From 74c23a6c465963e9eaca58408cc52fb4cbda52d5 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Tue, 8 Oct 2024 12:04:08 +0200 Subject: [PATCH 01/24] feat(resources): add new component for serving python applications --- .../cloud/aws/resources/aws_services.py | 253 ++++++++++++++++++ .../cloud/aws/resources/lambda_component.py | 203 ++++++++++++++ 2 files changed, 456 insertions(+) create mode 100644 src/damavand/cloud/aws/resources/aws_services.py create mode 100644 src/damavand/cloud/aws/resources/lambda_component.py diff --git a/src/damavand/cloud/aws/resources/aws_services.py b/src/damavand/cloud/aws/resources/aws_services.py new file mode 100644 index 0000000..fc565ae --- /dev/null +++ b/src/damavand/cloud/aws/resources/aws_services.py @@ -0,0 +1,253 @@ +from enum import StrEnum +from typing import Any + + +class AwsService(StrEnum): + """The AWS services that can assume a role.""" + + A4B = "a4b.amazonaws.com" + ACCESS_ANALYZER = "access-analyzer.amazonaws.com" + ACCOUNT = "account.amazonaws.com" + ACM_PCA = "acm-pca.amazonaws.com" + ACM = "acm.amazonaws.com" + AIRFLOW_ENV = "airflow-env.amazonaws.com" + AIRFLOW = "airflow.amazonaws.com" + ALEXA_APPKIT = "alexa-appkit.amazon.com" + ALEXA_CONNECTEDHOME = "alexa-connectedhome.amazon.com" + AMAZONMQ = "amazonmq.amazonaws.com" + AMPLIFY = "amplify.amazonaws.com" + APIGATEWAY = "apigateway.amazonaws.com" + APPFLOW = "appflow.amazonaws.com" + APPLICATION_AUTOSCALING = "application-autoscaling.amazonaws.com" + APPLICATION_INSIGHTS = "application-insights.amazonaws.com" + APPSTREAM = "appstream.amazonaws.com" + APPSTREAM_APPLICATIOIN_AUTOSCALING = ( + "appstream.application-autoscaling.amazonaws.com" + ) + APPSYNC = "appsync.amazonaws.com" + ATHENA = "athena.amazonaws.com" + AUTOMATION = "automation.amazonaws.com" + AUTOSCALING = "autoscaling.amazonaws.com" + AWS_ARTIFACT_ACCOUNT_SYNC = "aws-artifact-account-sync.amazonaws.com" + BACKUP = "backup.amazonaws.com" + BATCH = "batch.amazonaws.com" + BILLINGCONSOLE = "billingconsole.amazonaws.com" + BRAKET = "braket.amazonaws.com" + BUDGETS = "budgets.amazonaws.com" + CE = "ce.amazonaws.com" + CHANNELS = "channels.lex.amazonaws.com" + CHATBOT = "chatbot.amazonaws.com" + CHIME = "chime.amazonaws.com" + CLOUD9 = "cloud9.amazonaws.com" + CLOUDDIRECTORY = "clouddirectory.amazonaws.com" + CLOUDFORMATION = "cloudformation.amazonaws.com" + CLOUDFRONT = "cloudfront.amazonaws.com" + CLOUDHSM = "cloudhsm.amazonaws.com" + CLOUDSEARCH = "cloudsearch.amazonaws.com" + CLOUDTRAIL = "cloudtrail.amazonaws.com" + CLOUDWATCH_CROSSACCOUNT = "cloudwatch-crossaccount.amazonaws.com" + CODEBUILD = "codebuild.amazonaws.com" + CODECOMMIT = "codecommit.amazonaws.com" + CODEDEPLOY = "codedeploy.amazonaws.com" + CODEGURU_REVIEWER = "codeguru-reviewer.amazonaws.com" + CODEPIPELINE = "codepipeline.amazonaws.com" + CODESTAR_NOTIFICATIONS = "codestar-notifications.amazonaws.com" + CODESTAR = "codestar.amazonaws.com" + COGNITO_IDENTITY = "cognito-identity.amazonaws.com" + COGNITO_IDP = "cognito-idp.amazonaws.com" + COGNITO_SYNC = "cognito-sync.amazonaws.com" + COMPREHEND = "comprehend.amazonaws.com" + CONFIG_CONFORMS = "config-conforms.amazonaws.com" + CONFIG_MULTIACCOUNTSETUP = "config-multiaccountsetup.amazonaws.com" + CONFIG = "config.amazonaws.com" + CONNECT = "connect.amazonaws.com" + CONTINUOUSEXPORT = "continuousexport.discovery.amazonaws.com" + COSTALERTS = "costalerts.amazonaws.com" + CUSTOM_RESOURCE = "custom-resource.application-autoscaling.amazonaws.com" + DATABREW = "databrew.amazonaws.com" + DATAPIPELINE = "datapipeline.amazonaws.com" + DATASYNC = "datasync.amazonaws.com" + DAX = "dax.amazonaws.com" + DEEPLENS = "deeplens.amazonaws.com" + DELIVERY = "delivery.logs.amazonaws.com" + DIODE = "diode.amazonaws.com" + DIRECTCONNECT = "directconnect.amazonaws.com" + DISCOVERY = "discovery.amazonaws.com" + DLM = "dlm.amazonaws.com" + DMS = "dms.amazonaws.com" + DS = "ds.amazonaws.com" + DYNAMODB = "dynamodb.amazonaws.com" + DYNAMODB_AUTOSCALING = "dynamodb.application-autoscaling.amazonaws.com" + EC = "ec.amazonaws.com" + EC2 = "ec2.amazonaws.com" + EC2_AUTOSCALING = "ec2.application-autoscaling.amazonaws.com" + EC2FLEET = "ec2fleet.amazonaws.com" + EC2SCHEDULED = "ec2scheduled.amazonaws.com" + ECR = "ecr.amazonaws.com" + ECS_TASKS = "ecs-tasks.amazonaws.com" + ECS = "ecs.amazonaws.com" + ECS_AUTOSCALING = "ecs.application-autoscaling.amazonaws.com" + EDGELAMBDA = "edgelambda.amazonaws.com" + EKS_FARGATE_PODS = "eks-fargate-pods.amazonaws.com" + EKS_FARGATE = "eks-fargate.amazonaws.com" + EKS_NODEGROUP = "eks-nodegroup.amazonaws.com" + EKS = "eks.amazonaws.com" + ELASTICACHE = "elasticache.amazonaws.com" + ELASTICBEANSTALK = "elasticbeanstalk.amazonaws.com" + ELASTICFILESYSTEM = "elasticfilesystem.amazonaws.com" + ELASTICLOADBALANCING = "elasticloadbalancing.amazonaws.com" + ELASTICMAPREDUCE = "elasticmapreduce.amazonaws.com" + ELASTICTRANSCODER = "elastictranscoder.amazonaws.com" + EMAIL = "email.cognito-idp.amazonaws.com" + EMR_CONTAINERS = "emr-containers.amazonaws.com" + ES = "es.amazonaws.com" + EVENTS = "events.amazonaws.com" + FIREHOSE = "firehose.amazonaws.com" + FMS = "fms.amazonaws.com" + FORECAST = "forecast.amazonaws.com" + FREERTOS = "freertos.amazonaws.com" + FSX = "fsx.amazonaws.com" + GALAXY = "galaxy.amazonaws.com" + GAMELIFT = "gamelift.amazonaws.com" + GLACIER = "glacier.amazonaws.com" + GLOBALACCELERATOR = "globalaccelerator.amazonaws.com" + GLUE = "glue.amazonaws.com" + GREENGRASS = "greengrass.amazonaws.com" + GUARDDUTY = "guardduty.amazonaws.com" + HEALTH = "health.amazonaws.com" + HONEYCODE = "honeycode.amazonaws.com" + IAM = "iam.amazonaws.com" + IMAGEBUILDER = "imagebuilder.amazonaws.com" + IMPORTEXPORT = "importexport.amazonaws.com" + INSPECTOR = "inspector.amazonaws.com" + IOT = "iot.amazonaws.com" + IOTANALYTICS = "iotanalytics.amazonaws.com" + IOTEVENTS = "iotevents.amazonaws.com" + IOTSITEWISE = "iotsitewise.amazonaws.com" + IOTTHINGSGRAPH = "iotthingsgraph.amazonaws.com" + IVS = "ivs.amazonaws.com" + JELLYFISH = "jellyfish.amazonaws.com" + KAFKA = "kafka.amazonaws.com" + KINESIS = "kinesis.amazonaws.com" + KINESISANALYTICS = "kinesisanalytics.amazonaws.com" + KMS = "kms.amazonaws.com" + LAKEFORMATION = "lakeformation.amazonaws.com" + LAMBDA = "lambda.amazonaws.com" + LEX = "lex.amazonaws.com" + LICENSE_MANAGER = "license-manager.amazonaws.com" + LIGHTSAIL = "lightsail.amazonaws.com" + LOGGER = "logger.cloudfront.amazonaws.com" + LOGS = "logs.amazonaws.com" + MACHINELEARNING = "machinelearning.amazonaws.com" + MACIE = "macie.amazonaws.com" + MANAGEDBLOCKCHAIN = "managedblockchain.amazonaws.com" + MANAGEDSERVICES = "managedservices.amazonaws.com" + MEDIACONNECT = "mediaconnect.amazonaws.com" + MEDIACONVERT = "mediaconvert.amazonaws.com" + MEDIAPACKAGE = "mediapackage.amazonaws.com" + MEDIASTORE = "mediastore.amazonaws.com" + MEDIATAILOR = "mediatailor.amazonaws.com" + MEETINGS = "meetings.chime.amazonaws.com" + MEMBER = "member.org.stacksets.cloudformation.amazonaws.com" + METERING_MARKETPLACE = "metering-marketplace.amazonaws.com" + MGN = "mgn.amazonaws.com" + MIGRATIONHUB = "migrationhub.amazonaws.com" + MOBILEANALYTICS = "mobileanalytics.amazonaws.com" + MOBILEHUB = "mobilehub.amazonaws.com" + MONITORING = "monitoring.amazonaws.com" + MQ = "mq.amazonaws.com" + NETWORK_FIREWALL = "network-firewall.amazonaws.com" + OPS = "ops.apigateway.amazonaws.com" + OPSWORKS_CM = "opsworks-cm.amazonaws.com" + OPSWORKS = "opsworks.amazonaws.com" + ORGANIZATIONS = "organizations.amazonaws.com" + PERSONALIZE = "personalize.amazonaws.com" + PINPOINT = "pinpoint.amazonaws.com" + POLLY = "polly.amazonaws.com" + PURCHASEORDERS = "purchaseorders.amazonaws.com" + QLDB = "qldb.amazonaws.com" + QUICKSIGHT = "quicksight.amazonaws.com" + RAM = "ram.amazonaws.com" + RDS_PREVIEW = "rds-preview.amazonaws.com" + RDS = "rds.amazonaws.com" + REDSHIFT = "redshift.amazonaws.com" + REKOGNITION = "rekognition.amazonaws.com" + REPLICATION = "replication.dynamodb.amazonaws.com" + REPLICATOR = "replicator.lambda.amazonaws.com" + RESOURCE_GROUPS = "resource-groups.amazonaws.com" + ROBOMAKER = "robomaker.amazonaws.com" + ROUTE53 = "route53.amazonaws.com" + ROUTE53DOMAINS = "route53domains.amazonaws.com" + ROUTE53RESOLVER = "route53resolver.amazonaws.com" + S3 = "s3.amazonaws.com" + SAGEMAKER = "sagemaker.amazonaws.com" + SECRETSMANAGER = "secretsmanager.amazonaws.com" + SECURITYHUB = "securityhub.amazonaws.com" + SERVERLESSREPO = "serverlessrepo.amazonaws.com" + SERVICECATALOG_APPREGISTRY = "servicecatalog-appregistry.amazonaws.com" + SERVICECATALOG = "servicecatalog.amazonaws.com" + SERVICEDISCOVERY = "servicediscovery.amazonaws.com" + SES = "ses.amazonaws.com" + SHIELD = "shield.amazonaws.com" + SIGNER = "signer.amazonaws.com" + SIGNIN = "signin.amazonaws.com" + SMS = "sms.amazonaws.com" + SNS = "sns.amazonaws.com" + SPOTFLEET = "spotfleet.amazonaws.com" + SQS = "sqs.amazonaws.com" + SSM_INCIDENTS = "ssm-incidents.amazonaws.com" + SSM = "ssm.amazonaws.com" + SSO = "sso.amazonaws.com" + STATES = "states.amazonaws.com" + STORAGEGATEWAY = "storagegateway.amazonaws.com" + STREAMS = "streams.metrics.cloudwatch.amazonaws.com" + STS = "sts.amazonaws.com" + SUPPORT = "support.amazonaws.com" + SWF = "swf.amazonaws.com" + TAGGING = "tagging.amazonaws.com" + TAGPOLICIES = "tagpolicies.tag.amazonaws.com" + TEXTRACT = "textract.amazonaws.com" + TIMESTREAM = "timestream.amazonaws.com" + TRANSCRIBE = "transcribe.amazonaws.com" + TRANSFER = "transfer.amazonaws.com" + TRANSITGATEWAY = "transitgateway.amazonaws.com" + TRANSLATE = "translate.amazonaws.com" + TRUSTEDADVISOR = "trustedadvisor.amazonaws.com" + TTS = "tts.amazonaws.com" + VMIE = "vmie.amazonaws.com" + VPC_FLOW_LOGS = "vpc-flow-logs.amazonaws.com" + WAF_REGIONAL = "waf-regional.amazonaws.com" + WAF = "waf.amazonaws.com" + WAM = "wam.amazonaws.com" + WORKDOCS = "workdocs.amazonaws.com" + WORKLINK = "worklink.amazonaws.com" + WORKMAIL = "workmail.amazonaws.com" + WORKSPACES = "workspaces.amazonaws.com" + XRAY = "xray.amazonaws.com" + + def get_assume_policy(self) -> dict[str, Any]: + """Return the assume role policy for the requested service. + + Parameters + ---------- + service : str + the service url that can assume the role. + + Returns + ------- + dict[str, Any] + the assume role policy. + """ + + return { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": self, + }, + "Action": "sts:AssumeRole", + }, + ], + } diff --git a/src/damavand/cloud/aws/resources/lambda_component.py b/src/damavand/cloud/aws/resources/lambda_component.py new file mode 100644 index 0000000..4ef4762 --- /dev/null +++ b/src/damavand/cloud/aws/resources/lambda_component.py @@ -0,0 +1,203 @@ +import json +import os +from typing import Optional +from functools import cached_property +from dataclasses import dataclass + +import pulumi +import pulumi_aws as aws +from pulumi import ResourceOptions +from pulumi import ComponentResource as PulumiComponentResource + +from damavand.cloud.aws.resources.aws_services import AwsService + + +# TODO: rename to AwsServerlessPythonComponentArgs +@dataclass +class AwsLambdaComponentArgs: + """ + Arguments for the AwsLambdaComponent component. + + ... + + Attributes + ---------- + permissions : list[aws.iam.ManagedPolicy] + the managed policies for the Lambda function. + python_site_packages_path : Optional[str] + the path to the python site packages. Default is `./venv/lib/python/site-packages`. + python_site_packages_bucket : Optional[aws.s3.Bucket] + the S3 bucket for the python site packages. If not provided, a new bucket will be created. + python_version : str | aws.lambda_.Runtime + the python version for the Lambda function. Default is `aws.lambda_.Runtime.PYTHON3D12`. + handler : str + the handler for the Lambda function. Default is `__main__.event_handler`. + handler_root_directory : str + the root directory for the handler. Default is current working directory. + """ + + permissions: list[aws.iam.ManagedPolicy] = [] + python_site_packages_path: Optional[str] = None + python_site_packages_bucket: Optional[aws.s3.Bucket] = None + python_version: str | aws.lambda_.Runtime = aws.lambda_.Runtime.PYTHON3D12 + handler: str = "__main__.event_handler" + handler_root_directory: str = os.getcwd() + # TODO: add support for vpc + + +class AwsLambdaComponent(PulumiComponentResource): + """ + The AwsLambdaComponent class is a Pulumi component that deploys python applications into an AWS Lambda Function. + + ... + + Attributes + ---------- + name : str + the name of the component. + args : AwsLambdaComponentArgs + the arguments of the component. + opts : Optional[ResourceOptions] + the resource options. + + Methods + ------- + """ + + def __init__( + self, + name: str, + args: AwsLambdaComponentArgs, + opts: Optional[ResourceOptions] = None, + ) -> None: + super().__init__( + f"Damavand:{AwsLambdaComponent.__name__}", + name=name, + props={}, + opts=opts, + remote=False, + ) + + self.args = args + _ = self.lambda_function + + @property + def permissions(self) -> list[aws.iam.ManagedPolicy]: + """ + Return the managed policies for the Lambda function. + + Returns + ------- + list[aws.iam.ManagedPolicy] + the managed policies for the Lambda function. + """ + + return [ + aws.iam.ManagedPolicy.AWS_LAMBDA_BASIC_EXECUTION_ROLE, + aws.iam.ManagedPolicy.AWS_LAMBDA_VPC_ACCESS_EXECUTION_ROLE, + *self.args.permissions, + ] + + @cached_property + def role(self) -> aws.iam.Role: + """ + Return the IAM role for the Lambda function. + + Returns + ------- + aws.iam.Role + the IAM role for the Lambda function. + """ + + return aws.iam.Role( + resource_name=f"{self._name}-role", + opts=ResourceOptions(parent=self), + name=f"{self._name}-ExecutionRole", + managed_policy_arns=self.permissions, + assume_role_policy=json.dumps(AwsService.LAMBDA.get_assume_policy()), + ) + + @cached_property + def lambda_function(self) -> aws.lambda_.Function: + """ + Return the Lambda function. + + Returns + ------- + aws.lambda.Function + the Lambda function. + """ + + return aws.lambda_.Function( + resource_name=f"{self._name}-function", + opts=ResourceOptions(parent=self), + role=self.role.arn, + handler=self.args.handler, + runtime=self.args.python_version, + code=pulumi.FileArchive(self.args.handler_root_directory), + layers=[self.python_dependencies_lambda_layer.arn], + timeout=300, + memory_size=128, + ) + + # TODO: refactor to use pulumi bucket v2 for unique bucket names + @cached_property + def python_dependency_bucket(self) -> aws.s3.Bucket: + """ + Return the S3 bucket for python dependencies. + + Returns + ------- + aws.s3.Bucket + the S3 bucket for python dependencies. + """ + + return self.args.python_site_packages_bucket or aws.s3.Bucket( + resource_name=f"{self._name}-site-packages-bucket", + opts=ResourceOptions(parent=self), + bucket=f"{self._name}-py-site-packages", + acl="private", + ) + + @cached_property + def python_dependencies_s3_objects(self) -> aws.s3.BucketObject: + """ + Return the S3 objects for python dependencies. + + Returns + ------- + aws.s3.BucketObject + the S3 objects for python dependencies. + """ + + site_packages_path = self.args.python_site_packages_path or os.path.join( + self.args.handler_root_directory, + f"venv/lib/{self.args.python_version}/site-packages", + ) + + return aws.s3.BucketObject( + resource_name=f"{self._name}-site-packages-object", + opts=ResourceOptions(parent=self), + bucket=self.python_dependency_bucket.bucket, + key=f"{self._name}/site-packages.zip", + source=pulumi.FileArchive(site_packages_path), + ) + + @cached_property + def python_dependencies_lambda_layer(self) -> aws.lambda_.LayerVersion: + """ + Return the Lambda layer with installed python dependencies files. + + Returns + ------- + aws.lambda.LayerVersion + the Lambda layer for python dependencies. + """ + + return aws.lambda_.LayerVersion( + resource_name=f"{self._name}-site-packages-layer", + opts=ResourceOptions(parent=self), + layer_name=f"{self._name}-site-packages-layer", + s3_bucket=self.python_dependencies_s3_objects.bucket, + s3_key=self.python_dependencies_s3_objects.key, + ) From 0732c38334d9f717211c7c579452c0c0086576fb Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Tue, 8 Oct 2024 17:20:47 +0200 Subject: [PATCH 02/24] docs(resources): reformat the docstrings --- .../cloud/aws/resources/lambda_component.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/damavand/cloud/aws/resources/lambda_component.py b/src/damavand/cloud/aws/resources/lambda_component.py index 4ef4762..85dc9d3 100644 --- a/src/damavand/cloud/aws/resources/lambda_component.py +++ b/src/damavand/cloud/aws/resources/lambda_component.py @@ -22,17 +22,17 @@ class AwsLambdaComponentArgs: Attributes ---------- - permissions : list[aws.iam.ManagedPolicy] + permissions: list[aws.iam.ManagedPolicy] the managed policies for the Lambda function. - python_site_packages_path : Optional[str] + python_site_packages_path: Optional[str] the path to the python site packages. Default is `./venv/lib/python/site-packages`. - python_site_packages_bucket : Optional[aws.s3.Bucket] + python_site_packages_bucket: Optional[aws.s3.Bucket] the S3 bucket for the python site packages. If not provided, a new bucket will be created. - python_version : str | aws.lambda_.Runtime + python_version: str | aws.lambda_.Runtime the python version for the Lambda function. Default is `aws.lambda_.Runtime.PYTHON3D12`. - handler : str + handler: str the handler for the Lambda function. Default is `__main__.event_handler`. - handler_root_directory : str + handler_root_directory: str the root directory for the handler. Default is current working directory. """ @@ -53,11 +53,11 @@ class AwsLambdaComponent(PulumiComponentResource): Attributes ---------- - name : str + name: str the name of the component. - args : AwsLambdaComponentArgs + args: AwsLambdaComponentArgs the arguments of the component. - opts : Optional[ResourceOptions] + opts: Optional[ResourceOptions] the resource options. Methods From 784b0f4a1e19f4f51120af66efe790533825de7c Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Tue, 8 Oct 2024 17:27:21 +0200 Subject: [PATCH 03/24] refactor: change lambda_component name to serverless_python_component --- ...omponent.py => serverless_python_component.py} | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) rename src/damavand/cloud/aws/resources/{lambda_component.py => serverless_python_component.py} (92%) diff --git a/src/damavand/cloud/aws/resources/lambda_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py similarity index 92% rename from src/damavand/cloud/aws/resources/lambda_component.py rename to src/damavand/cloud/aws/resources/serverless_python_component.py index 85dc9d3..8a9957f 100644 --- a/src/damavand/cloud/aws/resources/lambda_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -12,11 +12,10 @@ from damavand.cloud.aws.resources.aws_services import AwsService -# TODO: rename to AwsServerlessPythonComponentArgs @dataclass -class AwsLambdaComponentArgs: +class AwsServerlessPythonComponentArgs: """ - Arguments for the AwsLambdaComponent component. + Arguments for the AwsServerlessPythonComponent component. ... @@ -45,9 +44,9 @@ class AwsLambdaComponentArgs: # TODO: add support for vpc -class AwsLambdaComponent(PulumiComponentResource): +class AwsServerlessPythonComponent(PulumiComponentResource): """ - The AwsLambdaComponent class is a Pulumi component that deploys python applications into an AWS Lambda Function. + The AwsServerlessPythonComponent class is a Pulumi component that deploys python applications into an AWS Lambda Function. ... @@ -55,7 +54,7 @@ class AwsLambdaComponent(PulumiComponentResource): ---------- name: str the name of the component. - args: AwsLambdaComponentArgs + args: AwsServerlessPythonComponentArgs the arguments of the component. opts: Optional[ResourceOptions] the resource options. @@ -67,11 +66,11 @@ class AwsLambdaComponent(PulumiComponentResource): def __init__( self, name: str, - args: AwsLambdaComponentArgs, + args: AwsServerlessPythonComponentArgs, opts: Optional[ResourceOptions] = None, ) -> None: super().__init__( - f"Damavand:{AwsLambdaComponent.__name__}", + f"Damavand:{AwsServerlessPythonComponent.__name__}", name=name, props={}, opts=opts, From c6d30fcbca0ccd9d36b3f73769833957dd521bef Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Thu, 17 Oct 2024 12:35:33 +0200 Subject: [PATCH 04/24] fix(py-serverless): unable to deploy with dependency bigger than 250mb --- pdm.lock | 93 +++++++++++----- pyproject.toml | 2 +- src/damavand/cloud/aws/resources/__init__.py | 10 -- .../resources/serverless_python_component.py | 100 +++++++----------- 4 files changed, 106 insertions(+), 99 deletions(-) diff --git a/pdm.lock b/pdm.lock index 7608580..fd06743 100644 --- a/pdm.lock +++ b/pdm.lock @@ -556,30 +556,39 @@ files = [ [[package]] name = "grpcio" -version = "1.60.2" -requires_python = ">=3.7" +version = "1.66.2" +requires_python = ">=3.8" summary = "HTTP/2-based RPC framework" groups = ["default"] files = [ - {file = "grpcio-1.60.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:8b9d2c0604be5306aa1ea5476432015777c5d57145062e57a3ba2ab76f0fa4f6"}, - {file = "grpcio-1.60.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:cf51071a6f0f9bb654348f8a7d608eafdb75f768af1dc97975daa824f4f341b1"}, - {file = "grpcio-1.60.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:152bab3f33fa162c1aa6b404c48e5c466979b544c2d5ae163297f1d5cdf4a1ba"}, - {file = "grpcio-1.60.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ae6ef779078f9aea2ee65272a52c3e411a30ae427a1c43699741617c32d6279"}, - {file = "grpcio-1.60.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25bad53f8e45aa937636afd21b3c6bc6b4e2577ef5f6eb93988881683b43ee8d"}, - {file = "grpcio-1.60.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:94c23eb89dde0a5a0a34a9aedbda039ed26c38d93e460d44dc9990d1ba610115"}, - {file = "grpcio-1.60.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:efbb311e24ce03da402b48ce12b9c73e83e38ea69f54089a122739d027a415ae"}, - {file = "grpcio-1.60.2-cp311-cp311-win32.whl", hash = "sha256:cbebbf033e2d6e8b53fc30876c132d6fb231ff24111af261f31ed85b3bfa7e4b"}, - {file = "grpcio-1.60.2-cp311-cp311-win_amd64.whl", hash = "sha256:0adf7136758b51d2c5816e99f6642f5055118e60b9069cbc65adf9dc6e1405fd"}, - {file = "grpcio-1.60.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:f0a94185bd36ffe037d42650eba01f8d346fdeaea2983bf10286182cf500cf30"}, - {file = "grpcio-1.60.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:f48123867cebdb4b23135742e6b7169a1355f3b0fdd582a01048dca83e8dfe3b"}, - {file = "grpcio-1.60.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:19ed5d1771beeb02bf3d9957ccfd62a7d96bc2d6bb2c17608ec7465914d80f06"}, - {file = "grpcio-1.60.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fa0899b6d32e7453f0e40c3a27a89a8638c4b44361872fce7cc4501c1777b46"}, - {file = "grpcio-1.60.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c22253ef0f8b3a0abb43bab65852950517ae476734ba1dac0201bb23ea395498"}, - {file = "grpcio-1.60.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e1db0e5b99ac20111ac2844c58cbdd4fcd55c2d9706a45200f02524858c3bd5"}, - {file = "grpcio-1.60.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9186981a9e8a2fc1cb9d7767d4e7ef3eef6604fd7429ca14b45daa6c1c41a8a"}, - {file = "grpcio-1.60.2-cp312-cp312-win32.whl", hash = "sha256:380834c7e1c0d747c1b6d36c6f3ccaab5ce018792647fb0e46b0b8af455d56b3"}, - {file = "grpcio-1.60.2-cp312-cp312-win_amd64.whl", hash = "sha256:8f760e7e26b04bef2327a07facc35c6196e5d17a7e9a22aaa5c7f3b83a801dad"}, - {file = "grpcio-1.60.2.tar.gz", hash = "sha256:595264cd4ba6a989d6a56cfa72ac34198ba696ab33d06ee223ad55a7d3c06105"}, + {file = "grpcio-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:2335c58560a9e92ac58ff2bc5649952f9b37d0735608242973c7a8b94a6437d8"}, + {file = "grpcio-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a3d462826f4868b442a6b8fdbe8b87b45eb4f5b5308168c156b21eca43f61c"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a9539f01cb04950fd4b5ab458e64a15f84c2acc273670072abe49a3f29bbad54"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce89f5876662f146d4c1f695dda29d4433a5d01c8681fbd2539afff535da14d4"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25a14af966438cddf498b2e338f88d1c9706f3493b1d73b93f695c99c5f0e2a"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6001e575b8bbd89eee11960bb640b6da6ae110cf08113a075f1e2051cc596cae"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ea1d062c9230278793820146c95d038dc0f468cbdd172eec3363e42ff1c7d01"}, + {file = "grpcio-1.66.2-cp311-cp311-win32.whl", hash = "sha256:38b68498ff579a3b1ee8f93a05eb48dc2595795f2f62716e797dc24774c1aaa8"}, + {file = "grpcio-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:6851de821249340bdb100df5eacfecfc4e6075fa85c6df7ee0eb213170ec8e5d"}, + {file = "grpcio-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:802d84fd3d50614170649853d121baaaa305de7b65b3e01759247e768d691ddf"}, + {file = "grpcio-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80fd702ba7e432994df208f27514280b4b5c6843e12a48759c9255679ad38db8"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:12fda97ffae55e6526825daf25ad0fa37483685952b5d0f910d6405c87e3adb6"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:950da58d7d80abd0ea68757769c9db0a95b31163e53e5bb60438d263f4bed7b7"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e636ce23273683b00410f1971d209bf3689238cf5538d960adc3cdfe80dd0dbd"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a917d26e0fe980b0ac7bfcc1a3c4ad6a9a4612c911d33efb55ed7833c749b0ee"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49f0ca7ae850f59f828a723a9064cadbed90f1ece179d375966546499b8a2c9c"}, + {file = "grpcio-1.66.2-cp312-cp312-win32.whl", hash = "sha256:31fd163105464797a72d901a06472860845ac157389e10f12631025b3e4d0453"}, + {file = "grpcio-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:ff1f7882e56c40b0d33c4922c15dfa30612f05fb785074a012f7cda74d1c3679"}, + {file = "grpcio-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:3b00efc473b20d8bf83e0e1ae661b98951ca56111feb9b9611df8efc4fe5d55d"}, + {file = "grpcio-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1caa38fb22a8578ab8393da99d4b8641e3a80abc8fd52646f1ecc92bcb8dee34"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c408f5ef75cfffa113cacd8b0c0e3611cbfd47701ca3cdc090594109b9fcbaed"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c806852deaedee9ce8280fe98955c9103f62912a5b2d5ee7e3eaa284a6d8d8e7"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f145cc21836c332c67baa6fc81099d1d27e266401565bf481948010d6ea32d46"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:73e3b425c1e155730273f73e419de3074aa5c5e936771ee0e4af0814631fb30a"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c509a4f78114cbc5f0740eb3d7a74985fd2eff022971bc9bc31f8bc93e66a3b"}, + {file = "grpcio-1.66.2-cp313-cp313-win32.whl", hash = "sha256:20657d6b8cfed7db5e11b62ff7dfe2e12064ea78e93f1434d61888834bc86d75"}, + {file = "grpcio-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:fb70487c95786e345af5e854ffec8cb8cc781bcc5df7930c4fbb7feaa72e1cdf"}, + {file = "grpcio-1.66.2.tar.gz", hash = "sha256:563588c587b75c34b928bc428548e5b00ea38c46972181a4d8b75ba7e3f24231"}, ] [[package]] @@ -1075,21 +1084,21 @@ files = [ [[package]] name = "pulumi" -version = "3.135.0" +version = "3.136.1" requires_python = ">=3.8" summary = "Pulumi's Python SDK" groups = ["default"] dependencies = [ "debugpy~=1.8.5", "dill~=0.3", - "grpcio~=1.60.1", + "grpcio~=1.66.2", "protobuf~=4.21", "pyyaml~=6.0", "semver~=2.13", "six~=1.12", ] files = [ - {file = "pulumi-3.135.0-py3-none-any.whl", hash = "sha256:fadda283509e360afac92f8b569b1f14b15667984ad966a2a66c6595228f9042"}, + {file = "pulumi-3.136.1-py3-none-any.whl", hash = "sha256:f4193733877c336332c95bd723c79faa240f2be082afbc3f4de940676d786e73"}, ] [[package]] @@ -1109,6 +1118,25 @@ files = [ {file = "pulumi_aws-6.54.1.tar.gz", hash = "sha256:6dd5fe2c9ce73c57297a93d2b2f52f8930c6584f3e67a597dc4e69257e9215d6"}, ] +[[package]] +name = "pulumi-awsx" +version = "2.16.1" +requires_python = ">=3.8" +summary = "Pulumi Amazon Web Services (AWS) AWSX Components." +groups = ["default"] +dependencies = [ + "parver>=0.2.1", + "pulumi-aws<7.0.0,>=6.0.4", + "pulumi-docker<5.0.0,>=4.5.1", + "pulumi<4.0.0,>=3.134.1", + "semver>=2.8.1", + "typing-extensions>=4.11; python_version < \"3.11\"", +] +files = [ + {file = "pulumi_awsx-2.16.1-py3-none-any.whl", hash = "sha256:6107c365dd7c02f5abe9dffc3cadaedfe9c6e4ac494a00c431d379ca8e2ed1e3"}, + {file = "pulumi_awsx-2.16.1.tar.gz", hash = "sha256:df65bee3f425bdb10c12de202a5ca2bceb1c2717e9f9510d5c8fd9113655fe32"}, +] + [[package]] name = "pulumi-azure-native" version = "2.64.2" @@ -1126,6 +1154,23 @@ files = [ {file = "pulumi_azure_native-2.64.2.tar.gz", hash = "sha256:0adaf301dcdc06d32beb2baa86044d396f5ad69ef28789ae0143c134deb93128"}, ] +[[package]] +name = "pulumi-docker" +version = "4.5.7" +requires_python = ">=3.8" +summary = "A Pulumi package for interacting with Docker in Pulumi programs" +groups = ["default"] +dependencies = [ + "parver>=0.2.1", + "pulumi<4.0.0,>=3.136.0", + "semver>=2.8.1", + "typing-extensions>=4.11; python_version < \"3.11\"", +] +files = [ + {file = "pulumi_docker-4.5.7-py3-none-any.whl", hash = "sha256:f8bebfee982151e46f39dc52a53af1edd21658722406c3d4327824dc4f724067"}, + {file = "pulumi_docker-4.5.7.tar.gz", hash = "sha256:19f8f9dce3055abd2da2ff10b867231610880e201c98d844036d6280e81b292c"}, +] + [[package]] name = "pulumi-random" version = "4.16.6" diff --git a/pyproject.toml b/pyproject.toml index 1d14a0b..132da79 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dependencies = [ "pulumi-azure-native>=2.51.0", "pulumi-random>=4.16.3", "sparkle @ git+https://github.com/DataChefHQ/sparkle.git@v0.6.1", - "damavand @ file:///${PROJECT_ROOT}/", + "pulumi-awsx>=2.16.1", ] requires-python = ">=3.11.0" readme = "README.md" diff --git a/src/damavand/cloud/aws/resources/__init__.py b/src/damavand/cloud/aws/resources/__init__.py index 927579e..e69de29 100644 --- a/src/damavand/cloud/aws/resources/__init__.py +++ b/src/damavand/cloud/aws/resources/__init__.py @@ -1,10 +0,0 @@ -from .glue_component import GlueComponent, GlueComponentArgs -from .vllm_component import AwsVllmComponentArgs, AwsVllmComponent - - -__all__ = [ - "GlueComponent", - "GlueComponentArgs", - "AwsVllmComponent", - "AwsVllmComponentArgs", -] diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index 8a9957f..61d8acf 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -2,31 +2,31 @@ import os from typing import Optional from functools import cached_property -from dataclasses import dataclass +from dataclasses import dataclass, field -import pulumi import pulumi_aws as aws +import pulumi_awsx as awsx from pulumi import ResourceOptions from pulumi import ComponentResource as PulumiComponentResource from damavand.cloud.aws.resources.aws_services import AwsService +# TODO: use google style docsting format @dataclass class AwsServerlessPythonComponentArgs: """ Arguments for the AwsServerlessPythonComponent component. + This component is using lambda function layer for python dependencies. The python dependencies are stored in an S3 bucket. The python dependencies are stored in a zip file. You can directly zip the site-packages directory of your virtual environment. ... Attributes ---------- permissions: list[aws.iam.ManagedPolicy] the managed policies for the Lambda function. - python_site_packages_path: Optional[str] - the path to the python site packages. Default is `./venv/lib/python/site-packages`. - python_site_packages_bucket: Optional[aws.s3.Bucket] - the S3 bucket for the python site packages. If not provided, a new bucket will be created. + dockerfile_directory: str + the directory of the Dockerfile. Default is current working directory. python_version: str | aws.lambda_.Runtime the python version for the Lambda function. Default is `aws.lambda_.Runtime.PYTHON3D12`. handler: str @@ -35,9 +35,8 @@ class AwsServerlessPythonComponentArgs: the root directory for the handler. Default is current working directory. """ - permissions: list[aws.iam.ManagedPolicy] = [] - python_site_packages_path: Optional[str] = None - python_site_packages_bucket: Optional[aws.s3.Bucket] = None + permissions: list[aws.iam.ManagedPolicy] = field(default_factory=list) + dockerfile_directory: str = os.getcwd() python_version: str | aws.lambda_.Runtime = aws.lambda_.Runtime.PYTHON3D12 handler: str = "__main__.event_handler" handler_root_directory: str = os.getcwd() @@ -117,86 +116,59 @@ def role(self) -> aws.iam.Role: ) @cached_property - def lambda_function(self) -> aws.lambda_.Function: - """ - Return the Lambda function. - - Returns - ------- - aws.lambda.Function - the Lambda function. - """ - - return aws.lambda_.Function( - resource_name=f"{self._name}-function", - opts=ResourceOptions(parent=self), - role=self.role.arn, - handler=self.args.handler, - runtime=self.args.python_version, - code=pulumi.FileArchive(self.args.handler_root_directory), - layers=[self.python_dependencies_lambda_layer.arn], - timeout=300, - memory_size=128, - ) - - # TODO: refactor to use pulumi bucket v2 for unique bucket names - @cached_property - def python_dependency_bucket(self) -> aws.s3.Bucket: + def lambda_image_ecr_repository(self) -> aws.ecr.Repository: """ - Return the S3 bucket for python dependencies. + Return the ECR repository for the Lambda function. Returns ------- - aws.s3.Bucket - the S3 bucket for python dependencies. + aws.ecr.Repository + the ECR repository for the Lambda function. """ - return self.args.python_site_packages_bucket or aws.s3.Bucket( - resource_name=f"{self._name}-site-packages-bucket", + return aws.ecr.Repository( + resource_name=f"{self._name}-repository", opts=ResourceOptions(parent=self), - bucket=f"{self._name}-py-site-packages", - acl="private", + name=f"{self._name}-image-repo", + force_delete=True, ) @cached_property - def python_dependencies_s3_objects(self) -> aws.s3.BucketObject: + def lambda_image(self) -> awsx.ecr.Image: """ - Return the S3 objects for python dependencies. + Return the ECR image for the Lambda function. Returns ------- - aws.s3.BucketObject - the S3 objects for python dependencies. + aws.ecr.Image + the ECR image for the Lambda function. """ - site_packages_path = self.args.python_site_packages_path or os.path.join( - self.args.handler_root_directory, - f"venv/lib/{self.args.python_version}/site-packages", - ) - - return aws.s3.BucketObject( - resource_name=f"{self._name}-site-packages-object", + return awsx.ecr.Image( + resource_name=f"{self._name}-image", opts=ResourceOptions(parent=self), - bucket=self.python_dependency_bucket.bucket, - key=f"{self._name}/site-packages.zip", - source=pulumi.FileArchive(site_packages_path), + context=self.args.dockerfile_directory, + repository_url=self.lambda_image_ecr_repository.repository_url, ) @cached_property - def python_dependencies_lambda_layer(self) -> aws.lambda_.LayerVersion: + def lambda_function(self) -> aws.lambda_.Function: """ - Return the Lambda layer with installed python dependencies files. + Return the Lambda function. Returns ------- - aws.lambda.LayerVersion - the Lambda layer for python dependencies. + aws.lambda.Function + the Lambda function. """ - return aws.lambda_.LayerVersion( - resource_name=f"{self._name}-site-packages-layer", + return aws.lambda_.Function( + resource_name=f"{self._name}-function", opts=ResourceOptions(parent=self), - layer_name=f"{self._name}-site-packages-layer", - s3_bucket=self.python_dependencies_s3_objects.bucket, - s3_key=self.python_dependencies_s3_objects.key, + role=self.role.arn, + runtime=self.args.python_version, + package_type="Image", + image_uri=self.lambda_image.image_uri, + timeout=300, + memory_size=128, ) From a806acd6fd88d9bcc7606631fb77a72205ab41d1 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Thu, 17 Oct 2024 12:36:34 +0200 Subject: [PATCH 05/24] chore(example): add example for python serverless component --- .../Dockerfile | 8 ++++++++ .../Pulumi.yaml | 7 +++++++ .../__main__.py | 19 +++++++++++++++++++ .../requirements.txt | 2 ++ 4 files changed, 36 insertions(+) create mode 100644 examples/aws-serverless-python-resources/Dockerfile create mode 100644 examples/aws-serverless-python-resources/Pulumi.yaml create mode 100644 examples/aws-serverless-python-resources/__main__.py create mode 100644 examples/aws-serverless-python-resources/requirements.txt diff --git a/examples/aws-serverless-python-resources/Dockerfile b/examples/aws-serverless-python-resources/Dockerfile new file mode 100644 index 0000000..a88fe44 --- /dev/null +++ b/examples/aws-serverless-python-resources/Dockerfile @@ -0,0 +1,8 @@ +FROM public.ecr.aws/lambda/python:3.11 + +# Copy function code +COPY . ${LAMBDA_TASK_ROOT} +CMD pip install -r requirements.txt + +# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) +CMD [ "__main__.main" ] diff --git a/examples/aws-serverless-python-resources/Pulumi.yaml b/examples/aws-serverless-python-resources/Pulumi.yaml new file mode 100644 index 0000000..56ddf88 --- /dev/null +++ b/examples/aws-serverless-python-resources/Pulumi.yaml @@ -0,0 +1,7 @@ +name: aws-serverless-python +runtime: + name: python + options: + toolchain: pip + virtualenv: venv +description: A minimal Python on Lambda function Pulumi program diff --git a/examples/aws-serverless-python-resources/__main__.py b/examples/aws-serverless-python-resources/__main__.py new file mode 100644 index 0000000..b94fec3 --- /dev/null +++ b/examples/aws-serverless-python-resources/__main__.py @@ -0,0 +1,19 @@ +import pulumi_aws as aws + +from damavand.cloud.aws.resources.serverless_python_component import ( + AwsServerlessPythonComponent, + AwsServerlessPythonComponentArgs, +) + + +def main() -> None: + AwsServerlessPythonComponent( + name="python-serverless-example", + args=AwsServerlessPythonComponentArgs( + python_version=aws.lambda_.Runtime.PYTHON3D11, + ), + ) + + +if __name__ == "__main__": + main() diff --git a/examples/aws-serverless-python-resources/requirements.txt b/examples/aws-serverless-python-resources/requirements.txt new file mode 100644 index 0000000..4a8397c --- /dev/null +++ b/examples/aws-serverless-python-resources/requirements.txt @@ -0,0 +1,2 @@ +-e ../../../damavand +pulumi From 8d9368ecc0a116537082fc4dccccfe1d6258788e Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Thu, 24 Oct 2024 13:57:24 +0200 Subject: [PATCH 06/24] feat(llm): make the llm controller support hosting the scripts as well --- src/damavand/cloud/aws/controllers/llm.py | 24 +++++-- .../cloud/aws/resources/llm_app_component.py | 72 +++++++++++++++++++ .../resources/serverless_python_component.py | 2 +- .../cloud/aws/resources/vllm_component.py | 50 ++++++++----- 4 files changed, 122 insertions(+), 26 deletions(-) create mode 100644 src/damavand/cloud/aws/resources/llm_app_component.py diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index 2dbd12a..5def408 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -4,11 +4,16 @@ import boto3 from botocore.exceptions import ClientError +import pulumi_aws as aws from pulumi import Resource as PulumiResource from damavand.base.controllers.llm import LlmController from damavand.base.controllers.base_controller import runtime, buildtime -from damavand.cloud.aws.resources import AwsVllmComponent, AwsVllmComponentArgs +from damavand.cloud.aws.resources.llm_app_component import ( + AwsLlmAppComponent, + AwsServerlessPythonComponentArgs, + AwsVllmComponentArgs, +) from damavand.errors import RuntimeException @@ -102,13 +107,18 @@ def default_api_key(self) -> str: @buildtime @cache def resource(self) -> PulumiResource: - """Return the Pulumi IaC AwsVllmComponent object.""" + """Creates the necessary IaC resources for serving the LLM and hosting the python application.""" - return AwsVllmComponent( + return AwsLlmAppComponent( name=self.name, - args=AwsVllmComponentArgs( - region=self._region, - api_key_required=True, - endpoint_ssm_parameter_name=self._base_url_ssm_name, + args=( + AwsVllmComponentArgs( + region=self._region, + api_key_required=True, + endpoint_ssm_parameter_name=self._base_url_ssm_name, + ), + AwsServerlessPythonComponentArgs( + python_version=aws.lambda_.Runtime.PYTHON3D11, + ), ), ) diff --git a/src/damavand/cloud/aws/resources/llm_app_component.py b/src/damavand/cloud/aws/resources/llm_app_component.py new file mode 100644 index 0000000..4da125c --- /dev/null +++ b/src/damavand/cloud/aws/resources/llm_app_component.py @@ -0,0 +1,72 @@ +from functools import cached_property + +from .vllm_component import AwsVllmComponent, AwsVllmComponentArgs +from .serverless_python_component import ( + AwsServerlessPythonComponent, + AwsServerlessPythonComponentArgs, +) + +from typing import Optional +from pulumi import ComponentResource as PulumiComponentResource +from pulumi import ResourceOptions + + +class AwsLlmAppComponent(PulumiComponentResource): + """ + Creates necessary resources for an end-to-end LLM application. This includes a vLLM instance and a serverless Python application on AWS Lambda. + + Attributes: + name: The unique name of the component. + args: The arguments to configure the component. + opts: Additional options to configure the component. + + """ + + def __init__( + self, + name: str, + args: tuple[AwsVllmComponentArgs, AwsServerlessPythonComponentArgs], + opts: Optional[ResourceOptions] = None, + ) -> None: + super().__init__( + f"Damavand:{AwsLlmAppComponent.__name__}", + name=name, + props={}, + opts=opts, + remote=False, + ) + + self.__vllm_args = args[0] + self.__serverless_python_args = args[1] + + _ = self.vllm + _ = self.python_applet + + @cached_property + def vllm(self) -> AwsVllmComponent: + """ + Creates necessary resources for serving a vLLM instance. + + Returns: + AwsVllmComponent: The vLLM component. + """ + + return AwsVllmComponent( + name=f"{self._name}-vllm", + args=self.__vllm_args, + opts=ResourceOptions(parent=self), + ) + + @cached_property + def python_applet(self) -> AwsServerlessPythonComponent: + """Creates necessary resources for serverless serving a Python application. + + Returns: + AwsServerlessPythonComponent: The serverless Python component. + """ + + return AwsServerlessPythonComponent( + name=f"{self._name}-python-applet", + args=self.__serverless_python_args, + opts=ResourceOptions(parent=self), + ) diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index 61d8acf..20a2db4 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -37,6 +37,7 @@ class AwsServerlessPythonComponentArgs: permissions: list[aws.iam.ManagedPolicy] = field(default_factory=list) dockerfile_directory: str = os.getcwd() + # FIXME: remove the runtime as we are using image python_version: str | aws.lambda_.Runtime = aws.lambda_.Runtime.PYTHON3D12 handler: str = "__main__.event_handler" handler_root_directory: str = os.getcwd() @@ -166,7 +167,6 @@ def lambda_function(self) -> aws.lambda_.Function: resource_name=f"{self._name}-function", opts=ResourceOptions(parent=self), role=self.role.arn, - runtime=self.args.python_version, package_type="Image", image_uri=self.lambda_image.image_uri, timeout=300, diff --git a/src/damavand/cloud/aws/resources/vllm_component.py b/src/damavand/cloud/aws/resources/vllm_component.py index 05feeb2..f0eb513 100644 --- a/src/damavand/cloud/aws/resources/vllm_component.py +++ b/src/damavand/cloud/aws/resources/vllm_component.py @@ -354,7 +354,6 @@ def api_resource_completions(self) -> aws.apigateway.Resource: path_part="completions", ) - @property @cache def api_method(self) -> aws.apigateway.Method: @@ -385,7 +384,9 @@ def admin_api_key(self) -> aws.apigateway.ApiKey: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`admin_api_key` is only available when api_key_required is False") + raise AttributeError( + "`admin_api_key` is only available when api_key_required is False" + ) return aws.apigateway.ApiKey( resource_name=f"{self._name}-api-key", @@ -405,7 +406,9 @@ def api_key_secret(self) -> aws.secretsmanager.Secret: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`admin_api_secret` is only available when api_key_required is False") + raise AttributeError( + "`admin_api_secret` is only available when api_key_required is False" + ) return aws.secretsmanager.Secret( resource_name=f"{self._name}-api-key-secret", @@ -424,7 +427,9 @@ def api_key_secret_version(self) -> aws.secretsmanager.SecretVersion: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`api_key_secret_version` is only available when api_key_required is False") + raise AttributeError( + "`api_key_secret_version` is only available when api_key_required is False" + ) return aws.secretsmanager.SecretVersion( resource_name=f"{self._name}-api-key-secret-version", @@ -433,7 +438,6 @@ def api_key_secret_version(self) -> aws.secretsmanager.SecretVersion: secret_string=self.admin_api_key.id, ) - @property @cache def default_usage_plan(self) -> aws.apigateway.UsagePlan: @@ -446,11 +450,13 @@ def default_usage_plan(self) -> aws.apigateway.UsagePlan: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`default_usage_plan` is only available when api_key_required is False") + raise AttributeError( + "`default_usage_plan` is only available when api_key_required is False" + ) return aws.apigateway.UsagePlan( resource_name=f"{self._name}-default-api-usage-plan", - opts=ResourceOptions(parent=self), + opts=ResourceOptions(parent=self, depends_on=[self.api_deployment]), api_stages=[ aws.apigateway.UsagePlanApiStageArgs( api_id=self.api.id, @@ -473,11 +479,13 @@ def tier_1_usage_plan(self) -> aws.apigateway.UsagePlan: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`default_usage_plan` is only available when api_key_required is False") + raise AttributeError( + "`default_usage_plan` is only available when api_key_required is False" + ) return aws.apigateway.UsagePlan( resource_name=f"{self._name}-tier-1-api-usage-plan", - opts=ResourceOptions(parent=self), + opts=ResourceOptions(parent=self, depends_on=[self.api_deployment]), api_stages=[ aws.apigateway.UsagePlanApiStageArgs( api_id=self.api.id, @@ -486,7 +494,7 @@ def tier_1_usage_plan(self) -> aws.apigateway.UsagePlan: ], throttle_settings=aws.apigateway.UsagePlanThrottleSettingsArgs( rate_limit=500 - ) + ), ) @property @@ -502,11 +510,13 @@ def tier_2_usage_plan(self) -> aws.apigateway.UsagePlan: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`default_usage_plan` is only available when api_key_required is False") + raise AttributeError( + "`default_usage_plan` is only available when api_key_required is False" + ) return aws.apigateway.UsagePlan( resource_name=f"{self._name}-tier-2-api-usage-plan", - opts=ResourceOptions(parent=self), + opts=ResourceOptions(parent=self, depends_on=[self.api_deployment]), api_stages=[ aws.apigateway.UsagePlanApiStageArgs( api_id=self.api.id, @@ -515,7 +525,7 @@ def tier_2_usage_plan(self) -> aws.apigateway.UsagePlan: ], throttle_settings=aws.apigateway.UsagePlanThrottleSettingsArgs( rate_limit=5000 - ) + ), ) @property @@ -531,11 +541,13 @@ def tier_3_usage_plan(self) -> aws.apigateway.UsagePlan: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`default_usage_plan` is only available when api_key_required is False") + raise AttributeError( + "`default_usage_plan` is only available when api_key_required is False" + ) return aws.apigateway.UsagePlan( - resource_name=f"{self._name}-tier-2-api-usage-plan", - opts=ResourceOptions(parent=self), + resource_name=f"{self._name}-tier-3-api-usage-plan", + opts=ResourceOptions(parent=self, depends_on=[self.api_deployment]), api_stages=[ aws.apigateway.UsagePlanApiStageArgs( api_id=self.api.id, @@ -544,7 +556,7 @@ def tier_3_usage_plan(self) -> aws.apigateway.UsagePlan: ], throttle_settings=aws.apigateway.UsagePlanThrottleSettingsArgs( rate_limit=10000 - ) + ), ) @property @@ -559,7 +571,9 @@ def api_key_usage_plan(self) -> aws.apigateway.UsagePlanKey: When api_key_required is False. """ if not self.args.api_key_required: - raise AttributeError("`api_key_usage_plan` is only available when api_key_required is False") + raise AttributeError( + "`api_key_usage_plan` is only available when api_key_required is False" + ) return aws.apigateway.UsagePlanKey( resource_name=f"{self._name}-api-usage-plan-key", From f988bd90a3158d27125554409e4f5caeaf0d3bb1 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Fri, 25 Oct 2024 15:25:28 +0200 Subject: [PATCH 07/24] test: disabling the api key --- src/damavand/cloud/aws/controllers/llm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index 5def408..b08c2d5 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -114,7 +114,7 @@ def resource(self) -> PulumiResource: args=( AwsVllmComponentArgs( region=self._region, - api_key_required=True, + api_key_required=False, endpoint_ssm_parameter_name=self._base_url_ssm_name, ), AwsServerlessPythonComponentArgs( From d8885cffdc7fe0048102447079fceec9f28e9ec5 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Mon, 28 Oct 2024 10:28:27 +0100 Subject: [PATCH 08/24] fix(llm): force set the region for the boto3 client --- src/damavand/cloud/aws/controllers/llm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index b08c2d5..60118c6 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -53,7 +53,7 @@ def __init__( **kwargs, ) -> None: super().__init__(name, model, tags, **kwargs) - self._parameter_store = boto3.client("ssm") + self._parameter_store = boto3.client("ssm", region_name=region) self._region = region @property From 6bbbb92b46a5553fd937ea2f5281df2aed8d577a Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Mon, 28 Oct 2024 13:57:47 +0100 Subject: [PATCH 09/24] refactor: seprating build time and runtime dependencies --- pdm.lock | 1190 +++++++++++++++++++++++++++++++++++++----------- pyproject.toml | 19 +- 2 files changed, 932 insertions(+), 277 deletions(-) diff --git a/pdm.lock b/pdm.lock index fd06743..2e3bd42 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,11 +5,29 @@ groups = ["default", "dev", "llm"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:eded6b337337dee9c917e85dfb3d774f698d96ba4f8d7ad37fcdc1e20cba8a12" +content_hash = "sha256:0dda884729e24b8641bf943eb76b874dd9ac7dada21dce5833d7a81e9b023759" [[metadata.targets]] requires_python = ">=3.11.0" +[[package]] +name = "alembic" +version = "1.13.3" +requires_python = ">=3.8" +summary = "A database migration tool for SQLAlchemy." +groups = ["llm"] +dependencies = [ + "Mako", + "SQLAlchemy>=1.3.0", + "importlib-metadata; python_version < \"3.9\"", + "importlib-resources; python_version < \"3.9\"", + "typing-extensions>=4", +] +files = [ + {file = "alembic-1.13.3-py3-none-any.whl", hash = "sha256:908e905976d15235fae59c9ac42c4c5b75cfcefe3d27c0fbf7ae15a37715d80e"}, + {file = "alembic-1.13.3.tar.gz", hash = "sha256:203503117415561e203aa14541740643a611f641517f0209fcae63e9fa09f1a2"}, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -35,22 +53,12 @@ files = [ {file = "argcomplete-3.5.0.tar.gz", hash = "sha256:4349400469dccfb7950bb60334a680c58d88699bff6159df61251878dc6bf74b"}, ] -[[package]] -name = "arpeggio" -version = "2.0.2" -summary = "Packrat parser interpreter" -groups = ["default"] -files = [ - {file = "Arpeggio-2.0.2-py2.py3-none-any.whl", hash = "sha256:f7c8ae4f4056a89e020c24c7202ac8df3e2bc84e416746f20b0da35bb1de0250"}, - {file = "Arpeggio-2.0.2.tar.gz", hash = "sha256:c790b2b06e226d2dd468e4fbfb5b7f506cec66416031fde1441cf1de2a0ba700"}, -] - [[package]] name = "attrs" version = "23.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" -groups = ["default", "dev", "llm"] +groups = ["dev", "llm"] dependencies = [ "importlib-metadata; python_version < \"3.8\"", ] @@ -64,7 +72,7 @@ name = "blinker" version = "1.8.2" requires_python = ">=3.8" summary = "Fast, simple object-to-object and broadcast signaling" -groups = ["default"] +groups = ["llm"] files = [ {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, @@ -72,25 +80,25 @@ files = [ [[package]] name = "boto3" -version = "1.35.31" +version = "1.35.49" requires_python = ">=3.8" summary = "The AWS SDK for Python" groups = ["default", "dev", "llm"] dependencies = [ - "botocore<1.36.0,>=1.35.31", + "botocore<1.36.0,>=1.35.49", "jmespath<2.0.0,>=0.7.1", "s3transfer<0.11.0,>=0.10.0", ] files = [ - {file = "boto3-1.35.31-py3-none-any.whl", hash = "sha256:2e9af74d10d8af7610a8d8468d2914961f116912a024fce17351825260385a52"}, - {file = "boto3-1.35.31.tar.gz", hash = "sha256:8c593af260c4ea3eb6f079c09908f94494ca2222aa4e40a7ff490fab1cee8b39"}, + {file = "boto3-1.35.49-py3-none-any.whl", hash = "sha256:b660c649a27a6b47a34f6f858f5bd7c3b0a798a16dec8dda7cbebeee80fd1f60"}, + {file = "boto3-1.35.49.tar.gz", hash = "sha256:ddecb27f5699ca9f97711c52b6c0652c2e63bf6c2bfbc13b819b4f523b4d30ff"}, ] [[package]] name = "boto3-stubs" -version = "1.35.31" +version = "1.35.49" requires_python = ">=3.8" -summary = "Type annotations for boto3 1.35.31 generated with mypy-boto3-builder 8.1.2" +summary = "Type annotations for boto3 1.35.49 generated with mypy-boto3-builder 8.1.4" groups = ["dev"] dependencies = [ "botocore-stubs", @@ -98,13 +106,13 @@ dependencies = [ "typing-extensions>=4.1.0; python_version < \"3.12\"", ] files = [ - {file = "boto3_stubs-1.35.31-py3-none-any.whl", hash = "sha256:d440ad57493534074024c999045929c617007712d395c86208b95b48f716269f"}, - {file = "boto3_stubs-1.35.31.tar.gz", hash = "sha256:bc10fa6e0c0e46c2b7c664b2183bb524053eb7439d9ebf9ae66547b295b76675"}, + {file = "boto3_stubs-1.35.49-py3-none-any.whl", hash = "sha256:daad87dcff906f7c09dde4ef3c252e2c47b6e1e8e669f5a8311658ac0d1182c0"}, + {file = "boto3_stubs-1.35.49.tar.gz", hash = "sha256:2a2e08ba2383df6f478127f9754a02a590131249b40c59d7c6ca9fce76906785"}, ] [[package]] name = "botocore" -version = "1.35.31" +version = "1.35.49" requires_python = ">=3.8" summary = "Low-level, data-driven core of boto 3." groups = ["default", "dev", "llm"] @@ -115,8 +123,8 @@ dependencies = [ "urllib3<1.27,>=1.25.4; python_version < \"3.10\"", ] files = [ - {file = "botocore-1.35.31-py3-none-any.whl", hash = "sha256:4cee814875bc78656aef4011d3d6b2231e96f53ea3661ee428201afb579d5c31"}, - {file = "botocore-1.35.31.tar.gz", hash = "sha256:f7bfa910cf2cbcc8c2307c1cf7b93495d614c2d699883417893e0a337fe4eb63"}, + {file = "botocore-1.35.49-py3-none-any.whl", hash = "sha256:aed4d3643afd702920792b68fbe712a8c3847993820d1048cd238a6469354da1"}, + {file = "botocore-1.35.49.tar.gz", hash = "sha256:07d0c1325fdbfa49a4a054413dbdeab0a6030449b2aa66099241af2dac48afd8"}, ] [[package]] @@ -134,6 +142,17 @@ files = [ {file = "botocore_stubs-1.35.31.tar.gz", hash = "sha256:b26f79253d8f2460aa8f2d49ae933c3f352fe38be72ea033651c15cd47a822a9"}, ] +[[package]] +name = "cachetools" +version = "5.5.0" +requires_python = ">=3.7" +summary = "Extensible memoizing collections and decorators" +groups = ["llm"] +files = [ + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, +] + [[package]] name = "certifi" version = "2024.8.30" @@ -239,7 +258,7 @@ name = "click" version = "8.1.7" requires_python = ">=3.7" summary = "Composable command line interface toolkit" -groups = ["default"] +groups = ["llm"] dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -265,7 +284,7 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["default", "dev", "llm"] +groups = ["dev", "llm"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -273,7 +292,7 @@ files = [ [[package]] name = "commitizen" -version = "3.29.1" +version = "3.30.0" requires_python = ">=3.8" summary = "Python commitizen client tool" groups = ["dev"] @@ -292,8 +311,59 @@ dependencies = [ "typing-extensions<5.0.0,>=4.0.1; python_version < \"3.8\"", ] files = [ - {file = "commitizen-3.29.1-py3-none-any.whl", hash = "sha256:83f6563fae6a6262238e4424c55db5743eaa9827d2044dc23719466e4e78a0ca"}, - {file = "commitizen-3.29.1.tar.gz", hash = "sha256:b9a56190f4f3b20c73600e5ba448c7b81e0e6f87be3092aec1db4de75bf0fa91"}, + {file = "commitizen-3.30.0-py3-none-any.whl", hash = "sha256:8dc226a136aee61207e396101fcd89e73de67a57c06e066db982310863caaf65"}, + {file = "commitizen-3.30.0.tar.gz", hash = "sha256:ae67a47c1a700b4f35ac12de0c35c7ba96f152b9377d22b6226bb87372c527b0"}, +] + +[[package]] +name = "contourpy" +version = "1.3.0" +requires_python = ">=3.9" +summary = "Python library for calculating contours of 2D quadrilateral grids" +groups = ["llm"] +dependencies = [ + "numpy>=1.23", +] +files = [ + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, ] [[package]] @@ -433,41 +503,29 @@ files = [ ] [[package]] -name = "damavand" -version = "0.0.0" -requires_python = ">=3.11.0" -path = "./." -summary = "Damavand is an opinionated cloud-agnostic pythonic implementation of ARC design pattern for developing cloud-native applications." -groups = ["default"] -dependencies = [ - "boto3>=1.34.147", - "flask>=3.0.3", - "psutil>=6.0.0", - "pulumi-aws>=6.47.0", - "pulumi-azure-native>=2.51.0", - "pulumi-random>=4.16.3", - "pulumi>=3.127.0", - "rich>=13.7.1", - "sparkle @ git+https://github.com/DataChefHQ/sparkle.git@v0.6.1", +name = "cycler" +version = "0.12.1" +requires_python = ">=3.8" +summary = "Composable style cycles" +groups = ["llm"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] [[package]] -name = "debugpy" -version = "1.8.6" -requires_python = ">=3.8" -summary = "An implementation of the Debug Adapter Protocol for Python" -groups = ["default"] +name = "databricks-sdk" +version = "0.36.0" +requires_python = ">=3.7" +summary = "Databricks SDK for Python (Beta)" +groups = ["llm"] +dependencies = [ + "google-auth~=2.0", + "requests<3,>=2.28.1", +] files = [ - {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, - {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, - {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, - {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, - {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, - {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, - {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, - {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, - {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, - {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, + {file = "databricks_sdk-0.36.0-py3-none-any.whl", hash = "sha256:e6105a2752c7980de35f7c7e3c4d63389c0763c9ef7bf7e2813e464acef907e9"}, + {file = "databricks_sdk-0.36.0.tar.gz", hash = "sha256:d8c46348cbd3e0b56991a6b7a59d7a6e0437947f6387bef832e6fe092e2dd427"}, ] [[package]] @@ -481,12 +539,26 @@ files = [ {file = "decli-0.6.2.tar.gz", hash = "sha256:36f71eb55fd0093895efb4f416ec32b7f6e00147dda448e3365cf73ceab42d6f"}, ] +[[package]] +name = "deprecated" +version = "1.2.14" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Python @deprecated decorator to deprecate old python classes, functions or methods." +groups = ["llm"] +dependencies = [ + "wrapt<2,>=1.10", +] +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + [[package]] name = "dill" version = "0.3.9" requires_python = ">=3.8" summary = "serialize all of Python" -groups = ["default", "llm"] +groups = ["llm"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -527,7 +599,7 @@ name = "flask" version = "3.0.3" requires_python = ">=3.8" summary = "A simple framework for building complex web applications." -groups = ["default"] +groups = ["llm"] dependencies = [ "Jinja2>=3.1.2", "Werkzeug>=3.0.0", @@ -541,6 +613,84 @@ files = [ {file = "flask-3.0.3.tar.gz", hash = "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842"}, ] +[[package]] +name = "fonttools" +version = "4.54.1" +requires_python = ">=3.8" +summary = "Tools to manipulate font files" +groups = ["llm"] +files = [ + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, +] + +[[package]] +name = "gitdb" +version = "4.0.11" +requires_python = ">=3.7" +summary = "Git Object Database" +groups = ["llm"] +dependencies = [ + "smmap<6,>=3.0.1", +] +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[[package]] +name = "gitpython" +version = "3.1.43" +requires_python = ">=3.7" +summary = "GitPython is a Python library used to interact with Git repositories" +groups = ["llm"] +dependencies = [ + "gitdb<5,>=4.0.1", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"", +] +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[[package]] +name = "google-auth" +version = "2.35.0" +requires_python = ">=3.7" +summary = "Google Authentication Library" +groups = ["llm"] +dependencies = [ + "cachetools<6.0,>=2.0.0", + "pyasn1-modules>=0.2.1", + "rsa<5,>=3.1.4", +] +files = [ + {file = "google_auth-2.35.0-py2.py3-none-any.whl", hash = "sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f"}, + {file = "google_auth-2.35.0.tar.gz", hash = "sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a"}, +] + [[package]] name = "google-pasta" version = "0.2.0" @@ -555,40 +705,109 @@ files = [ ] [[package]] -name = "grpcio" -version = "1.66.2" -requires_python = ">=3.8" -summary = "HTTP/2-based RPC framework" -groups = ["default"] -files = [ - {file = "grpcio-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:2335c58560a9e92ac58ff2bc5649952f9b37d0735608242973c7a8b94a6437d8"}, - {file = "grpcio-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a3d462826f4868b442a6b8fdbe8b87b45eb4f5b5308168c156b21eca43f61c"}, - {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a9539f01cb04950fd4b5ab458e64a15f84c2acc273670072abe49a3f29bbad54"}, - {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce89f5876662f146d4c1f695dda29d4433a5d01c8681fbd2539afff535da14d4"}, - {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25a14af966438cddf498b2e338f88d1c9706f3493b1d73b93f695c99c5f0e2a"}, - {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6001e575b8bbd89eee11960bb640b6da6ae110cf08113a075f1e2051cc596cae"}, - {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ea1d062c9230278793820146c95d038dc0f468cbdd172eec3363e42ff1c7d01"}, - {file = "grpcio-1.66.2-cp311-cp311-win32.whl", hash = "sha256:38b68498ff579a3b1ee8f93a05eb48dc2595795f2f62716e797dc24774c1aaa8"}, - {file = "grpcio-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:6851de821249340bdb100df5eacfecfc4e6075fa85c6df7ee0eb213170ec8e5d"}, - {file = "grpcio-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:802d84fd3d50614170649853d121baaaa305de7b65b3e01759247e768d691ddf"}, - {file = "grpcio-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80fd702ba7e432994df208f27514280b4b5c6843e12a48759c9255679ad38db8"}, - {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:12fda97ffae55e6526825daf25ad0fa37483685952b5d0f910d6405c87e3adb6"}, - {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:950da58d7d80abd0ea68757769c9db0a95b31163e53e5bb60438d263f4bed7b7"}, - {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e636ce23273683b00410f1971d209bf3689238cf5538d960adc3cdfe80dd0dbd"}, - {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a917d26e0fe980b0ac7bfcc1a3c4ad6a9a4612c911d33efb55ed7833c749b0ee"}, - {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49f0ca7ae850f59f828a723a9064cadbed90f1ece179d375966546499b8a2c9c"}, - {file = "grpcio-1.66.2-cp312-cp312-win32.whl", hash = "sha256:31fd163105464797a72d901a06472860845ac157389e10f12631025b3e4d0453"}, - {file = "grpcio-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:ff1f7882e56c40b0d33c4922c15dfa30612f05fb785074a012f7cda74d1c3679"}, - {file = "grpcio-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:3b00efc473b20d8bf83e0e1ae661b98951ca56111feb9b9611df8efc4fe5d55d"}, - {file = "grpcio-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1caa38fb22a8578ab8393da99d4b8641e3a80abc8fd52646f1ecc92bcb8dee34"}, - {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c408f5ef75cfffa113cacd8b0c0e3611cbfd47701ca3cdc090594109b9fcbaed"}, - {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c806852deaedee9ce8280fe98955c9103f62912a5b2d5ee7e3eaa284a6d8d8e7"}, - {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f145cc21836c332c67baa6fc81099d1d27e266401565bf481948010d6ea32d46"}, - {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:73e3b425c1e155730273f73e419de3074aa5c5e936771ee0e4af0814631fb30a"}, - {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c509a4f78114cbc5f0740eb3d7a74985fd2eff022971bc9bc31f8bc93e66a3b"}, - {file = "grpcio-1.66.2-cp313-cp313-win32.whl", hash = "sha256:20657d6b8cfed7db5e11b62ff7dfe2e12064ea78e93f1434d61888834bc86d75"}, - {file = "grpcio-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:fb70487c95786e345af5e854ffec8cb8cc781bcc5df7930c4fbb7feaa72e1cdf"}, - {file = "grpcio-1.66.2.tar.gz", hash = "sha256:563588c587b75c34b928bc428548e5b00ea38c46972181a4d8b75ba7e3f24231"}, +name = "graphene" +version = "3.4.1" +summary = "GraphQL Framework for Python" +groups = ["llm"] +dependencies = [ + "graphql-core<3.3,>=3.1", + "graphql-relay<3.3,>=3.1", + "python-dateutil<3,>=2.7.0", + "typing-extensions<5,>=4.7.1", +] +files = [ + {file = "graphene-3.4.1-py2.py3-none-any.whl", hash = "sha256:ca98f853201293871cdc7f55faf2523a9bc077181fe0f4947db5a243e5c67083"}, + {file = "graphene-3.4.1.tar.gz", hash = "sha256:828a8d7b1bce450566a72cc8733716c20f3acfc659960de73dd38f46dc302040"}, +] + +[[package]] +name = "graphql-core" +version = "3.2.5" +requires_python = "<4,>=3.6" +summary = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." +groups = ["llm"] +dependencies = [ + "typing-extensions<5,>=4; python_version < \"3.10\"", +] +files = [ + {file = "graphql_core-3.2.5-py3-none-any.whl", hash = "sha256:2f150d5096448aa4f8ab26268567bbfeef823769893b39c1a2e1409590939c8a"}, + {file = "graphql_core-3.2.5.tar.gz", hash = "sha256:e671b90ed653c808715645e3998b7ab67d382d55467b7e2978549111bbabf8d5"}, +] + +[[package]] +name = "graphql-relay" +version = "3.2.0" +requires_python = ">=3.6,<4" +summary = "Relay library for graphql-core" +groups = ["llm"] +dependencies = [ + "graphql-core<3.3,>=3.2", + "typing-extensions<5,>=4.1; python_version < \"3.8\"", +] +files = [ + {file = "graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c"}, + {file = "graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5"}, +] + +[[package]] +name = "greenlet" +version = "3.1.1" +requires_python = ">=3.7" +summary = "Lightweight in-process concurrent programming" +groups = ["llm"] +marker = "(platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.13\"" +files = [ + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[[package]] +name = "gunicorn" +version = "23.0.0" +requires_python = ">=3.7" +summary = "WSGI HTTP Server for UNIX" +groups = ["llm"] +marker = "platform_system != \"Windows\"" +dependencies = [ + "importlib-metadata; python_version < \"3.8\"", + "packaging", +] +files = [ + {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, + {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, ] [[package]] @@ -633,7 +852,7 @@ name = "itsdangerous" version = "2.2.0" requires_python = ">=3.8" summary = "Safely pass data to untrusted environments and back." -groups = ["default"] +groups = ["llm"] files = [ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, @@ -644,7 +863,7 @@ name = "jinja2" version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." -groups = ["default", "dev"] +groups = ["dev", "llm"] dependencies = [ "MarkupSafe>=2.0", ] @@ -664,6 +883,17 @@ files = [ {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] +[[package]] +name = "joblib" +version = "1.4.2" +requires_python = ">=3.8" +summary = "Lightweight pipelining with Python functions" +groups = ["llm"] +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + [[package]] name = "jsonschema" version = "4.23.0" @@ -698,12 +928,98 @@ files = [ {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] +[[package]] +name = "kiwisolver" +version = "1.4.7" +requires_python = ">=3.8" +summary = "A fast implementation of the Cassowary constraint solver" +groups = ["llm"] +files = [ + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + +[[package]] +name = "mako" +version = "1.3.6" +requires_python = ">=3.8" +summary = "A super-fast templating language that borrows the best ideas from the existing templating languages." +groups = ["llm"] +dependencies = [ + "MarkupSafe>=0.9.2", +] +files = [ + {file = "Mako-1.3.6-py3-none-any.whl", hash = "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"}, + {file = "mako-1.3.6.tar.gz", hash = "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d"}, +] + +[[package]] +name = "markdown" +version = "3.7" +requires_python = ">=3.8" +summary = "Python implementation of John Gruber's Markdown." +groups = ["llm"] +dependencies = [ + "importlib-metadata>=4.4; python_version < \"3.10\"", +] +files = [ + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, +] + [[package]] name = "markdown-it-py" version = "3.0.0" requires_python = ">=3.8" summary = "Python port of markdown-it. Markdown parsing, done right!" -groups = ["default", "llm"] +groups = ["llm"] dependencies = [ "mdurl~=0.1", ] @@ -717,7 +1033,7 @@ name = "markupsafe" version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." -groups = ["default", "dev"] +groups = ["dev", "llm"] files = [ {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, @@ -742,17 +1058,118 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "matplotlib" +version = "3.9.2" +requires_python = ">=3.9" +summary = "Python plotting package" +groups = ["llm"] +dependencies = [ + "contourpy>=1.0.1", + "cycler>=0.10", + "fonttools>=4.22.0", + "importlib-resources>=3.2.0; python_version < \"3.10\"", + "kiwisolver>=1.3.1", + "numpy>=1.23", + "packaging>=20.0", + "pillow>=8", + "pyparsing>=2.3.1", + "python-dateutil>=2.7", +] +files = [ + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, +] + [[package]] name = "mdurl" version = "0.1.2" requires_python = ">=3.7" summary = "Markdown URL utilities" -groups = ["default", "llm"] +groups = ["llm"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mlflow" +version = "2.17.1" +requires_python = ">=3.8" +summary = "MLflow is an open source platform for the complete machine learning lifecycle" +groups = ["llm"] +dependencies = [ + "Flask<4", + "Jinja2<4,>=2.11; platform_system != \"Windows\"", + "Jinja2<4,>=3.0; platform_system == \"Windows\"", + "alembic!=1.10.0,<2", + "docker<8,>=4.0.0", + "graphene<4", + "gunicorn<24; platform_system != \"Windows\"", + "markdown<4,>=3.3", + "matplotlib<4", + "mlflow-skinny==2.17.1", + "numpy<3", + "pandas<3", + "pyarrow<18,>=4.0.0", + "scikit-learn<2", + "scipy<2", + "sqlalchemy<3,>=1.4.0", + "waitress<4; platform_system == \"Windows\"", +] +files = [ + {file = "mlflow-2.17.1-py3-none-any.whl", hash = "sha256:e614d0732cf95712891bfdfd92461dcf6a85d9e1899591be8399eb107eec6919"}, + {file = "mlflow-2.17.1.tar.gz", hash = "sha256:04cbec7fe79a4509d8c073ef64302b24e73cb447f5a14ad51d915bfbaa05c73b"}, +] + +[[package]] +name = "mlflow-skinny" +version = "2.17.1" +requires_python = ">=3.8" +summary = "MLflow is an open source platform for the complete machine learning lifecycle" +groups = ["llm"] +dependencies = [ + "cachetools<6,>=5.0.0", + "click<9,>=7.0", + "cloudpickle<4", + "databricks-sdk<1,>=0.20.0", + "gitpython<4,>=3.1.9", + "importlib-metadata!=4.7.0,<9,>=3.7.0", + "opentelemetry-api<3,>=1.9.0", + "opentelemetry-sdk<3,>=1.9.0", + "packaging<25", + "protobuf<6,>=3.12.0", + "pyyaml<7,>=5.1", + "requests<3,>=2.17.3", + "sqlparse<1,>=0.4.0", +] +files = [ + {file = "mlflow_skinny-2.17.1-py3-none-any.whl", hash = "sha256:656b7ccf37e7a5a00124487ad9ff1be781a041b6830ac7ae08cd594fd40b7f69"}, + {file = "mlflow_skinny-2.17.1.tar.gz", hash = "sha256:75500acab95c81aac469ed12da4a102e229b8e16757b61393080a44d45018020"}, +] + [[package]] name = "mock" version = "4.0.3" @@ -766,7 +1183,7 @@ files = [ [[package]] name = "moto" -version = "5.0.16" +version = "5.0.18" requires_python = ">=3.8" summary = "" groups = ["dev"] @@ -782,8 +1199,8 @@ dependencies = [ "xmltodict", ] files = [ - {file = "moto-5.0.16-py2.py3-none-any.whl", hash = "sha256:4ce1f34830307f7b3d553d77a7ef26066ab3b70006203d4226b048c9d11a3be4"}, - {file = "moto-5.0.16.tar.gz", hash = "sha256:f4afb176a964cd7a70da9bc5e053d43109614ce3cab26044bcbb53610435dff4"}, + {file = "moto-5.0.18-py2.py3-none-any.whl", hash = "sha256:8e25401f7d7910e19a732b417e0d503ef86cf4de9114a273dd62679a42f3be1c"}, + {file = "moto-5.0.18.tar.gz", hash = "sha256:8a7ad2f53a2e6cc9db2ff65c0e0d4b5d7e78bc00b825c9e1ff6cc394371e76e9"}, ] [[package]] @@ -804,7 +1221,7 @@ files = [ [[package]] name = "mypy" -version = "1.11.2" +version = "1.13.0" requires_python = ">=3.8" summary = "Optional static typing for Python" groups = ["dev"] @@ -814,18 +1231,23 @@ dependencies = [ "typing-extensions>=4.6.0", ] files = [ - {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, - {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, - {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, - {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, - {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, - {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, - {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [[package]] @@ -876,6 +1298,52 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] +[[package]] +name = "opentelemetry-api" +version = "1.27.0" +requires_python = ">=3.8" +summary = "OpenTelemetry Python API" +groups = ["llm"] +dependencies = [ + "deprecated>=1.2.6", + "importlib-metadata<=8.4.0,>=6.0", +] +files = [ + {file = "opentelemetry_api-1.27.0-py3-none-any.whl", hash = "sha256:953d5871815e7c30c81b56d910c707588000fff7a3ca1c73e6531911d53065e7"}, + {file = "opentelemetry_api-1.27.0.tar.gz", hash = "sha256:ed673583eaa5f81b5ce5e86ef7cdaf622f88ef65f0b9aab40b843dcae5bef342"}, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.27.0" +requires_python = ">=3.8" +summary = "OpenTelemetry Python SDK" +groups = ["llm"] +dependencies = [ + "opentelemetry-api==1.27.0", + "opentelemetry-semantic-conventions==0.48b0", + "typing-extensions>=3.7.4", +] +files = [ + {file = "opentelemetry_sdk-1.27.0-py3-none-any.whl", hash = "sha256:365f5e32f920faf0fd9e14fdfd92c086e317eaa5f860edba9cdc17a380d9197d"}, + {file = "opentelemetry_sdk-1.27.0.tar.gz", hash = "sha256:d525017dea0ccce9ba4e0245100ec46ecdc043f2d7b8315d56b19aff0904fa6f"}, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.48b0" +requires_python = ">=3.8" +summary = "OpenTelemetry Semantic Conventions" +groups = ["llm"] +dependencies = [ + "deprecated>=1.2.6", + "opentelemetry-api==1.27.0", +] +files = [ + {file = "opentelemetry_semantic_conventions-0.48b0-py3-none-any.whl", hash = "sha256:a0de9f45c413a8669788a38569c7e0a11ce6ce97861a628cca785deecdc32a1f"}, + {file = "opentelemetry_semantic_conventions-0.48b0.tar.gz", hash = "sha256:12d74983783b6878162208be57c9effcb89dc88691c64992d70bb89dc00daa1a"}, +] + [[package]] name = "packaging" version = "24.1" @@ -932,22 +1400,6 @@ files = [ {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] -[[package]] -name = "parver" -version = "0.5" -requires_python = ">=3.8" -summary = "Parse and manipulate version numbers." -groups = ["default"] -dependencies = [ - "arpeggio>=1.7", - "attrs>=19.2", - "typing-extensions; python_version < \"3.10\"", -] -files = [ - {file = "parver-0.5-py3-none-any.whl", hash = "sha256:2281b187276c8e8e3c15634f62287b2fb6fe0efe3010f739a6bd1e45fa2bf2b2"}, - {file = "parver-0.5.tar.gz", hash = "sha256:b9fde1e6bb9ce9f07e08e9c4bea8d8825c5e78e18a0052d02e02bf9517eb4777"}, -] - [[package]] name = "pathos" version = "0.3.3" @@ -980,15 +1432,66 @@ files = [ {file = "pdbpp-0.10.3.tar.gz", hash = "sha256:d9e43f4fda388eeb365f2887f4e7b66ac09dce9b6236b76f63616530e2f669f5"}, ] +[[package]] +name = "pillow" +version = "11.0.0" +requires_python = ">=3.9" +summary = "Python Imaging Library (Fork)" +groups = ["llm"] +files = [ + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, +] + [[package]] name = "pip" -version = "24.2" +version = "24.3.1" requires_python = ">=3.8" summary = "The PyPA recommended tool for installing Python packages." groups = ["dev"] files = [ - {file = "pip-24.2-py3-none-any.whl", hash = "sha256:2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2"}, - {file = "pip-24.2.tar.gz", hash = "sha256:5b5e490b5e9cb275c879595064adce9ebd31b854e3e803740b72f9ccf34a45b8"}, + {file = "pip-24.3.1-py3-none-any.whl", hash = "sha256:3790624780082365f47549d032f3770eeb2b1e8bd1f7b2e02dace1afa361b4ed"}, + {file = "pip-24.3.1.tar.gz", hash = "sha256:ebcb60557f2aefabc2e0f918751cd24ea0d56d8ec5445fe1807f1d2109660b99"}, ] [[package]] @@ -1054,7 +1557,7 @@ name = "protobuf" version = "4.25.5" requires_python = ">=3.8" summary = "" -groups = ["default", "llm"] +groups = ["llm"] files = [ {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, @@ -1067,134 +1570,81 @@ files = [ [[package]] name = "psutil" -version = "6.0.0" +version = "6.1.0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Cross-platform lib for process and system monitoring in Python." -groups = ["default", "llm"] -files = [ - {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, - {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, - {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, - {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, - {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, -] - -[[package]] -name = "pulumi" -version = "3.136.1" -requires_python = ">=3.8" -summary = "Pulumi's Python SDK" -groups = ["default"] -dependencies = [ - "debugpy~=1.8.5", - "dill~=0.3", - "grpcio~=1.66.2", - "protobuf~=4.21", - "pyyaml~=6.0", - "semver~=2.13", - "six~=1.12", -] -files = [ - {file = "pulumi-3.136.1-py3-none-any.whl", hash = "sha256:f4193733877c336332c95bd723c79faa240f2be082afbc3f4de940676d786e73"}, -] - -[[package]] -name = "pulumi-aws" -version = "6.54.1" -requires_python = ">=3.8" -summary = "A Pulumi package for creating and managing Amazon Web Services (AWS) cloud resources." -groups = ["default"] -dependencies = [ - "parver>=0.2.1", - "pulumi<4.0.0,>=3.0.0", - "semver>=2.8.1", - "typing-extensions>=4.11; python_version < \"3.11\"", -] +groups = ["llm"] files = [ - {file = "pulumi_aws-6.54.1-py3-none-any.whl", hash = "sha256:38157b7ff074c552d983f0bfa159a80a15731785d85ecddee934776eb39096d4"}, - {file = "pulumi_aws-6.54.1.tar.gz", hash = "sha256:6dd5fe2c9ce73c57297a93d2b2f52f8930c6584f3e67a597dc4e69257e9215d6"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] [[package]] -name = "pulumi-awsx" -version = "2.16.1" -requires_python = ">=3.8" -summary = "Pulumi Amazon Web Services (AWS) AWSX Components." -groups = ["default"] -dependencies = [ - "parver>=0.2.1", - "pulumi-aws<7.0.0,>=6.0.4", - "pulumi-docker<5.0.0,>=4.5.1", - "pulumi<4.0.0,>=3.134.1", - "semver>=2.8.1", - "typing-extensions>=4.11; python_version < \"3.11\"", -] +name = "py4j" +version = "0.10.9.5" +summary = "Enables Python programs to dynamically access arbitrary Java objects" +groups = ["dev"] files = [ - {file = "pulumi_awsx-2.16.1-py3-none-any.whl", hash = "sha256:6107c365dd7c02f5abe9dffc3cadaedfe9c6e4ac494a00c431d379ca8e2ed1e3"}, - {file = "pulumi_awsx-2.16.1.tar.gz", hash = "sha256:df65bee3f425bdb10c12de202a5ca2bceb1c2717e9f9510d5c8fd9113655fe32"}, + {file = "py4j-0.10.9.5-py2.py3-none-any.whl", hash = "sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04"}, + {file = "py4j-0.10.9.5.tar.gz", hash = "sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6"}, ] [[package]] -name = "pulumi-azure-native" -version = "2.64.2" +name = "pyarrow" +version = "17.0.0" requires_python = ">=3.8" -summary = "A native Pulumi package for creating and managing Azure resources." -groups = ["default"] +summary = "Python library for Apache Arrow" +groups = ["llm"] dependencies = [ - "parver>=0.2.1", - "pulumi<4.0.0,>=3.134.1", - "semver>=2.8.1", - "typing-extensions>=4.11; python_version < \"3.11\"", + "numpy>=1.16.6", ] files = [ - {file = "pulumi_azure_native-2.64.2-py3-none-any.whl", hash = "sha256:f6271e30e25c09080df3aef509607b362774d126016abfb50492c7587cfc47e8"}, - {file = "pulumi_azure_native-2.64.2.tar.gz", hash = "sha256:0adaf301dcdc06d32beb2baa86044d396f5ad69ef28789ae0143c134deb93128"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, + {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, + {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, + {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, ] [[package]] -name = "pulumi-docker" -version = "4.5.7" +name = "pyasn1" +version = "0.6.1" requires_python = ">=3.8" -summary = "A Pulumi package for interacting with Docker in Pulumi programs" -groups = ["default"] -dependencies = [ - "parver>=0.2.1", - "pulumi<4.0.0,>=3.136.0", - "semver>=2.8.1", - "typing-extensions>=4.11; python_version < \"3.11\"", -] +summary = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +groups = ["llm"] files = [ - {file = "pulumi_docker-4.5.7-py3-none-any.whl", hash = "sha256:f8bebfee982151e46f39dc52a53af1edd21658722406c3d4327824dc4f724067"}, - {file = "pulumi_docker-4.5.7.tar.gz", hash = "sha256:19f8f9dce3055abd2da2ff10b867231610880e201c98d844036d6280e81b292c"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] -name = "pulumi-random" -version = "4.16.6" +name = "pyasn1-modules" +version = "0.4.1" requires_python = ">=3.8" -summary = "A Pulumi package to safely use randomness in Pulumi programs." -groups = ["default"] +summary = "A collection of ASN.1-based protocols modules" +groups = ["llm"] dependencies = [ - "parver>=0.2.1", - "pulumi<4.0.0,>=3.0.0", - "semver>=2.8.1", + "pyasn1<0.7.0,>=0.4.6", ] files = [ - {file = "pulumi_random-4.16.6-py3-none-any.whl", hash = "sha256:369e276eb4ad1b3b24bd95341f0449f035d0e642fb4edb33d378d94be1d2c5ae"}, - {file = "pulumi_random-4.16.6.tar.gz", hash = "sha256:9aff7552f03816d3ff217073cbf07f9692587b9c0a9373c882784e8974d0ac00"}, -] - -[[package]] -name = "py4j" -version = "0.10.9.5" -summary = "Enables Python programs to dynamically access arbitrary Java objects" -groups = ["dev"] -files = [ - {file = "py4j-0.10.9.5-py2.py3-none-any.whl", hash = "sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04"}, - {file = "py4j-0.10.9.5.tar.gz", hash = "sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6"}, + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, ] [[package]] @@ -1280,12 +1730,23 @@ name = "pygments" version = "2.18.0" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." -groups = ["default", "dev", "llm"] +groups = ["dev", "llm"] files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] +[[package]] +name = "pyparsing" +version = "3.2.0" +requires_python = ">=3.9" +summary = "pyparsing module - Classes and methods to define and execute parsing grammars" +groups = ["llm"] +files = [ + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, +] + [[package]] name = "pyreadline" version = "2.1" @@ -1307,7 +1768,7 @@ files = [ [[package]] name = "pyright" -version = "1.1.383" +version = "1.1.386" requires_python = ">=3.7" summary = "Command line wrapper for pyright" groups = ["dev"] @@ -1316,8 +1777,8 @@ dependencies = [ "typing-extensions>=4.1", ] files = [ - {file = "pyright-1.1.383-py3-none-any.whl", hash = "sha256:d864d1182a313f45aaf99e9bfc7d2668eeabc99b29a556b5344894fd73cb1959"}, - {file = "pyright-1.1.383.tar.gz", hash = "sha256:1df7f12407f3710c9c6df938d98ec53f70053e6c6bbf71ce7bcb038d42f10070"}, + {file = "pyright-1.1.386-py3-none-any.whl", hash = "sha256:7071ac495593b2258ccdbbf495f1a5c0e5f27951f6b429bed4e8b296eb5cd21d"}, + {file = "pyright-1.1.386.tar.gz", hash = "sha256:8e9975e34948ba5f8e07792a9c9d2bdceb2c6c0b61742b068d2229ca2bc4a9d9"}, ] [[package]] @@ -1437,7 +1898,7 @@ name = "pyyaml" version = "6.0.2" requires_python = ">=3.8" summary = "YAML parser and emitter for Python" -groups = ["default", "dev", "llm"] +groups = ["dev", "llm"] files = [ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, @@ -1533,18 +1994,18 @@ files = [ [[package]] name = "rich" -version = "13.9.1" +version = "13.9.3" requires_python = ">=3.8.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -groups = ["default", "llm"] +groups = ["llm"] dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", "typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"", ] files = [ - {file = "rich-13.9.1-py3-none-any.whl", hash = "sha256:b340e739f30aa58921dc477b8adaa9ecdb7cecc217be01d93730ee1bc8aa83be"}, - {file = "rich-13.9.1.tar.gz", hash = "sha256:097cffdf85db1babe30cc7deba5ab3a29e1b9885047dab24c57e9a7f8a9c1466"}, + {file = "rich-13.9.3-py3-none-any.whl", hash = "sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283"}, + {file = "rich-13.9.3.tar.gz", hash = "sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e"}, ] [[package]] @@ -1596,6 +2057,20 @@ files = [ {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] +[[package]] +name = "rsa" +version = "4.9" +requires_python = ">=3.6,<4" +summary = "Pure-Python RSA implementation" +groups = ["llm"] +dependencies = [ + "pyasn1>=0.1.3", +] +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + [[package]] name = "s3transfer" version = "0.10.2" @@ -1612,7 +2087,7 @@ files = [ [[package]] name = "sagemaker" -version = "2.232.1" +version = "2.232.2" requires_python = ">=3.8" summary = "Open source library for training and deploying models on Amazon SageMaker." groups = ["llm"] @@ -1634,6 +2109,7 @@ dependencies = [ "pyyaml~=6.0", "requests", "sagemaker-core<2.0.0,>=1.0.0", + "sagemaker-mlflow", "schema", "smdebug-rulesconfig==1.0.1", "tblib<4,>=1.7.0", @@ -1641,8 +2117,8 @@ dependencies = [ "urllib3<3.0.0,>=1.26.8", ] files = [ - {file = "sagemaker-2.232.1-py3-none-any.whl", hash = "sha256:64b92639918613b8042ddbc13f34cfac65145d916ff0c0001b249f9f33012cb1"}, - {file = "sagemaker-2.232.1.tar.gz", hash = "sha256:e59e1ac79bc31235b8d5c766abee5c6b2fd526814d1dde62b98e7dca9654503c"}, + {file = "sagemaker-2.232.2-py3-none-any.whl", hash = "sha256:49afdb0d83635bb71c5177e5ca6fb0b2dca804fa3c3f115f74dac88b77238f2f"}, + {file = "sagemaker-2.232.2.tar.gz", hash = "sha256:96732fc6986ad5b723b05bac5d5ee8e4594e51c6c65c0cc0d07c0dbef69e82b7"}, ] [[package]] @@ -1666,6 +2142,21 @@ files = [ {file = "sagemaker_core-1.0.9.tar.gz", hash = "sha256:664115faf797412553fb81b97a4777e78e51dfd4454c32edb2c8371bf203c535"}, ] +[[package]] +name = "sagemaker-mlflow" +version = "0.1.0" +requires_python = ">=3.8" +summary = "AWS Plugin for MLFlow with SageMaker" +groups = ["llm"] +dependencies = [ + "boto3>=1.34", + "mlflow>=2.8", +] +files = [ + {file = "sagemaker_mlflow-0.1.0-py3-none-any.whl", hash = "sha256:b0dc955e2898de2070b489e982372edafc0ec708634a2e69c21e2570d7308b0c"}, + {file = "sagemaker_mlflow-0.1.0.tar.gz", hash = "sha256:1fe8f7f010f7c68b6b0b46c032cf6a414f20adfc26cbc6a731d3a91b32b9b84f"}, +] + [[package]] name = "schema" version = "0.7.7" @@ -1680,14 +2171,71 @@ files = [ ] [[package]] -name = "semver" -version = "2.13.0" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -summary = "Python helper for Semantic Versioning (http://semver.org/)" -groups = ["default"] -files = [ - {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, - {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +name = "scikit-learn" +version = "1.5.2" +requires_python = ">=3.9" +summary = "A set of python modules for machine learning and data mining" +groups = ["llm"] +dependencies = [ + "joblib>=1.2.0", + "numpy>=1.19.5", + "scipy>=1.6.0", + "threadpoolctl>=3.1.0", +] +files = [ + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, + {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, +] + +[[package]] +name = "scipy" +version = "1.14.1" +requires_python = ">=3.10" +summary = "Fundamental algorithms for scientific computing in Python" +groups = ["llm"] +dependencies = [ + "numpy<2.3,>=1.23.5", +] +files = [ + {file = "scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2"}, + {file = "scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2"}, + {file = "scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066"}, + {file = "scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1"}, + {file = "scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e"}, + {file = "scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06"}, + {file = "scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84"}, + {file = "scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417"}, ] [[package]] @@ -1713,14 +2261,66 @@ files = [ ] [[package]] -name = "sparkle" -version = "0.6.1" -requires_python = "<4.0,>=3.10.14" -git = "https://github.com/DataChefHQ/sparkle.git" -ref = "v0.6.1" -revision = "7c59a62035142b51af8477f62829be46fa214b43" -summary = "" -groups = ["default"] +name = "smmap" +version = "5.0.1" +requires_python = ">=3.7" +summary = "A pure Python implementation of a sliding window memory map manager" +groups = ["llm"] +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.36" +requires_python = ">=3.7" +summary = "Database Abstraction Library" +groups = ["llm"] +dependencies = [ + "greenlet!=0.4.17; (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.13\"", + "importlib-metadata; python_version < \"3.8\"", + "typing-extensions>=4.6.0", +] +files = [ + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, +] + +[[package]] +name = "sqlparse" +version = "0.5.1" +requires_python = ">=3.8" +summary = "A non-validating SQL parser." +groups = ["llm"] +files = [ + {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, + {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, +] [[package]] name = "tblib" @@ -1744,6 +2344,17 @@ files = [ {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, ] +[[package]] +name = "threadpoolctl" +version = "3.5.0" +requires_python = ">=3.8" +summary = "threadpoolctl" +groups = ["llm"] +files = [ + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, +] + [[package]] name = "tomlkit" version = "0.13.2" @@ -1824,6 +2435,18 @@ files = [ {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] +[[package]] +name = "waitress" +version = "3.0.0" +requires_python = ">=3.8.0" +summary = "Waitress WSGI server" +groups = ["llm"] +marker = "platform_system == \"Windows\"" +files = [ + {file = "waitress-3.0.0-py3-none-any.whl", hash = "sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669"}, + {file = "waitress-3.0.0.tar.gz", hash = "sha256:005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1"}, +] + [[package]] name = "wcwidth" version = "0.2.13" @@ -1842,7 +2465,7 @@ name = "werkzeug" version = "3.0.4" requires_python = ">=3.8" summary = "The comprehensive WSGI web application library." -groups = ["default", "dev"] +groups = ["dev", "llm"] dependencies = [ "MarkupSafe>=2.1.1", ] @@ -1865,6 +2488,37 @@ files = [ {file = "wmctrl-0.5.tar.gz", hash = "sha256:7839a36b6fe9e2d6fd22304e5dc372dbced2116ba41283ea938b2da57f53e962"}, ] +[[package]] +name = "wrapt" +version = "1.16.0" +requires_python = ">=3.6" +summary = "Module for decorators, wrappers and monkey patching." +groups = ["llm"] +files = [ + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + [[package]] name = "xmltodict" version = "0.13.0" diff --git a/pyproject.toml b/pyproject.toml index 132da79..cc36d1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,16 +5,7 @@ authors = [ {name = "Kiarash Kiani", email = "kiarash@datachef.co"}, ] dependencies = [ - "rich>=13.7.1", "boto3>=1.34.147", - "psutil>=6.0.0", - "flask>=3.0.3", - "pulumi>=3.127.0", - "pulumi-aws>=6.47.0", - "pulumi-azure-native>=2.51.0", - "pulumi-random>=4.16.3", - "sparkle @ git+https://github.com/DataChefHQ/sparkle.git@v0.6.1", - "pulumi-awsx>=2.16.1", ] requires-python = ">=3.11.0" readme = "README.md" @@ -23,9 +14,19 @@ dynamic = ["version"] [project.optional-dependencies] +build = [ + "pulumi>=3.127.0", + "pulumi-aws>=6.47.0", + "pulumi-azure-native>=2.51.0", + "pulumi-random>=4.16.3", + "pulumi-awsx>=2.16.1", +] llm = [ "sagemaker>=2.232.0", ] +sparkle = [ + "sparkle @ git+https://github.com/DataChefHQ/sparkle.git@v0.6.1", +] [tool.pdm] distribution = false path = "src/damavand/__init__.py" From 7d7b27433c2db079eb848cf706ecb375aa63e431 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Mon, 28 Oct 2024 14:49:36 +0100 Subject: [PATCH 10/24] fix(core): seprating run/build time dependencies --- src/damavand/base/controllers/base_controller.py | 9 +-------- src/damavand/base/controllers/llm.py | 1 + src/damavand/base/resource.py | 8 ++++++++ src/damavand/cloud/aws/controllers/llm.py | 15 +++++++-------- 4 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 src/damavand/base/resource.py diff --git a/src/damavand/base/controllers/base_controller.py b/src/damavand/base/controllers/base_controller.py index 40860d7..bc29541 100644 --- a/src/damavand/base/controllers/base_controller.py +++ b/src/damavand/base/controllers/base_controller.py @@ -1,9 +1,8 @@ import logging from functools import cache -from pulumi import Resource as PulumiResource -import pulumi from damavand import utils +from damavand.base.resource import PulumiResource from damavand.environment import Environment @@ -48,12 +47,6 @@ def __init__( self.extra_args = kwargs self._pulumi_object = None - @property - @buildtime - @cache - def build_config(self) -> pulumi.Config: - return pulumi.Config() - @buildtime @cache def resource(self) -> PulumiResource: diff --git a/src/damavand/base/controllers/llm.py b/src/damavand/base/controllers/llm.py index 92be889..97ef162 100644 --- a/src/damavand/base/controllers/llm.py +++ b/src/damavand/base/controllers/llm.py @@ -83,6 +83,7 @@ def chat_completions_url(self) -> str: @cache def client(self) -> "openai.OpenAI": # type: ignore # noqa """Return an OpenAI client as an standared interface for interacting with deployed LLM APIs.""" + # FIXME: the openai package must be installed via llm group. This is a temporary solution. try: import openai # type: ignore # noqa diff --git a/src/damavand/base/resource.py b/src/damavand/base/resource.py new file mode 100644 index 0000000..2c18f04 --- /dev/null +++ b/src/damavand/base/resource.py @@ -0,0 +1,8 @@ +from typing import NewType +from damavand.utils import is_building + + +if is_building(): + from pulumi import Resource as PulumiResource +else: + PulumiResource = NewType("PulumiResource", None) diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index 60118c6..4238109 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -4,16 +4,10 @@ import boto3 from botocore.exceptions import ClientError -import pulumi_aws as aws -from pulumi import Resource as PulumiResource +from damavand.base.resource import PulumiResource from damavand.base.controllers.llm import LlmController from damavand.base.controllers.base_controller import runtime, buildtime -from damavand.cloud.aws.resources.llm_app_component import ( - AwsLlmAppComponent, - AwsServerlessPythonComponentArgs, - AwsVllmComponentArgs, -) from damavand.errors import RuntimeException @@ -108,6 +102,11 @@ def default_api_key(self) -> str: @cache def resource(self) -> PulumiResource: """Creates the necessary IaC resources for serving the LLM and hosting the python application.""" + from damavand.cloud.aws.resources.llm_app_component import ( + AwsLlmAppComponent, + AwsServerlessPythonComponentArgs, + AwsVllmComponentArgs, + ) return AwsLlmAppComponent( name=self.name, @@ -118,7 +117,7 @@ def resource(self) -> PulumiResource: endpoint_ssm_parameter_name=self._base_url_ssm_name, ), AwsServerlessPythonComponentArgs( - python_version=aws.lambda_.Runtime.PYTHON3D11, + python_version="python3.11", ), ), ) From d667a7de7d97dddd8ecdc49e75b2cd5782059f20 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Mon, 28 Oct 2024 16:22:17 +0100 Subject: [PATCH 11/24] refactor(llm): revert back python serverless to lambda layer --- pdm.lock | 699 ++++++++++++------ pyproject.toml | 3 +- .../base/controllers/base_controller.py | 3 +- src/damavand/base/resource.py | 8 - src/damavand/cloud/aws/controllers/llm.py | 8 +- .../resources/serverless_python_component.py | 83 ++- 6 files changed, 529 insertions(+), 275 deletions(-) delete mode 100644 src/damavand/base/resource.py diff --git a/pdm.lock b/pdm.lock index 2e3bd42..e15b64b 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,10 +2,10 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "dev", "llm"] +groups = ["default", "build", "dev", "llm"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:0dda884729e24b8641bf943eb76b874dd9ac7dada21dce5833d7a81e9b023759" +content_hash = "sha256:b70d0ecbbcec6e9f51e403f3c14a426fbb98ddfd80a4c16f165e609bf6d2a8d8" [[metadata.targets]] requires_python = ">=3.11.0" @@ -44,13 +44,23 @@ files = [ [[package]] name = "argcomplete" -version = "3.5.0" +version = "3.5.1" requires_python = ">=3.8" summary = "Bash tab completion for argparse" groups = ["dev"] files = [ - {file = "argcomplete-3.5.0-py3-none-any.whl", hash = "sha256:d4bcf3ff544f51e16e54228a7ac7f486ed70ebf2ecfe49a63a91171c76bf029b"}, - {file = "argcomplete-3.5.0.tar.gz", hash = "sha256:4349400469dccfb7950bb60334a680c58d88699bff6159df61251878dc6bf74b"}, + {file = "argcomplete-3.5.1-py3-none-any.whl", hash = "sha256:1a1d148bdaa3e3b93454900163403df41448a248af01b6e849edc5ac08e6c363"}, + {file = "argcomplete-3.5.1.tar.gz", hash = "sha256:eb1ee355aa2557bd3d0145de7b06b2a45b0ce461e1e7813f5d066039ab4177b4"}, +] + +[[package]] +name = "arpeggio" +version = "2.0.2" +summary = "Packrat parser interpreter" +groups = ["build"] +files = [ + {file = "Arpeggio-2.0.2-py2.py3-none-any.whl", hash = "sha256:f7c8ae4f4056a89e020c24c7202ac8df3e2bc84e416746f20b0da35bb1de0250"}, + {file = "Arpeggio-2.0.2.tar.gz", hash = "sha256:c790b2b06e226d2dd468e4fbfb5b7f506cec66416031fde1441cf1de2a0ba700"}, ] [[package]] @@ -58,7 +68,7 @@ name = "attrs" version = "23.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" -groups = ["dev", "llm"] +groups = ["build", "dev", "llm"] dependencies = [ "importlib-metadata; python_version < \"3.8\"", ] @@ -129,7 +139,7 @@ files = [ [[package]] name = "botocore-stubs" -version = "1.35.31" +version = "1.35.49" requires_python = ">=3.8" summary = "Type annotations and code completion for botocore" groups = ["dev"] @@ -138,8 +148,8 @@ dependencies = [ "typing-extensions>=4.1.0; python_version < \"3.9\"", ] files = [ - {file = "botocore_stubs-1.35.31-py3-none-any.whl", hash = "sha256:b7289c27b759dad40759c1421519cbd7ec65b79f7aa8be5dfc76004a61aef42b"}, - {file = "botocore_stubs-1.35.31.tar.gz", hash = "sha256:b26f79253d8f2460aa8f2d49ae933c3f352fe38be72ea033651c15cd47a822a9"}, + {file = "botocore_stubs-1.35.49-py3-none-any.whl", hash = "sha256:367ce067e003de7e9b76320f551ba4fc8369a4b7ef10210f6071d3593fea2605"}, + {file = "botocore_stubs-1.35.49.tar.gz", hash = "sha256:c5006e31d77e290eca215e6a71292ea7b029b54900310ed0f87da8e844f1db38"}, ] [[package]] @@ -214,43 +224,58 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." groups = ["dev", "llm"] files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -368,112 +393,112 @@ files = [ [[package]] name = "coverage" -version = "7.6.1" -requires_python = ">=3.8" +version = "7.6.4" +requires_python = ">=3.9" summary = "Code coverage measurement for Python" groups = ["dev"] files = [ - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.4" extras = ["toml"] -requires_python = ">=3.8" +requires_python = ">=3.9" summary = "Code coverage measurement for Python" groups = ["dev"] dependencies = [ - "coverage==7.6.1", + "coverage==7.6.4", "tomli; python_full_version <= \"3.11.0a6\"", ] files = [ - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [[package]] name = "cryptography" -version = "43.0.1" +version = "43.0.3" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["dev"] @@ -481,25 +506,25 @@ dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] files = [ - {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, - {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, - {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, - {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, - {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, - {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, - {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [[package]] @@ -528,6 +553,29 @@ files = [ {file = "databricks_sdk-0.36.0.tar.gz", hash = "sha256:d8c46348cbd3e0b56991a6b7a59d7a6e0437947f6387bef832e6fe092e2dd427"}, ] +[[package]] +name = "debugpy" +version = "1.8.7" +requires_python = ">=3.8" +summary = "An implementation of the Debug Adapter Protocol for Python" +groups = ["build"] +files = [ + {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, + {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, + {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, + {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, + {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, + {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, + {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, + {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, + {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, + {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, + {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, + {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, +] + [[package]] name = "decli" version = "0.6.2" @@ -558,7 +606,7 @@ name = "dill" version = "0.3.9" requires_python = ">=3.8" summary = "serialize all of Python" -groups = ["llm"] +groups = ["build", "llm"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -794,6 +842,43 @@ files = [ {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] +[[package]] +name = "grpcio" +version = "1.66.2" +requires_python = ">=3.8" +summary = "HTTP/2-based RPC framework" +groups = ["build"] +files = [ + {file = "grpcio-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:2335c58560a9e92ac58ff2bc5649952f9b37d0735608242973c7a8b94a6437d8"}, + {file = "grpcio-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a3d462826f4868b442a6b8fdbe8b87b45eb4f5b5308168c156b21eca43f61c"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a9539f01cb04950fd4b5ab458e64a15f84c2acc273670072abe49a3f29bbad54"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce89f5876662f146d4c1f695dda29d4433a5d01c8681fbd2539afff535da14d4"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25a14af966438cddf498b2e338f88d1c9706f3493b1d73b93f695c99c5f0e2a"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6001e575b8bbd89eee11960bb640b6da6ae110cf08113a075f1e2051cc596cae"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ea1d062c9230278793820146c95d038dc0f468cbdd172eec3363e42ff1c7d01"}, + {file = "grpcio-1.66.2-cp311-cp311-win32.whl", hash = "sha256:38b68498ff579a3b1ee8f93a05eb48dc2595795f2f62716e797dc24774c1aaa8"}, + {file = "grpcio-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:6851de821249340bdb100df5eacfecfc4e6075fa85c6df7ee0eb213170ec8e5d"}, + {file = "grpcio-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:802d84fd3d50614170649853d121baaaa305de7b65b3e01759247e768d691ddf"}, + {file = "grpcio-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80fd702ba7e432994df208f27514280b4b5c6843e12a48759c9255679ad38db8"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:12fda97ffae55e6526825daf25ad0fa37483685952b5d0f910d6405c87e3adb6"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:950da58d7d80abd0ea68757769c9db0a95b31163e53e5bb60438d263f4bed7b7"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e636ce23273683b00410f1971d209bf3689238cf5538d960adc3cdfe80dd0dbd"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a917d26e0fe980b0ac7bfcc1a3c4ad6a9a4612c911d33efb55ed7833c749b0ee"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49f0ca7ae850f59f828a723a9064cadbed90f1ece179d375966546499b8a2c9c"}, + {file = "grpcio-1.66.2-cp312-cp312-win32.whl", hash = "sha256:31fd163105464797a72d901a06472860845ac157389e10f12631025b3e4d0453"}, + {file = "grpcio-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:ff1f7882e56c40b0d33c4922c15dfa30612f05fb785074a012f7cda74d1c3679"}, + {file = "grpcio-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:3b00efc473b20d8bf83e0e1ae661b98951ca56111feb9b9611df8efc4fe5d55d"}, + {file = "grpcio-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1caa38fb22a8578ab8393da99d4b8641e3a80abc8fd52646f1ecc92bcb8dee34"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c408f5ef75cfffa113cacd8b0c0e3611cbfd47701ca3cdc090594109b9fcbaed"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c806852deaedee9ce8280fe98955c9103f62912a5b2d5ee7e3eaa284a6d8d8e7"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f145cc21836c332c67baa6fc81099d1d27e266401565bf481948010d6ea32d46"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:73e3b425c1e155730273f73e419de3074aa5c5e936771ee0e4af0814631fb30a"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c509a4f78114cbc5f0740eb3d7a74985fd2eff022971bc9bc31f8bc93e66a3b"}, + {file = "grpcio-1.66.2-cp313-cp313-win32.whl", hash = "sha256:20657d6b8cfed7db5e11b62ff7dfe2e12064ea78e93f1434d61888834bc86d75"}, + {file = "grpcio-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:fb70487c95786e345af5e854ffec8cb8cc781bcc5df7930c4fbb7feaa72e1cdf"}, + {file = "grpcio-1.66.2.tar.gz", hash = "sha256:563588c587b75c34b928bc428548e5b00ea38c46972181a4d8b75ba7e3f24231"}, +] + [[package]] name = "gunicorn" version = "23.0.0" @@ -915,17 +1000,16 @@ files = [ [[package]] name = "jsonschema-specifications" -version = "2023.12.1" -requires_python = ">=3.8" +version = "2024.10.1" +requires_python = ">=3.9" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" groups = ["llm"] dependencies = [ - "importlib-resources>=1.4.0; python_version < \"3.9\"", "referencing>=0.31.0", ] files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [[package]] @@ -1030,32 +1114,52 @@ files = [ [[package]] name = "markupsafe" -version = "2.1.5" -requires_python = ">=3.7" +version = "3.0.2" +requires_python = ">=3.9" summary = "Safely add untrusted strings to HTML/XML markup." groups = ["dev", "llm"] files = [ - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -1400,6 +1504,22 @@ files = [ {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] +[[package]] +name = "parver" +version = "0.5" +requires_python = ">=3.8" +summary = "Parse and manipulate version numbers." +groups = ["build"] +dependencies = [ + "arpeggio>=1.7", + "attrs>=19.2", + "typing-extensions; python_version < \"3.10\"", +] +files = [ + {file = "parver-0.5-py3-none-any.whl", hash = "sha256:2281b187276c8e8e3c15634f62287b2fb6fe0efe3010f739a6bd1e45fa2bf2b2"}, + {file = "parver-0.5.tar.gz", hash = "sha256:b9fde1e6bb9ce9f07e08e9c4bea8d8825c5e78e18a0052d02e02bf9517eb4777"}, +] + [[package]] name = "pathos" version = "0.3.3" @@ -1557,7 +1677,7 @@ name = "protobuf" version = "4.25.5" requires_python = ">=3.8" summary = "" -groups = ["llm"] +groups = ["build", "llm"] files = [ {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, @@ -1586,13 +1706,125 @@ files = [ ] [[package]] -name = "py4j" -version = "0.10.9.5" -summary = "Enables Python programs to dynamically access arbitrary Java objects" -groups = ["dev"] +name = "pulumi" +version = "3.137.0" +requires_python = ">=3.8" +summary = "Pulumi's Python SDK" +groups = ["build"] +dependencies = [ + "debugpy~=1.8.7", + "dill~=0.3", + "grpcio~=1.66.2", + "protobuf~=4.21", + "pyyaml~=6.0", + "semver~=2.13", + "six~=1.12", +] files = [ - {file = "py4j-0.10.9.5-py2.py3-none-any.whl", hash = "sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04"}, - {file = "py4j-0.10.9.5.tar.gz", hash = "sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6"}, + {file = "pulumi-3.137.0-py3-none-any.whl", hash = "sha256:d6f170f5fba3d55fb6bc021f1f397310972551ffd21b75f65a92fa6dcf49740b"}, +] + +[[package]] +name = "pulumi-aws" +version = "6.56.1" +requires_python = ">=3.8" +summary = "A Pulumi package for creating and managing Amazon Web Services (AWS) cloud resources." +groups = ["build"] +dependencies = [ + "parver>=0.2.1", + "pulumi<4.0.0,>=3.136.0", + "semver>=2.8.1", + "typing-extensions>=4.11; python_version < \"3.11\"", +] +files = [ + {file = "pulumi_aws-6.56.1-py3-none-any.whl", hash = "sha256:6bb23824a2d11bb5011752d3d707e6640204d08713f813fbb874c6a87161d702"}, + {file = "pulumi_aws-6.56.1.tar.gz", hash = "sha256:16f3af995d66ac8488465377e1a6d5ab30c8b2346a50e06f80355e9a13f3e6cd"}, +] + +[[package]] +name = "pulumi-awsx" +version = "2.16.1" +requires_python = ">=3.8" +summary = "Pulumi Amazon Web Services (AWS) AWSX Components." +groups = ["build"] +dependencies = [ + "parver>=0.2.1", + "pulumi-aws<7.0.0,>=6.0.4", + "pulumi-docker<5.0.0,>=4.5.1", + "pulumi<4.0.0,>=3.134.1", + "semver>=2.8.1", + "typing-extensions>=4.11; python_version < \"3.11\"", +] +files = [ + {file = "pulumi_awsx-2.16.1-py3-none-any.whl", hash = "sha256:6107c365dd7c02f5abe9dffc3cadaedfe9c6e4ac494a00c431d379ca8e2ed1e3"}, + {file = "pulumi_awsx-2.16.1.tar.gz", hash = "sha256:df65bee3f425bdb10c12de202a5ca2bceb1c2717e9f9510d5c8fd9113655fe32"}, +] + +[[package]] +name = "pulumi-azure-native" +version = "2.68.0" +requires_python = ">=3.8" +summary = "A native Pulumi package for creating and managing Azure resources." +groups = ["build"] +dependencies = [ + "parver>=0.2.1", + "pulumi<4.0.0,>=3.136.0", + "semver>=2.8.1", + "typing-extensions>=4.11; python_version < \"3.11\"", +] +files = [ + {file = "pulumi_azure_native-2.68.0-py3-none-any.whl", hash = "sha256:688d2b8b668721ef0d1903db21ffc039e76acfdb062ff2150f72685facb00409"}, + {file = "pulumi_azure_native-2.68.0.tar.gz", hash = "sha256:744b881c79783fc55f3c35b7a0b841abab22711b058a09feeed11efc5c0d3e09"}, +] + +[[package]] +name = "pulumi-command" +version = "1.0.1" +requires_python = ">=3.8" +summary = "The Pulumi Command Provider enables you to execute commands and scripts either locally or remotely as part of the Pulumi resource model." +groups = ["build"] +dependencies = [ + "parver>=0.2.1", + "pulumi<4.0.0,>=3.0.0", + "semver>=2.8.1", +] +files = [ + {file = "pulumi_command-1.0.1-py3-none-any.whl", hash = "sha256:672cdea9c0ced0f79ed47e578267a2b2160dcf88626dde34ee96f5524a003574"}, + {file = "pulumi_command-1.0.1.tar.gz", hash = "sha256:58e123707956aa7a9be2ce89c009642539cde5d9fa02e1e10501662600894843"}, +] + +[[package]] +name = "pulumi-docker" +version = "4.5.7" +requires_python = ">=3.8" +summary = "A Pulumi package for interacting with Docker in Pulumi programs" +groups = ["build"] +dependencies = [ + "parver>=0.2.1", + "pulumi<4.0.0,>=3.136.0", + "semver>=2.8.1", + "typing-extensions>=4.11; python_version < \"3.11\"", +] +files = [ + {file = "pulumi_docker-4.5.7-py3-none-any.whl", hash = "sha256:f8bebfee982151e46f39dc52a53af1edd21658722406c3d4327824dc4f724067"}, + {file = "pulumi_docker-4.5.7.tar.gz", hash = "sha256:19f8f9dce3055abd2da2ff10b867231610880e201c98d844036d6280e81b292c"}, +] + +[[package]] +name = "pulumi-random" +version = "4.16.7" +requires_python = ">=3.8" +summary = "A Pulumi package to safely use randomness in Pulumi programs." +groups = ["build"] +dependencies = [ + "parver>=0.2.1", + "pulumi<4.0.0,>=3.136.0", + "semver>=2.8.1", + "typing-extensions>=4.11; python_version < \"3.11\"", +] +files = [ + {file = "pulumi_random-4.16.7-py3-none-any.whl", hash = "sha256:bcb3e81c3d56cfd21dd6b14629430224e8d32197d489b567027f0782d0086359"}, + {file = "pulumi_random-4.16.7.tar.gz", hash = "sha256:d7d6a23fdfc06dad1c087eadf084005acda1c6935be260bc99dae8d03e5627d7"}, ] [[package]] @@ -1781,19 +2013,6 @@ files = [ {file = "pyright-1.1.386.tar.gz", hash = "sha256:8e9975e34948ba5f8e07792a9c9d2bdceb2c6c0b61742b068d2229ca2bc4a9d9"}, ] -[[package]] -name = "pyspark" -version = "3.3.2" -requires_python = ">=3.7" -summary = "Apache Spark Python API" -groups = ["dev"] -dependencies = [ - "py4j==0.10.9.5", -] -files = [ - {file = "pyspark-3.3.2.tar.gz", hash = "sha256:0dfd5db4300c1f6cc9c16d8dbdfb82d881b4b172984da71344ede1a9d4893da8"}, -] - [[package]] name = "pytest" version = "8.3.3" @@ -1880,17 +2099,20 @@ files = [ [[package]] name = "pywin32" -version = "306" +version = "308" summary = "Python for Window Extensions" groups = ["llm"] marker = "sys_platform == \"win32\"" files = [ - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, ] [[package]] @@ -1898,7 +2120,7 @@ name = "pyyaml" version = "6.0.2" requires_python = ">=3.8" summary = "YAML parser and emitter for Python" -groups = ["dev", "llm"] +groups = ["build", "dev", "llm"] files = [ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, @@ -2073,7 +2295,7 @@ files = [ [[package]] name = "s3transfer" -version = "0.10.2" +version = "0.10.3" requires_python = ">=3.8" summary = "An Amazon S3 Transfer Manager" groups = ["default", "dev", "llm"] @@ -2081,8 +2303,8 @@ dependencies = [ "botocore<2.0a.0,>=1.33.2", ] files = [ - {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, - {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, + {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, + {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, ] [[package]] @@ -2123,7 +2345,7 @@ files = [ [[package]] name = "sagemaker-core" -version = "1.0.9" +version = "1.0.10" requires_python = ">=3.8" summary = "An python package for sagemaker core functionalities" groups = ["llm"] @@ -2138,8 +2360,8 @@ dependencies = [ "rich<14.0.0,>=13.0.0", ] files = [ - {file = "sagemaker_core-1.0.9-py3-none-any.whl", hash = "sha256:7a22c46cf93594f8d44e3523d4ba98407911f3530af68a8ffdde5082d3b26fa3"}, - {file = "sagemaker_core-1.0.9.tar.gz", hash = "sha256:664115faf797412553fb81b97a4777e78e51dfd4454c32edb2c8371bf203c535"}, + {file = "sagemaker_core-1.0.10-py3-none-any.whl", hash = "sha256:0bdcf6a467db988919cc6b6d0077f74871ee24c24adf7f759f9cb98460e08953"}, + {file = "sagemaker_core-1.0.10.tar.gz", hash = "sha256:6d34a9b6dc5e17e8bfffd1d0650726865779c92b3b8f1b59fc15d42061a0dd29"}, ] [[package]] @@ -2238,12 +2460,23 @@ files = [ {file = "scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417"}, ] +[[package]] +name = "semver" +version = "2.13.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Python helper for Semantic Versioning (http://semver.org/)" +groups = ["build"] +files = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] + [[package]] name = "six" version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" -groups = ["default", "dev", "llm"] +groups = ["default", "build", "dev", "llm"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -2335,13 +2568,13 @@ files = [ [[package]] name = "termcolor" -version = "2.4.0" -requires_python = ">=3.8" +version = "2.5.0" +requires_python = ">=3.9" summary = "ANSI color formatting for output in terminal" groups = ["dev"] files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, ] [[package]] @@ -2368,7 +2601,7 @@ files = [ [[package]] name = "tqdm" -version = "4.66.5" +version = "4.66.6" requires_python = ">=3.7" summary = "Fast, Extensible Progress Meter" groups = ["llm"] @@ -2376,30 +2609,30 @@ dependencies = [ "colorama; platform_system == \"Windows\"", ] files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, + {file = "tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63"}, + {file = "tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090"}, ] [[package]] name = "types-awscrt" -version = "0.22.0" +version = "0.23.0" requires_python = ">=3.8" summary = "Type annotations and code completion for awscrt" groups = ["dev"] files = [ - {file = "types_awscrt-0.22.0-py3-none-any.whl", hash = "sha256:b2c196bbd3226bab42d80fae13c34548de9ddc195f5a366d79c15d18e5897aa9"}, - {file = "types_awscrt-0.22.0.tar.gz", hash = "sha256:67a660c90bad360c339f6a79310cc17094d12472042c7ca5a41450aaf5fc9a54"}, + {file = "types_awscrt-0.23.0-py3-none-any.whl", hash = "sha256:517d9d06f19cf58d778ca90ad01e52e0489466bf70dcf78c7f47f74fdf151a60"}, + {file = "types_awscrt-0.23.0.tar.gz", hash = "sha256:3fd1edeac923d1956c0e907c973fb83bda465beae7f054716b371b293f9b5fdc"}, ] [[package]] name = "types-s3transfer" -version = "0.10.2" +version = "0.10.3" requires_python = ">=3.8" summary = "Type annotations and code completion for s3transfer" groups = ["dev"] files = [ - {file = "types_s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:7a3fec8cd632e2b5efb665a355ef93c2a87fdd5a45b74a949f95a9e628a86356"}, - {file = "types_s3transfer-0.10.2.tar.gz", hash = "sha256:60167a3bfb5c536ec6cdb5818f7f9a28edca9dc3e0b5ff85ae374526fc5e576e"}, + {file = "types_s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:d34c5a82f531af95bb550927136ff5b737a1ed3087f90a59d545591dfde5b4cc"}, + {file = "types_s3transfer-0.10.3.tar.gz", hash = "sha256:f761b2876ac4c208e6c6b75cdf5f6939009768be9950c545b11b0225e7703ee7"}, ] [[package]] @@ -2462,7 +2695,7 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.4" +version = "3.0.6" requires_python = ">=3.8" summary = "The comprehensive WSGI web application library." groups = ["dev", "llm"] @@ -2470,8 +2703,8 @@ dependencies = [ "MarkupSafe>=2.1.1", ] files = [ - {file = "werkzeug-3.0.4-py3-none-any.whl", hash = "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c"}, - {file = "werkzeug-3.0.4.tar.gz", hash = "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306"}, + {file = "werkzeug-3.0.6-py3-none-any.whl", hash = "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17"}, + {file = "werkzeug-3.0.6.tar.gz", hash = "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d"}, ] [[package]] @@ -2521,13 +2754,13 @@ files = [ [[package]] name = "xmltodict" -version = "0.13.0" -requires_python = ">=3.4" +version = "0.14.2" +requires_python = ">=3.6" summary = "Makes working with XML feel like you are working with JSON" groups = ["dev"] files = [ - {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, - {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, + {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, + {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index cc36d1d..6b5cad6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ dynamic = ["version"] [project.optional-dependencies] build = [ + "pulumi-command>=1.0.1", "pulumi>=3.127.0", "pulumi-aws>=6.47.0", "pulumi-azure-native>=2.51.0", @@ -26,6 +27,7 @@ llm = [ ] sparkle = [ "sparkle @ git+https://github.com/DataChefHQ/sparkle.git@v0.6.1", + "pyspark==3.3.2", ] [tool.pdm] distribution = false @@ -45,7 +47,6 @@ dev = [ "pyright>=1.1.374", "moto>=5.0.11", "pip>=24.2", - "pyspark==3.3.2", ] [tool.commitizen] version = "1.0.0" diff --git a/src/damavand/base/controllers/base_controller.py b/src/damavand/base/controllers/base_controller.py index bc29541..ea8cbde 100644 --- a/src/damavand/base/controllers/base_controller.py +++ b/src/damavand/base/controllers/base_controller.py @@ -2,7 +2,6 @@ from functools import cache from damavand import utils -from damavand.base.resource import PulumiResource from damavand.environment import Environment @@ -49,7 +48,7 @@ def __init__( @buildtime @cache - def resource(self) -> PulumiResource: + def resource(self) -> "PulumiResource": # type: ignore # noqa """A lazy property that provision the resource if it is not provisioned yet and return the pulumi object.""" raise NotImplementedError() diff --git a/src/damavand/base/resource.py b/src/damavand/base/resource.py deleted file mode 100644 index 2c18f04..0000000 --- a/src/damavand/base/resource.py +++ /dev/null @@ -1,8 +0,0 @@ -from typing import NewType -from damavand.utils import is_building - - -if is_building(): - from pulumi import Resource as PulumiResource -else: - PulumiResource = NewType("PulumiResource", None) diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index 4238109..b769ad3 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -1,3 +1,4 @@ +import os import logging from functools import cache from typing import Optional @@ -5,7 +6,6 @@ import boto3 from botocore.exceptions import ClientError -from damavand.base.resource import PulumiResource from damavand.base.controllers.llm import LlmController from damavand.base.controllers.base_controller import runtime, buildtime from damavand.errors import RuntimeException @@ -100,8 +100,9 @@ def default_api_key(self) -> str: @buildtime @cache - def resource(self) -> PulumiResource: + def resource(self) -> "PulumiResource": # type: ignore # noqa """Creates the necessary IaC resources for serving the LLM and hosting the python application.""" + from damavand.cloud.aws.resources.llm_app_component import ( AwsLlmAppComponent, AwsServerlessPythonComponentArgs, @@ -118,6 +119,9 @@ def resource(self) -> PulumiResource: ), AwsServerlessPythonComponentArgs( python_version="python3.11", + python_runtime_dependencies_zip=os.path.join( + os.getcwd(), "deps.zip" + ), ), ), ) diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index 20a2db4..8b37bfd 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -5,7 +5,7 @@ from dataclasses import dataclass, field import pulumi_aws as aws -import pulumi_awsx as awsx +from pulumi import FileArchive from pulumi import ResourceOptions from pulumi import ComponentResource as PulumiComponentResource @@ -35,9 +35,11 @@ class AwsServerlessPythonComponentArgs: the root directory for the handler. Default is current working directory. """ + python_runtime_dependencies_zip: str permissions: list[aws.iam.ManagedPolicy] = field(default_factory=list) - dockerfile_directory: str = os.getcwd() # FIXME: remove the runtime as we are using image + python_requirements_path: str = "" + python_site_packages_bucket: Optional[aws.s3.Bucket] = None python_version: str | aws.lambda_.Runtime = aws.lambda_.Runtime.PYTHON3D12 handler: str = "__main__.event_handler" handler_root_directory: str = os.getcwd() @@ -117,58 +119,81 @@ def role(self) -> aws.iam.Role: ) @cached_property - def lambda_image_ecr_repository(self) -> aws.ecr.Repository: + def lambda_function(self) -> aws.lambda_.Function: """ - Return the ECR repository for the Lambda function. + Return the Lambda function. Returns ------- - aws.ecr.Repository - the ECR repository for the Lambda function. + aws.lambda.Function + the Lambda function. """ - return aws.ecr.Repository( - resource_name=f"{self._name}-repository", + return aws.lambda_.Function( + resource_name=f"{self._name}-function", opts=ResourceOptions(parent=self), - name=f"{self._name}-image-repo", - force_delete=True, + role=self.role.arn, + handler=self.args.handler, + runtime=self.args.python_version, + code=FileArchive(self.args.handler_root_directory), + layers=[self.python_dependencies_lambda_layer.arn], + timeout=300, + memory_size=128, ) + # TODO: refactor to use pulumi bucket v2 for unique bucket names @cached_property - def lambda_image(self) -> awsx.ecr.Image: + def python_dependency_bucket(self) -> aws.s3.Bucket: """ - Return the ECR image for the Lambda function. + Return the S3 bucket for python dependencies. Returns ------- - aws.ecr.Image - the ECR image for the Lambda function. + aws.s3.Bucket + the S3 bucket for python dependencies. """ - return awsx.ecr.Image( - resource_name=f"{self._name}-image", + return self.args.python_site_packages_bucket or aws.s3.Bucket( + resource_name=f"{self._name}-site-packages-bucket", opts=ResourceOptions(parent=self), - context=self.args.dockerfile_directory, - repository_url=self.lambda_image_ecr_repository.repository_url, + bucket=f"{self._name}-py-site-packages", + acl="private", ) @cached_property - def lambda_function(self) -> aws.lambda_.Function: + def python_dependencies_s3_objects(self) -> aws.s3.BucketObject: """ - Return the Lambda function. + Return the S3 objects for python dependencies. Returns ------- - aws.lambda.Function - the Lambda function. + aws.s3.BucketObject + the S3 objects for python dependencies. """ - return aws.lambda_.Function( - resource_name=f"{self._name}-function", + return aws.s3.BucketObject( + resource_name=f"{self._name}-site-packages-object", opts=ResourceOptions(parent=self), - role=self.role.arn, - package_type="Image", - image_uri=self.lambda_image.image_uri, - timeout=300, - memory_size=128, + bucket=self.python_dependency_bucket.bucket, + key=f"{self._name}/site-packages.zip", + source=FileArchive(self.args.python_runtime_dependencies_zip), + ) + + @cached_property + def python_dependencies_lambda_layer(self) -> aws.lambda_.LayerVersion: + """ + Return the Lambda layer with installed python dependencies files. + + Returns + ------- + aws.lambda.LayerVersion + the Lambda layer for python dependencies. + """ + + return aws.lambda_.LayerVersion( + resource_name=f"{self._name}-site-packages-layer", + opts=ResourceOptions(parent=self), + layer_name=f"{self._name}-site-packages-layer", + s3_bucket=self.python_dependencies_s3_objects.bucket, + s3_key=self.python_dependencies_s3_objects.key, ) From ae33f821ef753e08c6f97007df01925cd4fc0845 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Mon, 28 Oct 2024 20:38:30 +0100 Subject: [PATCH 12/24] feat(llm): remove openai chat method for a native method --- src/damavand/base/controllers/llm.py | 46 ++++++++++++++++++---------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/damavand/base/controllers/llm.py b/src/damavand/base/controllers/llm.py index 97ef162..dadaa93 100644 --- a/src/damavand/base/controllers/llm.py +++ b/src/damavand/base/controllers/llm.py @@ -1,6 +1,7 @@ -from functools import cache +import requests import logging -from typing import Optional +from functools import cache +from typing import List, Optional from damavand.base.controllers import ApplicationController from damavand.base.controllers.base_controller import runtime @@ -78,21 +79,34 @@ def chat_completions_url(self) -> str: return f"{self.base_url}/chat/completions" - @property @runtime - @cache - def client(self) -> "openai.OpenAI": # type: ignore # noqa - """Return an OpenAI client as an standared interface for interacting with deployed LLM APIs.""" - # FIXME: the openai package must be installed via llm group. This is a temporary solution. + def create_chat( + self, + messages: List[dict], + parameters: dict = {"max_new_tokens": 400}, + should_stream: bool = False, + ) -> dict: + """Create a chat completion.""" + + headers = { + "Content-Type": "application/json", + } + + json_data = { + "messages": messages, + "parameters": parameters, + "stream": should_stream, + } + + response = requests.post( + self.chat_completions_url, + headers=headers, + json=json_data, + ) - try: - import openai # type: ignore # noqa - except ImportError: + if response.status_code != 200: raise RuntimeException( - "Failed to import OpenAI library. Damavand provide this library as an optional dependency. Try to install it using `pip install damavand[openai]` or directly install it using pip or your dependency manager." + f"Failed to create chat completion. Response: {response.json()}" ) - - return openai.OpenAI( - api_key=self.default_api_key, - base_url=f"{self.base_url}", - ) + else: + return response.json() From 8726352fc8be3630f237c3b3ff87e9785ba5ab43 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Tue, 29 Oct 2024 13:15:49 +0100 Subject: [PATCH 13/24] fix(llm): endpoint parameter store not being created --- src/damavand/cloud/aws/resources/vllm_component.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/damavand/cloud/aws/resources/vllm_component.py b/src/damavand/cloud/aws/resources/vllm_component.py index f0eb513..5db708f 100644 --- a/src/damavand/cloud/aws/resources/vllm_component.py +++ b/src/damavand/cloud/aws/resources/vllm_component.py @@ -167,6 +167,7 @@ def __init__( _ = self.api_integration_response _ = self.api_method_response _ = self.api_deployment + _ = self.endpoint_ssm_parameter def get_service_assume_policy(self, service: str) -> dict[str, Any]: """Return the assume role policy for the requested service. @@ -717,11 +718,7 @@ def endpoint_ssm_parameter(self) -> aws.ssm.Parameter: return aws.ssm.Parameter( resource_name=f"{self._name}-endpoint-ssm-parameter", opts=ResourceOptions(parent=self), - name=( - self.args.api_key_required - if self.args.api_key_required - else self.endpoint.endpoint_config_name - ), + name=self.args.endpoint_ssm_parameter_name, type=aws.ssm.ParameterType.STRING, value=self.endpoint_base_url, ) From 24bf0056b256db215c8bbdca1b07b19f24e6940f Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Tue, 29 Oct 2024 15:17:00 +0100 Subject: [PATCH 14/24] refactor(llm): using code mode instead of docker mode with lambda --- src/damavand/base/controllers/llm.py | 4 + src/damavand/cloud/aws/controllers/llm.py | 18 +++-- .../resources/serverless_python_component.py | 81 +++++++++++++++---- 3 files changed, 82 insertions(+), 21 deletions(-) diff --git a/src/damavand/base/controllers/llm.py b/src/damavand/base/controllers/llm.py index dadaa93..7ecbd54 100644 --- a/src/damavand/base/controllers/llm.py +++ b/src/damavand/base/controllers/llm.py @@ -43,11 +43,15 @@ def __init__( self, name, model: Optional[str] = None, + python_version: str = "python3.11", + python_runtime_requirements_file: str = "../requirements-run.txt", tags: dict[str, str] = {}, **kwargs, ) -> None: ApplicationController.__init__(self, name, tags, **kwargs) self._model_name = model + self._python_version = python_version + self._python_runtime_requirements_file = python_runtime_requirements_file @property def model_id(self) -> str: diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index b769ad3..a84d208 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -1,4 +1,3 @@ -import os import logging from functools import cache from typing import Optional @@ -43,10 +42,19 @@ def __init__( name, region: str, model: Optional[str] = None, + python_version: str = "python3.11", + python_runtime_requirements_file: str = "../requirements-run.txt", tags: dict[str, str] = {}, **kwargs, ) -> None: - super().__init__(name, model, tags, **kwargs) + super().__init__( + name, + model, + python_version, + python_runtime_requirements_file, + tags, + **kwargs, + ) self._parameter_store = boto3.client("ssm", region_name=region) self._region = region @@ -118,10 +126,8 @@ def resource(self) -> "PulumiResource": # type: ignore # noqa endpoint_ssm_parameter_name=self._base_url_ssm_name, ), AwsServerlessPythonComponentArgs( - python_version="python3.11", - python_runtime_dependencies_zip=os.path.join( - os.getcwd(), "deps.zip" - ), + python_version=self._python_version, + python_requirements_file=self._python_runtime_requirements_file, ), ), ) diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index 8b37bfd..5c52763 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -5,7 +5,8 @@ from dataclasses import dataclass, field import pulumi_aws as aws -from pulumi import FileArchive +import pulumi_command as command +from pulumi import FileArchive, FileAsset from pulumi import ResourceOptions from pulumi import ComponentResource as PulumiComponentResource @@ -25,24 +26,24 @@ class AwsServerlessPythonComponentArgs: ---------- permissions: list[aws.iam.ManagedPolicy] the managed policies for the Lambda function. - dockerfile_directory: str - the directory of the Dockerfile. Default is current working directory. + python_requirements_file: str + the path to the requirements.txt file for the runtime environment. + python_dependencies_bucket: Optional[aws.s3.Bucket] + the S3 bucket for python dependencies. python_version: str | aws.lambda_.Runtime - the python version for the Lambda function. Default is `aws.lambda_.Runtime.PYTHON3D12`. + the python version for the Lambda function. handler: str - the handler for the Lambda function. Default is `__main__.event_handler`. + the handler for the Lambda function. Default is `app.event_handler`. handler_root_directory: str - the root directory for the handler. Default is current working directory. + the root directory of the handler to be uploaded to the Lambda function. Default is the `src` directory in the current working directory. """ - python_runtime_dependencies_zip: str permissions: list[aws.iam.ManagedPolicy] = field(default_factory=list) - # FIXME: remove the runtime as we are using image - python_requirements_path: str = "" - python_site_packages_bucket: Optional[aws.s3.Bucket] = None + python_requirements_file: str = "requirements-run.txt" + python_dependencies_bucket: Optional[aws.s3.Bucket] = None python_version: str | aws.lambda_.Runtime = aws.lambda_.Runtime.PYTHON3D12 - handler: str = "__main__.event_handler" - handler_root_directory: str = os.getcwd() + handler: str = "app.event_handler" + handler_root_directory: str = os.path.join(os.getcwd()) # TODO: add support for vpc @@ -80,6 +81,7 @@ def __init__( ) self.args = args + _ = self.runtime_env_builder _ = self.lambda_function @property @@ -141,6 +143,55 @@ def lambda_function(self) -> aws.lambda_.Function: memory_size=128, ) + @cached_property + def runtime_env_directory(self) -> str: + """ + Create a temporary directory to cache and package the python dependencies. + + Returns + ------- + str + the path of the python dependencies. + """ + + path = os.path.join("/tmp", "damavand-artifacts", "deps", "python") + os.makedirs(path, exist_ok=True) + return path + + @cached_property + def runtime_env_builder(self) -> command.local.Command: + """ + Build the runtime environment for the Lambda function. + + Returns + ------- + None + """ + + return command.local.Command( + resource_name=f"{self._name}-runtime-env-builder", + opts=ResourceOptions(parent=self), + create=f"pip install -r {self.args.python_requirements_file} --target {self.runtime_env_directory}", + asset_paths=[self.runtime_env_directory], + delete=f"rm -rf {self.runtime_env_directory}", + triggers=[ + FileAsset(self.args.python_requirements_file), + ], + ) + + @cached_property + def runtime_env_artifacts(self) -> FileArchive: + """ + Package the cached python dependencies into a zip file. + + Returns + ------- + FileArchive + the FileArchive of the runtime environment. + """ + + return FileArchive(os.path.dirname(self.runtime_env_directory)) + # TODO: refactor to use pulumi bucket v2 for unique bucket names @cached_property def python_dependency_bucket(self) -> aws.s3.Bucket: @@ -153,7 +204,7 @@ def python_dependency_bucket(self) -> aws.s3.Bucket: the S3 bucket for python dependencies. """ - return self.args.python_site_packages_bucket or aws.s3.Bucket( + return self.args.python_dependencies_bucket or aws.s3.Bucket( resource_name=f"{self._name}-site-packages-bucket", opts=ResourceOptions(parent=self), bucket=f"{self._name}-py-site-packages", @@ -173,10 +224,10 @@ def python_dependencies_s3_objects(self) -> aws.s3.BucketObject: return aws.s3.BucketObject( resource_name=f"{self._name}-site-packages-object", - opts=ResourceOptions(parent=self), + opts=ResourceOptions(parent=self, depends_on=[self.runtime_env_builder]), bucket=self.python_dependency_bucket.bucket, key=f"{self._name}/site-packages.zip", - source=FileArchive(self.args.python_runtime_dependencies_zip), + source=self.runtime_env_artifacts, ) @cached_property From 13825c2feb7252d02a6475531e8d794c6e7418dc Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Wed, 30 Oct 2024 09:23:47 +0100 Subject: [PATCH 15/24] feat(core, llm): add supporting tags Controllers now can pass two set of tags to the downstream Pulumi resources. First is the user defined tags which is a list of tags set at initialization of the controller. Second is a set of default tags which is enforced by the controller. By default damavand's base controller is setting two default tags including `application` and `tool`. --- .../base/controllers/base_controller.py | 47 +++++++++++++++++-- src/damavand/cloud/aws/controllers/llm.py | 1 + .../cloud/aws/controllers/object_storage.py | 2 +- .../cloud/aws/resources/glue_component.py | 1 + .../cloud/aws/resources/llm_app_component.py | 4 ++ .../resources/serverless_python_component.py | 7 +++ .../cloud/aws/resources/vllm_component.py | 15 ++++++ 7 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/damavand/base/controllers/base_controller.py b/src/damavand/base/controllers/base_controller.py index ea8cbde..6f1973f 100644 --- a/src/damavand/base/controllers/base_controller.py +++ b/src/damavand/base/controllers/base_controller.py @@ -1,5 +1,6 @@ +import re import logging -from functools import cache +from functools import cache, cached_property from damavand import utils from damavand.environment import Environment @@ -42,9 +43,27 @@ def __init__( **kwargs, ) -> None: self.name = name - self.tags = tags + self._userdefined_tags = tags self.extra_args = kwargs - self._pulumi_object = None + + @property + def name(self) -> str: + """Return the name of the controller.""" + + return self._name + + @name.setter + def name(self, value: str) -> None: + """Set the name of the controller.""" + + pattern = re.compile(r"^[a-z0-9-]+$") + + if not pattern.match(value): + raise ValueError( + f"Invalid name: `{value}`. Name must be lowercase letters, numbers, and hyphens." + ) + + self._name = value @buildtime @cache @@ -53,6 +72,28 @@ def resource(self) -> "PulumiResource": # type: ignore # noqa raise NotImplementedError() + @property + def userdefined_tags(self) -> dict[str, str]: + """Return the user-defined tags.""" + + return self._userdefined_tags + + @cached_property + @buildtime + def default_tags(self) -> dict[str, str]: + """Return the default tags for the resources.""" + + return { + "application": self.name, + "tool": "datachef:damavand", + } + + @property + def all_tags(self) -> dict[str, str]: + """Return all tags for the resource.""" + + return {**self.default_tags, **self.userdefined_tags} + @property def environment(self) -> Environment: """Return the environment that controller is being executed in.""" diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index a84d208..489f784 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -119,6 +119,7 @@ def resource(self) -> "PulumiResource": # type: ignore # noqa return AwsLlmAppComponent( name=self.name, + tags=self.all_tags, args=( AwsVllmComponentArgs( region=self._region, diff --git a/src/damavand/cloud/aws/controllers/object_storage.py b/src/damavand/cloud/aws/controllers/object_storage.py index 5c355e6..3edaada 100644 --- a/src/damavand/cloud/aws/controllers/object_storage.py +++ b/src/damavand/cloud/aws/controllers/object_storage.py @@ -37,7 +37,7 @@ def resource(self) -> PulumiResource: return s3.BucketV2( resource_name=f"{self.name}-bucket", bucket_prefix=self.name, - tags=self.tags, + tags=self._userdefined_tags, **self.extra_args, ) diff --git a/src/damavand/cloud/aws/resources/glue_component.py b/src/damavand/cloud/aws/resources/glue_component.py index fdf1847..95abf0e 100644 --- a/src/damavand/cloud/aws/resources/glue_component.py +++ b/src/damavand/cloud/aws/resources/glue_component.py @@ -147,6 +147,7 @@ class GlueComponent(PulumiComponentResource): def __init__( self, name: str, + tags: dict[str, str], args: GlueComponentArgs, opts: Optional[ResourceOptions] = None, ) -> None: diff --git a/src/damavand/cloud/aws/resources/llm_app_component.py b/src/damavand/cloud/aws/resources/llm_app_component.py index 4da125c..0d89b01 100644 --- a/src/damavand/cloud/aws/resources/llm_app_component.py +++ b/src/damavand/cloud/aws/resources/llm_app_component.py @@ -25,6 +25,7 @@ class AwsLlmAppComponent(PulumiComponentResource): def __init__( self, name: str, + tags: dict[str, str], args: tuple[AwsVllmComponentArgs, AwsServerlessPythonComponentArgs], opts: Optional[ResourceOptions] = None, ) -> None: @@ -38,6 +39,7 @@ def __init__( self.__vllm_args = args[0] self.__serverless_python_args = args[1] + self._tags = tags _ = self.vllm _ = self.python_applet @@ -53,6 +55,7 @@ def vllm(self) -> AwsVllmComponent: return AwsVllmComponent( name=f"{self._name}-vllm", + tags=self._tags, args=self.__vllm_args, opts=ResourceOptions(parent=self), ) @@ -67,6 +70,7 @@ def python_applet(self) -> AwsServerlessPythonComponent: return AwsServerlessPythonComponent( name=f"{self._name}-python-applet", + tags=self._tags, args=self.__serverless_python_args, opts=ResourceOptions(parent=self), ) diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index 5c52763..ad822a2 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -69,6 +69,7 @@ class AwsServerlessPythonComponent(PulumiComponentResource): def __init__( self, name: str, + tags: dict[str, str], args: AwsServerlessPythonComponentArgs, opts: Optional[ResourceOptions] = None, ) -> None: @@ -81,6 +82,8 @@ def __init__( ) self.args = args + self._tags = tags + _ = self.runtime_env_builder _ = self.lambda_function @@ -118,6 +121,7 @@ def role(self) -> aws.iam.Role: name=f"{self._name}-ExecutionRole", managed_policy_arns=self.permissions, assume_role_policy=json.dumps(AwsService.LAMBDA.get_assume_policy()), + tags=self._tags, ) @cached_property @@ -141,6 +145,7 @@ def lambda_function(self) -> aws.lambda_.Function: layers=[self.python_dependencies_lambda_layer.arn], timeout=300, memory_size=128, + tags=self._tags, ) @cached_property @@ -209,6 +214,7 @@ def python_dependency_bucket(self) -> aws.s3.Bucket: opts=ResourceOptions(parent=self), bucket=f"{self._name}-py-site-packages", acl="private", + tags=self._tags, ) @cached_property @@ -228,6 +234,7 @@ def python_dependencies_s3_objects(self) -> aws.s3.BucketObject: bucket=self.python_dependency_bucket.bucket, key=f"{self._name}/site-packages.zip", source=self.runtime_env_artifacts, + tags=self._tags, ) @cached_property diff --git a/src/damavand/cloud/aws/resources/vllm_component.py b/src/damavand/cloud/aws/resources/vllm_component.py index 5db708f..1fc698a 100644 --- a/src/damavand/cloud/aws/resources/vllm_component.py +++ b/src/damavand/cloud/aws/resources/vllm_component.py @@ -129,6 +129,7 @@ class AwsVllmComponent(PulumiComponentResource): def __init__( self, name: str, + tags: dict[str, str], args: AwsVllmComponentArgs, opts: Optional[ResourceOptions] = None, ) -> None: @@ -141,6 +142,7 @@ def __init__( ) self.args = args + self._tags = tags _ = self.model _ = self.endpoint_config @@ -219,6 +221,7 @@ def sagemaker_execution_role(self) -> aws.iam.Role: self.get_service_assume_policy("sagemaker.amazonaws.com") ), managed_policy_arns=self.sagemaker_access_policies, + tags=self._tags, ) @property @@ -258,6 +261,7 @@ def model(self) -> aws.sagemaker.Model: environment=self.model_image_configs, ), execution_role_arn=self.sagemaker_execution_role.arn, + tags=self._tags, ) @property @@ -276,6 +280,7 @@ def endpoint_config(self) -> aws.sagemaker.EndpointConfiguration: model_name=self.model.name, ), ], + tags=self._tags, ) @property @@ -287,6 +292,7 @@ def endpoint(self) -> aws.sagemaker.Endpoint: resource_name=f"{self._name}-endpoint", opts=ResourceOptions(parent=self), endpoint_config_name=self.endpoint_config.name, + tags=self._tags, ) @property @@ -302,6 +308,7 @@ def api(self) -> aws.apigateway.RestApi: endpoint_configuration=aws.apigateway.RestApiEndpointConfigurationArgs( types="REGIONAL", ), + tags=self._tags, ) @property @@ -392,6 +399,7 @@ def admin_api_key(self) -> aws.apigateway.ApiKey: return aws.apigateway.ApiKey( resource_name=f"{self._name}-api-key", opts=ResourceOptions(parent=self), + tags=self._tags, ) @property @@ -414,6 +422,7 @@ def api_key_secret(self) -> aws.secretsmanager.Secret: return aws.secretsmanager.Secret( resource_name=f"{self._name}-api-key-secret", opts=ResourceOptions(parent=self), + tags=self._tags, ) @property @@ -465,6 +474,7 @@ def default_usage_plan(self) -> aws.apigateway.UsagePlan: stage=self.args.api_env_name, ) ], + tags=self._tags, ) @property @@ -496,6 +506,7 @@ def tier_1_usage_plan(self) -> aws.apigateway.UsagePlan: throttle_settings=aws.apigateway.UsagePlanThrottleSettingsArgs( rate_limit=500 ), + tags=self._tags, ) @property @@ -527,6 +538,7 @@ def tier_2_usage_plan(self) -> aws.apigateway.UsagePlan: throttle_settings=aws.apigateway.UsagePlanThrottleSettingsArgs( rate_limit=5000 ), + tags=self._tags, ) @property @@ -558,6 +570,7 @@ def tier_3_usage_plan(self) -> aws.apigateway.UsagePlan: throttle_settings=aws.apigateway.UsagePlanThrottleSettingsArgs( rate_limit=10000 ), + tags=self._tags, ) @property @@ -618,6 +631,7 @@ def api_access_sagemaker_role(self) -> aws.iam.Role: self.get_service_assume_policy("apigateway.amazonaws.com") ), managed_policy_arns=self.apigateway_access_policies, + tags=self._tags, ) @property @@ -721,4 +735,5 @@ def endpoint_ssm_parameter(self) -> aws.ssm.Parameter: name=self.args.endpoint_ssm_parameter_name, type=aws.ssm.ParameterType.STRING, value=self.endpoint_base_url, + tags=self._tags, ) From bb0620c5047d9880f2ea7b885f6825fcac855f0e Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Wed, 30 Oct 2024 12:08:04 +0100 Subject: [PATCH 16/24] feat(core, llm): cost managements supports within controllers --- .../base/controllers/base_controller.py | 33 ++- src/damavand/base/controllers/llm.py | 5 +- src/damavand/cloud/aws/controllers/llm.py | 25 +- .../cloud/aws/resources/budget_component.py | 239 ++++++++++++++++++ 4 files changed, 296 insertions(+), 6 deletions(-) create mode 100644 src/damavand/cloud/aws/resources/budget_component.py diff --git a/src/damavand/base/controllers/base_controller.py b/src/damavand/base/controllers/base_controller.py index 6f1973f..0753114 100644 --- a/src/damavand/base/controllers/base_controller.py +++ b/src/damavand/base/controllers/base_controller.py @@ -1,6 +1,7 @@ +from dataclasses import dataclass import re import logging -from functools import cache, cached_property +from functools import cache from damavand import utils from damavand.environment import Environment @@ -35,15 +36,33 @@ def wrapper(self, *args, **kwargs): return wrapper +@dataclass +class CostManagement: + """Cost management configuration for the application. + + Parameters + ---------- + notification_subscribers : list[str] + List of email addresses to notify when the cost exceeds the limit. + monthly_limit_in_dollars : int + The monthly cost limit in dollars. + """ + + notification_subscribers: list[str] + monthly_limit_in_dollars: int + + class ApplicationController(object): def __init__( self, name: str, + cost: CostManagement, tags: dict[str, str] = {}, **kwargs, ) -> None: self.name = name self._userdefined_tags = tags + self._cost = cost self.extra_args = kwargs @property @@ -72,13 +91,20 @@ def resource(self) -> "PulumiResource": # type: ignore # noqa raise NotImplementedError() + @buildtime + @cache + def cost_controls(self) -> "PulumiResource": # type: ignore # noqa + """Apply cost controls to the resources.""" + + raise NotImplementedError() + @property def userdefined_tags(self) -> dict[str, str]: """Return the user-defined tags.""" return self._userdefined_tags - @cached_property + @property @buildtime def default_tags(self) -> dict[str, str]: """Return the default tags for the resources.""" @@ -110,6 +136,7 @@ def is_runtime_execution(self) -> bool: return not utils.is_building() def provision(self) -> None: - """Provision the resource in not provisioned yet.""" + """Provision all the resources and apply cost controls.""" _ = self.resource() + _ = self.cost_controls() diff --git a/src/damavand/base/controllers/llm.py b/src/damavand/base/controllers/llm.py index 7ecbd54..26d5aad 100644 --- a/src/damavand/base/controllers/llm.py +++ b/src/damavand/base/controllers/llm.py @@ -4,7 +4,7 @@ from typing import List, Optional from damavand.base.controllers import ApplicationController -from damavand.base.controllers.base_controller import runtime +from damavand.base.controllers.base_controller import CostManagement, runtime from damavand.errors import RuntimeException @@ -42,13 +42,14 @@ class LlmController(ApplicationController): def __init__( self, name, + cost: CostManagement, model: Optional[str] = None, python_version: str = "python3.11", python_runtime_requirements_file: str = "../requirements-run.txt", tags: dict[str, str] = {}, **kwargs, ) -> None: - ApplicationController.__init__(self, name, tags, **kwargs) + ApplicationController.__init__(self, name, cost, tags, **kwargs) self._model_name = model self._python_version = python_version self._python_runtime_requirements_file = python_runtime_requirements_file diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index 489f784..66fd681 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -6,7 +6,7 @@ from botocore.exceptions import ClientError from damavand.base.controllers.llm import LlmController -from damavand.base.controllers.base_controller import runtime, buildtime +from damavand.base.controllers.base_controller import CostManagement, runtime, buildtime from damavand.errors import RuntimeException @@ -41,6 +41,7 @@ def __init__( self, name, region: str, + cost: CostManagement, model: Optional[str] = None, python_version: str = "python3.11", python_runtime_requirements_file: str = "../requirements-run.txt", @@ -49,6 +50,7 @@ def __init__( ) -> None: super().__init__( name, + cost, model, python_version, python_runtime_requirements_file, @@ -132,3 +134,24 @@ def resource(self) -> "PulumiResource": # type: ignore # noqa ), ), ) + + @buildtime + @cache + def cost_controls(self) -> "PulumiResource": # type: ignore # noqa + """Creates the necessary IaC resources for cost controls.""" + + from damavand.cloud.aws.resources.budget_component import ( + AwsBudgetComponent, + AwsBudgetComponentArgs, + ) + + return AwsBudgetComponent( + name=self.name, + tags=self.all_tags, + args=AwsBudgetComponentArgs( + montly_limit_in_dollors=self._cost.monthly_limit_in_dollars, + subscriber_emails=self._cost.notification_subscribers, + filter_tag_key="application", + filter_tag_value=self.name, + ), + ) diff --git a/src/damavand/cloud/aws/resources/budget_component.py b/src/damavand/cloud/aws/resources/budget_component.py new file mode 100644 index 0000000..6427d88 --- /dev/null +++ b/src/damavand/cloud/aws/resources/budget_component.py @@ -0,0 +1,239 @@ +from typing import Optional +from functools import cached_property +from dataclasses import dataclass +from enum import StrEnum + +import pulumi_aws as aws +from pulumi import ComponentResource as PulumiComponentResource +from pulumi import ResourceOptions + + +class BudgetTimeUnit(StrEnum): + DAILY = "DAILY" + MONTHLY = "MONTHLY" + QUARTERLY = "QUARTERLY" + YEARLY = "ANNUALLY" + + +class BudgetType(StrEnum): + COST = "COST" + USAGE = "USAGE" + + +class BudgetComparisonOperator(StrEnum): + EQUAL_TO = "EQUAL_TO" + GREATER_THAN = "GREATER_THAN" + LESS_THAN = "LESS_THAN" + + +class BudgetThresholdType(StrEnum): + ABSOLUTE_VALUE = "ABSOLUTE_VALUE" + PERCENTAGE = "PERCENTAGE" + + +class BudgetNotificationType(StrEnum): + ACTUAL = "ACTUAL" + FORECASTED = "FORECASTED" + + +@dataclass +class AwsBudgetComponentArgs: + montly_limit_in_dollors: int + subscriber_emails: list[str] + filter_tag_key: str + filter_tag_value: str + + +class AwsBudgetComponent(PulumiComponentResource): + def __init__( + self, + name: str, + tags: dict[str, str], + args: AwsBudgetComponentArgs, + opts: Optional[ResourceOptions] = None, + ) -> None: + super().__init__( + f"Damavand:{AwsBudgetComponent.__name__}", + name=name, + props={}, + opts=opts, + remote=False, + ) + + self.args = args + self._tags = tags + + _ = self.daily_budgets + _ = self.monthly_budgets + _ = self.quarterly_budgets + _ = self.yearly_budgets + + @property + def tags(self) -> dict[str, str]: + """Return the tags for the component.""" + + return self._tags + + @property + def daily_budget_limit(self) -> int: + """Return the daily budget limit in dollars. Consider 30 days in a month.""" + + return self.args.montly_limit_in_dollors // 30 + + @property + def monthly_budget_limit(self) -> int: + """Return the monthly budget limit in dollars.""" + + return self.args.montly_limit_in_dollors + + @property + def quarterly_budget_limit(self) -> int: + """Return the quarterly budget limit in dollars.""" + + return self.args.montly_limit_in_dollors * 3 + + @property + def yearly_budget_limit(self) -> int: + """Return the yearly budget limit in dollars.""" + + return self.args.montly_limit_in_dollors * 12 + + @cached_property + def daily_budgets(self) -> list[aws.budgets.Budget]: + """Return the daily budgets for the component.""" + + return [ + aws.budgets.Budget( + f"{self._name}-daily-budget-%{threshold}", + opts=ResourceOptions(parent=self), + name=f"{self._name}-daily-budget-%{threshold}", + limit_amount=str(self.daily_budget_limit), + limit_unit="USD", + time_unit=BudgetTimeUnit.DAILY, + budget_type=BudgetType.COST, + notifications=[ + { + "comparison_operator": BudgetComparisonOperator.EQUAL_TO, + "threshold": threshold, + "threshold_type": BudgetThresholdType.PERCENTAGE, + "notification_type": BudgetNotificationType.ACTUAL, + "subscriber_email_addresses": self.args.subscriber_emails, + } + ], + cost_filters=[ + { + "name": "TagKeyValue", + "values": [ + f"{self.args.filter_tag_key}${self.args.filter_tag_value}" + ], + } + ], + tags=self.tags, + ) + for threshold in [80, 100] + ] + + @cached_property + def monthly_budgets(self) -> list[aws.budgets.Budget]: + """Return the monthly budgets for the component.""" + + return [ + aws.budgets.Budget( + f"{self._name}-monthly-budget-%{threshold}", + opts=ResourceOptions(parent=self), + name=f"{self._name}-monthly-budget-%{threshold}", + limit_amount=str(self.monthly_budget_limit), + limit_unit="USD", + time_unit=BudgetTimeUnit.MONTHLY, + budget_type=BudgetType.COST, + notifications=[ + { + "comparison_operator": BudgetComparisonOperator.EQUAL_TO, + "threshold": threshold, + "threshold_type": BudgetThresholdType.PERCENTAGE, + "notification_type": BudgetNotificationType.ACTUAL, + "subscriber_email_addresses": self.args.subscriber_emails, + } + ], + cost_filters=[ + { + "name": "TagKeyValue", + "values": [ + f"{self.args.filter_tag_key}${self.args.filter_tag_value}" + ], + } + ], + tags=self.tags, + ) + for threshold in [90, 95, 99, 100] + ] + + @cached_property + def quarterly_budgets(self) -> list[aws.budgets.Budget]: + """Return the quarterly budgets for the component.""" + + return [ + aws.budgets.Budget( + f"{self._name}-quarterly-budget-%{threshold}", + opts=ResourceOptions(parent=self), + name=f"{self._name}-quarterly-budget-%{threshold}", + limit_amount=str(self.quarterly_budget_limit), + limit_unit="USD", + time_unit=BudgetTimeUnit.QUARTERLY, + budget_type=BudgetType.COST, + notifications=[ + { + "comparison_operator": BudgetComparisonOperator.EQUAL_TO, + "threshold": threshold, + "threshold_type": BudgetThresholdType.PERCENTAGE, + "notification_type": BudgetNotificationType.ACTUAL, + "subscriber_email_addresses": self.args.subscriber_emails, + } + ], + cost_filters=[ + { + "name": "TagKeyValue", + "values": [ + f"{self.args.filter_tag_key}${self.args.filter_tag_value}" + ], + } + ], + tags=self.tags, + ) + for threshold in [90, 100] + ] + + @cached_property + def yearly_budgets(self) -> list[aws.budgets.Budget]: + """Return the yearly budgets for the component.""" + + return [ + aws.budgets.Budget( + f"{self._name}-yearly-budget-%{threshold}", + opts=ResourceOptions(parent=self), + name=f"{self._name}-yearly-budget-%{threshold}", + limit_amount=str(self.yearly_budget_limit), + limit_unit="USD", + time_unit=BudgetTimeUnit.YEARLY, + budget_type=BudgetType.COST, + notifications=[ + { + "comparison_operator": BudgetComparisonOperator.EQUAL_TO, + "threshold": threshold, + "threshold_type": BudgetThresholdType.PERCENTAGE, + "notification_type": BudgetNotificationType.ACTUAL, + "subscriber_email_addresses": self.args.subscriber_emails, + } + ], + cost_filters=[ + { + "name": "TagKeyValue", + "values": [ + f"{self.args.filter_tag_key}${self.args.filter_tag_value}" + ], + } + ], + tags=self.tags, + ) + for threshold in [90, 100] + ] From aeffe26ef7e7b3266abc62ada7dfbf0ecc07656e Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Wed, 30 Oct 2024 14:33:23 +0100 Subject: [PATCH 17/24] fix(llm): cannot access the api key --- src/damavand/base/controllers/llm.py | 1 + src/damavand/cloud/aws/controllers/llm.py | 39 +++++++++++++++++-- .../cloud/aws/resources/vllm_component.py | 11 +++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/damavand/base/controllers/llm.py b/src/damavand/base/controllers/llm.py index 26d5aad..ac4347a 100644 --- a/src/damavand/base/controllers/llm.py +++ b/src/damavand/base/controllers/llm.py @@ -95,6 +95,7 @@ def create_chat( headers = { "Content-Type": "application/json", + "x-api-key": self.default_api_key, } json_data = { diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index 66fd681..50531a3 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -58,6 +58,7 @@ def __init__( **kwargs, ) self._parameter_store = boto3.client("ssm", region_name=region) + self._secret_manager = boto3.client("secretsmanager", region_name=region) self._region = region @property @@ -100,13 +101,45 @@ def base_url(self) -> str: f"Failed to retrieve endpoint URL from SSM parameter store: {e}" ) + @property + def _default_api_key_secret_name(self) -> str: + """Return the secret name for the default API key.""" + + return f"/damavand/{self.name}/api_key" + @property @runtime @cache def default_api_key(self) -> str: - """Return the default API key.""" + """ + Retrieve the default API key from the Secrets Manager. + + Returns + ------- + str + The default API key. + + Raises + ------ + RuntimeException + If the API key cannot be retrieved from AWS. - return "EMPTY" + """ + + try: + response = self._secret_manager.get_secret_value( + SecretId=self._default_api_key_secret_name, + ) + + return response["SecretString"] + except ClientError as e: + raise RuntimeException( + f"Failed to retrieve API key from Secrets Manager: {e}" + ) + except KeyError as e: + raise RuntimeException( + f"Failed to retrieve API key from Secrets Manager: {e}" + ) @buildtime @cache @@ -125,7 +158,7 @@ def resource(self) -> "PulumiResource": # type: ignore # noqa args=( AwsVllmComponentArgs( region=self._region, - api_key_required=False, + api_key_secret_name=self._default_api_key_secret_name, endpoint_ssm_parameter_name=self._base_url_ssm_name, ), AwsServerlessPythonComponentArgs( diff --git a/src/damavand/cloud/aws/resources/vllm_component.py b/src/damavand/cloud/aws/resources/vllm_component.py index 1fc698a..9589939 100644 --- a/src/damavand/cloud/aws/resources/vllm_component.py +++ b/src/damavand/cloud/aws/resources/vllm_component.py @@ -31,6 +31,8 @@ class AwsVllmComponentArgs: type of instance to deploy the model. api_key_required : bool whether an API key is required for interacting with the API. + api_key_secret_name : Optional[str] + the name of the Secret Manager secret to store the API key. api_env_name : str the name of the API environment. endpoint_ssm_parameter_name : str @@ -43,6 +45,7 @@ class AwsVllmComponentArgs: instance_initial_count: int = 1 instance_type: str = "ml.g4dn.xlarge" api_key_required: bool = True + api_key_secret_name: Optional[str] = None api_env_name: str = "prod" endpoint_ssm_parameter_name: str = "/Vllm/endpoint/url" @@ -416,12 +419,18 @@ def api_key_secret(self) -> aws.secretsmanager.Secret: """ if not self.args.api_key_required: raise AttributeError( - "`admin_api_secret` is only available when api_key_required is False" + "`api_key_secret` is only available when api_key_required is False" + ) + + if self.args.api_key_secret_name is None: + raise AttributeError( + "The `api_key_secret_name` must be provided when `api_key_required` is True" ) return aws.secretsmanager.Secret( resource_name=f"{self._name}-api-key-secret", opts=ResourceOptions(parent=self), + name=self.args.api_key_secret_name, tags=self._tags, ) From c091235ce555ea45a871f4f3013631c4eae33f0b Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Wed, 30 Oct 2024 15:06:40 +0100 Subject: [PATCH 18/24] fix(llm): lambda function does not have access to ssm or secrets --- src/damavand/cloud/aws/resources/serverless_python_component.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index ad822a2..b6cf1a7 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -101,6 +101,8 @@ def permissions(self) -> list[aws.iam.ManagedPolicy]: return [ aws.iam.ManagedPolicy.AWS_LAMBDA_BASIC_EXECUTION_ROLE, aws.iam.ManagedPolicy.AWS_LAMBDA_VPC_ACCESS_EXECUTION_ROLE, + aws.iam.ManagedPolicy.SECRETS_MANAGER_READ_WRITE, + aws.iam.ManagedPolicy.AMAZON_SSM_READ_ONLY_ACCESS, *self.args.permissions, ] From f1bcf802570133a180bbbab296484b16e7415dd0 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Wed, 30 Oct 2024 15:07:36 +0100 Subject: [PATCH 19/24] refactor(serverless): uploading dependencies directly to lambda Previously, we used s3 to upload the dependencies there and then provide s3 object for the lambda layer. Now, lambda layer directly pick up the dependencies without needing s3 to host the dependencies files. --- .../resources/serverless_python_component.py | 48 +------------------ 1 file changed, 2 insertions(+), 46 deletions(-) diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index b6cf1a7..f08c12e 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -28,8 +28,6 @@ class AwsServerlessPythonComponentArgs: the managed policies for the Lambda function. python_requirements_file: str the path to the requirements.txt file for the runtime environment. - python_dependencies_bucket: Optional[aws.s3.Bucket] - the S3 bucket for python dependencies. python_version: str | aws.lambda_.Runtime the python version for the Lambda function. handler: str @@ -40,7 +38,6 @@ class AwsServerlessPythonComponentArgs: permissions: list[aws.iam.ManagedPolicy] = field(default_factory=list) python_requirements_file: str = "requirements-run.txt" - python_dependencies_bucket: Optional[aws.s3.Bucket] = None python_version: str | aws.lambda_.Runtime = aws.lambda_.Runtime.PYTHON3D12 handler: str = "app.event_handler" handler_root_directory: str = os.path.join(os.getcwd()) @@ -199,46 +196,6 @@ def runtime_env_artifacts(self) -> FileArchive: return FileArchive(os.path.dirname(self.runtime_env_directory)) - # TODO: refactor to use pulumi bucket v2 for unique bucket names - @cached_property - def python_dependency_bucket(self) -> aws.s3.Bucket: - """ - Return the S3 bucket for python dependencies. - - Returns - ------- - aws.s3.Bucket - the S3 bucket for python dependencies. - """ - - return self.args.python_dependencies_bucket or aws.s3.Bucket( - resource_name=f"{self._name}-site-packages-bucket", - opts=ResourceOptions(parent=self), - bucket=f"{self._name}-py-site-packages", - acl="private", - tags=self._tags, - ) - - @cached_property - def python_dependencies_s3_objects(self) -> aws.s3.BucketObject: - """ - Return the S3 objects for python dependencies. - - Returns - ------- - aws.s3.BucketObject - the S3 objects for python dependencies. - """ - - return aws.s3.BucketObject( - resource_name=f"{self._name}-site-packages-object", - opts=ResourceOptions(parent=self, depends_on=[self.runtime_env_builder]), - bucket=self.python_dependency_bucket.bucket, - key=f"{self._name}/site-packages.zip", - source=self.runtime_env_artifacts, - tags=self._tags, - ) - @cached_property def python_dependencies_lambda_layer(self) -> aws.lambda_.LayerVersion: """ @@ -252,8 +209,7 @@ def python_dependencies_lambda_layer(self) -> aws.lambda_.LayerVersion: return aws.lambda_.LayerVersion( resource_name=f"{self._name}-site-packages-layer", - opts=ResourceOptions(parent=self), + opts=ResourceOptions(parent=self, depends_on=[self.runtime_env_builder]), layer_name=f"{self._name}-site-packages-layer", - s3_bucket=self.python_dependencies_s3_objects.bucket, - s3_key=self.python_dependencies_s3_objects.key, + code=self.runtime_env_artifacts, ) From 8325e4ab9b77a8a17accfc4cf882cb8b000b5a7c Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Wed, 30 Oct 2024 15:23:56 +0100 Subject: [PATCH 20/24] fix(serverless): pushing empty dependency packages to lambda layer --- .../aws/resources/serverless_python_component.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index f08c12e..fd20eb6 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -169,16 +169,22 @@ def runtime_env_builder(self) -> command.local.Command: Returns ------- - None + command.local.Command + the command to build the runtime environment. """ return command.local.Command( resource_name=f"{self._name}-runtime-env-builder", opts=ResourceOptions(parent=self), - create=f"pip install -r {self.args.python_requirements_file} --target {self.runtime_env_directory}", + create=";".join( + [ + f"rm -rf {self.runtime_env_directory}", + f"pip install -r {self.args.python_requirements_file} --target {self.runtime_env_directory}", + ] + ), asset_paths=[self.runtime_env_directory], - delete=f"rm -rf {self.runtime_env_directory}", triggers=[ + FileArchive("/tmp/damavand-artifacts"), FileAsset(self.args.python_requirements_file), ], ) From 058c83cb4423be11e4967cf7433cc0b32b17ca72 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Thu, 31 Oct 2024 11:45:25 +0100 Subject: [PATCH 21/24] fix(llm): cannon recreate secrets after destroying --- src/damavand/cloud/aws/controllers/llm.py | 24 +++++++++++- .../resources/serverless_python_component.py | 37 ++++++++++++++++++- .../cloud/aws/resources/vllm_component.py | 36 +++++++++++++++--- 3 files changed, 88 insertions(+), 9 deletions(-) diff --git a/src/damavand/cloud/aws/controllers/llm.py b/src/damavand/cloud/aws/controllers/llm.py index 50531a3..99b91f7 100644 --- a/src/damavand/cloud/aws/controllers/llm.py +++ b/src/damavand/cloud/aws/controllers/llm.py @@ -102,10 +102,30 @@ def base_url(self) -> str: ) @property + def _default_api_key_secret_ssm_name(self) -> str: + """Return the SSM parameter name for the default API key stored in Secret Manager.""" + + return f"/damavand/{self.name}/api_key/secret/name" + + @property + @cache def _default_api_key_secret_name(self) -> str: """Return the secret name for the default API key.""" - return f"/damavand/{self.name}/api_key" + try: + response = self._parameter_store.get_parameter( + Name=self._default_api_key_secret_ssm_name, + ) + + return response["Parameter"]["Value"] + except ClientError as e: + raise RuntimeException( + f"Failed to retrieve secret name from SSM parameter store: {e}" + ) + except KeyError as e: + raise RuntimeException( + f"Failed to retrieve secret name from SSM parameter store: {e}" + ) @property @runtime @@ -158,7 +178,7 @@ def resource(self) -> "PulumiResource": # type: ignore # noqa args=( AwsVllmComponentArgs( region=self._region, - api_key_secret_name=self._default_api_key_secret_name, + api_key_ssm_name=self._default_api_key_secret_ssm_name, endpoint_ssm_parameter_name=self._base_url_ssm_name, ), AwsServerlessPythonComponentArgs( diff --git a/src/damavand/cloud/aws/resources/serverless_python_component.py b/src/damavand/cloud/aws/resources/serverless_python_component.py index fd20eb6..f0a4ebc 100644 --- a/src/damavand/cloud/aws/resources/serverless_python_component.py +++ b/src/damavand/cloud/aws/resources/serverless_python_component.py @@ -1,5 +1,6 @@ import json import os +import logging from typing import Optional from functools import cached_property from dataclasses import dataclass, field @@ -13,6 +14,9 @@ from damavand.cloud.aws.resources.aws_services import AwsService +logger = logging.getLogger(__name__) + + # TODO: use google style docsting format @dataclass class AwsServerlessPythonComponentArgs: @@ -41,7 +45,9 @@ class AwsServerlessPythonComponentArgs: python_version: str | aws.lambda_.Runtime = aws.lambda_.Runtime.PYTHON3D12 handler: str = "app.event_handler" handler_root_directory: str = os.path.join(os.getcwd()) - # TODO: add support for vpc + # FIXME: this needs to be integrated when we have working DLZ that provides VPC + subnet_ids: Optional[list[str]] = None + security_group_ids: Optional[list[str]] = None class AwsServerlessPythonComponent(PulumiComponentResource): @@ -123,6 +129,34 @@ def role(self) -> aws.iam.Role: tags=self._tags, ) + @cached_property + def vpc_config(self) -> aws.lambda_.FunctionVpcConfigArgs | None: + """ + Return the VPC configuration for the Lambda function. + + Returns + ------- + aws.lambda.FunctionVpcConfigArgs + the VPC configuration for the Lambda function. + """ + + if not self.args.subnet_ids: + logger.warning( + "No subnet IDs provided for the Lambda function. Skipping VPC configuration." + ) + return None + + if not self.args.security_group_ids: + logger.warning( + "No security group IDs provided for the Lambda function. Skipping VPC configuration." + ) + return None + + return aws.lambda_.FunctionVpcConfigArgs( + subnet_ids=self.args.subnet_ids, + security_group_ids=self.args.security_group_ids, + ) + @cached_property def lambda_function(self) -> aws.lambda_.Function: """ @@ -144,6 +178,7 @@ def lambda_function(self) -> aws.lambda_.Function: layers=[self.python_dependencies_lambda_layer.arn], timeout=300, memory_size=128, + vpc_config=self.vpc_config, tags=self._tags, ) diff --git a/src/damavand/cloud/aws/resources/vllm_component.py b/src/damavand/cloud/aws/resources/vllm_component.py index 9589939..562994a 100644 --- a/src/damavand/cloud/aws/resources/vllm_component.py +++ b/src/damavand/cloud/aws/resources/vllm_component.py @@ -45,8 +45,8 @@ class AwsVllmComponentArgs: instance_initial_count: int = 1 instance_type: str = "ml.g4dn.xlarge" api_key_required: bool = True - api_key_secret_name: Optional[str] = None api_env_name: str = "prod" + api_key_ssm_name: Optional[str] = None endpoint_ssm_parameter_name: str = "/Vllm/endpoint/url" @@ -166,6 +166,7 @@ def __init__( _ = self.api_key_usage_plan _ = self.api_key_secret _ = self.api_key_secret_version + _ = self.api_key_secret_ssm _ = self.api_method _ = self.api_integration @@ -422,15 +423,38 @@ def api_key_secret(self) -> aws.secretsmanager.Secret: "`api_key_secret` is only available when api_key_required is False" ) - if self.args.api_key_secret_name is None: + return aws.secretsmanager.Secret( + resource_name=f"{self._name}-api-key-secret", + opts=ResourceOptions(parent=self), + name_prefix=f"{self._name}/api-key/default", + tags=self._tags, + ) + + @property + @cache + def api_key_secret_ssm(self) -> aws.ssm.Parameter: + """ + Return the SSM parameter for the API key secret + + Secret Manager secrets have a time to live before they are deleted. As a result, a new secret name is required if the secret needs to be recreated. The parameter store provides a unique reference to the secret. + + + Raises + ------ + AttributeError + When api_key_required is False. + """ + if not self.args.api_key_required: raise AttributeError( - "The `api_key_secret_name` must be provided when `api_key_required` is True" + "`api_key_secret_ssm` is only available when api_key_required is False" ) - return aws.secretsmanager.Secret( - resource_name=f"{self._name}-api-key-secret", + return aws.ssm.Parameter( + resource_name=f"{self._name}-api-key-secret-ssm", opts=ResourceOptions(parent=self), - name=self.args.api_key_secret_name, + name=self.args.api_key_ssm_name, + type=aws.ssm.ParameterType.SECURE_STRING, + value=self.api_key_secret.arn, tags=self._tags, ) From 7642e2f56086158acca53cb8841974f5dda2e9e1 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Thu, 31 Oct 2024 15:36:23 +0100 Subject: [PATCH 22/24] fix(llm): secret key connot be found --- src/damavand/cloud/aws/resources/vllm_component.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/damavand/cloud/aws/resources/vllm_component.py b/src/damavand/cloud/aws/resources/vllm_component.py index 562994a..342bfdd 100644 --- a/src/damavand/cloud/aws/resources/vllm_component.py +++ b/src/damavand/cloud/aws/resources/vllm_component.py @@ -453,8 +453,8 @@ def api_key_secret_ssm(self) -> aws.ssm.Parameter: resource_name=f"{self._name}-api-key-secret-ssm", opts=ResourceOptions(parent=self), name=self.args.api_key_ssm_name, - type=aws.ssm.ParameterType.SECURE_STRING, - value=self.api_key_secret.arn, + type=aws.ssm.ParameterType.STRING, + value=self.api_key_secret.name, tags=self._tags, ) @@ -478,7 +478,7 @@ def api_key_secret_version(self) -> aws.secretsmanager.SecretVersion: resource_name=f"{self._name}-api-key-secret-version", opts=ResourceOptions(parent=self, depends_on=[self.api_key_secret]), secret_id=self.api_key_secret.id, - secret_string=self.admin_api_key.id, + secret_string=self.admin_api_key.value, ) @property From b9c3fc9124b25432abc57b8357239f64e28b9a54 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Thu, 31 Oct 2024 16:07:51 +0100 Subject: [PATCH 23/24] chore: update the packages lock file --- pdm.lock | 172 +++++++++++++++++++++++++++---------------------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/pdm.lock b/pdm.lock index e15b64b..0e373a5 100644 --- a/pdm.lock +++ b/pdm.lock @@ -90,25 +90,25 @@ files = [ [[package]] name = "boto3" -version = "1.35.49" +version = "1.35.52" requires_python = ">=3.8" summary = "The AWS SDK for Python" groups = ["default", "dev", "llm"] dependencies = [ - "botocore<1.36.0,>=1.35.49", + "botocore<1.36.0,>=1.35.52", "jmespath<2.0.0,>=0.7.1", "s3transfer<0.11.0,>=0.10.0", ] files = [ - {file = "boto3-1.35.49-py3-none-any.whl", hash = "sha256:b660c649a27a6b47a34f6f858f5bd7c3b0a798a16dec8dda7cbebeee80fd1f60"}, - {file = "boto3-1.35.49.tar.gz", hash = "sha256:ddecb27f5699ca9f97711c52b6c0652c2e63bf6c2bfbc13b819b4f523b4d30ff"}, + {file = "boto3-1.35.52-py3-none-any.whl", hash = "sha256:ec0e797441db56af63b1150bba49f114b0f885f5d76c3b6dc18075f73030d2bb"}, + {file = "boto3-1.35.52.tar.gz", hash = "sha256:68299da8ab2bb37cc843d61b9f4c1c9367438406cfd65a8f593afc7b3bfe226d"}, ] [[package]] name = "boto3-stubs" -version = "1.35.49" +version = "1.35.52" requires_python = ">=3.8" -summary = "Type annotations for boto3 1.35.49 generated with mypy-boto3-builder 8.1.4" +summary = "Type annotations for boto3 1.35.52 generated with mypy-boto3-builder 8.1.4" groups = ["dev"] dependencies = [ "botocore-stubs", @@ -116,13 +116,13 @@ dependencies = [ "typing-extensions>=4.1.0; python_version < \"3.12\"", ] files = [ - {file = "boto3_stubs-1.35.49-py3-none-any.whl", hash = "sha256:daad87dcff906f7c09dde4ef3c252e2c47b6e1e8e669f5a8311658ac0d1182c0"}, - {file = "boto3_stubs-1.35.49.tar.gz", hash = "sha256:2a2e08ba2383df6f478127f9754a02a590131249b40c59d7c6ca9fce76906785"}, + {file = "boto3_stubs-1.35.52-py3-none-any.whl", hash = "sha256:98f569ad38f08fa3aeebb6f83c26db19a0391a63ae3d5447e805445994509441"}, + {file = "boto3_stubs-1.35.52.tar.gz", hash = "sha256:4219eacd778c6bf8f738100ee5e411381c3a110ae635a7330a75723a5cddd7fd"}, ] [[package]] name = "botocore" -version = "1.35.49" +version = "1.35.52" requires_python = ">=3.8" summary = "Low-level, data-driven core of boto 3." groups = ["default", "dev", "llm"] @@ -133,13 +133,13 @@ dependencies = [ "urllib3<1.27,>=1.25.4; python_version < \"3.10\"", ] files = [ - {file = "botocore-1.35.49-py3-none-any.whl", hash = "sha256:aed4d3643afd702920792b68fbe712a8c3847993820d1048cd238a6469354da1"}, - {file = "botocore-1.35.49.tar.gz", hash = "sha256:07d0c1325fdbfa49a4a054413dbdeab0a6030449b2aa66099241af2dac48afd8"}, + {file = "botocore-1.35.52-py3-none-any.whl", hash = "sha256:cdbb5e43c9c3a977763e2a10d3b8b9c405d51279f9fcfd4ca4800763b22acba5"}, + {file = "botocore-1.35.52.tar.gz", hash = "sha256:1fe7485ea13d638b089103addd818c12984ff1e4d208de15f180b1e25ad944c5"}, ] [[package]] name = "botocore-stubs" -version = "1.35.49" +version = "1.35.52" requires_python = ">=3.8" summary = "Type annotations and code completion for botocore" groups = ["dev"] @@ -148,8 +148,8 @@ dependencies = [ "typing-extensions>=4.1.0; python_version < \"3.9\"", ] files = [ - {file = "botocore_stubs-1.35.49-py3-none-any.whl", hash = "sha256:367ce067e003de7e9b76320f551ba4fc8369a4b7ef10210f6071d3593fea2605"}, - {file = "botocore_stubs-1.35.49.tar.gz", hash = "sha256:c5006e31d77e290eca215e6a71292ea7b029b54900310ed0f87da8e844f1db38"}, + {file = "botocore_stubs-1.35.52-py3-none-any.whl", hash = "sha256:8478e738afbf37ac4c8f21dc0e341e11a72e018357ab9bad720378e50d29c3cc"}, + {file = "botocore_stubs-1.35.52.tar.gz", hash = "sha256:9d0498b0941a784f72e9984501a4e61f27a28fedc04d1f0edc9e37420ec6e8df"}, ] [[package]] @@ -1220,7 +1220,7 @@ files = [ [[package]] name = "mlflow" -version = "2.17.1" +version = "2.17.2" requires_python = ">=3.8" summary = "MLflow is an open source platform for the complete machine learning lifecycle" groups = ["llm"] @@ -1234,7 +1234,7 @@ dependencies = [ "gunicorn<24; platform_system != \"Windows\"", "markdown<4,>=3.3", "matplotlib<4", - "mlflow-skinny==2.17.1", + "mlflow-skinny==2.17.2", "numpy<3", "pandas<3", "pyarrow<18,>=4.0.0", @@ -1244,13 +1244,13 @@ dependencies = [ "waitress<4; platform_system == \"Windows\"", ] files = [ - {file = "mlflow-2.17.1-py3-none-any.whl", hash = "sha256:e614d0732cf95712891bfdfd92461dcf6a85d9e1899591be8399eb107eec6919"}, - {file = "mlflow-2.17.1.tar.gz", hash = "sha256:04cbec7fe79a4509d8c073ef64302b24e73cb447f5a14ad51d915bfbaa05c73b"}, + {file = "mlflow-2.17.2-py3-none-any.whl", hash = "sha256:5cd1b105d31db49d2c23d80d6e07ddde437793ffc1985b117fb013bf8ccb1ae8"}, + {file = "mlflow-2.17.2.tar.gz", hash = "sha256:3ecee5fa0eea9134154a99aec3006fe8fdbfc61d990a74ce99fa69cd3b54e933"}, ] [[package]] name = "mlflow-skinny" -version = "2.17.1" +version = "2.17.2" requires_python = ">=3.8" summary = "MLflow is an open source platform for the complete machine learning lifecycle" groups = ["llm"] @@ -1270,8 +1270,8 @@ dependencies = [ "sqlparse<1,>=0.4.0", ] files = [ - {file = "mlflow_skinny-2.17.1-py3-none-any.whl", hash = "sha256:656b7ccf37e7a5a00124487ad9ff1be781a041b6830ac7ae08cd594fd40b7f69"}, - {file = "mlflow_skinny-2.17.1.tar.gz", hash = "sha256:75500acab95c81aac469ed12da4a102e229b8e16757b61393080a44d45018020"}, + {file = "mlflow_skinny-2.17.2-py3-none-any.whl", hash = "sha256:d45d6ba7a05e4755110eca71afcad12d6ede51114b2be0fbb60a3f28d9159ab5"}, + {file = "mlflow_skinny-2.17.2.tar.gz", hash = "sha256:944144f2c94afff293c3f000dc605c7f08f5f8287bc6108d52a6f6e13dc4b64b"}, ] [[package]] @@ -1726,7 +1726,7 @@ files = [ [[package]] name = "pulumi-aws" -version = "6.56.1" +version = "6.57.0" requires_python = ">=3.8" summary = "A Pulumi package for creating and managing Amazon Web Services (AWS) cloud resources." groups = ["build"] @@ -1737,8 +1737,8 @@ dependencies = [ "typing-extensions>=4.11; python_version < \"3.11\"", ] files = [ - {file = "pulumi_aws-6.56.1-py3-none-any.whl", hash = "sha256:6bb23824a2d11bb5011752d3d707e6640204d08713f813fbb874c6a87161d702"}, - {file = "pulumi_aws-6.56.1.tar.gz", hash = "sha256:16f3af995d66ac8488465377e1a6d5ab30c8b2346a50e06f80355e9a13f3e6cd"}, + {file = "pulumi_aws-6.57.0-py3-none-any.whl", hash = "sha256:5d4eb464c90fa2b2cbba52dae5f98e7070f401598955269e0861c3590847371c"}, + {file = "pulumi_aws-6.57.0.tar.gz", hash = "sha256:bf389f35647fa4110de580fdfba0442d3432c65ab4009a5b1c4ad241903fcf65"}, ] [[package]] @@ -1762,7 +1762,7 @@ files = [ [[package]] name = "pulumi-azure-native" -version = "2.68.0" +version = "2.69.0" requires_python = ">=3.8" summary = "A native Pulumi package for creating and managing Azure resources." groups = ["build"] @@ -1773,8 +1773,8 @@ dependencies = [ "typing-extensions>=4.11; python_version < \"3.11\"", ] files = [ - {file = "pulumi_azure_native-2.68.0-py3-none-any.whl", hash = "sha256:688d2b8b668721ef0d1903db21ffc039e76acfdb062ff2150f72685facb00409"}, - {file = "pulumi_azure_native-2.68.0.tar.gz", hash = "sha256:744b881c79783fc55f3c35b7a0b841abab22711b058a09feeed11efc5c0d3e09"}, + {file = "pulumi_azure_native-2.69.0-py3-none-any.whl", hash = "sha256:932c6bcd083cf63762e2a183bbd014ac2bbb4c8d2641bc33f59e8f968e44006a"}, + {file = "pulumi_azure_native-2.69.0.tar.gz", hash = "sha256:483104a660fa93de2e8c389a349864a3325a63c97341c416027893eeb5a932cc"}, ] [[package]] @@ -2000,7 +2000,7 @@ files = [ [[package]] name = "pyright" -version = "1.1.386" +version = "1.1.387" requires_python = ">=3.7" summary = "Command line wrapper for pyright" groups = ["dev"] @@ -2009,8 +2009,8 @@ dependencies = [ "typing-extensions>=4.1", ] files = [ - {file = "pyright-1.1.386-py3-none-any.whl", hash = "sha256:7071ac495593b2258ccdbbf495f1a5c0e5f27951f6b429bed4e8b296eb5cd21d"}, - {file = "pyright-1.1.386.tar.gz", hash = "sha256:8e9975e34948ba5f8e07792a9c9d2bdceb2c6c0b61742b068d2229ca2bc4a9d9"}, + {file = "pyright-1.1.387-py3-none-any.whl", hash = "sha256:6a1f495a261a72e12ad17e20d1ae3df4511223c773b19407cfa006229b1b08a5"}, + {file = "pyright-1.1.387.tar.gz", hash = "sha256:577de60224f7fe36505d5b181231e3a395d427b7873be0bbcaa962a29ea93a60"}, ] [[package]] @@ -2034,17 +2034,17 @@ files = [ [[package]] name = "pytest-cov" -version = "5.0.0" -requires_python = ">=3.8" +version = "6.0.0" +requires_python = ">=3.9" summary = "Pytest plugin for measuring coverage." groups = ["dev"] dependencies = [ - "coverage[toml]>=5.2.1", + "coverage[toml]>=7.5", "pytest>=4.6", ] files = [ - {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, - {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, ] [[package]] @@ -2232,51 +2232,51 @@ files = [ [[package]] name = "rpds-py" -version = "0.20.0" +version = "0.20.1" requires_python = ">=3.8" summary = "Python bindings to Rust's persistent data structures (rpds)" groups = ["llm"] files = [ - {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, - {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, - {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, - {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, - {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, - {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, - {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, - {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, - {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, + {file = "rpds_py-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:762703bdd2b30983c1d9e62b4c88664df4a8a4d5ec0e9253b0231171f18f6d75"}, + {file = "rpds_py-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0b581f47257a9fce535c4567782a8976002d6b8afa2c39ff616edf87cbeff712"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842c19a6ce894493563c3bd00d81d5100e8e57d70209e84d5491940fdb8b9e3a"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42cbde7789f5c0bcd6816cb29808e36c01b960fb5d29f11e052215aa85497c93"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c8e9340ce5a52f95fa7d3b552b35c7e8f3874d74a03a8a69279fd5fca5dc751"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ba6f89cac95c0900d932c9efb7f0fb6ca47f6687feec41abcb1bd5e2bd45535"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a916087371afd9648e1962e67403c53f9c49ca47b9680adbeef79da3a7811b0"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:200a23239781f46149e6a415f1e870c5ef1e712939fe8fa63035cd053ac2638e"}, + {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58b1d5dd591973d426cbb2da5e27ba0339209832b2f3315928c9790e13f159e8"}, + {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6b73c67850ca7cae0f6c56f71e356d7e9fa25958d3e18a64927c2d930859b8e4"}, + {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8761c3c891cc51e90bc9926d6d2f59b27beaf86c74622c8979380a29cc23ac3"}, + {file = "rpds_py-0.20.1-cp311-none-win32.whl", hash = "sha256:cd945871335a639275eee904caef90041568ce3b42f402c6959b460d25ae8732"}, + {file = "rpds_py-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:7e21b7031e17c6b0e445f42ccc77f79a97e2687023c5746bfb7a9e45e0921b84"}, + {file = "rpds_py-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:36785be22066966a27348444b40389f8444671630063edfb1a2eb04318721e17"}, + {file = "rpds_py-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:142c0a5124d9bd0e2976089484af5c74f47bd3298f2ed651ef54ea728d2ea42c"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbddc10776ca7ebf2a299c41a4dde8ea0d8e3547bfd731cb87af2e8f5bf8962d"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15a842bb369e00295392e7ce192de9dcbf136954614124a667f9f9f17d6a216f"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be5ef2f1fc586a7372bfc355986226484e06d1dc4f9402539872c8bb99e34b01"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbcf360c9e3399b056a238523146ea77eeb2a596ce263b8814c900263e46031a"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd27a66740ffd621d20b9a2f2b5ee4129a56e27bfb9458a3bcc2e45794c96cb"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0b937b2a1988f184a3e9e577adaa8aede21ec0b38320d6009e02bd026db04fa"}, + {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6889469bfdc1eddf489729b471303739bf04555bb151fe8875931f8564309afc"}, + {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19b73643c802f4eaf13d97f7855d0fb527fbc92ab7013c4ad0e13a6ae0ed23bd"}, + {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c6afcf2338e7f374e8edc765c79fbcb4061d02b15dd5f8f314a4af2bdc7feb5"}, + {file = "rpds_py-0.20.1-cp312-none-win32.whl", hash = "sha256:dc73505153798c6f74854aba69cc75953888cf9866465196889c7cdd351e720c"}, + {file = "rpds_py-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:8bbe951244a838a51289ee53a6bae3a07f26d4e179b96fc7ddd3301caf0518eb"}, + {file = "rpds_py-0.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6ca91093a4a8da4afae7fe6a222c3b53ee4eef433ebfee4d54978a103435159e"}, + {file = "rpds_py-0.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b9c2fe36d1f758b28121bef29ed1dee9b7a2453e997528e7d1ac99b94892527c"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f009c69bc8c53db5dfab72ac760895dc1f2bc1b62ab7408b253c8d1ec52459fc"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6740a3e8d43a32629bb9b009017ea5b9e713b7210ba48ac8d4cb6d99d86c8ee8"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32b922e13d4c0080d03e7b62991ad7f5007d9cd74e239c4b16bc85ae8b70252d"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe00a9057d100e69b4ae4a094203a708d65b0f345ed546fdef86498bf5390982"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fe9b04b6fa685bd39237d45fad89ba19e9163a1ccaa16611a812e682913496"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa7ac11e294304e615b43f8c441fee5d40094275ed7311f3420d805fde9b07b4"}, + {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aa97af1558a9bef4025f8f5d8c60d712e0a3b13a2fe875511defc6ee77a1ab7"}, + {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:483b29f6f7ffa6af845107d4efe2e3fa8fb2693de8657bc1849f674296ff6a5a"}, + {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37fe0f12aebb6a0e3e17bb4cd356b1286d2d18d2e93b2d39fe647138458b4bcb"}, + {file = "rpds_py-0.20.1-cp313-none-win32.whl", hash = "sha256:a624cc00ef2158e04188df5e3016385b9353638139a06fb77057b3498f794782"}, + {file = "rpds_py-0.20.1-cp313-none-win_amd64.whl", hash = "sha256:b71b8666eeea69d6363248822078c075bac6ed135faa9216aa85f295ff009b1e"}, + {file = "rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350"}, ] [[package]] @@ -2309,7 +2309,7 @@ files = [ [[package]] name = "sagemaker" -version = "2.232.2" +version = "2.232.3" requires_python = ">=3.8" summary = "Open source library for training and deploying models on Amazon SageMaker." groups = ["llm"] @@ -2339,13 +2339,13 @@ dependencies = [ "urllib3<3.0.0,>=1.26.8", ] files = [ - {file = "sagemaker-2.232.2-py3-none-any.whl", hash = "sha256:49afdb0d83635bb71c5177e5ca6fb0b2dca804fa3c3f115f74dac88b77238f2f"}, - {file = "sagemaker-2.232.2.tar.gz", hash = "sha256:96732fc6986ad5b723b05bac5d5ee8e4594e51c6c65c0cc0d07c0dbef69e82b7"}, + {file = "sagemaker-2.232.3-py3-none-any.whl", hash = "sha256:cff39fc1e93f1468f1627a7a4078d4a7c009c903a9b0ca55b6c646dee5d1d2a5"}, + {file = "sagemaker-2.232.3.tar.gz", hash = "sha256:d46eb5dc98e4abc4b68548aeea3a8c36b7bdf107f14adcb5b3b25da3e36282c6"}, ] [[package]] name = "sagemaker-core" -version = "1.0.10" +version = "1.0.12" requires_python = ">=3.8" summary = "An python package for sagemaker core functionalities" groups = ["llm"] @@ -2360,8 +2360,8 @@ dependencies = [ "rich<14.0.0,>=13.0.0", ] files = [ - {file = "sagemaker_core-1.0.10-py3-none-any.whl", hash = "sha256:0bdcf6a467db988919cc6b6d0077f74871ee24c24adf7f759f9cb98460e08953"}, - {file = "sagemaker_core-1.0.10.tar.gz", hash = "sha256:6d34a9b6dc5e17e8bfffd1d0650726865779c92b3b8f1b59fc15d42061a0dd29"}, + {file = "sagemaker_core-1.0.12-py3-none-any.whl", hash = "sha256:83e0ec40fc047b157a1803ab6ed0cd1833b9d36dd7c2e3b6d907e4647ad527a3"}, + {file = "sagemaker_core-1.0.12.tar.gz", hash = "sha256:511a6bab576af58f20748ff4a648bd8587af3549acbeaeef776db5c3e7d8169b"}, ] [[package]] @@ -2670,14 +2670,14 @@ files = [ [[package]] name = "waitress" -version = "3.0.0" -requires_python = ">=3.8.0" +version = "3.0.1" +requires_python = ">=3.9.0" summary = "Waitress WSGI server" groups = ["llm"] marker = "platform_system == \"Windows\"" files = [ - {file = "waitress-3.0.0-py3-none-any.whl", hash = "sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669"}, - {file = "waitress-3.0.0.tar.gz", hash = "sha256:005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1"}, + {file = "waitress-3.0.1-py3-none-any.whl", hash = "sha256:26cdbc593093a15119351690752c99adc13cbc6786d75f7b6341d1234a3730ac"}, + {file = "waitress-3.0.1.tar.gz", hash = "sha256:ef0c1f020d9f12a515c4ec65c07920a702613afcad1dbfdc3bcec256b6c072b3"}, ] [[package]] From 576f020b25ae0762002b27e03162be16c344a676 Mon Sep 17 00:00:00 2001 From: kiarash kiani Date: Thu, 31 Oct 2024 16:31:50 +0100 Subject: [PATCH 24/24] fix(test): making the test pipeline working --- .../base/controllers/object_storage.py | 4 +++- src/damavand/base/controllers/spark.py | 5 +++-- .../cloud/aws/controllers/object_storage.py | 4 +++- src/damavand/cloud/aws/controllers/spark.py | 18 +++++++++++++++--- src/damavand/cloud/azure/controllers/spark.py | 10 +++++++--- tests/clouds/aws/controllers/test_aws_spark.py | 5 +++++ .../aws/resources/test_glue_component.py | 6 +++++- .../aws/resources/test_vllm_component.py | 6 +++++- 8 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/damavand/base/controllers/object_storage.py b/src/damavand/base/controllers/object_storage.py index db995c6..67d0e88 100644 --- a/src/damavand/base/controllers/object_storage.py +++ b/src/damavand/base/controllers/object_storage.py @@ -1,16 +1,18 @@ from typing import Iterable from damavand.base.controllers import ApplicationController +from damavand.base.controllers.base_controller import CostManagement class ObjectStorageController(ApplicationController): def __init__( self, name, + cost: CostManagement, tags: dict[str, str] = {}, **kwargs, ) -> None: - super().__init__(name, tags, **kwargs) + super().__init__(name, cost, tags, **kwargs) def read(self, path: str) -> bytes: """Read an object from the storage.""" diff --git a/src/damavand/base/controllers/spark.py b/src/damavand/base/controllers/spark.py index 84c12ba..dbada63 100644 --- a/src/damavand/base/controllers/spark.py +++ b/src/damavand/base/controllers/spark.py @@ -1,7 +1,7 @@ import logging from damavand.base.controllers import ApplicationController -from damavand.base.controllers.base_controller import runtime +from damavand.base.controllers.base_controller import CostManagement, runtime from sparkle.application import Sparkle @@ -38,11 +38,12 @@ class SparkController(ApplicationController): def __init__( self, name, + cost: CostManagement, applications: list[Sparkle], tags: dict[str, str] = {}, **kwargs, ) -> None: - ApplicationController.__init__(self, name, tags, **kwargs) + ApplicationController.__init__(self, name, cost, tags, **kwargs) self.applications: list[Sparkle] = applications def application_with_id(self, app_id: str) -> Sparkle: diff --git a/src/damavand/cloud/aws/controllers/object_storage.py b/src/damavand/cloud/aws/controllers/object_storage.py index 3edaada..d0cb98d 100644 --- a/src/damavand/cloud/aws/controllers/object_storage.py +++ b/src/damavand/cloud/aws/controllers/object_storage.py @@ -9,6 +9,7 @@ from damavand import utils from damavand.base.controllers import buildtime, runtime +from damavand.base.controllers.base_controller import CostManagement from damavand.base.controllers.object_storage import ObjectStorageController from damavand.errors import ( RuntimeException, @@ -24,11 +25,12 @@ class AwsObjectStorageController(ObjectStorageController): def __init__( self, name, + cost: CostManagement, region: str, tags: dict[str, str] = {}, **kwargs, ) -> None: - super().__init__(name, tags, **kwargs) + super().__init__(name, cost, tags, **kwargs) self.__s3_client = boto3.client("s3", region_name=region) @buildtime diff --git a/src/damavand/cloud/aws/controllers/spark.py b/src/damavand/cloud/aws/controllers/spark.py index 80cad7a..c53bf0c 100644 --- a/src/damavand/cloud/aws/controllers/spark.py +++ b/src/damavand/cloud/aws/controllers/spark.py @@ -6,9 +6,13 @@ from sparkle.application import Sparkle from damavand.base.controllers import buildtime +from damavand.base.controllers.base_controller import CostManagement from damavand.base.controllers.spark import SparkController -from damavand.cloud.aws.resources import GlueComponent, GlueComponentArgs -from damavand.cloud.aws.resources.glue_component import GlueJobDefinition +from damavand.cloud.aws.resources.glue_component import ( + GlueComponent, + GlueComponentArgs, + GlueJobDefinition, +) from damavand.errors import BuildtimeException @@ -20,11 +24,12 @@ def __init__( self, name, applications: list[Sparkle], + cost: CostManagement, region: str, tags: dict[str, str] = {}, **kwargs, ) -> None: - super().__init__(name, applications, tags, **kwargs) + super().__init__(name, cost, applications, tags, **kwargs) self._glue_client = boto3.client("glue", region_name=region) @buildtime @@ -44,4 +49,11 @@ def resource(self) -> PulumiResource: for app in self.applications ], ), + tags=self.all_tags, ) + + @buildtime + @cache + def cost_controls(self) -> PulumiResource: # type: ignore # noqa + # FIXME: Implement cost controls + pass diff --git a/src/damavand/cloud/azure/controllers/spark.py b/src/damavand/cloud/azure/controllers/spark.py index 85d2ee8..77a2ae7 100644 --- a/src/damavand/cloud/azure/controllers/spark.py +++ b/src/damavand/cloud/azure/controllers/spark.py @@ -7,6 +7,7 @@ from sparkle.application import Sparkle from damavand.base.controllers import buildtime +from damavand.base.controllers.base_controller import CostManagement from damavand.base.controllers.spark import SparkController from damavand.cloud.azure.resources import SynapseComponent, SynapseComponentArgs from damavand.cloud.azure.resources.synapse_component import SynapseJobDefinition @@ -19,22 +20,25 @@ class AzureSparkController(SparkController): def __init__( self, name, + cost: CostManagement, applications: list[Sparkle], region: str, tags: dict[str, str] = {}, **kwargs, ) -> None: - super().__init__(name, applications, tags, **kwargs) + super().__init__(name, cost, applications, tags, **kwargs) self.applications = applications @buildtime def admin_username(self) -> str: - return self.build_config.require("admin_username") + # FIXME: this has to be fixed + return "admin" @buildtime @cache def admin_password(self) -> pulumi.Output[str] | str: - return self.build_config.require_secret("admin_password") + # FIXME: this has to be fixed + return "sample_password" @buildtime @cache diff --git a/tests/clouds/aws/controllers/test_aws_spark.py b/tests/clouds/aws/controllers/test_aws_spark.py index 79912de..dc0e483 100644 --- a/tests/clouds/aws/controllers/test_aws_spark.py +++ b/tests/clouds/aws/controllers/test_aws_spark.py @@ -5,6 +5,7 @@ from sparkle.application import Sparkle from sparkle.config import Config +from damavand.base.controllers.base_controller import CostManagement from damavand.cloud.aws.controllers.spark import AwsSparkController, GlueComponent from damavand.errors import BuildtimeException @@ -15,6 +16,10 @@ def controller(): "test-spark", applications=[], region="us-east-1", + cost=CostManagement( + notification_subscribers=[], + monthly_limit_in_dollars=100, + ), ) return ctr diff --git a/tests/clouds/aws/resources/test_glue_component.py b/tests/clouds/aws/resources/test_glue_component.py index 4257d30..8b21ef0 100644 --- a/tests/clouds/aws/resources/test_glue_component.py +++ b/tests/clouds/aws/resources/test_glue_component.py @@ -22,11 +22,12 @@ def call(self, args: MockCallArgs) -> Tuple[dict, Optional[List[Tuple[str, str]] preview=False, # Sets the flag `dry_run`, which is true at runtime during a preview. ) -from damavand.cloud.aws.resources import GlueComponent, GlueComponentArgs # noqa: E402 from damavand.cloud.aws.resources.glue_component import ( # noqa: E402 GlueJobDefinition, ConnectorConfig, GlueJobType, + GlueComponent, + GlueComponentArgs, ) @@ -46,6 +47,7 @@ def glue_component(): ), ] ), + tags={"env": "test"}, ) @@ -129,6 +131,7 @@ def glue_component_with_streaming_job(): ), ] ), + tags={"env": "test"}, ) @@ -160,6 +163,7 @@ def glue_component_with_connector(): connection_properties={"BootstrapServers": "localhost:9092"}, ), ), + tags={"env": "test"}, ) diff --git a/tests/clouds/aws/resources/test_vllm_component.py b/tests/clouds/aws/resources/test_vllm_component.py index a65bedb..12abacf 100644 --- a/tests/clouds/aws/resources/test_vllm_component.py +++ b/tests/clouds/aws/resources/test_vllm_component.py @@ -21,7 +21,7 @@ def call(self, args: MockCallArgs) -> Tuple[dict, Optional[List[Tuple[str, str]] preview=False, # Sets the flag `dry_run`, which is true at runtime during a preview. ) -from damavand.cloud.aws.resources import ( # noqa: E402 +from damavand.cloud.aws.resources.vllm_component import ( # noqa: E402 AwsVllmComponent, AwsVllmComponentArgs, ) @@ -31,6 +31,7 @@ def test_require_api_key(): vllm = AwsVllmComponent( name="test", args=AwsVllmComponentArgs(), + tags={"env": "test"}, ) assert isinstance(vllm.api, aws.apigateway.RestApi) @@ -54,6 +55,7 @@ def test_public_internet_access(): args=AwsVllmComponentArgs( api_key_required=False, ), + tags={"env": "test"}, ) assert isinstance(vllm.api, aws.apigateway.RestApi) @@ -80,6 +82,7 @@ def test_model_image_version(): model_image_version="0.29.0", api_key_required=True, ), + tags={"env": "test"}, ) assert "djl-inference:0.29.0" in vllm.model_image_ecr_path @@ -92,6 +95,7 @@ def test_model_image_config(): model_name="microsoft/Phi-3-mini-4k-instruct", api_key_required=True, ), + tags={"env": "test"}, ) assert vllm.model_image_configs["HF_MODEL_ID"] == "microsoft/Phi-3-mini-4k-instruct"