diff --git a/aana/api/api_generation.py b/aana/api/api_generation.py index 70c3745c..131e2129 100644 --- a/aana/api/api_generation.py +++ b/aana/api/api_generation.py @@ -18,7 +18,7 @@ from aana.api.event_handlers.event_manager import EventManager from aana.api.exception_handler import custom_exception_handler from aana.api.responses import AanaJSONResponse -from aana.api.security import require_admin_access +from aana.api.security import require_active_subscription, require_admin_access from aana.configs.settings import settings as aana_settings from aana.core.models.api_service import ApiKey from aana.core.models.exception import ExceptionResponseModel @@ -62,6 +62,7 @@ class Endpoint: path (str): Path of the endpoint (e.g. "/video/transcribe"). summary (str): Description of the endpoint that will be shown in the API documentation. admin_required (bool): Flag indicating if the endpoint requires admin access. + active_subscription_required (bool): Flag indicating if the endpoint requires an active subscription. defer_option (DeferOption): Defer option for the endpoint (always, never, optional). event_handlers (list[EventHandler] | None): The list of event handlers to register for the endpoint. """ @@ -70,6 +71,7 @@ class Endpoint: path: str summary: str admin_required: bool = False + active_subscription_required: bool = False defer_option: DeferOption = DeferOption.OPTIONAL initialized: bool = False event_handlers: list[EventHandler] | None = None @@ -347,6 +349,9 @@ async def route_func( if aana_settings.api_service.enabled and self.admin_required: require_admin_access(request) + if aana_settings.api_service.enabled and self.active_subscription_required: + require_active_subscription(request) + if self.defer_option == DeferOption.ALWAYS: defer = True elif self.defer_option == DeferOption.NEVER: @@ -391,6 +396,19 @@ def send_usage_event( def send_event_with_retry(client, event): return client.events.create(event) + if not aana_settings.api_service.enabled: + logger.warning("API service is not enabled. Skipping usage event.") + return + + if ( + not aana_settings.api_service.lago_url + or not aana_settings.api_service.lago_api_key + ): + logger.warning( + "LAGO API service URL or API key is not set. Skipping usage event." + ) + return + try: client = Client( api_key=aana_settings.api_service.lago_api_key, diff --git a/aana/api/app.py b/aana/api/app.py index ad006a08..a51ff683 100644 --- a/aana/api/app.py +++ b/aana/api/app.py @@ -11,7 +11,6 @@ ApiKeyNotFound, ApiKeyNotProvided, ApiKeyValidationFailed, - InactiveSubscription, ) from aana.storage.models.api_key import ApiKeyEntity from aana.storage.session import get_session @@ -47,9 +46,6 @@ async def api_key_check(request: Request, call_next): if not api_key_info: raise ApiKeyNotFound(key=api_key) - if not api_key_info.is_subscription_active: - raise InactiveSubscription(key=api_key) - request.state.api_key_info = api_key_info.to_model() response = await call_next(request) diff --git a/aana/api/security.py b/aana/api/security.py index 5ff49af0..13310c02 100644 --- a/aana/api/security.py +++ b/aana/api/security.py @@ -4,7 +4,7 @@ from aana.configs.settings import settings as aana_settings from aana.core.models.api_service import ApiKey -from aana.exceptions.api_service import AdminOnlyAccess +from aana.exceptions.api_service import AdminOnlyAccess, InactiveSubscription def is_admin(request: Request) -> bool: @@ -48,6 +48,22 @@ def extract_user_id(request: Request) -> str | None: return api_key_info.user_id if api_key_info else None +def require_active_subscription(request: Request) -> bool: + """Check if the user has an active subscription. If not, raise an exception. + + Args: + request (Request): The request object + + Raises: + InactiveSubscription: If the user does not have an active subscription + """ + if aana_settings.api_service.enabled: + api_key_info: ApiKey = request.state.api_key_info + if not api_key_info.is_subscription_active: + raise InactiveSubscription(key=api_key_info.api_key) + return True + + AdminAccessDependency = Annotated[bool, Depends(require_admin_access)] """ Dependency to check if the user is an admin. If not, it will raise an exception. """ @@ -59,3 +75,8 @@ def extract_user_id(request: Request) -> str | None: ApiKeyInfoDependency = Annotated[ApiKey | None, Depends(extract_api_key_info)] """ Dependency to get the API key info. """ + +ActiveSubscriptionRequiredDependency = Annotated[ + bool, Depends(require_active_subscription) +] +""" Dependency to check if the user has an active subscription. If not, it will raise an exception. """ diff --git a/aana/configs/__init__.py b/aana/configs/__init__.py index dcbcaf0a..6cee0168 100644 --- a/aana/configs/__init__.py +++ b/aana/configs/__init__.py @@ -3,11 +3,11 @@ from aana.storage.op import DbType __all__ = [ - "Settings", "DbSettings", - "TaskQueueSettings", - "TestSettings", "DbType", "PostgreSQLConfig", "SQLiteConfig", + "Settings", + "TaskQueueSettings", + "TestSettings", ] diff --git a/aana/configs/settings.py b/aana/configs/settings.py index 08edaa5f..ba9623e0 100644 --- a/aana/configs/settings.py +++ b/aana/configs/settings.py @@ -65,7 +65,7 @@ class WebhookSettings(BaseModel): """ retry_attempts: int = 5 - hmac_secret: str = "webhook_secret" + hmac_secret: str = "webhook_secret" # noqa: S105 class Settings(BaseSettings): @@ -130,17 +130,6 @@ def setup_resource_directories(self): self.model_dir.mkdir(parents=True, exist_ok=True) return self - @model_validator(mode="after") - def validate_lago_settings(self): - """Validate the LAGO API service settings.""" - if self.api_service.enabled and ( - self.api_service.lago_url is None or self.api_service.lago_api_key is None - ): - raise ValueError( # noqa: TRY003 - "LAGO API service settings are required when the API service is enabled." - ) - return self - model_config = SettingsConfigDict( protected_namespaces=("settings", *pydantic_protected_fields), env_nested_delimiter="__", diff --git a/aana/core/models/asr.py b/aana/core/models/asr.py index 55883e4b..c2c66839 100644 --- a/aana/core/models/asr.py +++ b/aana/core/models/asr.py @@ -18,14 +18,14 @@ ) __all__ = [ - "AsrWord", "AsrSegment", - "AsrTranscriptionInfo", - "AsrTranscription", "AsrSegments", "AsrSegmentsList", + "AsrTranscription", + "AsrTranscriptionInfo", "AsrTranscriptionInfoList", "AsrTranscriptionList", + "AsrWord", ] diff --git a/aana/core/models/chat.py b/aana/core/models/chat.py index c102f3d6..8dde9a54 100644 --- a/aana/core/models/chat.py +++ b/aana/core/models/chat.py @@ -5,14 +5,14 @@ from aana.core.models.base import pydantic_protected_fields __all__ = [ - "Role", + "ChatCompletion", + "ChatCompletionChoice", + "ChatCompletionRequest", + "ChatDialog", + "ChatMessage", "Prompt", "Question", - "ChatMessage", - "ChatDialog", - "ChatCompletionRequest", - "ChatCompletionChoice", - "ChatCompletion", + "Role", ] Role = Literal["system", "user", "assistant"] diff --git a/aana/core/models/whisper.py b/aana/core/models/whisper.py index c46bcfd8..daac988a 100644 --- a/aana/core/models/whisper.py +++ b/aana/core/models/whisper.py @@ -7,7 +7,7 @@ class MyConfig(ConfigDict, total=False): json_schema_extra: dict -__all__ = ["WhisperParams", "BatchedWhisperParams"] +__all__ = ["BatchedWhisperParams", "WhisperParams"] class WhisperParams(BaseModel): diff --git a/aana/exceptions/db.py b/aana/exceptions/db.py index a3caa196..9d12d74e 100644 --- a/aana/exceptions/db.py +++ b/aana/exceptions/db.py @@ -2,8 +2,8 @@ from aana.exceptions.core import BaseException __all__ = [ - "NotFoundException", "MediaIdAlreadyExistsException", + "NotFoundException", ] diff --git a/aana/exceptions/io.py b/aana/exceptions/io.py index 1711465c..c9c656a4 100644 --- a/aana/exceptions/io.py +++ b/aana/exceptions/io.py @@ -9,9 +9,9 @@ __all__ = [ - "ImageReadingException", "AudioReadingException", "DownloadException", + "ImageReadingException", "VideoException", "VideoReadingException", "VideoTooLongException", diff --git a/aana/exceptions/runtime.py b/aana/exceptions/runtime.py index 825b8409..20e70692 100644 --- a/aana/exceptions/runtime.py +++ b/aana/exceptions/runtime.py @@ -1,17 +1,17 @@ from aana.exceptions.core import BaseException __all__ = [ - "InferenceException", - "PromptTooLongException", + "DeploymentException", + "EmptyMigrationsException", "EndpointNotFoundException", - "TooManyRequestsException", + "FailedDeployment", "HandlerAlreadyRegisteredException", "HandlerNotRegisteredException", - "UploadedFileNotFound", - "DeploymentException", + "InferenceException", "InsufficientResources", - "FailedDeployment", - "EmptyMigrationsException", + "PromptTooLongException", + "TooManyRequestsException", + "UploadedFileNotFound", ] diff --git a/aana/integrations/external/decord.py b/aana/integrations/external/decord.py index 424b1dc6..9cf2f641 100644 --- a/aana/integrations/external/decord.py +++ b/aana/integrations/external/decord.py @@ -11,11 +11,11 @@ from aana.exceptions.io import VideoReadingException __all__ = [ + "FramesDict", "extract_frames", "generate_frames", "get_video_duration", "is_audio", - "FramesDict", ] diff --git a/aana/sdk.py b/aana/sdk.py index 252458e8..0500107d 100644 --- a/aana/sdk.py +++ b/aana/sdk.py @@ -270,6 +270,7 @@ def register_endpoint( summary: str, endpoint_cls: type[Endpoint], admin_required: bool = False, + active_subscription_required: bool = False, defer_option: DeferOption = DeferOption.OPTIONAL, event_handlers: list[EventHandler] | None = None, ): @@ -281,6 +282,7 @@ def register_endpoint( summary (str): The summary of the endpoint. endpoint_cls (Type[Endpoint]): The class of the endpoint. admin_required (bool, optional): If True, the endpoint requires admin access. Defaults to False. + active_subscription_required (bool, optional): If True, the endpoint requires an active subscription. Defaults to False. defer_option (DeferOption): Defer option for the endpoint (always, never, optional). event_handlers (list[EventHandler], optional): The event handlers to register for the endpoint. """ @@ -289,6 +291,7 @@ def register_endpoint( path=path, summary=summary, admin_required=admin_required, + active_subscription_required=active_subscription_required, defer_option=defer_option, event_handlers=event_handlers, ) diff --git a/aana/storage/models/__init__.py b/aana/storage/models/__init__.py index 0ccaecfd..fa0468a2 100644 --- a/aana/storage/models/__init__.py +++ b/aana/storage/models/__init__.py @@ -19,8 +19,8 @@ __all__ = [ "BaseEntity", - "MediaEntity", - "VideoEntity", "CaptionEntity", + "MediaEntity", "TranscriptEntity", + "VideoEntity", ] diff --git a/aana/storage/session.py b/aana/storage/session.py index 19e6fcce..1ca18d92 100644 --- a/aana/storage/session.py +++ b/aana/storage/session.py @@ -7,7 +7,7 @@ from aana.storage.models.api_key import ApiServiceBase from aana.storage.models.base import BaseEntity -__all__ = ["get_session", "get_db"] +__all__ = ["get_db", "get_session"] engine = settings.db_config.get_engine() diff --git a/aana/tests/conftest.py b/aana/tests/conftest.py index 0ba9f0cd..8d288cfd 100644 --- a/aana/tests/conftest.py +++ b/aana/tests/conftest.py @@ -118,13 +118,7 @@ def start_app(deployments, endpoints): ) for endpoint in endpoints: - app.register_endpoint( - name=endpoint["name"], - path=endpoint["path"], - summary=endpoint["summary"], - endpoint_cls=endpoint["endpoint_cls"], - event_handlers=endpoint.get("event_handlers", []), - ) + app.register_endpoint(**endpoint) app.deploy(blocking=False) diff --git a/aana/tests/deployments/test_whisper_deployment.py b/aana/tests/deployments/test_whisper_deployment.py index ad00bfd8..ffe9efae 100644 --- a/aana/tests/deployments/test_whisper_deployment.py +++ b/aana/tests/deployments/test_whisper_deployment.py @@ -115,7 +115,7 @@ async def test_transcribe(self, setup_deployment, audio_file): ) assert vad_path.exists(), f"vad expected predictions not found: {vad_path}" - with Path(vad_path) as path, path.open() as f: + with Path(vad_path) as path, path.open() as f: # noqa: ASYNC230 expected_output_vad = json.load(f) vad_input = [ VadSegment(time_interval=seg["time_interval"], segments=seg["segments"]) diff --git a/aana/tests/units/test_app_with_api_service.py b/aana/tests/units/test_app_with_api_service.py index 6a44671a..536d728a 100644 --- a/aana/tests/units/test_app_with_api_service.py +++ b/aana/tests/units/test_app_with_api_service.py @@ -100,6 +100,7 @@ async def run(self, text: str) -> UppercaseEndpointOutput: "name": "lowercase", "path": "/lowercase", "summary": "Lowercase text", + "active_subscription_required": True, "endpoint_cls": LowercaseEndpoint, }, { diff --git a/aana/tests/units/test_status_endpoint.py b/aana/tests/units/test_status_endpoint.py index 750d0197..59af6a62 100644 --- a/aana/tests/units/test_status_endpoint.py +++ b/aana/tests/units/test_status_endpoint.py @@ -93,7 +93,7 @@ async def test_status_endpoint(create_app): assert status["status"] == "RUNNING" # kill the deployment - response = requests.post( # noqa: ASYNC100 + response = requests.post( # noqa: ASYNC210 f"http://localhost:{aana_app.port}/lowercase", data={"body": json.dumps({"text": "kill"})}, ).json() diff --git a/aana/utils/download.py b/aana/utils/download.py index 5bec3f32..54641b62 100644 --- a/aana/utils/download.py +++ b/aana/utils/download.py @@ -9,7 +9,7 @@ from aana.exceptions.io import DownloadException from aana.utils.file import get_sha256_hash_file -__all__ = ["download_model", "download_file"] +__all__ = ["download_file", "download_model"] # Issue-Enable HF download: https://github.com/mobiusml/aana_sdk/issues/65 diff --git a/aana/utils/json.py b/aana/utils/json.py index 6e832190..1f490f68 100644 --- a/aana/utils/json.py +++ b/aana/utils/json.py @@ -5,7 +5,7 @@ from pydantic import BaseModel from sqlalchemy import Engine -__all__ = ["jsonify", "json_serializer_default"] +__all__ = ["json_serializer_default", "jsonify"] def json_serializer_default(obj: object) -> object: diff --git a/notebooks/diarized_transcription_example.ipynb b/notebooks/diarized_transcription_example.ipynb index df7a9812..8cf46872 100644 --- a/notebooks/diarized_transcription_example.ipynb +++ b/notebooks/diarized_transcription_example.ipynb @@ -24,7 +24,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"HF_TOKEN\"] = \"\"\n", + "os.environ[\"HF_TOKEN\"] = \"\" # noqa: S105\n", "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"" ] }, @@ -226,8 +226,8 @@ ], "source": [ "import json\n", - "import requests\n", "\n", + "import requests\n", "\n", "video = {\n", " # Video URL/path, Aana SDK supports URLs (including YouTube), file paths or even raw video data\n", @@ -245,7 +245,7 @@ "url = \"http://127.0.0.1:8000/video/transcribe\"\n", "\n", "# No streaming support possible for diarized transcription as it needs complete ASR output beforehand.\n", - "response = requests.post(url, data={\"body\": json.dumps(data)})\n", + "response = requests.post(url, data={\"body\": json.dumps(data)}) # noqa: S113\n", "\n", "print(response.json())" ] @@ -274,7 +274,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.10.16" } }, "nbformat": 4, diff --git a/notebooks/getting_started_with_aana.ipynb b/notebooks/getting_started_with_aana.ipynb index de44a7fb..4b3969b9 100644 --- a/notebooks/getting_started_with_aana.ipynb +++ b/notebooks/getting_started_with_aana.ipynb @@ -722,9 +722,8 @@ } ], "source": [ - "import json\n", "import re\n", - "from datetime import datetime\n", + "from datetime import datetime, timezone\n", "\n", "import requests\n", "\n", @@ -732,7 +731,9 @@ "\n", "match = re.search(r\"v=([^&]+)\", url)\n", "video_id = match.group(1) if match else None\n", - "media_id = f\"{video_id}_{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\"\n", + "\n", + "\n", + "media_id = f\"{video_id}_{datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S')}\"\n", "\n", "video = {\n", " \"url\": url, # Video URL, Aana SDK supports URLs (including YouTube), file paths or even raw video data\n", @@ -747,7 +748,7 @@ "}\n", "\n", "url = \"http://127.0.0.1:8005/video/index_stream\"\n", - "response = requests.post(url, data={\"body\": json.dumps(data)}, stream=True)\n", + "response = requests.post(url, data={\"body\": json.dumps(data)}, stream=True) # noqa: S113\n", "\n", "for chunk in response.iter_content(chunk_size=None):\n", " json_data = json.loads(chunk)\n", @@ -791,7 +792,7 @@ "\n", "url = \"http://127.0.0.1:8005/video/chat_stream\"\n", "\n", - "response = requests.post(url, data={\"body\": json.dumps(data)}, stream=True)\n", + "response = requests.post(url, data={\"body\": json.dumps(data)}, stream=True) # noqa: S113\n", "op = \"\"\n", "for chunk in response.iter_content(chunk_size=None):\n", " chunk_dict = json.loads(chunk)\n", @@ -865,8 +866,8 @@ } ], "source": [ - "from IPython.display import YouTubeVideo\n", "import rich\n", + "from IPython.display import YouTubeVideo\n", "\n", "rich.print(op)\n", "YouTubeVideo(video_id)" diff --git a/notebooks/haystack_integration.ipynb b/notebooks/haystack_integration.ipynb index fa40b57a..11e6af9d 100644 --- a/notebooks/haystack_integration.ipynb +++ b/notebooks/haystack_integration.ipynb @@ -53,7 +53,6 @@ "source": [ "from aana.sdk import AanaSDK\n", "\n", - "\n", "aana_app = AanaSDK().connect()" ] }, @@ -362,10 +361,12 @@ } ], "source": [ - "import requests, json\n", + "import json\n", + "\n", + "import requests\n", "\n", "data = {\"query\": \"Who lives in Berlin?\"}\n", - "response = requests.post(\n", + "response = requests.post( # noqa: S113\n", " \"http://127.0.0.1:8000/query\",\n", " data={\"body\": json.dumps(data)},\n", ")\n", @@ -386,10 +387,12 @@ } ], "source": [ - "import requests, json\n", + "import json\n", + "\n", + "import requests\n", "\n", "data = {\"query\": \"What is the interesting fact about Germany?\"}\n", - "response = requests.post(\n", + "response = requests.post( # noqa: S113\n", " \"http://127.0.0.1:8000/query\",\n", " data={\"body\": json.dumps(data)},\n", ")\n", @@ -421,7 +424,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.16" } }, "nbformat": 4, diff --git a/notebooks/hf_pipeline_deployment.ipynb b/notebooks/hf_pipeline_deployment.ipynb index 924d7470..7f013f16 100644 --- a/notebooks/hf_pipeline_deployment.ipynb +++ b/notebooks/hf_pipeline_deployment.ipynb @@ -50,7 +50,6 @@ "source": [ "from aana.sdk import AanaSDK\n", "\n", - "\n", "aana_app = AanaSDK().connect()" ] }, @@ -93,18 +92,20 @@ ")\n", "\n", "hf_pipeline_deployment = HfPipelineDeployment.options(\n", - " num_replicas=1, # The number of replicas of the model to deploy\n", - " ray_actor_options={\"num_gpus\": 0.25}, # Allocate 0.25 GPU, should be > 0 if the model requires GPU\n", + " num_replicas=1, # The number of replicas of the model to deploy\n", + " ray_actor_options={\n", + " \"num_gpus\": 0.25\n", + " }, # Allocate 0.25 GPU, should be > 0 if the model requires GPU\n", " user_config=HfPipelineConfig(\n", - " model_id=\"ydshieh/vit-gpt2-coco-en\", # The model ID from the Hugging Face model hub\n", - " model_kwargs={}, # Extra model parameters\n", + " model_id=\"ydshieh/vit-gpt2-coco-en\", # The model ID from the Hugging Face model hub\n", + " model_kwargs={}, # Extra model parameters\n", " ).model_dump(mode=\"json\"),\n", ")\n", "\n", "aana_app.register_deployment(\n", - " name=\"image_captioning_model\", # Name of the deployment, which will be using to access the deployment\n", - " instance=hf_pipeline_deployment, # Instance of the deployment that we just created above\n", - " deploy=True # Tell Aana to deploy the component immediately instead of waiting aana_app.deploy()\n", + " name=\"image_captioning_model\", # Name of the deployment, which will be using to access the deployment\n", + " instance=hf_pipeline_deployment, # Instance of the deployment that we just created above\n", + " deploy=True, # Tell Aana to deploy the component immediately instead of waiting aana_app.deploy()\n", ")" ] }, @@ -159,7 +160,7 @@ "\n", "url = \"http://images.cocodataset.org/val2017/000000039769.jpg\"\n", "\n", - "image = PilImage.open(requests.get(url, stream=True).raw)" + "image = PilImage.open(requests.get(url, stream=True).raw) # noqa: S113\n" ] }, { diff --git a/notebooks/hf_text_gen_deployment.ipynb b/notebooks/hf_text_gen_deployment.ipynb index aeb420dc..a6436ef1 100644 --- a/notebooks/hf_text_gen_deployment.ipynb +++ b/notebooks/hf_text_gen_deployment.ipynb @@ -50,7 +50,6 @@ "source": [ "from aana.sdk import AanaSDK\n", "\n", - "\n", "aana_app = AanaSDK().connect()" ] }, diff --git a/notebooks/structured_generation.ipynb b/notebooks/structured_generation.ipynb index 0e7315e2..d41281ef 100644 --- a/notebooks/structured_generation.ipynb +++ b/notebooks/structured_generation.ipynb @@ -121,6 +121,8 @@ "\n", "\n", "class CityDescription(BaseModel):\n", + " \"\"\"City description model.\"\"\"\n", + "\n", " city: str\n", " country: str\n", " description: str\n", @@ -440,7 +442,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.10.16" } }, "nbformat": 4, diff --git a/poetry.lock b/poetry.lock index 859d0f06..114ed3ba 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3115,30 +3115,30 @@ psutil = {version = ">=4.0.0", markers = "sys_platform != \"cygwin\""} [[package]] name = "mistral-common" -version = "1.5.2" +version = "1.5.3" description = "" optional = true python-versions = "<4.0.0,>=3.8.10" groups = ["main"] markers = "(extra == \"vllm\" or extra == \"all\") and (python_version <= \"3.11\" or python_version >= \"3.12\")" files = [ - {file = "mistral_common-1.5.2-py3-none-any.whl", hash = "sha256:cc586eaf5907b9a4eca4bf62f03e31f9b85618c09bbd47cbf6755606b6d119b3"}, - {file = "mistral_common-1.5.2.tar.gz", hash = "sha256:9d1157b1376c49d35abfc743dbe0084f2ca37b3a5abd03e741276a1bc66c852f"}, + {file = "mistral_common-1.5.3-py3-none-any.whl", hash = "sha256:918af99501282bdd14cc453d561fbce13ba1416654604b94bed22c6aaebbb819"}, + {file = "mistral_common-1.5.3.tar.gz", hash = "sha256:1e9cc740197a55f9bc20d44160ce9230d9fff399da2e781d91c2677011765eff"}, ] [package.dependencies] -jsonschema = ">=4.21.1,<5.0.0" +jsonschema = ">=4.21.1" numpy = {version = ">=1.25", markers = "python_version >= \"3.9\""} -opencv-python-headless = {version = ">=4.0.0,<5.0.0", optional = true, markers = "extra == \"opencv\""} -pillow = ">=10.3.0,<11.0.0" +opencv-python-headless = {version = ">=4.0.0", optional = true, markers = "extra == \"opencv\""} +pillow = ">=10.3.0" pydantic = ">=2.7,<3.0" -requests = ">=2.0.0,<3.0.0" -sentencepiece = "0.2.0" -tiktoken = ">=0.7.0,<0.8.0" -typing-extensions = ">=4.11.0,<5.0.0" +requests = ">=2.0.0" +sentencepiece = ">=0.2.0" +tiktoken = ">=0.7.0" +typing-extensions = ">=4.11.0" [package.extras] -opencv = ["opencv-python-headless (>=4.0.0,<5.0.0)"] +opencv = ["opencv-python-headless (>=4.0.0)"] [[package]] name = "mkdocs" @@ -4539,105 +4539,6 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pillow" -version = "10.4.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.8" -groups = ["main", "dev", "tests"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, - {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, - {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, - {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, - {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, - {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, - {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, - {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, - {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, - {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, - {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, - {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, - {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, - {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, - {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, - {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] -fpx = ["olefile"] -mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] -xmp = ["defusedxml"] - [[package]] name = "pillow" version = "11.1.0" @@ -6758,30 +6659,31 @@ files = [ [[package]] name = "ruff" -version = "0.1.15" +version = "0.9.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba"}, + {file = "ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504"}, + {file = "ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5"}, + {file = "ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08"}, + {file = "ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656"}, + {file = "ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d"}, + {file = "ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa"}, + {file = "ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a"}, + {file = "ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9"}, ] [[package]] @@ -8947,4 +8849,4 @@ vllm = ["outlines", "vllm"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" -content-hash = "0cb9a93cddd2784da8f52d3dc6cdb4834b9dee16b6cbce57d8459ffd13359ab7" +content-hash = "4dc7be3c7c86775897201043e5c2b5effc4ce23850b2e886d2928e7a1fb2a994" diff --git a/pyproject.toml b/pyproject.toml index 6627de33..a3fc37ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,10 +86,10 @@ all = [ optional = true [tool.poetry.group.dev.dependencies] -ipykernel = "^6.25.2" +ipykernel = ">=6.25.2" matplotlib = "^3.8.2" -mypy = "^1.6.1" -ruff = "^0.1.5" +mypy = ">=1.6.1" +ruff = ">=0.9.0" [tool.poetry.group.docs] optional = true @@ -143,7 +143,7 @@ select = [ "UP", "PTH", "TRY", # pyupgrade, pathlib, tryceratops "D", "NPY", "RUF" # pydocstyle, numpy, misc Ruff ] -ignore = ["D100", "D104", "D106"] # require docstrings for modules and nested clases +ignore = ["D100", "D104", "D106", "A004", "A005"] # require docstrings for modules and nested clases fixable = ["ALL"] unfixable = [] target-version = "py310"