From 6485b6e1bb096655e51b24723fc7036c1d1d3e51 Mon Sep 17 00:00:00 2001 From: swve Date: Fri, 9 Aug 2024 20:54:41 +0200 Subject: [PATCH 1/5] feat: init new config model version --- apps/api/migrations/orgconfigs/v0tov1.py | 69 ++++++++++++++ apps/api/src/db/organization_config.py | 111 +++++++++++++++-------- apps/api/src/services/ai/ai.py | 8 +- apps/api/src/services/ai/utils.py | 4 +- apps/api/src/services/install/install.py | 79 ++++++++-------- apps/api/src/services/orgs/orgs.py | 71 +++++++-------- 6 files changed, 225 insertions(+), 117 deletions(-) create mode 100644 apps/api/migrations/orgconfigs/v0tov1.py diff --git a/apps/api/migrations/orgconfigs/v0tov1.py b/apps/api/migrations/orgconfigs/v0tov1.py new file mode 100644 index 00000000..d0a4c944 --- /dev/null +++ b/apps/api/migrations/orgconfigs/v0tov1.py @@ -0,0 +1,69 @@ +def migrate_v0_to_v1(v0_config): + v1_config = { + "config_version": "1.0", + "general": { + "enabled": v0_config["GeneralConfig"]["active"], + "color": v0_config["GeneralConfig"]["color"], + "watermark": True, # Default value as it's not present in v0 + }, + "features": { + "courses": { + "enabled": True, + "limit": ( + v0_config["GeneralConfig"]["limits"]["max_users"] + if v0_config["GeneralConfig"]["limits"]["limits_enabled"] + else 5 + ), + }, + "members": { + "enabled": True, + "signup_mode": ( + "open" + if v0_config["GeneralConfig"]["users"]["signup_mechanism"] == "open" + else "inviteOnly" + ), + "admin_limit": 5, + "limit": ( + v0_config["GeneralConfig"]["limits"]["max_users"] + if v0_config["GeneralConfig"]["limits"]["limits_enabled"] + else 10 + ), + }, + "usergroups": { + "enabled": True, + "limit": ( + v0_config["GeneralConfig"]["limits"]["max_staff"] + if v0_config["GeneralConfig"]["limits"]["limits_enabled"] + else 10 + ), + }, + "storage": { + "enabled": True, + "limit": ( + v0_config["GeneralConfig"]["limits"]["max_storage"] + if v0_config["GeneralConfig"]["limits"]["limits_enabled"] + else 10 + ), + }, + "ai": { + "enabled": v0_config["AIConfig"]["enabled"], + "limit": ( + v0_config["AIConfig"]["limits"]["max_asks"] + if v0_config["AIConfig"]["limits"]["limits_enabled"] + else 10 + ), + "model": v0_config["AIConfig"]["ai_model"], + }, + "assignments": {"enabled": True, "limit": 10}, + "payments": {"enabled": False, "stripe_key": ""}, + "discussions": {"enabled": False, "limit": 10}, + "analytics": {"enabled": False, "limit": 10}, + "collaboration": { + "enabled": v0_config["GeneralConfig"]["collaboration"], + "limit": 10, + }, + "api": {"enabled": False, "limit": 10}, + }, + } + + return v1_config diff --git a/apps/api/src/db/organization_config.py b/apps/api/src/db/organization_config.py index 5dcfcc7b..067e42e7 100644 --- a/apps/api/src/db/organization_config.py +++ b/apps/api/src/db/organization_config.py @@ -4,51 +4,91 @@ from sqlalchemy import JSON, BigInteger, Column, ForeignKey from sqlmodel import Field, SQLModel -# AI -class AILimitsSettings(BaseModel): - limits_enabled: bool = False - max_asks: int = 0 - - -class AIEnabledFeatures(BaseModel): - editor: bool = False - activity_ask: bool = False - course_ask: bool = False - global_ai_ask: bool = False - - -class AIConfig(BaseModel): +# Features +class CourseOrgConfig(BaseModel): enabled: bool = True - limits: AILimitsSettings = AILimitsSettings() - embeddings: Literal["text-embedding-ada-002"] = "text-embedding-ada-002" - ai_model: Literal["gpt-3.5-turbo", "gpt-4-1106-preview"] = "gpt-3.5-turbo" - features: AIEnabledFeatures = AIEnabledFeatures() + limit: int = 10 -class OrgUserConfig(BaseModel): - signup_mechanism: Literal["open", "inviteOnly"] = "open" +class MemberOrgConfig(BaseModel): + enabled: bool = True + signup_mode: Literal["open", "inviteOnly"] = "open" + admin_limit: int = 1 + limit: int = 10 -# Limits -class LimitSettings(BaseModel): - limits_enabled: bool = False - max_users: int = 0 - max_storage: int = 0 - max_staff: int = 0 +class UserGroupOrgConfig(BaseModel): + enabled: bool = True + limit: int = 10 + + +class StorageOrgConfig(BaseModel): + enabled: bool = True + limit: int = 10 + + +class AIOrgConfig(BaseModel): + enabled: bool = True + limit: int = 10 + model: str = "gpt-4o-mini" + + +class AssignmentOrgConfig(BaseModel): + enabled: bool = False + limit: int = 10 + + +class PaymentOrgConfig(BaseModel): + enabled: bool = True + stripe_key: str = "" + + +class DiscussionOrgConfig(BaseModel): + enabled: bool = True + limit: int = 10 + + +class AnalyticsOrgConfig(BaseModel): + enabled: bool = True + limit: int = 10 + + +class CollaborationOrgConfig(BaseModel): + enabled: bool = True + limit: int = 10 + + +class APIOrgConfig(BaseModel): + enabled: bool = True + limit: int = 10 + + +class OrgFeatureConfig(BaseModel): + courses: CourseOrgConfig = CourseOrgConfig() + members: MemberOrgConfig = MemberOrgConfig() + usergroups: UserGroupOrgConfig = UserGroupOrgConfig() + storage: StorageOrgConfig = StorageOrgConfig() + ai: AIOrgConfig = AIOrgConfig() + assignments: AssignmentOrgConfig = AssignmentOrgConfig() + payments: PaymentOrgConfig = PaymentOrgConfig() + discussions: DiscussionOrgConfig = DiscussionOrgConfig() + analytics: AnalyticsOrgConfig = AnalyticsOrgConfig() + collaboration: CollaborationOrgConfig = CollaborationOrgConfig() + api: APIOrgConfig = APIOrgConfig() # General -class GeneralConfig(BaseModel): - color: str = "" - limits: LimitSettings = LimitSettings() - users: OrgUserConfig = OrgUserConfig() - collaboration: bool = False - active: bool = True +class OrgGeneralConfig(BaseModel): + enabled: bool = True + color: str = "normal" + watermark: bool = True -class OrganizationConfigBase(SQLModel): - GeneralConfig: GeneralConfig - AIConfig: AIConfig +# Main Config +class OrganizationConfigBase(BaseModel): + config_version: str = "1.0" + general: OrgGeneralConfig + features: OrgFeatureConfig class OrganizationConfig(SQLModel, table=True): @@ -56,7 +96,6 @@ class OrganizationConfig(SQLModel, table=True): org_id: int = Field( sa_column=Column(BigInteger, ForeignKey("organization.id", ondelete="CASCADE")) ) - # TODO: fix this to use the correct type GeneralConfig config: dict = Field(default={}, sa_column=Column(JSON)) creation_date: Optional[str] update_date: Optional[str] diff --git a/apps/api/src/services/ai/ai.py b/apps/api/src/services/ai/ai.py index 17516d76..17edab1c 100644 --- a/apps/api/src/services/ai/ai.py +++ b/apps/api/src/services/ai/ai.py @@ -86,8 +86,8 @@ def ai_start_activity_chat_session( org_config = result.first() org_config = OrganizationConfig.model_validate(org_config) - embeddings = org_config.config["AIConfig"]["embeddings"] - ai_model = org_config.config["AIConfig"]["ai_model"] + embeddings = "text-embedding-ada-002" + ai_model = org_config.config["features"]["ai"]["model"] chat_session = get_chat_session_history() @@ -177,8 +177,8 @@ def ai_send_activity_chat_message( org_config = result.first() org_config = OrganizationConfig.model_validate(org_config) - embeddings = org_config.config["AIConfig"]["embeddings"] - ai_model = org_config.config["AIConfig"]["ai_model"] + embeddings = "text-embedding-ada-002" + ai_model = org_config.config["features"]["ai"]["model"] chat_session = get_chat_session_history(chat_session_object.aichat_uuid) diff --git a/apps/api/src/services/ai/utils.py b/apps/api/src/services/ai/utils.py index 4b708ec1..2fe9c367 100644 --- a/apps/api/src/services/ai/utils.py +++ b/apps/api/src/services/ai/utils.py @@ -78,7 +78,7 @@ def check_limits_and_config(db_session: Session, organization: Organization): ) # Check if the Organization has Limits enabled and if the max_asks limit has been reached - if org_config.config["AIConfig"]["limits"]["limits_enabled"] == True: + if org_config.config["features"]["ai"]["limit"] > 0: LH_CONFIG = get_learnhouse_config() redis_conn_string = LH_CONFIG.redis_config.redis_connection_string @@ -107,7 +107,7 @@ def check_limits_and_config(db_session: Session, organization: Organization): ai_asks = int(ai_asks) # Check if the Number of asks is less than the max_asks limit - if org_config.config["AIConfig"]["limits"]["max_asks"] <= ai_asks: + if org_config.config["features"]["ai"]["limit"] <= ai_asks: raise HTTPException( status_code=403, detail="Organization has reached the max number of AI asks", diff --git a/apps/api/src/services/install/install.py b/apps/api/src/services/install/install.py index c54580eb..366751d2 100644 --- a/apps/api/src/services/install/install.py +++ b/apps/api/src/services/install/install.py @@ -5,12 +5,28 @@ from fastapi import HTTPException, Request from sqlalchemy import desc from sqlmodel import Session, select from src.db.install import Install, InstallRead -from src.db.organization_config import AIEnabledFeatures, AILimitsSettings, LimitSettings, OrgUserConfig, OrganizationConfig, OrganizationConfigBase, GeneralConfig, AIConfig +from src.db.organization_config import ( + AIOrgConfig, + APIOrgConfig, + AnalyticsOrgConfig, + AssignmentOrgConfig, + CollaborationOrgConfig, + CourseOrgConfig, + DiscussionOrgConfig, + MemberOrgConfig, + OrgFeatureConfig, + OrgGeneralConfig, + OrganizationConfig, + OrganizationConfigBase, + PaymentOrgConfig, + StorageOrgConfig, + UserGroupOrgConfig, +) from src.db.organizations import Organization, OrganizationCreate from src.db.roles import Permission, Rights, Role, RoleTypeEnum from src.db.user_organizations import UserOrganization from src.db.users import User, UserCreate, UserRead -from config.config import get_learnhouse_config +from config.config import GeneralConfig, get_learnhouse_config from src.security.security import security_hash_password @@ -57,7 +73,7 @@ async def get_latest_install_instance(request: Request, db_session: Session): status_code=404, detail="No install instance found", ) - + install = InstallRead.model_validate(install) return install @@ -96,8 +112,7 @@ async def update_install_instance( # Install Default roles def install_default_elements(db_session: Session): - """ - """ + """ """ # remove all default roles statement = select(Role).where(Role.role_type == RoleTypeEnum.TYPE_GLOBAL) roles = db_session.exec(statement).all() @@ -300,9 +315,7 @@ def install_default_elements(db_session: Session): # Organization creation -def install_create_organization( - org_object: OrganizationCreate, db_session: Session -): +def install_create_organization(org_object: OrganizationCreate, db_session: Session): org = Organization.model_validate(org_object) # Complete the org object @@ -314,36 +327,28 @@ def install_create_organization( db_session.commit() db_session.refresh(org) - # Org Config + # Org Config org_config = OrganizationConfigBase( - GeneralConfig=GeneralConfig( - color="#000000", - limits=LimitSettings( - limits_enabled=False, - max_users=0, - max_storage=0, - max_staff=0, - ), - collaboration=False, - users=OrgUserConfig( - signup_mechanism="open", - ), - active=True, - ), - AIConfig=AIConfig( + config_version="1.0", + general=OrgGeneralConfig( enabled=True, - limits=AILimitsSettings( - limits_enabled=False, - max_asks=0, - ), - embeddings="text-embedding-ada-002", - ai_model="gpt-3.5-turbo", - features=AIEnabledFeatures( - editor=True, - activity_ask=True, - course_ask=True, - global_ai_ask=True, + color="normal", + watermark=True, + ), + features=OrgFeatureConfig( + courses=CourseOrgConfig(enabled=True, limit=0), + members=MemberOrgConfig( + enabled=True, signup_mode="open", admin_limit=0, limit=0 ), + usergroups=UserGroupOrgConfig(enabled=True, limit=0), + storage=StorageOrgConfig(enabled=True, limit=0), + ai=AIOrgConfig(enabled=True, limit=0, model="text-embedding-ada-002"), + assignments=AssignmentOrgConfig(enabled=True, limit=0), + payments=PaymentOrgConfig(enabled=True, stripe_key=""), + discussions=DiscussionOrgConfig(enabled=True, limit=0), + analytics=AnalyticsOrgConfig(enabled=True, limit=0), + collaboration=CollaborationOrgConfig(enabled=True, limit=0), + api=APIOrgConfig(enabled=True, limit=0), ), ) @@ -365,7 +370,7 @@ def install_create_organization( def install_create_organization_user( - user_object: UserCreate, org_slug: str, db_session: Session + user_object: UserCreate, org_slug: str, db_session: Session ): user = User.model_validate(user_object) @@ -418,8 +423,6 @@ def install_create_organization_user( db_session.commit() db_session.refresh(user) - - # get org id statement = select(Organization).where(Organization.slug == org_slug) org = db_session.exec(statement) diff --git a/apps/api/src/services/orgs/orgs.py b/apps/api/src/services/orgs/orgs.py index bab0add7..58edc7ea 100644 --- a/apps/api/src/services/orgs/orgs.py +++ b/apps/api/src/services/orgs/orgs.py @@ -5,14 +5,21 @@ from typing import Literal from uuid import uuid4 from sqlmodel import Session, select from src.db.organization_config import ( - AIConfig, - AIEnabledFeatures, - AILimitsSettings, - GeneralConfig, - LimitSettings, - OrgUserConfig, + AIOrgConfig, + APIOrgConfig, + AnalyticsOrgConfig, + AssignmentOrgConfig, + CollaborationOrgConfig, + CourseOrgConfig, + DiscussionOrgConfig, + MemberOrgConfig, + OrgFeatureConfig, + OrgGeneralConfig, OrganizationConfig, OrganizationConfigBase, + PaymentOrgConfig, + StorageOrgConfig, + UserGroupOrgConfig, ) from src.security.rbac.rbac import ( authorization_verify_based_on_org_admin_status, @@ -149,35 +156,27 @@ async def create_org( db_session.commit() db_session.refresh(user_org) - org_config = OrganizationConfigBase( - GeneralConfig=GeneralConfig( - color="#000000", - limits=LimitSettings( - limits_enabled=False, - max_users=0, - max_storage=0, - max_staff=0, - ), - collaboration=False, - users=OrgUserConfig( - signup_mechanism="open", - ), - active=True, - ), - AIConfig=AIConfig( + org_config = org_config = OrganizationConfigBase( + config_version="1.0", + general=OrgGeneralConfig( enabled=True, - limits=AILimitsSettings( - limits_enabled=False, - max_asks=0, - ), - embeddings="text-embedding-ada-002", - ai_model="gpt-3.5-turbo", - features=AIEnabledFeatures( - editor=True, - activity_ask=True, - course_ask=True, - global_ai_ask=True, + color="normal", + watermark=True, + ), + features=OrgFeatureConfig( + courses=CourseOrgConfig(enabled=True, limit=0), + members=MemberOrgConfig( + enabled=True, signup_mode="open", admin_limit=0, limit=0 ), + usergroups=UserGroupOrgConfig(enabled=True, limit=0), + storage=StorageOrgConfig(enabled=True, limit=0), + ai=AIOrgConfig(enabled=True, limit=0, model="text-embedding-ada-002"), + assignments=AssignmentOrgConfig(enabled=True, limit=0), + payments=PaymentOrgConfig(enabled=True, stripe_key=""), + discussions=DiscussionOrgConfig(enabled=True, limit=0), + analytics=AnalyticsOrgConfig(enabled=True, limit=0), + collaboration=CollaborationOrgConfig(enabled=True, limit=0), + api=APIOrgConfig(enabled=True, limit=0), ), ) @@ -210,8 +209,6 @@ async def create_org( return org - -# Temporary pre-alpha code async def create_org_with_config( request: Request, org_object: OrganizationCreate, @@ -477,7 +474,7 @@ async def update_org_signup_mechanism( # Update config updated_config = OrganizationConfigBase(**updated_config) - updated_config.GeneralConfig.users.signup_mechanism = signup_mechanism + updated_config.features.members.signup_mode = signup_mechanism # Update the database org_config.config = json.loads(updated_config.json()) @@ -527,7 +524,7 @@ async def get_org_join_mechanism( # Get the signup mechanism config = OrganizationConfigBase(**config) - signup_mechanism = config.GeneralConfig.users.signup_mechanism + signup_mechanism = config.features.members.signup_mode return signup_mechanism From 28a2456d69523ccec4928510920f2affa06b02c9 Mon Sep 17 00:00:00 2001 From: swve Date: Sat, 10 Aug 2024 16:53:59 +0200 Subject: [PATCH 2/5] feat: migrate orgconfig model across the app --- apps/api/migrations/orgconfigs/v0tov1.py | 2 +- apps/api/poetry.lock | 766 ++++++++++-------- apps/api/pyproject.toml | 6 +- apps/api/src/routers/dev.py | 26 +- apps/api/src/services/ai/utils.py | 2 +- apps/web/app/auth/signup/signup.tsx | 2 +- .../components/AI/Hooks/useGetAIFeatures.tsx | 16 +- apps/web/components/Contexts/OrgContext.tsx | 2 +- .../Dashboard/Users/OrgAccess/OrgAccess.tsx | 2 +- .../Objects/Editor/ActiveAvatars.tsx | 2 +- .../Objects/Editor/EditorWrapper.tsx | 2 +- .../Objects/Editor/MouseMovements.tsx | 2 +- 12 files changed, 467 insertions(+), 363 deletions(-) diff --git a/apps/api/migrations/orgconfigs/v0tov1.py b/apps/api/migrations/orgconfigs/v0tov1.py index d0a4c944..fd7a537c 100644 --- a/apps/api/migrations/orgconfigs/v0tov1.py +++ b/apps/api/migrations/orgconfigs/v0tov1.py @@ -52,7 +52,7 @@ def migrate_v0_to_v1(v0_config): if v0_config["AIConfig"]["limits"]["limits_enabled"] else 10 ), - "model": v0_config["AIConfig"]["ai_model"], + "model": 'gpt-4o-mini', }, "assignments": {"enabled": True, "limit": 10}, "payments": {"enabled": False, "stripe_key": ""}, diff --git a/apps/api/poetry.lock b/apps/api/poetry.lock index c388a787..8117e47e 100644 --- a/apps/api/poetry.lock +++ b/apps/api/poetry.lock @@ -2,18 +2,19 @@ [[package]] name = "aiohappyeyeballs" -version = "2.3.4" +version = "2.3.5" description = "Happy Eyeballs for asyncio" optional = false -python-versions = "<4.0,>=3.8" +python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.3.4-py3-none-any.whl", hash = "sha256:40a16ceffcf1fc9e142fd488123b2e218abc4188cf12ac20c67200e1579baa42"}, - {file = "aiohappyeyeballs-2.3.4.tar.gz", hash = "sha256:7e1ae8399c320a8adec76f6c919ed5ceae6edd4c3672f4d9eae2b27e37c80ff6"}, + {file = "aiohappyeyeballs-2.3.5-py3-none-any.whl", hash = "sha256:4d6dea59215537dbc746e93e779caea8178c866856a721c9c660d7a5a7b8be03"}, + {file = "aiohappyeyeballs-2.3.5.tar.gz", hash = "sha256:6fa48b9f1317254f122a07a131a86b71ca6946ca989ce6326fff54a99a920105"}, ] [[package]] name = "aiohttp" version = "3.10.2" +version = "3.10.2" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" @@ -94,6 +95,82 @@ files = [ {file = "aiohttp-3.10.2-cp39-cp39-win32.whl", hash = "sha256:e2f43d238eae4f0b04f58d4c0df4615697d4ca3e9f9b1963d49555a94f0f5a04"}, {file = "aiohttp-3.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:947847f07a8f81d7b39b2d0202fd73e61962ebe17ac2d8566f260679e467da7b"}, {file = "aiohttp-3.10.2.tar.gz", hash = "sha256:4d1f694b5d6e459352e5e925a42e05bac66655bfde44d81c59992463d2897014"}, + {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95213b3d79c7e387144e9cb7b9d2809092d6ff2c044cb59033aedc612f38fb6d"}, + {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1aa005f060aff7124cfadaa2493f00a4e28ed41b232add5869e129a2e395935a"}, + {file = "aiohttp-3.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eabe6bf4c199687592f5de4ccd383945f485779c7ffb62a9b9f1f8a3f9756df8"}, + {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e010736fc16d21125c7e2dc5c350cd43c528b85085c04bf73a77be328fe944"}, + {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99f81f9c1529fd8e03be4a7bd7df32d14b4f856e90ef6e9cbad3415dbfa9166c"}, + {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d611d1a01c25277bcdea06879afbc11472e33ce842322496b211319aa95441bb"}, + {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00191d38156e09e8c81ef3d75c0d70d4f209b8381e71622165f22ef7da6f101"}, + {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74c091a5ded6cb81785de2d7a8ab703731f26de910dbe0f3934eabef4ae417cc"}, + {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:18186a80ec5a701816adbf1d779926e1069392cf18504528d6e52e14b5920525"}, + {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5a7ceb2a0d2280f23a02c64cd0afdc922079bb950400c3dd13a1ab2988428aac"}, + {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8bd7be6ff6c162a60cb8fce65ee879a684fbb63d5466aba3fa5b9288eb04aefa"}, + {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fae962b62944eaebff4f4fddcf1a69de919e7b967136a318533d82d93c3c6bd1"}, + {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a0fde16d284efcacbe15fb0c1013f0967b6c3e379649239d783868230bf1db42"}, + {file = "aiohttp-3.10.2-cp310-cp310-win32.whl", hash = "sha256:f81cd85a0e76ec7b8e2b6636fe02952d35befda4196b8c88f3cec5b4fb512839"}, + {file = "aiohttp-3.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:54ba10eb5a3481c28282eb6afb5f709aedf53cf9c3a31875ffbdc9fc719ffd67"}, + {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87fab7f948e407444c2f57088286e00e2ed0003ceaf3d8f8cc0f60544ba61d91"}, + {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec6ad66ed660d46503243cbec7b2b3d8ddfa020f984209b3b8ef7d98ce69c3f2"}, + {file = "aiohttp-3.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4be88807283bd96ae7b8e401abde4ca0bab597ba73b5e9a2d98f36d451e9aac"}, + {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01c98041f90927c2cbd72c22a164bb816fa3010a047d264969cf82e1d4bcf8d1"}, + {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54e36c67e1a9273ecafab18d6693da0fb5ac48fd48417e4548ac24a918c20998"}, + {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7de3ddb6f424af54535424082a1b5d1ae8caf8256ebd445be68c31c662354720"}, + {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dd9c7db94b4692b827ce51dcee597d61a0e4f4661162424faf65106775b40e7"}, + {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e57e21e1167705f8482ca29cc5d02702208d8bf4aff58f766d94bcd6ead838cd"}, + {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a1a50e59b720060c29e2951fd9f13c01e1ea9492e5a527b92cfe04dd64453c16"}, + {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:686c87782481fda5ee6ba572d912a5c26d9f98cc5c243ebd03f95222af3f1b0f"}, + {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:dafb4abb257c0ed56dc36f4e928a7341b34b1379bd87e5a15ce5d883c2c90574"}, + {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:494a6f77560e02bd7d1ab579fdf8192390567fc96a603f21370f6e63690b7f3d"}, + {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fe8503b1b917508cc68bf44dae28823ac05e9f091021e0c41f806ebbb23f92f"}, + {file = "aiohttp-3.10.2-cp311-cp311-win32.whl", hash = "sha256:4ddb43d06ce786221c0dfd3c91b4892c318eaa36b903f7c4278e7e2fa0dd5102"}, + {file = "aiohttp-3.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:ca2f5abcb0a9a47e56bac173c01e9f6c6e7f27534d91451c5f22e6a35a5a2093"}, + {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14eb6b17f6246959fb0b035d4f4ae52caa870c4edfb6170aad14c0de5bfbf478"}, + {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:465e445ec348d4e4bd349edd8b22db75f025da9d7b6dc1369c48e7935b85581e"}, + {file = "aiohttp-3.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:341f8ece0276a828d95b70cd265d20e257f5132b46bf77d759d7f4e0443f2906"}, + {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01fbb87b5426381cd9418b3ddcf4fc107e296fa2d3446c18ce6c76642f340a3"}, + {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c474af073e1a6763e1c5522bbb2d85ff8318197e4c6c919b8d7886e16213345"}, + {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9076810a5621236e29b2204e67a68e1fe317c8727ee4c9abbfbb1083b442c38"}, + {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f515d6859e673940e08de3922b9c4a2249653b0ac181169313bd6e4b1978ac"}, + {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:655e583afc639bef06f3b2446972c1726007a21003cd0ef57116a123e44601bc"}, + {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8da9449a575133828cc99985536552ea2dcd690e848f9d41b48d8853a149a959"}, + {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19073d57d0feb1865d12361e2a1f5a49cb764bf81a4024a3b608ab521568093a"}, + {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8e98e1845805f184d91fda6f9ab93d7c7b0dddf1c07e0255924bfdb151a8d05"}, + {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:377220a5efde6f9497c5b74649b8c261d3cce8a84cb661be2ed8099a2196400a"}, + {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92f7f4a4dc9cdb5980973a74d43cdbb16286dacf8d1896b6c3023b8ba8436f8e"}, + {file = "aiohttp-3.10.2-cp312-cp312-win32.whl", hash = "sha256:9bb2834a6f11d65374ce97d366d6311a9155ef92c4f0cee543b2155d06dc921f"}, + {file = "aiohttp-3.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:518dc3cb37365255708283d1c1c54485bbacccd84f0a0fb87ed8917ba45eda5b"}, + {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7f98e70bbbf693086efe4b86d381efad8edac040b8ad02821453083d15ec315f"}, + {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9f6f0b252a009e98fe84028a4ec48396a948e7a65b8be06ccfc6ef68cf1f614d"}, + {file = "aiohttp-3.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9360e3ffc7b23565600e729e8c639c3c50d5520e05fdf94aa2bd859eef12c407"}, + {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3988044d1635c7821dd44f0edfbe47e9875427464e59d548aece447f8c22800a"}, + {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a9d59da1543a6f1478c3436fd49ec59be3868bca561a33778b4391005e499d"}, + {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f49bdb94809ac56e09a310a62f33e5f22973d6fd351aac72a39cd551e98194"}, + {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfd2dca3f11c365d6857a07e7d12985afc59798458a2fdb2ffa4a0332a3fd43"}, + {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c1508ec97b2cd3e120bfe309a4ff8e852e8a7460f1ef1de00c2c0ed01e33c"}, + {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:49904f38667c44c041a0b44c474b3ae36948d16a0398a8f8cd84e2bb3c42a069"}, + {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:352f3a4e5f11f3241a49b6a48bc5b935fabc35d1165fa0d87f3ca99c1fcca98b"}, + {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fc61f39b534c5d5903490478a0dd349df397d2284a939aa3cbaa2fb7a19b8397"}, + {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ad2274e707be37420d0b6c3d26a8115295fe9d8e6e530fa6a42487a8ca3ad052"}, + {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c836bf3c7512100219fe1123743fd8dd9a2b50dd7cfb0c3bb10d041309acab4b"}, + {file = "aiohttp-3.10.2-cp38-cp38-win32.whl", hash = "sha256:53e8898adda402be03ff164b0878abe2d884e3ea03a4701e6ad55399d84b92dc"}, + {file = "aiohttp-3.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:7cc8f65f5b22304693de05a245b6736b14cb5bc9c8a03da6e2ae9ef15f8b458f"}, + {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9dfc906d656e14004c5bc672399c1cccc10db38df2b62a13fb2b6e165a81c316"}, + {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:91b10208b222ddf655c3a3d5b727879d7163db12b634492df41a9182a76edaae"}, + {file = "aiohttp-3.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fd16b5e1a7bdd14668cd6bde60a2a29b49147a535c74f50d8177d11b38433a7"}, + {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2bfdda4971bd79201f59adbad24ec2728875237e1c83bba5221284dbbf57bda"}, + {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69d73f869cf29e8a373127fc378014e2b17bcfbe8d89134bc6fb06a2f67f3cb3"}, + {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df59f8486507c421c0620a2c3dce81fbf1d54018dc20ff4fecdb2c106d6e6abc"}, + {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df930015db36b460aa9badbf35eccbc383f00d52d4b6f3de2ccb57d064a6ade"}, + {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:562b1153ab7f766ee6b8b357ec777a302770ad017cf18505d34f1c088fccc448"}, + {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d984db6d855de58e0fde1ef908d48fe9a634cadb3cf715962722b4da1c40619d"}, + {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:14dc3fcb0d877911d775d511eb617a486a8c48afca0a887276e63db04d3ee920"}, + {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b52a27a5c97275e254704e1049f4b96a81e67d6205f52fa37a4777d55b0e98ef"}, + {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:cd33d9de8cfd006a0d0fe85f49b4183c57e91d18ffb7e9004ce855e81928f704"}, + {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1238fc979160bc03a92fff9ad021375ff1c8799c6aacb0d8ea1b357ea40932bb"}, + {file = "aiohttp-3.10.2-cp39-cp39-win32.whl", hash = "sha256:e2f43d238eae4f0b04f58d4c0df4615697d4ca3e9f9b1963d49555a94f0f5a04"}, + {file = "aiohttp-3.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:947847f07a8f81d7b39b2d0202fd73e61962ebe17ac2d8566f260679e467da7b"}, + {file = "aiohttp-3.10.2.tar.gz", hash = "sha256:4d1f694b5d6e459352e5e925a42e05bac66655bfde44d81c59992463d2897014"}, ] [package.dependencies] @@ -261,17 +338,17 @@ typecheck = ["mypy"] [[package]] name = "boto3" -version = "1.34.154" +version = "1.34.158" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.154-py3-none-any.whl", hash = "sha256:7ca22adef4c77ee128e1e1dc7d48bc9512a87cc6fe3d771b3f913d5ecd41c057"}, - {file = "boto3-1.34.154.tar.gz", hash = "sha256:864f06528c583dc7b02adf12db395ecfadbf9cb0da90e907e848ffb27128ce19"}, + {file = "boto3-1.34.158-py3-none-any.whl", hash = "sha256:c29e9b7e1034e8734ccaffb9f2b3f3df2268022fd8a93d836604019f8759ce27"}, + {file = "boto3-1.34.158.tar.gz", hash = "sha256:5b7b2ce0ec1e498933f600d29f3e1c641f8c44dd7e468c26795359d23d81fa39"}, ] [package.dependencies] -botocore = ">=1.34.154,<1.35.0" +botocore = ">=1.34.158,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -280,13 +357,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.154" +version = "1.34.158" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.154-py3-none-any.whl", hash = "sha256:4eef4b1bb809b382ba9dc9c88f5fcc4a133f221a1acb693ee6bee4de9f325979"}, - {file = "botocore-1.34.154.tar.gz", hash = "sha256:64d9b4c85a504d77cb56dabb2ad717cd8e1717424a88edb458b01d1e5797262a"}, + {file = "botocore-1.34.158-py3-none-any.whl", hash = "sha256:0e6fceba1e39bfa8feeba70ba3ac2af958b3387df4bd3b5f2db3f64c1754c756"}, + {file = "botocore-1.34.158.tar.gz", hash = "sha256:5934082e25ad726673afbf466092fb1223dafa250e6e756c819430ba6b1b3da5"}, ] [package.dependencies] @@ -295,7 +372,7 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.20.11)"] +crt = ["awscrt (==0.21.2)"] [[package]] name = "build" @@ -443,40 +520,36 @@ files = [ [[package]] name = "chroma-hnswlib" -version = "0.7.6" +version = "0.7.3" description = "Chromas fork of hnswlib" optional = false python-versions = "*" files = [ - {file = "chroma_hnswlib-0.7.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f35192fbbeadc8c0633f0a69c3d3e9f1a4eab3a46b65458bbcbcabdd9e895c36"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f007b608c96362b8f0c8b6b2ac94f67f83fcbabd857c378ae82007ec92f4d82"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:456fd88fa0d14e6b385358515aef69fc89b3c2191706fd9aee62087b62aad09c"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dfaae825499c2beaa3b75a12d7ec713b64226df72a5c4097203e3ed532680da"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-win_amd64.whl", hash = "sha256:2487201982241fb1581be26524145092c95902cb09fc2646ccfbc407de3328ec"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81181d54a2b1e4727369486a631f977ffc53c5533d26e3d366dda243fb0998ca"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4b4ab4e11f1083dd0a11ee4f0e0b183ca9f0f2ed63ededba1935b13ce2b3606f"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53db45cd9173d95b4b0bdccb4dbff4c54a42b51420599c32267f3abbeb795170"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c093f07a010b499c00a15bc9376036ee4800d335360570b14f7fe92badcdcf9"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-win_amd64.whl", hash = "sha256:0540b0ac96e47d0aa39e88ea4714358ae05d64bbe6bf33c52f316c664190a6a3"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e87e9b616c281bfbe748d01705817c71211613c3b063021f7ed5e47173556cb7"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec5ca25bc7b66d2ecbf14502b5729cde25f70945d22f2aaf523c2d747ea68912"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305ae491de9d5f3c51e8bd52d84fdf2545a4a2bc7af49765cda286b7bb30b1d4"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:822ede968d25a2c88823ca078a58f92c9b5c4142e38c7c8b4c48178894a0a3c5"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2fe6ea949047beed19a94b33f41fe882a691e58b70c55fdaa90274ae78be046f"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feceff971e2a2728c9ddd862a9dd6eb9f638377ad98438876c9aeac96c9482f5"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb0633b60e00a2b92314d0bf5bbc0da3d3320be72c7e3f4a9b19f4609dc2b2ab"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a566abe32fab42291f766d667bdbfa234a7f457dcbd2ba19948b7a978c8ca624"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6be47853d9a58dedcfa90fc846af202b071f028bbafe1d8711bf64fe5a7f6111"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a7af35bdd39a88bffa49f9bb4bf4f9040b684514a024435a1ef5cdff980579d"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a53b1f1551f2b5ad94eb610207bde1bb476245fc5097a2bec2b476c653c58bde"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3085402958dbdc9ff5626ae58d696948e715aef88c86d1e3f9285a88f1afd3bc"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:77326f658a15adfb806a16543f7db7c45f06fd787d699e643642d6bde8ed49c4"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:93b056ab4e25adab861dfef21e1d2a2756b18be5bc9c292aa252fa12bb44e6ae"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fe91f018b30452c16c811fd6c8ede01f84e5a9f3c23e0758775e57f1c3778871"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c0e627476f0f4d9e153420d36042dd9c6c3671cfd1fe511c0253e38c2a1039"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e9796a4536b7de6c6d76a792ba03e08f5aaa53e97e052709568e50b4d20c04f"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:d30e2db08e7ffdcc415bd072883a322de5995eb6ec28a8f8c054103bbd3ec1e0"}, - {file = "chroma_hnswlib-0.7.6.tar.gz", hash = "sha256:4dce282543039681160259d29fcde6151cc9106c6461e0485f57cdccd83059b7"}, + {file = "chroma-hnswlib-0.7.3.tar.gz", hash = "sha256:b6137bedde49fffda6af93b0297fe00429fc61e5a072b1ed9377f909ed95a932"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59d6a7c6f863c67aeb23e79a64001d537060b6995c3eca9a06e349ff7b0998ca"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d71a3f4f232f537b6152947006bd32bc1629a8686df22fd97777b70f416c127a"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c92dc1ebe062188e53970ba13f6b07e0ae32e64c9770eb7f7ffa83f149d4210"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49da700a6656fed8753f68d44b8cc8ae46efc99fc8a22a6d970dc1697f49b403"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:108bc4c293d819b56476d8f7865803cb03afd6ca128a2a04d678fffc139af029"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11e7ca93fb8192214ac2b9c0943641ac0daf8f9d4591bb7b73be808a83835667"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6f552e4d23edc06cdeb553cdc757d2fe190cdeb10d43093d6a3319f8d4bf1c6b"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f96f4d5699e486eb1fb95849fe35ab79ab0901265805be7e60f4eaa83ce263ec"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:368e57fe9ebae05ee5844840fa588028a023d1182b0cfdb1d13f607c9ea05756"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:b7dca27b8896b494456db0fd705b689ac6b73af78e186eb6a42fea2de4f71c6f"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:70f897dc6218afa1d99f43a9ad5eb82f392df31f57ff514ccf4eeadecd62f544"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aef10b4952708f5a1381c124a29aead0c356f8d7d6e0b520b778aaa62a356f4"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee2d8d1529fca3898d512079144ec3e28a81d9c17e15e0ea4665697a7923253"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a4021a70e898783cd6f26e00008b494c6249a7babe8774e90ce4766dd288c8ba"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8f61fa1d417fda848e3ba06c07671f14806a2585272b175ba47501b066fe6b1"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7563be58bc98e8f0866907368e22ae218d6060601b79c42f59af4eccbbd2e0a"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51b8d411486ee70d7b66ec08cc8b9b6620116b650df9c19076d2d8b6ce2ae914"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d706782b628e4f43f1b8a81e9120ac486837fbd9bcb8ced70fe0d9b95c72d77"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:54f053dedc0e3ba657f05fec6e73dd541bc5db5b09aa8bc146466ffb734bdc86"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e607c5a71c610a73167a517062d302c0827ccdd6e259af6e4869a5c1306ffb5d"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2358a795870156af6761890f9eb5ca8cade57eb10c5f046fe94dae1faa04b9e"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cea425df2e6b8a5e201fff0d922a1cc1d165b3cfe762b1408075723c8892218"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:454df3dd3e97aa784fba7cf888ad191e0087eef0fd8c70daf28b753b3b591170"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:df587d15007ca701c6de0ee7d5585dd5e976b7edd2b30ac72bc376b3c3f85882"}, ] [package.dependencies] @@ -484,19 +557,19 @@ numpy = "*" [[package]] name = "chromadb" -version = "0.5.5" +version = "0.5.3" description = "Chroma." optional = false python-versions = ">=3.8" files = [ - {file = "chromadb-0.5.5-py3-none-any.whl", hash = "sha256:2a5a4b84cb0fc32b380e193be68cdbadf3d9f77dbbf141649be9886e42910ddd"}, - {file = "chromadb-0.5.5.tar.gz", hash = "sha256:84f4bfee320fb4912cbeb4d738f01690891e9894f0ba81f39ee02867102a1c4d"}, + {file = "chromadb-0.5.3-py3-none-any.whl", hash = "sha256:b3874f08356e291c68c6d2e177db472cd51f22f3af7b9746215b748fd1e29982"}, + {file = "chromadb-0.5.3.tar.gz", hash = "sha256:05d887f56a46b2e0fc6ac5ab979503a27b9ee50d5ca9e455f83b2fb9840cd026"}, ] [package.dependencies] bcrypt = ">=4.0.1" build = ">=1.0.3" -chroma-hnswlib = "0.7.6" +chroma-hnswlib = "0.7.3" fastapi = ">=0.95.2" grpcio = ">=1.58.0" httpx = ">=0.27.0" @@ -515,6 +588,7 @@ posthog = ">=2.4.0" pydantic = ">=1.9" pypika = ">=0.48.9" PyYAML = ">=6.0.0" +requests = ">=2.28" tenacity = ">=8.2.3" tokenizers = ">=0.13.2" tqdm = ">=4.65.0" @@ -892,13 +966,13 @@ tqdm = ["tqdm"] [[package]] name = "google-auth" -version = "2.32.0" +version = "2.33.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, - {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, + {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, + {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, ] [package.dependencies] @@ -2014,13 +2088,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.40.2" +version = "1.40.3" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.40.2-py3-none-any.whl", hash = "sha256:38068f858f310b4fd4b0ea8734c3efcfde3c15a2978311e1453bd84817231b96"}, - {file = "openai-1.40.2.tar.gz", hash = "sha256:2180e9070bd36084328248b3ce668964e8ddd2e9019e1d426e31dc54cc117bb5"}, + {file = "openai-1.40.3-py3-none-any.whl", hash = "sha256:09396cb6e2e15c921a5d872bf92841a60a9425da10dcd962b45fe7c4f48f8395"}, + {file = "openai-1.40.3.tar.gz", hash = "sha256:f2ffe907618240938c59d7ccc67dd01dc8c50be203c0077240db6758d2f02480"}, ] [package.dependencies] @@ -2201,64 +2275,68 @@ files = [ [[package]] name = "orjson" -version = "3.10.6" +version = "3.10.7" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, - {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, - {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, - {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, - {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, - {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, - {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, - {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, - {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, - {file = "orjson-3.10.6-cp313-none-win32.whl", hash = "sha256:efdf2c5cde290ae6b83095f03119bdc00303d7a03b42b16c54517baa3c4ca3d0"}, - {file = "orjson-3.10.6-cp313-none-win_amd64.whl", hash = "sha256:8e190fe7888e2e4392f52cafb9626113ba135ef53aacc65cd13109eb9746c43e"}, - {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, - {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, - {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, - {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, - {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, - {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, - {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, + {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, + {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, + {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, + {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, + {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, + {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, + {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, + {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, + {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, + {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, + {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, + {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, + {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, + {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, + {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, + {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, + {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, + {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, + {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, + {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, ] [[package]] @@ -2671,62 +2749,64 @@ dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatc [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {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"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -3268,111 +3348,111 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "tokenizers" -version = "0.19.1" +version = "0.20.0" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, - {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, - {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, - {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, - {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, - {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, - {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, - {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, - {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, - {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, - {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, - {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, - {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, - {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, - {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, + {file = "tokenizers-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6cff5c5e37c41bc5faa519d6f3df0679e4b37da54ea1f42121719c5e2b4905c0"}, + {file = "tokenizers-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:62a56bf75c27443432456f4ca5ca055befa95e25be8a28141cc495cac8ae4d6d"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68cc7de6a63f09c4a86909c2597b995aa66e19df852a23aea894929c74369929"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:053c37ecee482cc958fdee53af3c6534286a86f5d35aac476f7c246830e53ae5"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d7074aaabc151a6363fa03db5493fc95b423b2a1874456783989e96d541c7b6"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a11435780f2acd89e8fefe5e81cecf01776f6edb9b3ac95bcb76baee76b30b90"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a81cd2712973b007d84268d45fc3f6f90a79c31dfe7f1925e6732f8d2959987"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7dfd796ab9d909f76fb93080e1c7c8309f196ecb316eb130718cd5e34231c69"}, + {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8029ad2aa8cb00605c9374566034c1cc1b15130713e0eb5afcef6cface8255c9"}, + {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca4d54260ebe97d59dfa9a30baa20d0c4dd9137d99a8801700055c561145c24e"}, + {file = "tokenizers-0.20.0-cp310-none-win32.whl", hash = "sha256:95ee16b57cec11b86a7940174ec5197d506439b0f415ab3859f254b1dffe9df0"}, + {file = "tokenizers-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:0a61a11e93eeadbf02aea082ffc75241c4198e0608bbbac4f65a9026851dcf37"}, + {file = "tokenizers-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6636b798b3c4d6c9b1af1a918bd07c867808e5a21c64324e95318a237e6366c3"}, + {file = "tokenizers-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ec603e42eaf499ffd58b9258162add948717cf21372458132f14e13a6bc7172"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce124264903a8ea6f8f48e1cc7669e5ef638c18bd4ab0a88769d5f92debdf7f"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07bbeba0231cf8de07aa6b9e33e9779ff103d47042eeeb859a8c432e3292fb98"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:06c0ca8397b35d38b83a44a9c6929790c1692957d88541df061cb34d82ebbf08"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca6557ac3b83d912dfbb1f70ab56bd4b0594043916688e906ede09f42e192401"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a5ad94c9e80ac6098328bee2e3264dbced4c6faa34429994d473f795ec58ef4"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b5c7f906ee6bec30a9dc20268a8b80f3b9584de1c9f051671cb057dc6ce28f6"}, + {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:31e087e9ee1b8f075b002bfee257e858dc695f955b43903e1bb4aa9f170e37fe"}, + {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3124fb6f3346cb3d8d775375d3b429bf4dcfc24f739822702009d20a4297990"}, + {file = "tokenizers-0.20.0-cp311-none-win32.whl", hash = "sha256:a4bb8b40ba9eefa621fdcabf04a74aa6038ae3be0c614c6458bd91a4697a452f"}, + {file = "tokenizers-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:2b709d371f1fe60a28ef0c5c67815952d455ca7f34dbe7197eaaed3cc54b658e"}, + {file = "tokenizers-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:15c81a17d0d66f4987c6ca16f4bea7ec253b8c7ed1bb00fdc5d038b1bb56e714"}, + {file = "tokenizers-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a531cdf1fb6dc41c984c785a3b299cb0586de0b35683842a3afbb1e5207f910"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06caabeb4587f8404e0cd9d40f458e9cba3e815c8155a38e579a74ff3e2a4301"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8768f964f23f5b9f50546c0369c75ab3262de926983888bbe8b98be05392a79c"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:626403860152c816f97b649fd279bd622c3d417678c93b4b1a8909b6380b69a8"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c1b88fa9e5ff062326f4bf82681da5a96fca7104d921a6bd7b1e6fcf224af26"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7e559436a07dc547f22ce1101f26d8b2fad387e28ec8e7e1e3b11695d681d8"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48afb75e50449848964e4a67b0da01261dd3aa8df8daecf10db8fd7f5b076eb"}, + {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf5d0e1ff44710a95eefc196dd87666ffc609fd447c5e5b68272a7c3d342a1d"}, + {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e5e56df0e8ed23ba60ae3848c3f069a0710c4b197218fe4f89e27eba38510768"}, + {file = "tokenizers-0.20.0-cp312-none-win32.whl", hash = "sha256:ec53e5ecc142a82432f9c6c677dbbe5a2bfee92b8abf409a9ecb0d425ee0ce75"}, + {file = "tokenizers-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:f18661ece72e39c0dfaa174d6223248a15b457dbd4b0fc07809b8e6d3ca1a234"}, + {file = "tokenizers-0.20.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:f7065b1084d8d1a03dc89d9aad69bcbc8415d4bc123c367063eb32958cd85054"}, + {file = "tokenizers-0.20.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e5d4069e4714e3f7ba0a4d3d44f9d84a432cd4e4aa85c3d7dd1f51440f12e4a1"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:799b808529e54b7e1a36350bda2aeb470e8390e484d3e98c10395cee61d4e3c6"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f9baa027cc8a281ad5f7725a93c204d7a46986f88edbe8ef7357f40a23fb9c7"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:010ec7f3f7a96adc4c2a34a3ada41fa14b4b936b5628b4ff7b33791258646c6b"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98d88f06155335b14fd78e32ee28ca5b2eb30fced4614e06eb14ae5f7fba24ed"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e13eb000ef540c2280758d1b9cfa5fe424b0424ae4458f440e6340a4f18b2638"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fab3cf066ff426f7e6d70435dc28a9ff01b2747be83810e397cba106f39430b0"}, + {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:39fa3761b30a89368f322e5daf4130dce8495b79ad831f370449cdacfb0c0d37"}, + {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c8da0fba4d179ddf2607821575998df3c294aa59aa8df5a6646dc64bc7352bce"}, + {file = "tokenizers-0.20.0-cp37-none-win32.whl", hash = "sha256:fada996d6da8cf213f6e3c91c12297ad4f6cdf7a85c2fadcd05ec32fa6846fcd"}, + {file = "tokenizers-0.20.0-cp37-none-win_amd64.whl", hash = "sha256:7d29aad702279e0760c265fcae832e89349078e3418dd329732d4503259fd6bd"}, + {file = "tokenizers-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:099c68207f3ef0227ecb6f80ab98ea74de559f7b124adc7b17778af0250ee90a"}, + {file = "tokenizers-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:68012d8a8cddb2eab3880870d7e2086cb359c7f7a2b03f5795044f5abff4e850"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9253bdd209c6aee168deca7d0e780581bf303e0058f268f9bb06859379de19b6"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f868600ddbcb0545905ed075eb7218a0756bf6c09dae7528ea2f8436ebd2c93"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9643d9c8c5f99b6aba43fd10034f77cc6c22c31f496d2f0ee183047d948fa0"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c375c6a889aeab44734028bc65cc070acf93ccb0f9368be42b67a98e1063d3f6"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e359f852328e254f070bbd09a19a568421d23388f04aad9f2fb7da7704c7228d"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d98b01a309d4387f3b1c1dd68a8b8136af50376cf146c1b7e8d8ead217a5be4b"}, + {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:459f7537119554c2899067dec1ac74a00d02beef6558f4ee2e99513bf6d568af"}, + {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:392b87ec89452628c045c9f2a88bc2a827f4c79e7d84bc3b72752b74c2581f70"}, + {file = "tokenizers-0.20.0-cp38-none-win32.whl", hash = "sha256:55a393f893d2ed4dd95a1553c2e42d4d4086878266f437b03590d3f81984c4fe"}, + {file = "tokenizers-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:30ffe33c5c2f2aab8e9a3340d0110dd9f7ace7eec7362e20a697802306bd8068"}, + {file = "tokenizers-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aa2d4a6fed2a7e3f860c7fc9d48764bb30f2649d83915d66150d6340e06742b8"}, + {file = "tokenizers-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5ef0f814084a897e9071fc4a868595f018c5c92889197bdc4bf19018769b148"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1e1b791e8c3bf4c4f265f180dadaff1c957bf27129e16fdd5e5d43c2d3762c"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b69e55e481459c07885263743a0d3c18d52db19bae8226a19bcca4aaa213fff"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806b4d82e27a2512bc23057b2986bc8b85824914286975b84d8105ff40d03d9"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9859e9ef13adf5a473ccab39d31bff9c550606ae3c784bf772b40f615742a24f"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef703efedf4c20488a8eb17637b55973745b27997ff87bad88ed499b397d1144"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eec0061bab94b1841ab87d10831fdf1b48ebaed60e6d66d66dbe1d873f92bf5"}, + {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:980f3d0d7e73f845b69087f29a63c11c7eb924c4ad6b358da60f3db4cf24bdb4"}, + {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c157550a2f3851b29d7fdc9dc059fcf81ff0c0fc49a1e5173a89d533ed043fa"}, + {file = "tokenizers-0.20.0-cp39-none-win32.whl", hash = "sha256:8a3d2f4d08608ec4f9895ec25b4b36a97f05812543190a5f2c3cd19e8f041e5a"}, + {file = "tokenizers-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:d90188d12afd0c75e537f9a1d92f9c7375650188ee4f48fdc76f9e38afbd2251"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d68e15f1815357b059ec266062340c343ea7f98f7f330602df81ffa3474b6122"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:23f9ecec637b9bc80da5f703808d29ed5329e56b5aa8d791d1088014f48afadc"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f830b318ee599e3d0665b3e325f85bc75ee2d2ca6285f52e439dc22b64691580"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3dc750def789cb1de1b5a37657919545e1d9ffa667658b3fa9cb7862407a1b8"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e26e6c755ae884c2ea6135cd215bdd0fccafe4ee62405014b8c3cd19954e3ab9"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a1158c7174f427182e08baa2a8ded2940f2b4a3e94969a85cc9cfd16004cbcea"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:6324826287a3fc198898d3dcf758fe4a8479e42d6039f4c59e2cedd3cf92f64e"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d8653149405bb0c16feaf9cfee327fdb6aaef9dc2998349fec686f35e81c4e2"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a2dc1e402a155e97309287ca085c80eb1b7fab8ae91527d3b729181639fa51"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bef67b20aa6e5f7868c42c7c5eae4d24f856274a464ae62e47a0f2cccec3da"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da06e397182ff53789c506c7833220c192952c57e1581a53f503d8d953e2d67e"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:302f7e11a14814028b7fc88c45a41f1bbe9b5b35fd76d6869558d1d1809baa43"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:055ec46e807b875589dfbe3d9259f9a6ee43394fb553b03b3d1e9541662dbf25"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e3144b8acebfa6ae062e8f45f7ed52e4b50fb6c62f93afc8871b525ab9fdcab3"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b52aa3fd14b2a07588c00a19f66511cff5cca8f7266ca3edcdd17f3512ad159f"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b8cf52779ffc5d4d63a0170fbeb512372bad0dd014ce92bbb9149756c831124"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:983a45dd11a876124378dae71d6d9761822199b68a4c73f32873d8cdaf326a5b"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6b819c9a19831ebec581e71a7686a54ab45d90faf3842269a10c11d746de0c"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e738cfd80795fcafcef89c5731c84b05638a4ab3f412f97d5ed7765466576eb1"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c8842c7be2fadb9c9edcee233b1b7fe7ade406c99b0973f07439985c1c1d0683"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e47a82355511c373a4a430c4909dc1e518e00031207b1fec536c49127388886b"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9afbf359004551179a5db19424180c81276682773cff2c5d002f6eaaffe17230"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07eaa8799a92e6af6f472c21a75bf71575de2af3c0284120b7a09297c0de2f3"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0994b2e5fc53a301071806bc4303e4bc3bdc3f490e92a21338146a36746b0872"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6466e0355b603d10e3cc3d282d350b646341b601e50969464a54939f9848d0"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1e86594c2a433cb1ea09cfbe596454448c566e57ee8905bd557e489d93e89986"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3e14cdef1efa96ecead6ea64a891828432c3ebba128bdc0596e3059fea104ef3"}, + {file = "tokenizers-0.20.0.tar.gz", hash = "sha256:39d7acc43f564c274085cafcd1dae9d36f332456de1a31970296a6b8da4eac8d"}, ] [package.dependencies] @@ -3534,86 +3614,98 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "watchfiles" -version = "0.22.0" +version = "0.23.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.8" files = [ - {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, - {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, - {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, - {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, - {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, - {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, - {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, - {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, - {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, - {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, - {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, - {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, - {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, - {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, - {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, - {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, - {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, - {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, - {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, - {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, - {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, - {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, - {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, - {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, - {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, - {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, - {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, - {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, - {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, - {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, - {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, + {file = "watchfiles-0.23.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bee8ce357a05c20db04f46c22be2d1a2c6a8ed365b325d08af94358e0688eeb4"}, + {file = "watchfiles-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ccd3011cc7ee2f789af9ebe04745436371d36afe610028921cab9f24bb2987b"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb02d41c33be667e6135e6686f1bb76104c88a312a18faa0ef0262b5bf7f1a0f"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf12ac34c444362f3261fb3ff548f0037ddd4c5bb85f66c4be30d2936beb3c5"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0b2c25040a3c0ce0e66c7779cc045fdfbbb8d59e5aabfe033000b42fe44b53e"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf2be4b9eece4f3da8ba5f244b9e51932ebc441c0867bd6af46a3d97eb068d6"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40cb8fa00028908211eb9f8d47744dca21a4be6766672e1ff3280bee320436f1"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f48c917ffd36ff9a5212614c2d0d585fa8b064ca7e66206fb5c095015bc8207"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9d183e3888ada88185ab17064079c0db8c17e32023f5c278d7bf8014713b1b5b"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9837edf328b2805346f91209b7e660f65fb0e9ca18b7459d075d58db082bf981"}, + {file = "watchfiles-0.23.0-cp310-none-win32.whl", hash = "sha256:296e0b29ab0276ca59d82d2da22cbbdb39a23eed94cca69aed274595fb3dfe42"}, + {file = "watchfiles-0.23.0-cp310-none-win_amd64.whl", hash = "sha256:4ea756e425ab2dfc8ef2a0cb87af8aa7ef7dfc6fc46c6f89bcf382121d4fff75"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:e397b64f7aaf26915bf2ad0f1190f75c855d11eb111cc00f12f97430153c2eab"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4ac73b02ca1824ec0a7351588241fd3953748d3774694aa7ddb5e8e46aef3e3"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130a896d53b48a1cecccfa903f37a1d87dbb74295305f865a3e816452f6e49e4"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c5e7803a65eb2d563c73230e9d693c6539e3c975ccfe62526cadde69f3fda0cf"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1aa4cc85202956d1a65c88d18c7b687b8319dbe6b1aec8969784ef7a10e7d1a"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87f889f6e58849ddb7c5d2cb19e2e074917ed1c6e3ceca50405775166492cca8"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37fd826dac84c6441615aa3f04077adcc5cac7194a021c9f0d69af20fb9fa788"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7db6e36e7a2c15923072e41ea24d9a0cf39658cb0637ecc9307b09d28827e1"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2368c5371c17fdcb5a2ea71c5c9d49f9b128821bfee69503cc38eae00feb3220"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:857af85d445b9ba9178db95658c219dbd77b71b8264e66836a6eba4fbf49c320"}, + {file = "watchfiles-0.23.0-cp311-none-win32.whl", hash = "sha256:1d636c8aeb28cdd04a4aa89030c4b48f8b2954d8483e5f989774fa441c0ed57b"}, + {file = "watchfiles-0.23.0-cp311-none-win_amd64.whl", hash = "sha256:46f1d8069a95885ca529645cdbb05aea5837d799965676e1b2b1f95a4206313e"}, + {file = "watchfiles-0.23.0-cp311-none-win_arm64.whl", hash = "sha256:e495ed2a7943503766c5d1ff05ae9212dc2ce1c0e30a80d4f0d84889298fa304"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1db691bad0243aed27c8354b12d60e8e266b75216ae99d33e927ff5238d270b5"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62d2b18cb1edaba311fbbfe83fb5e53a858ba37cacb01e69bc20553bb70911b8"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e087e8fdf1270d000913c12e6eca44edd02aad3559b3e6b8ef00f0ce76e0636f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd41d5c72417b87c00b1b635738f3c283e737d75c5fa5c3e1c60cd03eac3af77"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e5f3ca0ff47940ce0a389457b35d6df601c317c1e1a9615981c474452f98de1"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6991e3a78f642368b8b1b669327eb6751439f9f7eaaa625fae67dd6070ecfa0b"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f7252f52a09f8fa5435dc82b6af79483118ce6bd51eb74e6269f05ee22a7b9f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e01bcb8d767c58865207a6c2f2792ad763a0fe1119fb0a430f444f5b02a5ea0"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e56fbcdd27fce061854ddec99e015dd779cae186eb36b14471fc9ae713b118c"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bd3e2d64500a6cad28bcd710ee6269fbeb2e5320525acd0cfab5f269ade68581"}, + {file = "watchfiles-0.23.0-cp312-none-win32.whl", hash = "sha256:eb99c954291b2fad0eff98b490aa641e128fbc4a03b11c8a0086de8b7077fb75"}, + {file = "watchfiles-0.23.0-cp312-none-win_amd64.whl", hash = "sha256:dccc858372a56080332ea89b78cfb18efb945da858fabeb67f5a44fa0bcb4ebb"}, + {file = "watchfiles-0.23.0-cp312-none-win_arm64.whl", hash = "sha256:6c21a5467f35c61eafb4e394303720893066897fca937bade5b4f5877d350ff8"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ba31c32f6b4dceeb2be04f717811565159617e28d61a60bb616b6442027fd4b9"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85042ab91814fca99cec4678fc063fb46df4cbb57b4835a1cc2cb7a51e10250e"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24655e8c1c9c114005c3868a3d432c8aa595a786b8493500071e6a52f3d09217"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b1a950ab299a4a78fd6369a97b8763732bfb154fdb433356ec55a5bce9515c1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8d3c5cd327dd6ce0edfc94374fb5883d254fe78a5e9d9dfc237a1897dc73cd1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ff785af8bacdf0be863ec0c428e3288b817e82f3d0c1d652cd9c6d509020dd0"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02b7ba9d4557149410747353e7325010d48edcfe9d609a85cb450f17fd50dc3d"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a1b05c0afb2cd2f48c1ed2ae5487b116e34b93b13074ed3c22ad5c743109f0"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:109a61763e7318d9f821b878589e71229f97366fa6a5c7720687d367f3ab9eef"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9f8e6bb5ac007d4a4027b25f09827ed78cbbd5b9700fd6c54429278dacce05d1"}, + {file = "watchfiles-0.23.0-cp313-none-win32.whl", hash = "sha256:f46c6f0aec8d02a52d97a583782d9af38c19a29900747eb048af358a9c1d8e5b"}, + {file = "watchfiles-0.23.0-cp313-none-win_amd64.whl", hash = "sha256:f449afbb971df5c6faeb0a27bca0427d7b600dd8f4a068492faec18023f0dcff"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:2dddc2487d33e92f8b6222b5fb74ae2cfde5e8e6c44e0248d24ec23befdc5366"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e75695cc952e825fa3e0684a7f4a302f9128721f13eedd8dbd3af2ba450932b8"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2537ef60596511df79b91613a5bb499b63f46f01a11a81b0a2b0dedf645d0a9c"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20b423b58f5fdde704a226b598a2d78165fe29eb5621358fe57ea63f16f165c4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b98732ec893975455708d6fc9a6daab527fc8bbe65be354a3861f8c450a632a4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee1f5fcbf5bc33acc0be9dd31130bcba35d6d2302e4eceafafd7d9018c7755ab"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f195338a5a7b50a058522b39517c50238358d9ad8284fd92943643144c0c03"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524fcb8d59b0dbee2c9b32207084b67b2420f6431ed02c18bd191e6c575f5c48"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0eff099a4df36afaa0eea7a913aa64dcf2cbd4e7a4f319a73012210af4d23810"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a8323daae27ea290ba3350c70c836c0d2b0fb47897fa3b0ca6a5375b952b90d3"}, + {file = "watchfiles-0.23.0-cp38-none-win32.whl", hash = "sha256:aafea64a3ae698695975251f4254df2225e2624185a69534e7fe70581066bc1b"}, + {file = "watchfiles-0.23.0-cp38-none-win_amd64.whl", hash = "sha256:c846884b2e690ba62a51048a097acb6b5cd263d8bd91062cd6137e2880578472"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a753993635eccf1ecb185dedcc69d220dab41804272f45e4aef0a67e790c3eb3"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6bb91fa4d0b392f0f7e27c40981e46dda9eb0fbc84162c7fb478fe115944f491"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1f67312efa3902a8e8496bfa9824d3bec096ff83c4669ea555c6bdd213aa516"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ca6b71dcc50d320c88fb2d88ecd63924934a8abc1673683a242a7ca7d39e781"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aec5c29915caf08771d2507da3ac08e8de24a50f746eb1ed295584ba1820330"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1733b9bc2c8098c6bdb0ff7a3d7cb211753fecb7bd99bdd6df995621ee1a574b"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02ff5d7bd066c6a7673b17c8879cd8ee903078d184802a7ee851449c43521bdd"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18e2de19801b0eaa4c5292a223effb7cfb43904cb742c5317a0ac686ed604765"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8ada449e22198c31fb013ae7e9add887e8d2bd2335401abd3cbc55f8c5083647"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3af1b05361e1cc497bf1be654a664750ae61f5739e4bb094a2be86ec8c6db9b6"}, + {file = "watchfiles-0.23.0-cp39-none-win32.whl", hash = "sha256:486bda18be5d25ab5d932699ceed918f68eb91f45d018b0343e3502e52866e5e"}, + {file = "watchfiles-0.23.0-cp39-none-win_amd64.whl", hash = "sha256:d2d42254b189a346249424fb9bb39182a19289a2409051ee432fb2926bad966a"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9265cf87a5b70147bfb2fec14770ed5b11a5bb83353f0eee1c25a81af5abfe"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f02a259fcbbb5fcfe7a0805b1097ead5ba7a043e318eef1db59f93067f0b49b"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebaebb53b34690da0936c256c1cdb0914f24fb0e03da76d185806df9328abed"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd257f98cff9c6cb39eee1a83c7c3183970d8a8d23e8cf4f47d9a21329285cee"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aba037c1310dd108411d27b3d5815998ef0e83573e47d4219f45753c710f969f"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a96ac14e184aa86dc43b8a22bb53854760a58b2966c2b41580de938e9bf26ed0"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11698bb2ea5e991d10f1f4f83a39a02f91e44e4bd05f01b5c1ec04c9342bf63c"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efadd40fca3a04063d40c4448c9303ce24dd6151dc162cfae4a2a060232ebdcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:556347b0abb4224c5ec688fc58214162e92a500323f50182f994f3ad33385dcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1cf7f486169986c4b9d34087f08ce56a35126600b6fef3028f19ca16d5889071"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f18de0f82c62c4197bea5ecf4389288ac755896aac734bd2cc44004c56e4ac47"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:532e1f2c491274d1333a814e4c5c2e8b92345d41b12dc806cf07aaff786beb66"}, + {file = "watchfiles-0.23.0.tar.gz", hash = "sha256:9338ade39ff24f8086bb005d16c29f8e9f19e55b18dcb04dfa26fcbc09da497b"}, ] [package.dependencies] @@ -3916,4 +4008,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "c4fb16f8c99d00f6da26dae90ad75d726be530aa0a667c728e17e5d1d78dec20" +content-hash = "85f9baed83a51fe85ea2aad9dfb7e8568f787cc720e62d1e98e740f3744f6a97" diff --git a/apps/api/pyproject.toml b/apps/api/pyproject.toml index c09fd520..ac102cd8 100644 --- a/apps/api/pyproject.toml +++ b/apps/api/pyproject.toml @@ -16,10 +16,10 @@ faker = "^26.3.0" fastapi = "^0.111.0" fastapi-jwt-auth = "^0.5.0" httpx = "^0.27.0" -langchain = "0.1.7" +langchain = "^0.1.7" langchain-community = "^0.0.20" langchain-openai = "^0.0.6" -openai = "^1.40.2" +openai = "^1.40.3" passlib = "^1.7.4" psycopg2-binary = "^2.9.9" pydantic = {version = ">=1.8.0,<2.0.0", extras = ["email"]} @@ -37,7 +37,7 @@ sqlmodel = "^0.0.19" tiktoken = "^0.7.0" uvicorn = "0.30.1" typer = "^0.12.3" -chromadb = "^0.5.3" +chromadb = "0.5.3" alembic = "^1.13.2" alembic-postgresql-enum = "^1.2.0" sqlalchemy-utils = "^0.41.2" diff --git a/apps/api/src/routers/dev.py b/apps/api/src/routers/dev.py index e5d11d23..af2ba1ce 100644 --- a/apps/api/src/routers/dev.py +++ b/apps/api/src/routers/dev.py @@ -1,5 +1,13 @@ -from fastapi import APIRouter +from fastapi import APIRouter, Depends +from h11 import Request +from sqlmodel import Session, select from config.config import get_learnhouse_config +from migrations.orgconfigs.v0tov1 import migrate_v0_to_v1 +from src.core.events.database import get_db_session +from src.db.organization_config import OrganizationConfig +from src.db.organizations import Organization +from src.db.users import PublicUser +from src.security.auth import get_current_user router = APIRouter() @@ -11,4 +19,20 @@ async def config(): return config.dict() +@router.post("/migrate_orgconfig_v0_to_v1") +async def migrate( + db_session: Session = Depends(get_db_session), +): + """ + Migrate organization config from v0 to v1 + """ + statement = select(OrganizationConfig) + result = db_session.exec(statement) + for orgConfig in result: + orgConfig.config = migrate_v0_to_v1(orgConfig.config) + + db_session.add(orgConfig) + db_session.commit() + + return {"message": "Migration successful"} diff --git a/apps/api/src/services/ai/utils.py b/apps/api/src/services/ai/utils.py index 2fe9c367..9a853665 100644 --- a/apps/api/src/services/ai/utils.py +++ b/apps/api/src/services/ai/utils.py @@ -71,7 +71,7 @@ def check_limits_and_config(db_session: Session, organization: Organization): ) # Check if the Organizations has AI enabled - if org_config.config["AIConfig"]["enabled"] == False: + if org_config.config["features"]["ai"]["enabled"] == False: raise HTTPException( status_code=403, detail="Organization has AI disabled", diff --git a/apps/web/app/auth/signup/signup.tsx b/apps/web/app/auth/signup/signup.tsx index 5174fc7f..1ed093c9 100644 --- a/apps/web/app/auth/signup/signup.tsx +++ b/apps/web/app/auth/signup/signup.tsx @@ -33,7 +33,7 @@ function SignUpClient(props: SignUpClientProps) { useEffect(() => { if (props.org.config) { setJoinMethod( - props.org?.config?.config?.GeneralConfig.users.signup_mechanism + props.org?.config?.config?.features.members.signup_mode ) } if (inviteCodeParam) { diff --git a/apps/web/components/AI/Hooks/useGetAIFeatures.tsx b/apps/web/components/AI/Hooks/useGetAIFeatures.tsx index e7c0afb5..ac09f597 100644 --- a/apps/web/components/AI/Hooks/useGetAIFeatures.tsx +++ b/apps/web/components/AI/Hooks/useGetAIFeatures.tsx @@ -10,21 +10,9 @@ function useGetAIFeatures(props: UseGetAIFeatures) { const [isEnabled, setisEnabled] = React.useState(false) function checkAvailableAIFeaturesOnOrg(feature: string) { - const config = org?.config?.config?.AIConfig + const config = org?.config?.config?.features.ai.enabled - if (!config) { - return false - } - - if (!config.enabled) { - return false - } - - if (!config.features[feature]) { - return false - } - - return true + return config } React.useEffect(() => { diff --git a/apps/web/components/Contexts/OrgContext.tsx b/apps/web/components/Contexts/OrgContext.tsx index d9482fed..8b50e39a 100644 --- a/apps/web/components/Contexts/OrgContext.tsx +++ b/apps/web/components/Contexts/OrgContext.tsx @@ -26,7 +26,7 @@ export function OrgProvider({ children, orgslug }: { children: React.ReactNode, ) - const isOrgActive = useMemo(() => org?.config?.config?.GeneralConfig?.active !== false, [org]) + const isOrgActive = useMemo(() => org?.config?.config?.general?.enabled !== false, [org]) const isUserPartOfTheOrg = useMemo(() => orgs?.some((userOrg: any) => userOrg.id === org?.id), [orgs, org?.id]) if (orgError || orgsError) return diff --git a/apps/web/components/Dashboard/Users/OrgAccess/OrgAccess.tsx b/apps/web/components/Dashboard/Users/OrgAccess/OrgAccess.tsx index 0f8e071e..9c609c77 100644 --- a/apps/web/components/Dashboard/Users/OrgAccess/OrgAccess.tsx +++ b/apps/web/components/Dashboard/Users/OrgAccess/OrgAccess.tsx @@ -33,7 +33,7 @@ function OrgAccess() { async function getOrgJoinMethod() { if (org) { - if (org.config.config.GeneralConfig.users.signup_mechanism == 'open') { + if (org.config.config.features.members.signup_mode == 'open') { setJoinMethod('open') } else { setJoinMethod('inviteOnly') diff --git a/apps/web/components/Objects/Editor/ActiveAvatars.tsx b/apps/web/components/Objects/Editor/ActiveAvatars.tsx index ddab6d8a..40d0d656 100644 --- a/apps/web/components/Objects/Editor/ActiveAvatars.tsx +++ b/apps/web/components/Objects/Editor/ActiveAvatars.tsx @@ -17,7 +17,7 @@ function ActiveAvatars(props: ActiveAvatarsProps) { /* Collaboration Features */ const collab = getCollaborationServerUrl() - const isCollabEnabledOnThisOrg = org?.config.config.GeneralConfig.collaboration && collab + const isCollabEnabledOnThisOrg = org?.config.config.features.collaboration.enabled && collab // Get users from the mouseMovements object useEffect(() => { diff --git a/apps/web/components/Objects/Editor/EditorWrapper.tsx b/apps/web/components/Objects/Editor/EditorWrapper.tsx index 6353a297..860beeae 100644 --- a/apps/web/components/Objects/Editor/EditorWrapper.tsx +++ b/apps/web/components/Objects/Editor/EditorWrapper.tsx @@ -35,7 +35,7 @@ function EditorWrapper(props: EditorWrapperProps): JSX.Element { /* Collaboration Features */ const collab = getCollaborationServerUrl() - const isCollabEnabledOnThisOrg = props.org.config.config.GeneralConfig.collaboration && collab + const isCollabEnabledOnThisOrg = props.org.config.config.features.collaboration.enabled && collab const doc = new Y.Doc() // mouse movement const [mouseMovements, setMouseMovements] = useState({} as any); diff --git a/apps/web/components/Objects/Editor/MouseMovements.tsx b/apps/web/components/Objects/Editor/MouseMovements.tsx index 403cd1b6..dbe0ce9e 100644 --- a/apps/web/components/Objects/Editor/MouseMovements.tsx +++ b/apps/web/components/Objects/Editor/MouseMovements.tsx @@ -27,7 +27,7 @@ function MouseMovements({ movements, onlinePageInstanceID, org }: MouseMovements /* Collaboration config */ const collab = getCollaborationServerUrl() - const isCollabEnabledOnThisOrg = org?.config.config.GeneralConfig.collaboration && collab + const isCollabEnabledOnThisOrg = org?.config.config.features.collaboration.enabled && collab useEffect(() => { From 1bf58efe1c0f3ae01073d3f75eb17c06f4b98f6c Mon Sep 17 00:00:00 2001 From: swve Date: Sun, 11 Aug 2024 15:42:55 +0200 Subject: [PATCH 3/5] feat: add watermark --- .../app/orgs/[orgslug]/(withmenu)/layout.tsx | 2 ++ apps/web/components/Watermark.tsx | 27 ++++++++++++++++++ apps/web/public/black_logo.png | Bin 0 -> 65304 bytes 3 files changed, 29 insertions(+) create mode 100644 apps/web/components/Watermark.tsx create mode 100644 apps/web/public/black_logo.png diff --git a/apps/web/app/orgs/[orgslug]/(withmenu)/layout.tsx b/apps/web/app/orgs/[orgslug]/(withmenu)/layout.tsx index 152aa846..96e5c1aa 100644 --- a/apps/web/app/orgs/[orgslug]/(withmenu)/layout.tsx +++ b/apps/web/app/orgs/[orgslug]/(withmenu)/layout.tsx @@ -2,6 +2,7 @@ import '@styles/globals.css' import { Menu } from '@components/Objects/Menu/Menu' import { SessionProvider } from 'next-auth/react' +import Watermark from '@components/Watermark' export default function RootLayout({ children, @@ -15,6 +16,7 @@ export default function RootLayout({ {children} + ) diff --git a/apps/web/components/Watermark.tsx b/apps/web/components/Watermark.tsx new file mode 100644 index 00000000..ff06fb4c --- /dev/null +++ b/apps/web/components/Watermark.tsx @@ -0,0 +1,27 @@ +import Image from 'next/image' +import Link from 'next/link' +import blacklogo from '@public/black_logo.png' +import React, { useEffect } from 'react' +import { useOrg } from './Contexts/OrgContext' + +function Watermark() { + const org = useOrg() as any + + useEffect(() => { + } + , [org]); + + if (org?.config?.config?.general?.watermark) { + return ( +
+ +

Made with

+ logo + +
+ ) + } + return null +} + +export default Watermark \ No newline at end of file diff --git a/apps/web/public/black_logo.png b/apps/web/public/black_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8e942af7d58ae6c0b6c323701c4a02e1bfdcc97e GIT binary patch literal 65304 zcmZU52Q-^+__ns%Qe6@)Evgi;S3_&psu81TjUYy8rNoF8yHzcrHnC~Vsu_aXYL8k; ztx#&jR(r26ZGYeYYyaPSPLAYtj$H5k+|NC(`+A@sX)0g3aPtBM1;r&*6-6BiigQgA z6sI0gog?3&QMy6CK|$@HV(3Ic!3X*EI+ZDn$syl7<)ou5Pf^g#G*A9O`CLvzj)DRk zMssL>mV)9qUsX}=G3wM(Olw2G7rU?~u+u{() zX1RGM`JCCwDT>@`5Hp%!e=2D+`YtkKCuR8i`<$9=KH-MpKD(|^CB(Bp77dEK?0w%q z(g<2^-e>xGE295NjP{f9Fhdto7*!a{jre5J_-30NMSrg%vDy3}-gZV6-$2OL8aIPC zw6r{A2x|?og4!`$JQuYRr)(#w2|3V_xMCNKA-T~TjXwL7Shn=-jx zclzP1ZPV7#(8;(6V>-$!G?uWPpP%2p9&75eXY50M?!T_DvB)>4o!MR(seXGw?6H)- zz#$vPMmNT=GpZB1 zpY+l)ra!Y5gq<%{f+VgsfxBusi(Igcs_>-!$lGEs>Q)r{mTUlD=QadS)&<>8|An9Y zR{eJ1wO&oD&p_FgQUZXJ)|PvXk{Lo(Vrwl{I#(dDwV-1U@keIKKVF7fTUk#&$q5|d zkSG9uDtMzP9K=&qg2k?h`-}YZH-GdzxC+EYm`ZA;${gLkK*R2(!B#63kp{lW-8wNb zF`a0e;r1vKfsDs9F*E1vWimwJV*=&L&n{?7U@NIs5rCD^$3LT%LMA9^Sg+d}l?CSK z^NY%B%CA_ahuJb_YKcWIM~e-6%xA`i?jY>!G|T$#Y2^;bO#9cJj<5x2JWP%IxdGBj zSu$Tx`Uluz8&Si`B�MP5~60en*Vk){R6pG%a9mO(!< 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 Date: Sun, 11 Aug 2024 15:51:44 +0200 Subject: [PATCH 4/5] fix: lock issues and ruff errors --- apps/api/poetry.lock | 233 ++++++++--------------- apps/api/src/routers/dev.py | 4 - apps/api/src/services/install/install.py | 2 +- 3 files changed, 79 insertions(+), 160 deletions(-) diff --git a/apps/api/poetry.lock b/apps/api/poetry.lock index 8117e47e..283ed358 100644 --- a/apps/api/poetry.lock +++ b/apps/api/poetry.lock @@ -13,164 +13,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.2" -version = "3.10.2" +version = "3.10.3" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95213b3d79c7e387144e9cb7b9d2809092d6ff2c044cb59033aedc612f38fb6d"}, - {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1aa005f060aff7124cfadaa2493f00a4e28ed41b232add5869e129a2e395935a"}, - {file = "aiohttp-3.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eabe6bf4c199687592f5de4ccd383945f485779c7ffb62a9b9f1f8a3f9756df8"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e010736fc16d21125c7e2dc5c350cd43c528b85085c04bf73a77be328fe944"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99f81f9c1529fd8e03be4a7bd7df32d14b4f856e90ef6e9cbad3415dbfa9166c"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d611d1a01c25277bcdea06879afbc11472e33ce842322496b211319aa95441bb"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00191d38156e09e8c81ef3d75c0d70d4f209b8381e71622165f22ef7da6f101"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74c091a5ded6cb81785de2d7a8ab703731f26de910dbe0f3934eabef4ae417cc"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:18186a80ec5a701816adbf1d779926e1069392cf18504528d6e52e14b5920525"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5a7ceb2a0d2280f23a02c64cd0afdc922079bb950400c3dd13a1ab2988428aac"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8bd7be6ff6c162a60cb8fce65ee879a684fbb63d5466aba3fa5b9288eb04aefa"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fae962b62944eaebff4f4fddcf1a69de919e7b967136a318533d82d93c3c6bd1"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a0fde16d284efcacbe15fb0c1013f0967b6c3e379649239d783868230bf1db42"}, - {file = "aiohttp-3.10.2-cp310-cp310-win32.whl", hash = "sha256:f81cd85a0e76ec7b8e2b6636fe02952d35befda4196b8c88f3cec5b4fb512839"}, - {file = "aiohttp-3.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:54ba10eb5a3481c28282eb6afb5f709aedf53cf9c3a31875ffbdc9fc719ffd67"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87fab7f948e407444c2f57088286e00e2ed0003ceaf3d8f8cc0f60544ba61d91"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec6ad66ed660d46503243cbec7b2b3d8ddfa020f984209b3b8ef7d98ce69c3f2"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4be88807283bd96ae7b8e401abde4ca0bab597ba73b5e9a2d98f36d451e9aac"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01c98041f90927c2cbd72c22a164bb816fa3010a047d264969cf82e1d4bcf8d1"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54e36c67e1a9273ecafab18d6693da0fb5ac48fd48417e4548ac24a918c20998"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7de3ddb6f424af54535424082a1b5d1ae8caf8256ebd445be68c31c662354720"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dd9c7db94b4692b827ce51dcee597d61a0e4f4661162424faf65106775b40e7"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e57e21e1167705f8482ca29cc5d02702208d8bf4aff58f766d94bcd6ead838cd"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a1a50e59b720060c29e2951fd9f13c01e1ea9492e5a527b92cfe04dd64453c16"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:686c87782481fda5ee6ba572d912a5c26d9f98cc5c243ebd03f95222af3f1b0f"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:dafb4abb257c0ed56dc36f4e928a7341b34b1379bd87e5a15ce5d883c2c90574"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:494a6f77560e02bd7d1ab579fdf8192390567fc96a603f21370f6e63690b7f3d"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fe8503b1b917508cc68bf44dae28823ac05e9f091021e0c41f806ebbb23f92f"}, - {file = "aiohttp-3.10.2-cp311-cp311-win32.whl", hash = "sha256:4ddb43d06ce786221c0dfd3c91b4892c318eaa36b903f7c4278e7e2fa0dd5102"}, - {file = "aiohttp-3.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:ca2f5abcb0a9a47e56bac173c01e9f6c6e7f27534d91451c5f22e6a35a5a2093"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14eb6b17f6246959fb0b035d4f4ae52caa870c4edfb6170aad14c0de5bfbf478"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:465e445ec348d4e4bd349edd8b22db75f025da9d7b6dc1369c48e7935b85581e"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:341f8ece0276a828d95b70cd265d20e257f5132b46bf77d759d7f4e0443f2906"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01fbb87b5426381cd9418b3ddcf4fc107e296fa2d3446c18ce6c76642f340a3"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c474af073e1a6763e1c5522bbb2d85ff8318197e4c6c919b8d7886e16213345"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9076810a5621236e29b2204e67a68e1fe317c8727ee4c9abbfbb1083b442c38"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f515d6859e673940e08de3922b9c4a2249653b0ac181169313bd6e4b1978ac"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:655e583afc639bef06f3b2446972c1726007a21003cd0ef57116a123e44601bc"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8da9449a575133828cc99985536552ea2dcd690e848f9d41b48d8853a149a959"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19073d57d0feb1865d12361e2a1f5a49cb764bf81a4024a3b608ab521568093a"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8e98e1845805f184d91fda6f9ab93d7c7b0dddf1c07e0255924bfdb151a8d05"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:377220a5efde6f9497c5b74649b8c261d3cce8a84cb661be2ed8099a2196400a"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92f7f4a4dc9cdb5980973a74d43cdbb16286dacf8d1896b6c3023b8ba8436f8e"}, - {file = "aiohttp-3.10.2-cp312-cp312-win32.whl", hash = "sha256:9bb2834a6f11d65374ce97d366d6311a9155ef92c4f0cee543b2155d06dc921f"}, - {file = "aiohttp-3.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:518dc3cb37365255708283d1c1c54485bbacccd84f0a0fb87ed8917ba45eda5b"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7f98e70bbbf693086efe4b86d381efad8edac040b8ad02821453083d15ec315f"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9f6f0b252a009e98fe84028a4ec48396a948e7a65b8be06ccfc6ef68cf1f614d"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9360e3ffc7b23565600e729e8c639c3c50d5520e05fdf94aa2bd859eef12c407"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3988044d1635c7821dd44f0edfbe47e9875427464e59d548aece447f8c22800a"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a9d59da1543a6f1478c3436fd49ec59be3868bca561a33778b4391005e499d"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f49bdb94809ac56e09a310a62f33e5f22973d6fd351aac72a39cd551e98194"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfd2dca3f11c365d6857a07e7d12985afc59798458a2fdb2ffa4a0332a3fd43"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c1508ec97b2cd3e120bfe309a4ff8e852e8a7460f1ef1de00c2c0ed01e33c"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:49904f38667c44c041a0b44c474b3ae36948d16a0398a8f8cd84e2bb3c42a069"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:352f3a4e5f11f3241a49b6a48bc5b935fabc35d1165fa0d87f3ca99c1fcca98b"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fc61f39b534c5d5903490478a0dd349df397d2284a939aa3cbaa2fb7a19b8397"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ad2274e707be37420d0b6c3d26a8115295fe9d8e6e530fa6a42487a8ca3ad052"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c836bf3c7512100219fe1123743fd8dd9a2b50dd7cfb0c3bb10d041309acab4b"}, - {file = "aiohttp-3.10.2-cp38-cp38-win32.whl", hash = "sha256:53e8898adda402be03ff164b0878abe2d884e3ea03a4701e6ad55399d84b92dc"}, - {file = "aiohttp-3.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:7cc8f65f5b22304693de05a245b6736b14cb5bc9c8a03da6e2ae9ef15f8b458f"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9dfc906d656e14004c5bc672399c1cccc10db38df2b62a13fb2b6e165a81c316"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:91b10208b222ddf655c3a3d5b727879d7163db12b634492df41a9182a76edaae"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fd16b5e1a7bdd14668cd6bde60a2a29b49147a535c74f50d8177d11b38433a7"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2bfdda4971bd79201f59adbad24ec2728875237e1c83bba5221284dbbf57bda"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69d73f869cf29e8a373127fc378014e2b17bcfbe8d89134bc6fb06a2f67f3cb3"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df59f8486507c421c0620a2c3dce81fbf1d54018dc20ff4fecdb2c106d6e6abc"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df930015db36b460aa9badbf35eccbc383f00d52d4b6f3de2ccb57d064a6ade"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:562b1153ab7f766ee6b8b357ec777a302770ad017cf18505d34f1c088fccc448"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d984db6d855de58e0fde1ef908d48fe9a634cadb3cf715962722b4da1c40619d"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:14dc3fcb0d877911d775d511eb617a486a8c48afca0a887276e63db04d3ee920"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b52a27a5c97275e254704e1049f4b96a81e67d6205f52fa37a4777d55b0e98ef"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:cd33d9de8cfd006a0d0fe85f49b4183c57e91d18ffb7e9004ce855e81928f704"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1238fc979160bc03a92fff9ad021375ff1c8799c6aacb0d8ea1b357ea40932bb"}, - {file = "aiohttp-3.10.2-cp39-cp39-win32.whl", hash = "sha256:e2f43d238eae4f0b04f58d4c0df4615697d4ca3e9f9b1963d49555a94f0f5a04"}, - {file = "aiohttp-3.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:947847f07a8f81d7b39b2d0202fd73e61962ebe17ac2d8566f260679e467da7b"}, - {file = "aiohttp-3.10.2.tar.gz", hash = "sha256:4d1f694b5d6e459352e5e925a42e05bac66655bfde44d81c59992463d2897014"}, - {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95213b3d79c7e387144e9cb7b9d2809092d6ff2c044cb59033aedc612f38fb6d"}, - {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1aa005f060aff7124cfadaa2493f00a4e28ed41b232add5869e129a2e395935a"}, - {file = "aiohttp-3.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eabe6bf4c199687592f5de4ccd383945f485779c7ffb62a9b9f1f8a3f9756df8"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e010736fc16d21125c7e2dc5c350cd43c528b85085c04bf73a77be328fe944"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99f81f9c1529fd8e03be4a7bd7df32d14b4f856e90ef6e9cbad3415dbfa9166c"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d611d1a01c25277bcdea06879afbc11472e33ce842322496b211319aa95441bb"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00191d38156e09e8c81ef3d75c0d70d4f209b8381e71622165f22ef7da6f101"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74c091a5ded6cb81785de2d7a8ab703731f26de910dbe0f3934eabef4ae417cc"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:18186a80ec5a701816adbf1d779926e1069392cf18504528d6e52e14b5920525"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5a7ceb2a0d2280f23a02c64cd0afdc922079bb950400c3dd13a1ab2988428aac"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8bd7be6ff6c162a60cb8fce65ee879a684fbb63d5466aba3fa5b9288eb04aefa"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fae962b62944eaebff4f4fddcf1a69de919e7b967136a318533d82d93c3c6bd1"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a0fde16d284efcacbe15fb0c1013f0967b6c3e379649239d783868230bf1db42"}, - {file = "aiohttp-3.10.2-cp310-cp310-win32.whl", hash = "sha256:f81cd85a0e76ec7b8e2b6636fe02952d35befda4196b8c88f3cec5b4fb512839"}, - {file = "aiohttp-3.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:54ba10eb5a3481c28282eb6afb5f709aedf53cf9c3a31875ffbdc9fc719ffd67"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87fab7f948e407444c2f57088286e00e2ed0003ceaf3d8f8cc0f60544ba61d91"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec6ad66ed660d46503243cbec7b2b3d8ddfa020f984209b3b8ef7d98ce69c3f2"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4be88807283bd96ae7b8e401abde4ca0bab597ba73b5e9a2d98f36d451e9aac"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01c98041f90927c2cbd72c22a164bb816fa3010a047d264969cf82e1d4bcf8d1"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54e36c67e1a9273ecafab18d6693da0fb5ac48fd48417e4548ac24a918c20998"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7de3ddb6f424af54535424082a1b5d1ae8caf8256ebd445be68c31c662354720"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dd9c7db94b4692b827ce51dcee597d61a0e4f4661162424faf65106775b40e7"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e57e21e1167705f8482ca29cc5d02702208d8bf4aff58f766d94bcd6ead838cd"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a1a50e59b720060c29e2951fd9f13c01e1ea9492e5a527b92cfe04dd64453c16"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:686c87782481fda5ee6ba572d912a5c26d9f98cc5c243ebd03f95222af3f1b0f"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:dafb4abb257c0ed56dc36f4e928a7341b34b1379bd87e5a15ce5d883c2c90574"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:494a6f77560e02bd7d1ab579fdf8192390567fc96a603f21370f6e63690b7f3d"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fe8503b1b917508cc68bf44dae28823ac05e9f091021e0c41f806ebbb23f92f"}, - {file = "aiohttp-3.10.2-cp311-cp311-win32.whl", hash = "sha256:4ddb43d06ce786221c0dfd3c91b4892c318eaa36b903f7c4278e7e2fa0dd5102"}, - {file = "aiohttp-3.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:ca2f5abcb0a9a47e56bac173c01e9f6c6e7f27534d91451c5f22e6a35a5a2093"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14eb6b17f6246959fb0b035d4f4ae52caa870c4edfb6170aad14c0de5bfbf478"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:465e445ec348d4e4bd349edd8b22db75f025da9d7b6dc1369c48e7935b85581e"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:341f8ece0276a828d95b70cd265d20e257f5132b46bf77d759d7f4e0443f2906"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01fbb87b5426381cd9418b3ddcf4fc107e296fa2d3446c18ce6c76642f340a3"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c474af073e1a6763e1c5522bbb2d85ff8318197e4c6c919b8d7886e16213345"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9076810a5621236e29b2204e67a68e1fe317c8727ee4c9abbfbb1083b442c38"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f515d6859e673940e08de3922b9c4a2249653b0ac181169313bd6e4b1978ac"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:655e583afc639bef06f3b2446972c1726007a21003cd0ef57116a123e44601bc"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8da9449a575133828cc99985536552ea2dcd690e848f9d41b48d8853a149a959"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19073d57d0feb1865d12361e2a1f5a49cb764bf81a4024a3b608ab521568093a"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8e98e1845805f184d91fda6f9ab93d7c7b0dddf1c07e0255924bfdb151a8d05"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:377220a5efde6f9497c5b74649b8c261d3cce8a84cb661be2ed8099a2196400a"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92f7f4a4dc9cdb5980973a74d43cdbb16286dacf8d1896b6c3023b8ba8436f8e"}, - {file = "aiohttp-3.10.2-cp312-cp312-win32.whl", hash = "sha256:9bb2834a6f11d65374ce97d366d6311a9155ef92c4f0cee543b2155d06dc921f"}, - {file = "aiohttp-3.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:518dc3cb37365255708283d1c1c54485bbacccd84f0a0fb87ed8917ba45eda5b"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7f98e70bbbf693086efe4b86d381efad8edac040b8ad02821453083d15ec315f"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9f6f0b252a009e98fe84028a4ec48396a948e7a65b8be06ccfc6ef68cf1f614d"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9360e3ffc7b23565600e729e8c639c3c50d5520e05fdf94aa2bd859eef12c407"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3988044d1635c7821dd44f0edfbe47e9875427464e59d548aece447f8c22800a"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a9d59da1543a6f1478c3436fd49ec59be3868bca561a33778b4391005e499d"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f49bdb94809ac56e09a310a62f33e5f22973d6fd351aac72a39cd551e98194"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfd2dca3f11c365d6857a07e7d12985afc59798458a2fdb2ffa4a0332a3fd43"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c1508ec97b2cd3e120bfe309a4ff8e852e8a7460f1ef1de00c2c0ed01e33c"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:49904f38667c44c041a0b44c474b3ae36948d16a0398a8f8cd84e2bb3c42a069"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:352f3a4e5f11f3241a49b6a48bc5b935fabc35d1165fa0d87f3ca99c1fcca98b"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fc61f39b534c5d5903490478a0dd349df397d2284a939aa3cbaa2fb7a19b8397"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ad2274e707be37420d0b6c3d26a8115295fe9d8e6e530fa6a42487a8ca3ad052"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c836bf3c7512100219fe1123743fd8dd9a2b50dd7cfb0c3bb10d041309acab4b"}, - {file = "aiohttp-3.10.2-cp38-cp38-win32.whl", hash = "sha256:53e8898adda402be03ff164b0878abe2d884e3ea03a4701e6ad55399d84b92dc"}, - {file = "aiohttp-3.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:7cc8f65f5b22304693de05a245b6736b14cb5bc9c8a03da6e2ae9ef15f8b458f"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9dfc906d656e14004c5bc672399c1cccc10db38df2b62a13fb2b6e165a81c316"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:91b10208b222ddf655c3a3d5b727879d7163db12b634492df41a9182a76edaae"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fd16b5e1a7bdd14668cd6bde60a2a29b49147a535c74f50d8177d11b38433a7"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2bfdda4971bd79201f59adbad24ec2728875237e1c83bba5221284dbbf57bda"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69d73f869cf29e8a373127fc378014e2b17bcfbe8d89134bc6fb06a2f67f3cb3"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df59f8486507c421c0620a2c3dce81fbf1d54018dc20ff4fecdb2c106d6e6abc"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df930015db36b460aa9badbf35eccbc383f00d52d4b6f3de2ccb57d064a6ade"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:562b1153ab7f766ee6b8b357ec777a302770ad017cf18505d34f1c088fccc448"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d984db6d855de58e0fde1ef908d48fe9a634cadb3cf715962722b4da1c40619d"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:14dc3fcb0d877911d775d511eb617a486a8c48afca0a887276e63db04d3ee920"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b52a27a5c97275e254704e1049f4b96a81e67d6205f52fa37a4777d55b0e98ef"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:cd33d9de8cfd006a0d0fe85f49b4183c57e91d18ffb7e9004ce855e81928f704"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1238fc979160bc03a92fff9ad021375ff1c8799c6aacb0d8ea1b357ea40932bb"}, - {file = "aiohttp-3.10.2-cp39-cp39-win32.whl", hash = "sha256:e2f43d238eae4f0b04f58d4c0df4615697d4ca3e9f9b1963d49555a94f0f5a04"}, - {file = "aiohttp-3.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:947847f07a8f81d7b39b2d0202fd73e61962ebe17ac2d8566f260679e467da7b"}, - {file = "aiohttp-3.10.2.tar.gz", hash = "sha256:4d1f694b5d6e459352e5e925a42e05bac66655bfde44d81c59992463d2897014"}, + {file = "aiohttp-3.10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc36cbdedf6f259371dbbbcaae5bb0e95b879bc501668ab6306af867577eb5db"}, + {file = "aiohttp-3.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85466b5a695c2a7db13eb2c200af552d13e6a9313d7fa92e4ffe04a2c0ea74c1"}, + {file = "aiohttp-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71bb1d97bfe7e6726267cea169fdf5df7658831bb68ec02c9c6b9f3511e108bb"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baec1eb274f78b2de54471fc4c69ecbea4275965eab4b556ef7a7698dee18bf2"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13031e7ec1188274bad243255c328cc3019e36a5a907978501256000d57a7201"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bbc55a964b8eecb341e492ae91c3bd0848324d313e1e71a27e3d96e6ee7e8e8"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8cc0564b286b625e673a2615ede60a1704d0cbbf1b24604e28c31ed37dc62aa"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f817a54059a4cfbc385a7f51696359c642088710e731e8df80d0607193ed2b73"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8542c9e5bcb2bd3115acdf5adc41cda394e7360916197805e7e32b93d821ef93"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:671efce3a4a0281060edf9a07a2f7e6230dca3a1cbc61d110eee7753d28405f7"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0974f3b5b0132edcec92c3306f858ad4356a63d26b18021d859c9927616ebf27"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:44bb159b55926b57812dca1b21c34528e800963ffe130d08b049b2d6b994ada7"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6ae9ae382d1c9617a91647575255ad55a48bfdde34cc2185dd558ce476bf16e9"}, + {file = "aiohttp-3.10.3-cp310-cp310-win32.whl", hash = "sha256:aed12a54d4e1ee647376fa541e1b7621505001f9f939debf51397b9329fd88b9"}, + {file = "aiohttp-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:b51aef59370baf7444de1572f7830f59ddbabd04e5292fa4218d02f085f8d299"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e021c4c778644e8cdc09487d65564265e6b149896a17d7c0f52e9a088cc44e1b"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:24fade6dae446b183e2410a8628b80df9b7a42205c6bfc2eff783cbeedc224a2"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bc8e9f15939dacb0e1f2d15f9c41b786051c10472c7a926f5771e99b49a5957f"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5a9ec959b5381271c8ec9310aae1713b2aec29efa32e232e5ef7dcca0df0279"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a5d0ea8a6467b15d53b00c4e8ea8811e47c3cc1bdbc62b1aceb3076403d551f"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9ed607dbbdd0d4d39b597e5bf6b0d40d844dfb0ac6a123ed79042ef08c1f87e"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e66d5b506832e56add66af88c288c1d5ba0c38b535a1a59e436b300b57b23e"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fda91ad797e4914cca0afa8b6cccd5d2b3569ccc88731be202f6adce39503189"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:61ccb867b2f2f53df6598eb2a93329b5eee0b00646ee79ea67d68844747a418e"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d881353264e6156f215b3cb778c9ac3184f5465c2ece5e6fce82e68946868ef"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b031ce229114825f49cec4434fa844ccb5225e266c3e146cb4bdd025a6da52f1"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5337cc742a03f9e3213b097abff8781f79de7190bbfaa987bd2b7ceb5bb0bdec"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab3361159fd3dcd0e48bbe804006d5cfb074b382666e6c064112056eb234f1a9"}, + {file = "aiohttp-3.10.3-cp311-cp311-win32.whl", hash = "sha256:05d66203a530209cbe40f102ebaac0b2214aba2a33c075d0bf825987c36f1f0b"}, + {file = "aiohttp-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:70b4a4984a70a2322b70e088d654528129783ac1ebbf7dd76627b3bd22db2f17"}, + {file = "aiohttp-3.10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:166de65e2e4e63357cfa8417cf952a519ac42f1654cb2d43ed76899e2319b1ee"}, + {file = "aiohttp-3.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7084876352ba3833d5d214e02b32d794e3fd9cf21fdba99cff5acabeb90d9806"}, + {file = "aiohttp-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d98c604c93403288591d7d6d7d6cc8a63459168f8846aeffd5b3a7f3b3e5e09"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d73b073a25a0bb8bf014345374fe2d0f63681ab5da4c22f9d2025ca3e3ea54fc"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8da6b48c20ce78f5721068f383e0e113dde034e868f1b2f5ee7cb1e95f91db57"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a9dcdccf50284b1b0dc72bc57e5bbd3cc9bf019060dfa0668f63241ccc16aa7"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56fb94bae2be58f68d000d046172d8b8e6b1b571eb02ceee5535e9633dcd559c"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf75716377aad2c718cdf66451c5cf02042085d84522aec1f9246d3e4b8641a6"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6c51ed03e19c885c8e91f574e4bbe7381793f56f93229731597e4a499ffef2a5"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b84857b66fa6510a163bb083c1199d1ee091a40163cfcbbd0642495fed096204"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c124b9206b1befe0491f48185fd30a0dd51b0f4e0e7e43ac1236066215aff272"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3461d9294941937f07bbbaa6227ba799bc71cc3b22c40222568dc1cca5118f68"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:08bd0754d257b2db27d6bab208c74601df6f21bfe4cb2ec7b258ba691aac64b3"}, + {file = "aiohttp-3.10.3-cp312-cp312-win32.whl", hash = "sha256:7f9159ae530297f61a00116771e57516f89a3de6ba33f314402e41560872b50a"}, + {file = "aiohttp-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:e1128c5d3a466279cb23c4aa32a0f6cb0e7d2961e74e9e421f90e74f75ec1edf"}, + {file = "aiohttp-3.10.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d1100e68e70eb72eadba2b932b185ebf0f28fd2f0dbfe576cfa9d9894ef49752"}, + {file = "aiohttp-3.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a541414578ff47c0a9b0b8b77381ea86b0c8531ab37fc587572cb662ccd80b88"}, + {file = "aiohttp-3.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d5548444ef60bf4c7b19ace21f032fa42d822e516a6940d36579f7bfa8513f9c"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba2e838b5e6a8755ac8297275c9460e729dc1522b6454aee1766c6de6d56e5e"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48665433bb59144aaf502c324694bec25867eb6630fcd831f7a893ca473fcde4"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bac352fceed158620ce2d701ad39d4c1c76d114255a7c530e057e2b9f55bdf9f"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0f670502100cdc567188c49415bebba947eb3edaa2028e1a50dd81bd13363f"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b09f38a67679e32d380fe512189ccb0b25e15afc79b23fbd5b5e48e4fc8fd9"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:cd788602e239ace64f257d1c9d39898ca65525583f0fbf0988bcba19418fe93f"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:214277dcb07ab3875f17ee1c777d446dcce75bea85846849cc9d139ab8f5081f"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:32007fdcaab789689c2ecaaf4b71f8e37bf012a15cd02c0a9db8c4d0e7989fa8"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:123e5819bfe1b87204575515cf448ab3bf1489cdeb3b61012bde716cda5853e7"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:812121a201f0c02491a5db335a737b4113151926a79ae9ed1a9f41ea225c0e3f"}, + {file = "aiohttp-3.10.3-cp38-cp38-win32.whl", hash = "sha256:b97dc9a17a59f350c0caa453a3cb35671a2ffa3a29a6ef3568b523b9113d84e5"}, + {file = "aiohttp-3.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:3731a73ddc26969d65f90471c635abd4e1546a25299b687e654ea6d2fc052394"}, + {file = "aiohttp-3.10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38d91b98b4320ffe66efa56cb0f614a05af53b675ce1b8607cdb2ac826a8d58e"}, + {file = "aiohttp-3.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9743fa34a10a36ddd448bba8a3adc2a66a1c575c3c2940301bacd6cc896c6bf1"}, + {file = "aiohttp-3.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7c126f532caf238031c19d169cfae3c6a59129452c990a6e84d6e7b198a001dc"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:926e68438f05703e500b06fe7148ef3013dd6f276de65c68558fa9974eeb59ad"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:434b3ab75833accd0b931d11874e206e816f6e6626fd69f643d6a8269cd9166a"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d35235a44ec38109b811c3600d15d8383297a8fab8e3dec6147477ec8636712a"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59c489661edbd863edb30a8bd69ecb044bd381d1818022bc698ba1b6f80e5dd1"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50544fe498c81cb98912afabfc4e4d9d85e89f86238348e3712f7ca6a2f01dab"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09bc79275737d4dc066e0ae2951866bb36d9c6b460cb7564f111cc0427f14844"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:af4dbec58e37f5afff4f91cdf235e8e4b0bd0127a2a4fd1040e2cad3369d2f06"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b22cae3c9dd55a6b4c48c63081d31c00fc11fa9db1a20c8a50ee38c1a29539d2"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ba562736d3fbfe9241dad46c1a8994478d4a0e50796d80e29d50cabe8fbfcc3f"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f25d6c4e82d7489be84f2b1c8212fafc021b3731abdb61a563c90e37cced3a21"}, + {file = "aiohttp-3.10.3-cp39-cp39-win32.whl", hash = "sha256:b69d832e5f5fa15b1b6b2c8eb6a9fd2c0ec1fd7729cb4322ed27771afc9fc2ac"}, + {file = "aiohttp-3.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:673bb6e3249dc8825df1105f6ef74e2eab779b7ff78e96c15cadb78b04a83752"}, + {file = "aiohttp-3.10.3.tar.gz", hash = "sha256:21650e7032cc2d31fc23d353d7123e771354f2a3d5b05a5647fc30fea214e696"}, ] [package.dependencies] @@ -4008,4 +3931,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "85f9baed83a51fe85ea2aad9dfb7e8568f787cc720e62d1e98e740f3744f6a97" +content-hash = "1b7c9d0a0d354185ec5b17fe4adf6256008c90d97a19d1e41657231baf14af49" diff --git a/apps/api/src/routers/dev.py b/apps/api/src/routers/dev.py index af2ba1ce..73e0fe92 100644 --- a/apps/api/src/routers/dev.py +++ b/apps/api/src/routers/dev.py @@ -1,13 +1,9 @@ from fastapi import APIRouter, Depends -from h11 import Request from sqlmodel import Session, select from config.config import get_learnhouse_config from migrations.orgconfigs.v0tov1 import migrate_v0_to_v1 from src.core.events.database import get_db_session from src.db.organization_config import OrganizationConfig -from src.db.organizations import Organization -from src.db.users import PublicUser -from src.security.auth import get_current_user router = APIRouter() diff --git a/apps/api/src/services/install/install.py b/apps/api/src/services/install/install.py index 366751d2..8bac7e17 100644 --- a/apps/api/src/services/install/install.py +++ b/apps/api/src/services/install/install.py @@ -26,7 +26,7 @@ from src.db.organizations import Organization, OrganizationCreate from src.db.roles import Permission, Rights, Role, RoleTypeEnum from src.db.user_organizations import UserOrganization from src.db.users import User, UserCreate, UserRead -from config.config import GeneralConfig, get_learnhouse_config +from config.config import get_learnhouse_config from src.security.security import security_hash_password From a5fbf4930400f61b041507c5f7ea9fbb87ea446f Mon Sep 17 00:00:00 2001 From: swve Date: Sun, 11 Aug 2024 21:08:18 +0200 Subject: [PATCH 5/5] feat: implement usage limits across the app --- apps/api/migrations/orgconfigs/v0tov1.py | 8 +- .../routers/courses/activities/activities.py | 6 +- apps/api/src/security/features_utils/usage.py | 141 ++++++++++++++++++ apps/api/src/services/ai/ai.py | 19 ++- apps/api/src/services/ai/utils.py | 114 -------------- .../courses/activities/assignments.py | 30 +++- apps/api/src/services/courses/courses.py | 29 +++- apps/api/src/services/orgs/join.py | 10 +- apps/api/src/services/orgs/users.py | 3 + apps/api/src/services/users/usergroups.py | 23 ++- apps/api/src/services/users/users.py | 14 ++ .../Create/NewActivityModal/Assignment.tsx | 13 +- .../Modals/Course/Create/CreateCourse.tsx | 25 ++-- apps/web/services/courses/activities.ts | 4 +- apps/web/services/courses/courses.ts | 2 +- 15 files changed, 281 insertions(+), 160 deletions(-) create mode 100644 apps/api/src/security/features_utils/usage.py delete mode 100644 apps/api/src/services/ai/utils.py diff --git a/apps/api/migrations/orgconfigs/v0tov1.py b/apps/api/migrations/orgconfigs/v0tov1.py index fd7a537c..b010340f 100644 --- a/apps/api/migrations/orgconfigs/v0tov1.py +++ b/apps/api/migrations/orgconfigs/v0tov1.py @@ -30,7 +30,7 @@ def migrate_v0_to_v1(v0_config): ), }, "usergroups": { - "enabled": True, + "enabled": False, "limit": ( v0_config["GeneralConfig"]["limits"]["max_staff"] if v0_config["GeneralConfig"]["limits"]["limits_enabled"] @@ -46,7 +46,7 @@ def migrate_v0_to_v1(v0_config): ), }, "ai": { - "enabled": v0_config["AIConfig"]["enabled"], + "enabled": False, "limit": ( v0_config["AIConfig"]["limits"]["max_asks"] if v0_config["AIConfig"]["limits"]["limits_enabled"] @@ -54,12 +54,12 @@ def migrate_v0_to_v1(v0_config): ), "model": 'gpt-4o-mini', }, - "assignments": {"enabled": True, "limit": 10}, + "assignments": {"enabled": True, "limit": 5}, "payments": {"enabled": False, "stripe_key": ""}, "discussions": {"enabled": False, "limit": 10}, "analytics": {"enabled": False, "limit": 10}, "collaboration": { - "enabled": v0_config["GeneralConfig"]["collaboration"], + "enabled": False, "limit": 10, }, "api": {"enabled": False, "limit": 10}, diff --git a/apps/api/src/routers/courses/activities/activities.py b/apps/api/src/routers/courses/activities/activities.py index 8ca5877a..3b5bc84a 100644 --- a/apps/api/src/routers/courses/activities/activities.py +++ b/apps/api/src/routers/courses/activities/activities.py @@ -92,17 +92,17 @@ async def api_update_activity( ) -@router.delete("/{activity_id}") +@router.delete("/{activity_uuid}") async def api_delete_activity( request: Request, - activity_id: str, + activity_uuid: str, current_user: PublicUser = Depends(get_current_user), db_session=Depends(get_db_session), ): """ Delete activity by activity_id """ - return await delete_activity(request, activity_id, current_user, db_session) + return await delete_activity(request, activity_uuid, current_user, db_session) # Video activity diff --git a/apps/api/src/security/features_utils/usage.py b/apps/api/src/security/features_utils/usage.py new file mode 100644 index 00000000..3ac11403 --- /dev/null +++ b/apps/api/src/security/features_utils/usage.py @@ -0,0 +1,141 @@ +import redis +from src.db.organization_config import OrganizationConfig +from config.config import get_learnhouse_config +from typing import Literal, TypeAlias +from fastapi import HTTPException +from sqlmodel import Session, select + +FeatureSet: TypeAlias = Literal[ + "ai", + "analytics", + "api", + "assignments", + "collaboration", + "courses", + "discussions", + "members", + "payments", + "storage", + "usergroups", +] + + +def check_limits_with_usage( + feature: FeatureSet, + org_id: int, + db_session: Session, +): + + # Get the Organization Config + statement = select(OrganizationConfig).where(OrganizationConfig.org_id == org_id) + result = db_session.exec(statement) + + org_config = result.first() + + if org_config is None: + raise HTTPException( + status_code=404, + detail="Organization has no config", + ) + + # Check if the Organizations has AI enabled + if org_config.config["features"][feature]["enabled"] == False: + raise HTTPException( + status_code=403, + detail=f"{feature.capitalize()} is not enabled for this organization", + ) + + LH_CONFIG = get_learnhouse_config() + redis_conn_string = LH_CONFIG.redis_config.redis_connection_string + + if not redis_conn_string: + raise HTTPException( + status_code=500, + detail="Redis connection string not found", + ) + + # Connect to Redis + r = redis.Redis.from_url(redis_conn_string) + + # Check limits + feature_limit = org_config.config["features"][feature]["limit"] + + if feature_limit > 0: + # Get the number of feature usage + feature_usage = r.get(f"{feature}_usage:{org_id}") + + # Get a number of feature asks + if feature_usage is None: + feature_usage_count = 0 + else: + feature_usage_count = int(feature_usage) # type: ignore + + # Check if the Number of usage is less than the max_asks limit + if feature_limit <= feature_usage_count: + raise HTTPException( + status_code=403, + detail=f"Usage Limit has been reached for {feature.capitalize()}", + ) + return True + + +def increase_feature_usage( + feature: FeatureSet, + org_id: int, + db_session: Session, +): + LH_CONFIG = get_learnhouse_config() + redis_conn_string = LH_CONFIG.redis_config.redis_connection_string + + if not redis_conn_string: + raise HTTPException( + status_code=500, + detail="Redis connection string not found", + ) + + # Connect to Redis + r = redis.Redis.from_url(redis_conn_string) + + # Get the number of feature usage + feature_usage = r.get(f"{feature}_usage:{org_id}") + + # Get a number of feature asks + if feature_usage is None: + feature_usage_count = 0 + else: + feature_usage_count = int(feature_usage) # type: ignore + + # Increment the feature usage + r.set(f"{feature}_usage:{org_id}", feature_usage_count + 1) + return True + + +def decrease_feature_usage( + feature: FeatureSet, + org_id: int, + db_session: Session, +): + LH_CONFIG = get_learnhouse_config() + redis_conn_string = LH_CONFIG.redis_config.redis_connection_string + + if not redis_conn_string: + raise HTTPException( + status_code=500, + detail="Redis connection string not found", + ) + + # Connect to Redis + r = redis.Redis.from_url(redis_conn_string) + + # Get the number of feature usage + feature_usage = r.get(f"{feature}_usage:{org_id}") + + # Get a number of feature asks + if feature_usage is None: + feature_usage_count = 0 + else: + feature_usage_count = int(feature_usage) # type: ignore + + # Increment the feature usage + r.set(f"{feature}_usage:{org_id}", feature_usage_count - 1) + return True diff --git a/apps/api/src/services/ai/ai.py b/apps/api/src/services/ai/ai.py index 17edab1c..9eec0e84 100644 --- a/apps/api/src/services/ai/ai.py +++ b/apps/api/src/services/ai/ai.py @@ -2,7 +2,10 @@ from fastapi import Depends, HTTPException, Request from sqlmodel import Session, select from src.db.organization_config import OrganizationConfig from src.db.organizations import Organization -from src.services.ai.utils import check_limits_and_config, count_ai_ask +from src.security.features_utils.usage import ( + check_limits_with_usage, + increase_feature_usage, +) from src.db.courses.courses import Course, CourseRead from src.core.events.database import get_db_session from src.db.users import PublicUser @@ -52,9 +55,15 @@ def ai_start_activity_chat_session( statement = select(Organization).where(Organization.id == course.org_id) org = db_session.exec(statement).first() + if not org or org.id is None: + raise HTTPException( + status_code=404, + detail="Organization not found", + ) + # Check limits and usage - check_limits_and_config(db_session, org) # type: ignore - count_ai_ask(org, "increment") # type: ignore + check_limits_with_usage("ai", org.id, db_session) + increase_feature_usage("ai", org.id, db_session) if not activity: raise HTTPException( @@ -147,8 +156,8 @@ def ai_send_activity_chat_message( org = db_session.exec(statement).first() # Check limits and usage - check_limits_and_config(db_session, org) # type: ignore - count_ai_ask(org, "increment") # type: ignore + check_limits_with_usage("ai", course.org_id, db_session) + increase_feature_usage("ai", course.org_id, db_session) if not activity: raise HTTPException( diff --git a/apps/api/src/services/ai/utils.py b/apps/api/src/services/ai/utils.py deleted file mode 100644 index 9a853665..00000000 --- a/apps/api/src/services/ai/utils.py +++ /dev/null @@ -1,114 +0,0 @@ -from typing import Literal -import redis -from fastapi import HTTPException -from sqlmodel import Session, select -from config.config import get_learnhouse_config -from src.db.organization_config import OrganizationConfig -from src.db.organizations import Organization - - -def count_ai_ask( - organization: Organization, - operation: Literal["increment", "decrement"], -): - """ - Count the number of AI asks - """ - - LH_CONFIG = get_learnhouse_config() - redis_conn_string = LH_CONFIG.redis_config.redis_connection_string - - if not redis_conn_string: - raise HTTPException( - status_code=500, - detail="Redis connection string not found", - ) - - # Connect to Redis - r = redis.Redis.from_url(redis_conn_string) - - if not r: - raise HTTPException( - status_code=500, - detail="Could not connect to Redis", - ) - - # Get the number of AI asks - ai_asks = r.get(f"ai_asks:{organization.org_uuid}") - - if ai_asks is None: - ai_asks = 0 - - # Increment or decrement the number of AI asks - if operation == "increment": - ai_asks = int(ai_asks) + 1 - elif operation == "decrement": - ai_asks = int(ai_asks) - 1 - - # Update the number of AI asks - r.set(f"ai_asks:{organization.org_uuid}", ai_asks) - - # Set the expiration time to 30 days - r.expire(f"ai_asks:{organization.org_uuid}", 2592000) - - -def check_limits_and_config(db_session: Session, organization: Organization): - """ - Check the limits and config of an Organization - """ - - # Get the Organization Config - statement = select(OrganizationConfig).where( - OrganizationConfig.org_id == organization.id - ) - result = db_session.exec(statement) - org_config = result.first() - - if org_config is None: - raise HTTPException( - status_code=404, - detail="Organization has no config", - ) - - # Check if the Organizations has AI enabled - if org_config.config["features"]["ai"]["enabled"] == False: - raise HTTPException( - status_code=403, - detail="Organization has AI disabled", - ) - - # Check if the Organization has Limits enabled and if the max_asks limit has been reached - if org_config.config["features"]["ai"]["limit"] > 0: - LH_CONFIG = get_learnhouse_config() - redis_conn_string = LH_CONFIG.redis_config.redis_connection_string - - if not redis_conn_string: - raise HTTPException( - status_code=500, - detail="Redis connection string not found", - ) - - # Connect to Redis - r = redis.Redis.from_url(redis_conn_string) - - if not r: - raise HTTPException( - status_code=500, - detail="Could not connect to Redis", - ) - - # Get the number of AI asks - ai_asks = r.get(f"ai_asks:{organization.org_uuid}") - - # Get a number of AI asks - if ai_asks is None: - ai_asks = 0 - else: - ai_asks = int(ai_asks) - - # Check if the Number of asks is less than the max_asks limit - if org_config.config["features"]["ai"]["limit"] <= ai_asks: - raise HTTPException( - status_code=403, - detail="Organization has reached the max number of AI asks", - ) diff --git a/apps/api/src/services/courses/activities/assignments.py b/apps/api/src/services/courses/activities/assignments.py index a10d5f44..99b59b26 100644 --- a/apps/api/src/services/courses/activities/assignments.py +++ b/apps/api/src/services/courses/activities/assignments.py @@ -28,6 +28,11 @@ from src.db.organizations import Organization from src.db.trail_runs import TrailRun from src.db.trail_steps import TrailStep from src.db.users import AnonymousUser, PublicUser, User +from src.security.features_utils.usage import ( + check_limits_with_usage, + decrease_feature_usage, + increase_feature_usage, +) from src.security.rbac.rbac import ( authorization_verify_based_on_roles_and_authorship_and_usergroups, authorization_verify_if_element_is_public, @@ -61,6 +66,9 @@ async def create_assignment( # RBAC check await rbac_check(request, course.course_uuid, current_user, "create", db_session) + # Usage check + check_limits_with_usage("assignments", course.org_id, db_session) + # Create Assignment assignment = Assignment(**assignment_object.model_dump()) @@ -74,6 +82,9 @@ async def create_assignment( db_session.commit() db_session.refresh(assignment) + # Feature usage + increase_feature_usage("assignments", course.org_id, db_session) + # return assignment read return AssignmentRead.model_validate(assignment) @@ -228,6 +239,9 @@ async def delete_assignment( # RBAC check await rbac_check(request, course.course_uuid, current_user, "delete", db_session) + # Feature usage + decrease_feature_usage("assignments", course.org_id, db_session) + # Delete Assignment db_session.delete(assignment) db_session.commit() @@ -275,6 +289,9 @@ async def delete_assignment_from_activity_uuid( # RBAC check await rbac_check(request, course.course_uuid, current_user, "delete", db_session) + # Feature usage + decrease_feature_usage("assignments", course.org_id, db_session) + # Delete Assignment db_session.delete(assignment) @@ -1119,9 +1136,9 @@ async def create_assignment_submission( # Add TrailStep trail = await check_trail_presence( org_id=course.org_id, - user_id=user.id, + user_id=user.id, # type: ignore request=request, - user=user, + user=user, # type: ignore db_session=db_session, ) @@ -1137,7 +1154,7 @@ async def create_assignment_submission( trail_id=trail.id if trail.id is not None else 0, course_id=course.id if course.id is not None else 0, org_id=course.org_id, - user_id=user.id, + user_id=user.id, # type: ignore creation_date=str(datetime.now()), update_date=str(datetime.now()), ) @@ -1162,7 +1179,7 @@ async def create_assignment_submission( complete=True, teacher_verified=False, grade="", - user_id=user.id, + user_id=user.id, # type: ignore creation_date=str(datetime.now()), update_date=str(datetime.now()), ) @@ -1400,7 +1417,7 @@ async def grade_assignment_submission( status_code=404, detail="Assignment not found", ) - + statement = select(Course).where(Course.id == assignment.course_id) course = db_session.exec(statement).first() @@ -1409,7 +1426,6 @@ async def grade_assignment_submission( status_code=404, detail="Course not found", ) - await rbac_check(request, course.course_uuid, current_user, "update", db_session) @@ -1551,7 +1567,6 @@ async def mark_activity_as_done_for_user( status_code=404, detail="Course not found", ) - await rbac_check(request, course.course_uuid, current_user, "update", db_session) @@ -1596,6 +1611,7 @@ async def mark_activity_as_done_for_user( # return OK return {"message": "Activity marked as done for user"} + async def get_assignments_from_course( request: Request, course_uuid: str, diff --git a/apps/api/src/services/courses/courses.py b/apps/api/src/services/courses/courses.py index 744f77b4..fa140944 100644 --- a/apps/api/src/services/courses/courses.py +++ b/apps/api/src/services/courses/courses.py @@ -5,6 +5,11 @@ from sqlmodel import Session, select from src.db.usergroup_resources import UserGroupResource from src.db.usergroup_user import UserGroupUser from src.db.organizations import Organization +from src.security.features_utils.usage import ( + check_limits_with_usage, + decrease_feature_usage, + increase_feature_usage, +) from src.services.trail.trail import get_user_trail_with_orgid from src.db.resource_authors import ResourceAuthor, ResourceAuthorshipEnum from src.db.users import PublicUser, AnonymousUser, User, UserRead @@ -58,6 +63,7 @@ async def get_course( return course + async def get_course_by_id( request: Request, course_id: str, @@ -91,6 +97,7 @@ async def get_course_by_id( return course + async def get_course_meta( request: Request, course_uuid: str, @@ -158,6 +165,9 @@ async def create_course( # RBAC check await rbac_check(request, "course_x", current_user, "create", db_session) + # Usage check + check_limits_with_usage("courses", org_id, db_session) + # Complete course object course.org_id = course.org_id @@ -207,6 +217,9 @@ async def create_course( ) authors = db_session.exec(authors_statement).all() + # Feature usage + increase_feature_usage("courses", course.org_id, db_session) + # convert from User to UserRead authors = [UserRead.model_validate(author) for author in authors] @@ -344,6 +357,9 @@ async def delete_course( # RBAC check await rbac_check(request, course.course_uuid, current_user, "delete", db_session) + # Feature usage + decrease_feature_usage("courses", course.org_id, db_session) + db_session.delete(course) db_session.commit() @@ -358,7 +374,7 @@ async def get_courses_orgslug( page: int = 1, limit: int = 10, ): - + # TODO : This entire function is a mess. It needs to be rewritten. # Query for public courses @@ -372,7 +388,7 @@ async def get_courses_orgslug( statement_author = ( select(Course) .join(Organization) - .join(ResourceAuthor, ResourceAuthor.user_id == current_user.id) + .join(ResourceAuthor, ResourceAuthor.user_id == current_user.id) # type: ignore .where( Organization.slug == org_slug, ResourceAuthor.resource_uuid == Course.course_uuid, @@ -383,9 +399,9 @@ async def get_courses_orgslug( statement_usergroup = ( select(Course) .join(Organization) - .join(UserGroupResource, UserGroupResource.resource_uuid == Course.course_uuid) + .join(UserGroupResource, UserGroupResource.resource_uuid == Course.course_uuid) # type: ignore .join( - UserGroupUser, UserGroupUser.usergroup_id == UserGroupResource.usergroup_id + UserGroupUser, UserGroupUser.usergroup_id == UserGroupResource.usergroup_id # type: ignore ) .where(Organization.slug == org_slug, UserGroupUser.user_id == current_user.id) ) @@ -395,13 +411,12 @@ async def get_courses_orgslug( statement_public, statement_author, statement_usergroup ).subquery() - # TODO: migrate this to exec - courses = db_session.execute(select(statement_complete)).all() + # TODO: migrate this to exec + courses = db_session.execute(select(statement_complete)).all() # type: ignore # TODO: I have no idea why this is necessary, but it is courses = [CourseRead(**course._asdict(), authors=[]) for course in courses] - # for every course, get the authors for course in courses: authors_statement = ( diff --git a/apps/api/src/services/orgs/join.py b/apps/api/src/services/orgs/join.py index 177cc04e..a62f8fad 100644 --- a/apps/api/src/services/orgs/join.py +++ b/apps/api/src/services/orgs/join.py @@ -6,6 +6,10 @@ from sqlmodel import Session, select from src.db.organizations import Organization from src.db.user_organizations import UserOrganization from src.db.users import AnonymousUser, PublicUser, User +from src.security.features_utils.usage import ( + check_limits_with_usage, + increase_feature_usage, +) from src.services.orgs.invites import get_invite_code from src.services.orgs.orgs import get_org_join_mechanism @@ -27,12 +31,14 @@ async def join_org( org = result.first() - if not org: + if not org or org.id is None: raise HTTPException( status_code=404, detail="Organization not found", ) + check_limits_with_usage("members", org.id, db_session) + join_method = await get_org_join_mechanism( request, args.org_id, current_user, db_session ) @@ -104,6 +110,8 @@ async def join_org( db_session.add(user_organization) db_session.commit() + increase_feature_usage("members", org.id, db_session) + return "Great, You're part of the Organization" else: diff --git a/apps/api/src/services/orgs/users.py b/apps/api/src/services/orgs/users.py index 8cb0c4d6..2d7019a9 100644 --- a/apps/api/src/services/orgs/users.py +++ b/apps/api/src/services/orgs/users.py @@ -5,6 +5,7 @@ import logging import redis from fastapi import HTTPException, Request from sqlmodel import Session, select +from src.security.features_utils.usage import decrease_feature_usage from src.services.orgs.invites import send_invite_email from config.config import get_learnhouse_config from src.services.orgs.orgs import rbac_check @@ -147,6 +148,8 @@ async def remove_user_from_org( db_session.delete(user_org) db_session.commit() + decrease_feature_usage("members", org_id, db_session) + return {"detail": "User removed from org"} diff --git a/apps/api/src/services/users/usergroups.py b/apps/api/src/services/users/usergroups.py index 84b5de96..f443b6b2 100644 --- a/apps/api/src/services/users/usergroups.py +++ b/apps/api/src/services/users/usergroups.py @@ -4,6 +4,10 @@ from typing import Literal from uuid import uuid4 from fastapi import HTTPException, Request from sqlmodel import Session, select +from src.security.features_utils.usage import ( + check_limits_with_usage, + increase_feature_usage, +) from src.security.rbac.rbac import ( authorization_verify_based_on_roles_and_authorship_and_usergroups, authorization_verify_if_user_is_anon, @@ -35,14 +39,17 @@ async def create_usergroup( # Check if Organization exists statement = select(Organization).where(Organization.id == usergroup_create.org_id) - result = db_session.exec(statement) + org = db_session.exec(statement).first() - if not result.first(): + if not org or org.id is None: raise HTTPException( status_code=400, detail="Organization does not exist", ) + # Usage check + check_limits_with_usage("courses", org.id, db_session) + # Complete the object usergroup.usergroup_uuid = f"usergroup_{uuid4()}" usergroup.creation_date = str(datetime.now()) @@ -53,6 +60,9 @@ async def create_usergroup( db_session.commit() db_session.refresh(usergroup) + # Feature usage + increase_feature_usage("usergroups", org.id, db_session) + usergroup = UserGroupRead.model_validate(usergroup) return usergroup @@ -253,6 +263,9 @@ async def delete_usergroup_by_id( db_session=db_session, ) + # Feature usage + increase_feature_usage("usergroups", usergroup.org_id, db_session) + db_session.delete(usergroup) db_session.commit() @@ -275,8 +288,6 @@ async def add_users_to_usergroup( status_code=404, detail="UserGroup not found", ) - - # RBAC check await rbac_check( @@ -353,7 +364,9 @@ async def remove_users_from_usergroup( user_ids_array = user_ids.split(",") for user_id in user_ids_array: - statement = select(UserGroupUser).where(UserGroupUser.user_id == user_id, UserGroupUser.usergroup_id == usergroup_id) + statement = select(UserGroupUser).where( + UserGroupUser.user_id == user_id, UserGroupUser.usergroup_id == usergroup_id + ) usergroup_user = db_session.exec(statement).first() if usergroup_user: diff --git a/apps/api/src/services/users/users.py b/apps/api/src/services/users/users.py index a0a716f6..c7277122 100644 --- a/apps/api/src/services/users/users.py +++ b/apps/api/src/services/users/users.py @@ -3,6 +3,10 @@ from typing import Literal from uuid import uuid4 from fastapi import HTTPException, Request, UploadFile, status from sqlmodel import Session, select +from src.security.features_utils.usage import ( + check_limits_with_usage, + increase_feature_usage, +) from src.services.users.usergroups import add_users_to_usergroup from src.services.users.emails import ( send_account_creation_email, @@ -61,6 +65,9 @@ async def create_user( detail="Organization does not exist", ) + # Usage check + check_limits_with_usage("members", org_id, db_session) + # Username statement = select(User).where(User.username == user.username) result = db_session.exec(statement) @@ -106,6 +113,8 @@ async def create_user( user = UserRead.model_validate(user) + increase_feature_usage("members", org_id, db_session) + # Send Account creation email send_account_creation_email( user=user, @@ -135,6 +144,9 @@ async def create_user_with_invite( detail="Invite code is incorrect", ) + # Usage check + check_limits_with_usage("members", org_id, db_session) + # Check if invite code contains UserGroup if inviteCode.usergroup_id: # Add user to UserGroup @@ -148,6 +160,8 @@ async def create_user_with_invite( user = await create_user(request, db_session, current_user, user_object, org_id) + increase_feature_usage("members", org_id, db_session) + return user diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx index f69d7cbc..cd304165 100644 --- a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx +++ b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx @@ -15,7 +15,8 @@ import { getAPIUrl } from '@services/config/config' import { mutate } from 'swr' import { createAssignment } from '@services/courses/assignments' import { useLHSession } from '@components/Contexts/LHSessionContext' -import { createActivity } from '@services/courses/activities' +import { createActivity, deleteActivity } from '@services/courses/activities' +import toast from 'react-hot-toast' function NewAssignment({ submitActivity, chapterId, course, closeModal }: any) { const org = useOrg() as any; @@ -55,7 +56,7 @@ function NewAssignment({ submitActivity, chapterId, course, closeModal }: any) { } const activity_res = await createActivity(activity, chapterId, org?.id, session.data?.tokens?.access_token) - await createAssignment({ + const res = await createAssignment({ title: activityName, description: activityDescription, due_date: dueDate, @@ -66,6 +67,14 @@ function NewAssignment({ submitActivity, chapterId, course, closeModal }: any) { activity_id: activity_res?.id, }, session.data?.tokens?.access_token) + if (res.success) { + toast.success('Assignment created successfully') + } else { + toast.error(res.data.detail) + await deleteActivity(activity_res.activity_uuid, session.data?.tokens?.access_token) + + } + mutate(`${getAPIUrl()}courses/${course.courseStructure.course_uuid}/meta`) setIsSubmitting(false) closeModal() diff --git a/apps/web/components/Objects/Modals/Course/Create/CreateCourse.tsx b/apps/web/components/Objects/Modals/Course/Create/CreateCourse.tsx index 51bfe5f5..6f8ce885 100644 --- a/apps/web/components/Objects/Modals/Course/Create/CreateCourse.tsx +++ b/apps/web/components/Objects/Modals/Course/Create/CreateCourse.tsx @@ -16,6 +16,7 @@ import { BarLoader } from 'react-spinners' import { revalidateTags } from '@services/utils/ts/requests' import { useRouter } from 'next/navigation' import { useLHSession } from '@components/Contexts/LHSessionContext' +import toast from 'react-hot-toast' function CreateCourseModal({ closeModal, orgslug }: any) { const [isSubmitting, setIsSubmitting] = useState(false) @@ -69,21 +70,27 @@ function CreateCourseModal({ closeModal, orgslug }: any) { e.preventDefault() setIsSubmitting(true) - let status = await createNewCourse( + let res = await createNewCourse( orgId, { name, description, tags, visibility }, thumbnail, session.data?.tokens?.access_token ) - await revalidateTags(['courses'], orgslug) - setIsSubmitting(false) - - if (status.org_id == orgId) { - closeModal() - router.refresh() + if (res.success) { await revalidateTags(['courses'], orgslug) - } else { - alert('Error creating course, please see console logs') + setIsSubmitting(false) + toast.success('Course created successfully') + + if (res.data.org_id == orgId) { + closeModal() + router.refresh() + await revalidateTags(['courses'], orgslug) + } + + } + else { + setIsSubmitting(false) + toast.error(res.data.detail) } } diff --git a/apps/web/services/courses/activities.ts b/apps/web/services/courses/activities.ts index 162780f7..e2c41f2f 100644 --- a/apps/web/services/courses/activities.ts +++ b/apps/web/services/courses/activities.ts @@ -99,9 +99,9 @@ export async function getActivityByID( return res } -export async function deleteActivity(activity_id: any, access_token: string) { +export async function deleteActivity(activity_uuid: any, access_token: string) { const result = await fetch( - `${getAPIUrl()}activities/${activity_id}`, + `${getAPIUrl()}activities/${activity_uuid}`, RequestBodyWithAuthHeader('DELETE', null, null, access_token) ) const res = await result.json() diff --git a/apps/web/services/courses/courses.ts b/apps/web/services/courses/courses.ts index a8b687fd..e3f6bd1d 100644 --- a/apps/web/services/courses/courses.ts +++ b/apps/web/services/courses/courses.ts @@ -98,7 +98,7 @@ export async function createNewCourse( `${getAPIUrl()}courses/?org_id=${org_id}`, RequestBodyFormWithAuthHeader('POST', formData, null, access_token) ) - const res = await errorHandling(result) + const res = await getResponseMetadata(result) return res }