From da10a2a8ef9f821dee9f939b81b77f7bdaff3faa Mon Sep 17 00:00:00 2001 From: SwiftyOS Date: Thu, 2 Jan 2025 10:29:17 +0100 Subject: [PATCH] Reapply "remove marketplace" This reverts commit 5959c0d303c212a168cf03b399c7018c92b347a8. --- autogpt_platform/docker-compose.platform.yml | 45 - autogpt_platform/docker-compose.yml | 12 - autogpt_platform/market/.env.example | 12 - autogpt_platform/market/.gitignore | 6 - autogpt_platform/market/Dockerfile | 72 - autogpt_platform/market/README.md | 37 - autogpt_platform/market/docker-compose.yml | 16 - autogpt_platform/market/market/__init__.py | 0 autogpt_platform/market/market/app.py | 97 -- autogpt_platform/market/market/config.py | 30 - autogpt_platform/market/market/db.py | 725 --------- autogpt_platform/market/market/model.py | 161 -- .../market/market/routes/admin.py | 286 ---- .../market/market/routes/admin_tests.py | 76 - .../market/market/routes/agents.py | 368 ----- .../market/market/routes/analytics.py | 26 - .../market/market/routes/search.py | 56 - .../market/market/routes/submissions.py | 35 - .../market/market/utils/analytics.py | 47 - .../market/market/utils/extension_types.py | 5 - .../market/market/utils/partial_types.py | 6 - .../migration.sql | 61 - .../migration.sql | 11 - .../migration.sql | 20 - .../migration.sql | 2 - .../migration.sql | 8 - .../migration.sql | 12 - .../migrations/20240905162237_/migration.sql | 19 - .../migration.sql | 20 - .../migration.sql | 8 - .../market/migrations/migration_lock.toml | 3 - autogpt_platform/market/poetry.lock | 1301 ----------------- autogpt_platform/market/pyproject.toml | 57 - autogpt_platform/market/schema.prisma | 80 - autogpt_platform/market/scripts.py | 65 - autogpt_platform/market/tests/test_agents.py | 79 - 36 files changed, 3864 deletions(-) delete mode 100644 autogpt_platform/market/.env.example delete mode 100644 autogpt_platform/market/.gitignore delete mode 100644 autogpt_platform/market/Dockerfile delete mode 100644 autogpt_platform/market/README.md delete mode 100644 autogpt_platform/market/docker-compose.yml delete mode 100644 autogpt_platform/market/market/__init__.py delete mode 100644 autogpt_platform/market/market/app.py delete mode 100644 autogpt_platform/market/market/config.py delete mode 100644 autogpt_platform/market/market/db.py delete mode 100644 autogpt_platform/market/market/model.py delete mode 100644 autogpt_platform/market/market/routes/admin.py delete mode 100644 autogpt_platform/market/market/routes/admin_tests.py delete mode 100644 autogpt_platform/market/market/routes/agents.py delete mode 100644 autogpt_platform/market/market/routes/analytics.py delete mode 100644 autogpt_platform/market/market/routes/search.py delete mode 100644 autogpt_platform/market/market/routes/submissions.py delete mode 100644 autogpt_platform/market/market/utils/analytics.py delete mode 100644 autogpt_platform/market/market/utils/extension_types.py delete mode 100644 autogpt_platform/market/market/utils/partial_types.py delete mode 100644 autogpt_platform/market/migrations/20240731181721_base_migration/migration.sql delete mode 100644 autogpt_platform/market/migrations/20240731213728_unique_agent_id/migration.sql delete mode 100644 autogpt_platform/market/migrations/20240802100955_add_featured_agents/migration.sql delete mode 100644 autogpt_platform/market/migrations/20240802174953_default_is_featured_to_false/migration.sql delete mode 100644 autogpt_platform/market/migrations/20240808080208_added_submissions/migration.sql delete mode 100644 autogpt_platform/market/migrations/20240829002156_make_featured_category_a_list_of_categories_and_is_featured_is_active/migration.sql delete mode 100644 autogpt_platform/market/migrations/20240905162237_/migration.sql delete mode 100644 autogpt_platform/market/migrations/20241003134209_update_foreign_key_on_delete/migration.sql delete mode 100644 autogpt_platform/market/migrations/20241014173713_add_unique_restriction/migration.sql delete mode 100644 autogpt_platform/market/migrations/migration_lock.toml delete mode 100644 autogpt_platform/market/poetry.lock delete mode 100644 autogpt_platform/market/pyproject.toml delete mode 100644 autogpt_platform/market/schema.prisma delete mode 100644 autogpt_platform/market/scripts.py delete mode 100644 autogpt_platform/market/tests/test_agents.py diff --git a/autogpt_platform/docker-compose.platform.yml b/autogpt_platform/docker-compose.platform.yml index a09fed4c8..e013616db 100644 --- a/autogpt_platform/docker-compose.platform.yml +++ b/autogpt_platform/docker-compose.platform.yml @@ -144,51 +144,6 @@ services: networks: - app-network - market: - build: - context: ../ - dockerfile: autogpt_platform/market/Dockerfile - develop: - watch: - - path: ./ - target: autogpt_platform/market/ - action: rebuild - depends_on: - db: - condition: service_healthy - market-migrations: - condition: service_completed_successfully - environment: - - SUPABASE_URL=http://kong:8000 - - SUPABASE_JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long - - SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE - - DATABASE_URL=postgresql://postgres:your-super-secret-and-long-postgres-password@db:5432/postgres?connect_timeout=60&schema=market - - BACKEND_CORS_ALLOW_ORIGINS="http://localhost:3000,http://127.0.0.1:3000" - ports: - - "8015:8015" - networks: - - app-network - - market-migrations: - build: - context: ../ - dockerfile: autogpt_platform/market/Dockerfile - command: ["sh", "-c", "poetry run prisma migrate deploy"] - develop: - watch: - - path: ./ - target: autogpt_platform/market/ - action: rebuild - depends_on: - db: - condition: service_healthy - environment: - - SUPABASE_URL=http://kong:8000 - - SUPABASE_JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long - - SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE - - DATABASE_URL=postgresql://postgres:your-super-secret-and-long-postgres-password@db:5432/postgres?connect_timeout=60&schema=market - networks: - - app-network # frontend: # build: # context: ../ diff --git a/autogpt_platform/docker-compose.yml b/autogpt_platform/docker-compose.yml index d9cafccf0..9166e0e32 100644 --- a/autogpt_platform/docker-compose.yml +++ b/autogpt_platform/docker-compose.yml @@ -51,18 +51,6 @@ services: file: ./docker-compose.platform.yml service: websocket_server - market: - <<: *agpt-services - extends: - file: ./docker-compose.platform.yml - service: market - - market-migrations: - <<: *agpt-services - extends: - file: ./docker-compose.platform.yml - service: market-migrations - # frontend: # <<: *agpt-services # extends: diff --git a/autogpt_platform/market/.env.example b/autogpt_platform/market/.env.example deleted file mode 100644 index b3b1cb8a4..000000000 --- a/autogpt_platform/market/.env.example +++ /dev/null @@ -1,12 +0,0 @@ -DB_USER=postgres -DB_PASS=your-super-secret-and-long-postgres-password -DB_NAME=postgres -DB_PORT=5432 -DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:${DB_PORT}/${DB_NAME}?connect_timeout=60&schema=market" -SENTRY_DSN=https://11d0640fef35640e0eb9f022eb7d7626@o4505260022104064.ingest.us.sentry.io/4507890252447744 - -ENABLE_AUTH=true -SUPABASE_JWT_SECRET=our-super-secret-jwt-token-with-at-least-32-characters-long -BACKEND_CORS_ALLOW_ORIGINS="http://localhost:3000,http://127.0.0.1:3000" - -APP_ENV=local diff --git a/autogpt_platform/market/.gitignore b/autogpt_platform/market/.gitignore deleted file mode 100644 index 7fd0341ba..000000000 --- a/autogpt_platform/market/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -database.db -database.db-journal -build/ -config.json -secrets/* -!secrets/.gitkeep \ No newline at end of file diff --git a/autogpt_platform/market/Dockerfile b/autogpt_platform/market/Dockerfile deleted file mode 100644 index dbd12565d..000000000 --- a/autogpt_platform/market/Dockerfile +++ /dev/null @@ -1,72 +0,0 @@ -FROM python:3.11.10-slim-bookworm AS builder - -# Set environment variables -ENV PYTHONDONTWRITEBYTECODE 1 -ENV PYTHONUNBUFFERED 1 - -WORKDIR /app - -RUN echo 'Acquire::http::Pipeline-Depth 0;\nAcquire::http::No-Cache true;\nAcquire::BrokenProxy true;\n' > /etc/apt/apt.conf.d/99fixbadproxy - -RUN apt-get update --allow-releaseinfo-change --fix-missing - -# Install build dependencies -RUN apt-get install -y build-essential -RUN apt-get install -y libpq5 -RUN apt-get install -y libz-dev -RUN apt-get install -y libssl-dev - -ENV POETRY_VERSION=1.8.3 \ - POETRY_HOME="/opt/poetry" \ - POETRY_NO_INTERACTION=1 \ - POETRY_VIRTUALENVS_CREATE=false -ENV PATH="$POETRY_HOME/bin:$PATH" - -# Upgrade pip and setuptools to fix security vulnerabilities -RUN pip3 install --upgrade pip setuptools - -RUN pip3 install poetry - -# Copy and install dependencies -COPY autogpt_platform/autogpt_libs /app/autogpt_platform/autogpt_libs -COPY autogpt_platform/market/poetry.lock autogpt_platform/market/pyproject.toml /app/autogpt_platform/market/ -WORKDIR /app/autogpt_platform/market -RUN poetry config virtualenvs.create false \ - && poetry install --no-interaction --no-ansi - -# Generate Prisma client -COPY autogpt_platform/market /app/autogpt_platform/market -RUN poetry config virtualenvs.create false \ - && poetry run prisma generate - -FROM python:3.11.10-slim-bookworm AS server_dependencies - -WORKDIR /app - -# Upgrade pip and setuptools to fix security vulnerabilities -RUN pip3 install --upgrade pip setuptools - -# Copy only necessary files from builder -COPY --from=builder /app /app -COPY --from=builder /usr/local/lib/python3.11 /usr/local/lib/python3.11 -COPY --from=builder /usr/local/bin /usr/local/bin -# Copy Prisma binaries -COPY --from=builder /root/.cache/prisma-python/binaries /root/.cache/prisma-python/binaries - -ENV PATH="/app/.venv/bin:$PATH" - -RUN mkdir -p /app/autogpt_platform/autogpt_libs -RUN mkdir -p /app/autogpt_platform/market - -COPY autogpt_platform/autogpt_libs /app/autogpt_platform/autogpt_libs - -COPY autogpt_platform/market /app/autogpt_platform/market - -WORKDIR /app/autogpt_platform/market - -FROM server_dependencies AS server - -ENV DATABASE_URL="" -ENV PORT=8015 - -CMD ["poetry", "run", "app"] diff --git a/autogpt_platform/market/README.md b/autogpt_platform/market/README.md deleted file mode 100644 index a799f362b..000000000 --- a/autogpt_platform/market/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# AutoGPT Agent Marketplace - -## Overview - -AutoGPT Agent Marketplace is an open-source platform for autonomous AI agents. This project aims to create a user-friendly, accessible marketplace where users can discover, utilize, and contribute to a diverse ecosystem of AI solutions. - -## Vision - -Our vision is to empower users with customizable and free AI agents, fostering an open-source community that drives innovation in AI automation across various industries. - -## Key Features - -- Agent Discovery and Search -- Agent Listings with Detailed Information -- User Profiles -- Data Protection and Compliance - -## Getting Started - -To get started with the AutoGPT Agent Marketplace, follow these steps: - -- Copy `.env.example` to `.env` and fill in the required environment variables -- Run `poetry run setup` -- Run `poetry run populate` -- Run `poetry run app` - -## Poetry Run Commands - -This section outlines the available command line scripts for this project, configured using Poetry. You can execute these scripts directly using Poetry. Each command performs a specific operation as described below: - -- `poetry run format`: Runs the formatting script to ensure code consistency. -- `poetry run lint`: Executes the linting script to identify and fix potential code issues. -- `poetry run app`: Starts the main application. -- `poetry run setup`: Runs the setup script to configure the database. -- `poetry run populate`: Populates the database with initial data using the specified script. - -To run any of these commands, ensure Poetry is installed on your system and execute the commands from the project's root directory. diff --git a/autogpt_platform/market/docker-compose.yml b/autogpt_platform/market/docker-compose.yml deleted file mode 100644 index 3eaa40892..000000000 --- a/autogpt_platform/market/docker-compose.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: "3" -services: - postgres: - image: ankane/pgvector:latest - environment: - POSTGRES_USER: ${DB_USER} - POSTGRES_PASSWORD: ${DB_PASS} - POSTGRES_DB: ${DB_NAME} - PGUSER: ${DB_USER} - healthcheck: - test: pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB - interval: 10s - timeout: 5s - retries: 5 - ports: - - "${DB_PORT}:5432" diff --git a/autogpt_platform/market/market/__init__.py b/autogpt_platform/market/market/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/autogpt_platform/market/market/app.py b/autogpt_platform/market/market/app.py deleted file mode 100644 index 63736acd3..000000000 --- a/autogpt_platform/market/market/app.py +++ /dev/null @@ -1,97 +0,0 @@ -import contextlib -import logging.config -import os - -import dotenv -import fastapi -import fastapi.middleware.cors -import fastapi.middleware.gzip -import prisma -import prometheus_fastapi_instrumentator -import sentry_sdk -import sentry_sdk.integrations.asyncio -import sentry_sdk.integrations.fastapi -import sentry_sdk.integrations.starlette - -import market.config -import market.routes.admin -import market.routes.agents -import market.routes.analytics -import market.routes.search -import market.routes.submissions - -dotenv.load_dotenv() - -logging.config.dictConfig(market.config.LogConfig().model_dump()) - -if os.environ.get("SENTRY_DSN"): - sentry_sdk.init( - dsn=os.environ.get("SENTRY_DSN"), - traces_sample_rate=1.0, - profiles_sample_rate=1.0, - enable_tracing=True, - environment=os.environ.get("RUN_ENV", default="CLOUD").lower(), - integrations=[ - sentry_sdk.integrations.starlette.StarletteIntegration( - transaction_style="url" - ), - sentry_sdk.integrations.fastapi.FastApiIntegration(transaction_style="url"), - sentry_sdk.integrations.asyncio.AsyncioIntegration(), - ], - ) - -db_client = prisma.Prisma(auto_register=True) - - -@contextlib.asynccontextmanager -async def lifespan(app: fastapi.FastAPI): - await db_client.connect() - yield - await db_client.disconnect() - - -docs_url = "/docs" -app = fastapi.FastAPI( - title="Marketplace API", - description="AutoGPT Marketplace API is a service that allows users to share AI agents.", - summary="Maketplace API", - version="0.1", - lifespan=lifespan, - root_path="/api/v1/market", - docs_url=docs_url, -) - -app.add_middleware(fastapi.middleware.gzip.GZipMiddleware, minimum_size=1000) -app.add_middleware( - middleware_class=fastapi.middleware.cors.CORSMiddleware, - allow_origins=os.environ.get( - "BACKEND_CORS_ALLOW_ORIGINS", "http://localhost:3000,http://127.0.0.1:3000" - ).split(","), - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) -app.include_router(market.routes.agents.router, tags=["agents"]) -app.include_router(market.routes.search.router, tags=["search"]) -app.include_router(market.routes.submissions.router, tags=["submissions"]) -app.include_router(market.routes.admin.router, prefix="/admin", tags=["admin"]) -app.include_router( - market.routes.analytics.router, prefix="/analytics", tags=["analytics"] -) - - -@app.get("/health") -def health(): - return fastapi.responses.HTMLResponse( - content="

Marketplace API

", status_code=200 - ) - - -@app.get("/") -def default(): - return fastapi.responses.HTMLResponse( - content="

Marketplace API

", status_code=200 - ) - - -prometheus_fastapi_instrumentator.Instrumentator().instrument(app).expose(app) diff --git a/autogpt_platform/market/market/config.py b/autogpt_platform/market/market/config.py deleted file mode 100644 index 46a31b462..000000000 --- a/autogpt_platform/market/market/config.py +++ /dev/null @@ -1,30 +0,0 @@ -from pydantic import BaseModel - - -class LogConfig(BaseModel): - """Logging configuration to be set for the server""" - - LOGGER_NAME: str = "marketplace" - LOG_FORMAT: str = "%(levelprefix)s | %(asctime)s | %(message)s" - LOG_LEVEL: str = "DEBUG" - - # Logging config - version: int = 1 - disable_existing_loggers: bool = False - formatters: dict = { - "default": { - "()": "uvicorn.logging.DefaultFormatter", - "fmt": LOG_FORMAT, - "datefmt": "%Y-%m-%d %H:%M:%S", - }, - } - handlers: dict = { - "default": { - "formatter": "default", - "class": "logging.StreamHandler", - "stream": "ext://sys.stderr", - }, - } - loggers: dict = { - LOGGER_NAME: {"handlers": ["default"], "level": LOG_LEVEL}, - } diff --git a/autogpt_platform/market/market/db.py b/autogpt_platform/market/market/db.py deleted file mode 100644 index 6b4418bd8..000000000 --- a/autogpt_platform/market/market/db.py +++ /dev/null @@ -1,725 +0,0 @@ -import datetime -import typing - -import fuzzywuzzy.fuzz -import prisma.enums -import prisma.errors -import prisma.models -import prisma.types -import pydantic - -import market.model -import market.utils.extension_types - - -class AgentQueryError(Exception): - """Custom exception for agent query errors""" - - pass - - -class TopAgentsDBResponse(pydantic.BaseModel): - """ - Represents a response containing a list of top agents. - - Attributes: - analytics (list[AgentResponse]): The list of top agents. - total_count (int): The total count of agents. - page (int): The current page number. - page_size (int): The number of agents per page. - total_pages (int): The total number of pages. - """ - - analytics: list[prisma.models.AnalyticsTracker] - total_count: int - page: int - page_size: int - total_pages: int - - -class FeaturedAgentResponse(pydantic.BaseModel): - """ - Represents a response containing a list of featured agents. - - Attributes: - featured_agents (list[FeaturedAgent]): The list of featured agents. - total_count (int): The total count of featured agents. - page (int): The current page number. - page_size (int): The number of agents per page. - total_pages (int): The total number of pages. - """ - - featured_agents: list[prisma.models.FeaturedAgent] - total_count: int - page: int - page_size: int - total_pages: int - - -async def delete_agent(agent_id: str) -> prisma.models.Agents | None: - """ - Delete an agent from the database. - - Args: - agent_id (str): The ID of the agent to delete. - - Returns: - prisma.models.Agents | None: The deleted agent if found, None otherwise. - - Raises: - AgentQueryError: If there is an error deleting the agent from the database. - """ - try: - deleted_agent = await prisma.models.Agents.prisma().delete( - where={"id": agent_id} - ) - return deleted_agent - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def create_agent_entry( - name: str, - description: str, - author: str, - keywords: typing.List[str], - categories: typing.List[str], - graph: prisma.Json, - submission_state: prisma.enums.SubmissionStatus = prisma.enums.SubmissionStatus.PENDING, -): - """ - Create a new agent entry in the database. - - Args: - name (str): The name of the agent. - description (str): The description of the agent. - author (str): The author of the agent. - keywords (List[str]): The keywords associated with the agent. - categories (List[str]): The categories associated with the agent. - graph (dict): The graph data of the agent. - - Returns: - dict: The newly created agent entry. - - Raises: - AgentQueryError: If there is an error creating the agent entry. - """ - try: - agent = await prisma.models.Agents.prisma().create( - data={ - "name": name, - "description": description, - "author": author, - "keywords": keywords, - "categories": categories, - "graph": graph, - "AnalyticsTracker": {"create": {"downloads": 0, "views": 0}}, - "submissionStatus": submission_state, - } - ) - - return agent - - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def update_agent_entry( - agent_id: str, - version: int, - submission_state: prisma.enums.SubmissionStatus, - comments: str | None = None, -) -> prisma.models.Agents | None: - """ - Update an existing agent entry in the database. - - Args: - agent_id (str): The ID of the agent. - version (int): The version of the agent. - submission_state (prisma.enums.SubmissionStatus): The submission state of the agent. - """ - - try: - agent = await prisma.models.Agents.prisma().update( - where={"id": agent_id}, - data={ - "version": version, - "submissionStatus": submission_state, - "submissionReviewDate": datetime.datetime.now(datetime.timezone.utc), - "submissionReviewComments": comments, - }, - ) - - return agent - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Agent Update Failed Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def get_agents( - page: int = 1, - page_size: int = 10, - name: str | None = None, - keyword: str | None = None, - category: str | None = None, - description: str | None = None, - description_threshold: int = 60, - submission_status: prisma.enums.SubmissionStatus = prisma.enums.SubmissionStatus.APPROVED, - sort_by: str = "createdAt", - sort_order: typing.Literal["desc"] | typing.Literal["asc"] = "desc", -): - """ - Retrieve a list of agents from the database based on the provided filters and pagination parameters. - - Args: - page (int, optional): The page number to retrieve. Defaults to 1. - page_size (int, optional): The number of agents per page. Defaults to 10. - name (str, optional): Filter agents by name. Defaults to None. - keyword (str, optional): Filter agents by keyword. Defaults to None. - category (str, optional): Filter agents by category. Defaults to None. - description (str, optional): Filter agents by description. Defaults to None. - description_threshold (int, optional): The minimum fuzzy search threshold for the description. Defaults to 60. - sort_by (str, optional): The field to sort the agents by. Defaults to "createdAt". - sort_order (str, optional): The sort order ("asc" or "desc"). Defaults to "desc". - - Returns: - dict: A dictionary containing the list of agents, total count, current page number, page size, and total number of pages. - """ - try: - # Define the base query - query = {} - - # Add optional filters - if name: - query["name"] = {"contains": name, "mode": "insensitive"} - if keyword: - query["keywords"] = {"has": keyword} - if category: - query["categories"] = {"has": category} - - query["submissionStatus"] = submission_status - - # Define sorting - order = {sort_by: sort_order} - - # Calculate pagination - skip = (page - 1) * page_size - - # Execute the query - try: - agents = await prisma.models.Agents.prisma().find_many( - where=query, # type: ignore - order=order, # type: ignore - skip=skip, - take=page_size, - ) - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - - # Apply fuzzy search on description if provided - if description: - try: - filtered_agents = [] - for agent in agents: - if ( - agent.description - and fuzzywuzzy.fuzz.partial_ratio( - description.lower(), agent.description.lower() - ) - >= description_threshold - ): - filtered_agents.append(agent) - agents = filtered_agents - except AttributeError as e: - raise AgentQueryError(f"Error during fuzzy search: {str(e)}") - - # Get total count for pagination info - total_count = len(agents) - - return { - "agents": agents, - "total_count": total_count, - "page": page, - "page_size": page_size, - "total_pages": (total_count + page_size - 1) // page_size, - } - - except AgentQueryError as e: - # Log the error or handle it as needed - raise e - except ValueError as e: - raise AgentQueryError(f"Invalid input parameter: {str(e)}") - except Exception as e: - # Catch any other unexpected exceptions - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def get_agent_details(agent_id: str, version: int | None = None): - """ - Retrieve agent details from the database. - - Args: - agent_id (str): The ID of the agent. - version (int | None, optional): The version of the agent. Defaults to None. - - Returns: - dict: The agent details. - - Raises: - AgentQueryError: If the agent is not found or if there is an error querying the database. - """ - try: - query = {"id": agent_id} - if version is not None: - query["version"] = version # type: ignore - - agent = await prisma.models.Agents.prisma().find_first(where=query) # type: ignore - - if not agent: - raise AgentQueryError("Agent not found") - - return agent - - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def search_db( - query: str, - page: int = 1, - page_size: int = 10, - categories: typing.List[str] | None = None, - description_threshold: int = 60, - sort_by: str = "rank", - sort_order: typing.Literal["desc"] | typing.Literal["asc"] = "desc", - submission_status: prisma.enums.SubmissionStatus = prisma.enums.SubmissionStatus.APPROVED, -) -> market.model.ListResponse[market.utils.extension_types.AgentsWithRank]: - """Perform a search for agents based on the provided query string. - - Args: - query (str): the search string - page (int, optional): page for searching. Defaults to 1. - page_size (int, optional): the number of results to return. Defaults to 10. - categories (List[str] | None, optional): list of category filters. Defaults to None. - description_threshold (int, optional): number of characters to return. Defaults to 60. - sort_by (str, optional): sort by option. Defaults to "rank". - sort_order ("asc" | "desc", optional): the sort order. Defaults to "desc". - - Raises: - AgentQueryError: Raises an error if the query fails. - AgentQueryError: Raises if an unexpected error occurs. - - Returns: - List[AgentsWithRank]: List of agents matching the search criteria. - """ - try: - offset = (page - 1) * page_size - - category_filter = "1=1" - if categories: - category_conditions = [f"'{cat}' = ANY(categories)" for cat in categories] - category_filter = "AND (" + " OR ".join(category_conditions) + ")" - - # Construct the ORDER BY clause based on the sort_by parameter - if sort_by in ["createdAt", "updatedAt"]: - order_by_clause = f'"{sort_by}" {sort_order.upper()}, rank DESC' - elif sort_by == "name": - order_by_clause = f"name {sort_order.upper()}, rank DESC" - else: - order_by_clause = 'rank DESC, "createdAt" DESC' - - submission_status_filter = f""""submissionStatus" = '{submission_status}'""" - - sql_query = f""" - WITH query AS ( - SELECT to_tsquery(string_agg(lexeme || ':*', ' & ' ORDER BY positions)) AS q - FROM unnest(to_tsvector('{query}')) - ) - SELECT - id, - "createdAt", - "updatedAt", - version, - name, - LEFT(description, {description_threshold}) AS description, - author, - keywords, - categories, - graph, - "submissionStatus", - "submissionDate", - CASE - WHEN query.q::text = '' THEN 1.0 - ELSE COALESCE(ts_rank(CAST(search AS tsvector), query.q), 0.0) - END AS rank - FROM market."Agents", query - WHERE - (query.q::text = '' OR search @@ query.q) - AND {category_filter} - AND {submission_status_filter} - ORDER BY {order_by_clause} - LIMIT {page_size} - OFFSET {offset}; - """ - - results = await prisma.client.get_client().query_raw( - query=sql_query, - model=market.utils.extension_types.AgentsWithRank, - ) - - class CountResponse(pydantic.BaseModel): - count: int - - count_query = f""" - WITH query AS ( - SELECT to_tsquery(string_agg(lexeme || ':*', ' & ' ORDER BY positions)) AS q - FROM unnest(to_tsvector('{query}')) - ) - SELECT COUNT(*) - FROM market."Agents", query - WHERE (search @@ query.q OR query.q = '') AND {category_filter} AND {submission_status_filter}; - """ - - total_count = await prisma.client.get_client().query_first( - query=count_query, - model=CountResponse, - ) - total_count = total_count.count if total_count else 0 - - return market.model.ListResponse( - items=results, - total_count=total_count, - page=page, - page_size=page_size, - total_pages=(total_count + page_size - 1) // page_size, - ) - - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def get_top_agents_by_downloads( - page: int = 1, - page_size: int = 10, - submission_status: prisma.enums.SubmissionStatus = prisma.enums.SubmissionStatus.APPROVED, -) -> market.model.ListResponse[prisma.models.AnalyticsTracker]: - """Retrieve the top agents by download count. - - Args: - page (int, optional): The page number. Defaults to 1. - page_size (int, optional): The number of agents per page. Defaults to 10. - - Returns: - dict: A dictionary containing the list of agents, total count, current page number, page size, and total number of pages. - """ - try: - # Calculate pagination - skip = (page - 1) * page_size - - # Execute the query - try: - # Agents with no downloads will not be included in the results... is this the desired behavior? - analytics = await prisma.models.AnalyticsTracker.prisma().find_many( - include={"agent": True}, - order={"downloads": "desc"}, - where={"agent": {"is": {"submissionStatus": submission_status}}}, - skip=skip, - take=page_size, - ) - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - - try: - total_count = await prisma.models.AnalyticsTracker.prisma().count( - where={"agent": {"is": {"submissionStatus": submission_status}}}, - ) - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - - return market.model.ListResponse( - items=analytics, - total_count=total_count, - page=page, - page_size=page_size, - total_pages=(total_count + page_size - 1) // page_size, - ) - - except AgentQueryError as e: - # Log the error or handle it as needed - raise e from e - except ValueError as e: - raise AgentQueryError(f"Invalid input parameter: {str(e)}") from e - except Exception as e: - # Catch any other unexpected exceptions - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") from e - - -async def set_agent_featured( - agent_id: str, is_active: bool = True, featured_categories: list[str] = ["featured"] -) -> prisma.models.FeaturedAgent: - """Set an agent as featured in the database. - - Args: - agent_id (str): The ID of the agent. - category (str, optional): The category to set the agent as featured. Defaults to "featured". - - Raises: - AgentQueryError: If there is an error setting the agent as featured. - """ - try: - agent = await prisma.models.Agents.prisma().find_unique(where={"id": agent_id}) - if not agent: - raise AgentQueryError(f"Agent with ID {agent_id} not found.") - - featured = await prisma.models.FeaturedAgent.prisma().upsert( - where={"agentId": agent_id}, - data={ - "update": { - "featuredCategories": featured_categories, - "isActive": is_active, - }, - "create": { - "featuredCategories": featured_categories, - "isActive": is_active, - "agent": {"connect": {"id": agent_id}}, - }, - }, - ) - return featured - - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def get_featured_agents( - category: str = "featured", - page: int = 1, - page_size: int = 10, - submission_status: prisma.enums.SubmissionStatus = prisma.enums.SubmissionStatus.APPROVED, -) -> FeaturedAgentResponse: - """Retrieve a list of featured agents from the database based on the provided category. - - Args: - category (str, optional): The category of featured agents to retrieve. Defaults to "featured". - page (int, optional): The page number to retrieve. Defaults to 1. - page_size (int, optional): The number of agents per page. Defaults to 10. - - Returns: - dict: A dictionary containing the list of featured agents, total count, current page number, page size, and total number of pages. - """ - try: - # Calculate pagination - skip = (page - 1) * page_size - - # Execute the query - try: - featured_agents = await prisma.models.FeaturedAgent.prisma().find_many( - where={ - "featuredCategories": {"has": category}, - "isActive": True, - "agent": {"is": {"submissionStatus": submission_status}}, - }, - include={"agent": {"include": {"AnalyticsTracker": True}}}, - skip=skip, - take=page_size, - ) - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - - # Get total count for pagination info - total_count = len(featured_agents) - - return FeaturedAgentResponse( - featured_agents=featured_agents, - total_count=total_count, - page=page, - page_size=page_size, - total_pages=(total_count + page_size - 1) // page_size, - ) - - except AgentQueryError as e: - # Log the error or handle it as needed - raise e from e - except ValueError as e: - raise AgentQueryError(f"Invalid input parameter: {str(e)}") from e - except Exception as e: - # Catch any other unexpected exceptions - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") from e - - -async def remove_featured_category( - agent_id: str, category: str -) -> prisma.models.FeaturedAgent | None: - """Adds a featured category to an agent. - - Args: - agent_id (str): The ID of the agent. - category (str): The category to add to the agent. - - Returns: - FeaturedAgentResponse: The updated list of featured agents. - """ - try: - # get the existing categories - featured_agent = await prisma.models.FeaturedAgent.prisma().find_unique( - where={"agentId": agent_id}, - include={"agent": True}, - ) - - if not featured_agent: - raise AgentQueryError(f"Agent with ID {agent_id} not found.") - - # remove the category from the list - featured_agent.featuredCategories.remove(category) - - featured_agent = await prisma.models.FeaturedAgent.prisma().update( - where={"agentId": agent_id}, - data={"featuredCategories": featured_agent.featuredCategories}, - ) - - return featured_agent - - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def add_featured_category( - agent_id: str, category: str -) -> prisma.models.FeaturedAgent | None: - """Removes a featured category from an agent. - - Args: - agent_id (str): The ID of the agent. - category (str): The category to remove from the agent. - - Returns: - FeaturedAgentResponse: The updated list of featured agents. - """ - try: - featured_agent = await prisma.models.FeaturedAgent.prisma().update( - where={"agentId": agent_id}, - data={"featuredCategories": {"push": [category]}}, - ) - - return featured_agent - - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def get_agent_featured(agent_id: str) -> prisma.models.FeaturedAgent | None: - """Retrieve an agent's featured categories from the database. - - Args: - agent_id (str): The ID of the agent. - - Returns: - FeaturedAgentResponse: The list of featured agents. - """ - try: - featured_agent = await prisma.models.FeaturedAgent.prisma().find_unique( - where={"agentId": agent_id}, - ) - return featured_agent - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def get_not_featured_agents( - page: int = 1, page_size: int = 10 -) -> typing.List[prisma.models.Agents]: - """ - Retrieve a list of not featured agents from the database. - """ - try: - agents = await prisma.client.get_client().query_raw( - query=f""" - SELECT - "market"."Agents".id, - "market"."Agents"."createdAt", - "market"."Agents"."updatedAt", - "market"."Agents".version, - "market"."Agents".name, - LEFT("market"."Agents".description, 500) AS description, - "market"."Agents".author, - "market"."Agents".keywords, - "market"."Agents".categories, - "market"."Agents".graph, - "market"."Agents"."submissionStatus", - "market"."Agents"."submissionDate", - "market"."Agents".search::text AS search - FROM "market"."Agents" - LEFT JOIN "market"."FeaturedAgent" ON "market"."Agents"."id" = "market"."FeaturedAgent"."agentId" - WHERE ("market"."FeaturedAgent"."agentId" IS NULL OR "market"."FeaturedAgent"."featuredCategories" = '{{}}') - AND "market"."Agents"."submissionStatus" = 'APPROVED' - ORDER BY "market"."Agents"."createdAt" DESC - LIMIT {page_size} OFFSET {page_size * (page - 1)} - """, - model=prisma.models.Agents, - ) - return agents - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") - - -async def get_all_categories() -> market.model.CategoriesResponse: - """ - Retrieve all unique categories from the database. - - Returns: - CategoriesResponse: A list of unique categories. - """ - try: - agents = await prisma.models.Agents.prisma().find_many(distinct=["categories"]) - - # Aggregate categories on the Python side - all_categories = set() - for agent in agents: - all_categories.update(agent.categories) - - unique_categories = sorted(list(all_categories)) - - return market.model.CategoriesResponse(unique_categories=unique_categories) - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception: - # Return an empty list of categories in case of unexpected errors - return market.model.CategoriesResponse(unique_categories=[]) - - -async def create_agent_installed_event( - event_data: market.model.AgentInstalledFromMarketplaceEventData, -): - try: - await prisma.models.InstallTracker.prisma().create( - data={ - "installedAgentId": event_data.installed_agent_id, - "marketplaceAgentId": event_data.marketplace_agent_id, - "installationLocation": prisma.enums.InstallationLocation( - event_data.installation_location.name - ), - } - ) - except prisma.errors.PrismaError as e: - raise AgentQueryError(f"Database query failed: {str(e)}") - except Exception as e: - raise AgentQueryError(f"Unexpected error occurred: {str(e)}") diff --git a/autogpt_platform/market/market/model.py b/autogpt_platform/market/market/model.py deleted file mode 100644 index 14bd017a1..000000000 --- a/autogpt_platform/market/market/model.py +++ /dev/null @@ -1,161 +0,0 @@ -import datetime -import typing -from enum import Enum -from typing import Generic, Literal, TypeVar, Union - -import prisma.enums -import pydantic - - -class InstallationLocation(str, Enum): - LOCAL = "local" - CLOUD = "cloud" - - -class AgentInstalledFromMarketplaceEventData(pydantic.BaseModel): - marketplace_agent_id: str - installed_agent_id: str - installation_location: InstallationLocation - - -class AgentInstalledFromTemplateEventData(pydantic.BaseModel): - template_id: str - installed_agent_id: str - installation_location: InstallationLocation - - -class AgentInstalledFromMarketplaceEvent(pydantic.BaseModel): - event_name: Literal["agent_installed_from_marketplace"] - event_data: AgentInstalledFromMarketplaceEventData - - -class AgentInstalledFromTemplateEvent(pydantic.BaseModel): - event_name: Literal["agent_installed_from_template"] - event_data: AgentInstalledFromTemplateEventData - - -AnalyticsEvent = Union[ - AgentInstalledFromMarketplaceEvent, AgentInstalledFromTemplateEvent -] - - -class AnalyticsRequest(pydantic.BaseModel): - event: AnalyticsEvent - - -class AddAgentRequest(pydantic.BaseModel): - graph: dict[str, typing.Any] - author: str - keywords: list[str] - categories: list[str] - - -class SubmissionReviewRequest(pydantic.BaseModel): - agent_id: str - version: int - status: prisma.enums.SubmissionStatus - comments: str | None - - -class AgentResponse(pydantic.BaseModel): - """ - Represents a response from an agent. - - Attributes: - id (str): The ID of the agent. - name (str, optional): The name of the agent. - description (str, optional): The description of the agent. - author (str, optional): The author of the agent. - keywords (list[str]): The keywords associated with the agent. - categories (list[str]): The categories the agent belongs to. - version (int): The version of the agent. - createdAt (str): The creation date of the agent. - updatedAt (str): The last update date of the agent. - """ - - id: str - name: typing.Optional[str] - description: typing.Optional[str] - author: typing.Optional[str] - keywords: list[str] - categories: list[str] - version: int - createdAt: datetime.datetime - updatedAt: datetime.datetime - submissionStatus: str - views: int = 0 - downloads: int = 0 - - -class AgentDetailResponse(pydantic.BaseModel): - """ - Represents the response data for an agent detail. - - Attributes: - id (str): The ID of the agent. - name (Optional[str]): The name of the agent. - description (Optional[str]): The description of the agent. - author (Optional[str]): The author of the agent. - keywords (List[str]): The keywords associated with the agent. - categories (List[str]): The categories the agent belongs to. - version (int): The version of the agent. - createdAt (str): The creation date of the agent. - updatedAt (str): The last update date of the agent. - graph (Dict[str, Any]): The graph data of the agent. - """ - - id: str - name: typing.Optional[str] - description: typing.Optional[str] - author: typing.Optional[str] - keywords: list[str] - categories: list[str] - version: int - createdAt: datetime.datetime - updatedAt: datetime.datetime - graph: dict[str, typing.Any] - - -class FeaturedAgentResponse(pydantic.BaseModel): - """ - Represents the response data for an agent detail. - """ - - agentId: str - featuredCategories: list[str] - createdAt: datetime.datetime - updatedAt: datetime.datetime - isActive: bool - - -class CategoriesResponse(pydantic.BaseModel): - """ - Represents the response data for a list of categories. - - Attributes: - unique_categories (list[str]): The list of unique categories. - """ - - unique_categories: list[str] - - -T = TypeVar("T") - - -class ListResponse(pydantic.BaseModel, Generic[T]): - """ - Represents a list response. - - Attributes: - items (list[T]): The list of items. - total_count (int): The total count of items. - page (int): The current page number. - page_size (int): The number of items per page. - total_pages (int): The total number of pages. - """ - - items: list[T] - total_count: int - page: int - page_size: int - total_pages: int diff --git a/autogpt_platform/market/market/routes/admin.py b/autogpt_platform/market/market/routes/admin.py deleted file mode 100644 index a3fe65cc9..000000000 --- a/autogpt_platform/market/market/routes/admin.py +++ /dev/null @@ -1,286 +0,0 @@ -import logging -import typing - -import autogpt_libs.auth -import fastapi -import prisma -import prisma.enums -import prisma.models - -import market.db -import market.model - -logger = logging.getLogger("marketplace") - -router = fastapi.APIRouter() - - -@router.delete("/agent/{agent_id}", response_model=market.model.AgentResponse) -async def delete_agent( - agent_id: str, - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -): - """ - Delete an agent and all related records from the database. - - Args: - agent_id (str): The ID of the agent to delete. - - Returns: - market.model.AgentResponse: The deleted agent's data. - - Raises: - fastapi.HTTPException: If the agent is not found or if there's an error during deletion. - """ - try: - deleted_agent = await market.db.delete_agent(agent_id) - if deleted_agent: - return market.model.AgentResponse(**deleted_agent.dict()) - else: - raise fastapi.HTTPException(status_code=404, detail="Agent not found") - except market.db.AgentQueryError as e: - logger.error(f"Error deleting agent: {e}") - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - logger.error(f"Unexpected error deleting agent: {e}") - raise fastapi.HTTPException( - status_code=500, detail="An unexpected error occurred" - ) - - -@router.post("/agent", response_model=market.model.AgentResponse) -async def create_agent_entry( - request: market.model.AddAgentRequest, - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -): - """ - A basic endpoint to create a new agent entry in the database. - - """ - try: - agent = await market.db.create_agent_entry( - request.graph["name"], - request.graph["description"], - request.author, - request.keywords, - request.categories, - prisma.Json(request.graph), - ) - - return fastapi.responses.PlainTextResponse(agent.model_dump_json()) - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - - -@router.post("/agent/featured/{agent_id}") -async def set_agent_featured( - agent_id: str, - categories: list[str] = fastapi.Query( - default=["featured"], - description="The categories to set the agent as featured in", - ), - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -) -> market.model.FeaturedAgentResponse: - """ - A basic endpoint to set an agent as featured in the database. - """ - try: - agent = await market.db.set_agent_featured( - agent_id, is_active=True, featured_categories=categories - ) - return market.model.FeaturedAgentResponse(**agent.model_dump()) - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - - -@router.get("/agent/featured/{agent_id}") -async def get_agent_featured( - agent_id: str, - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -) -> market.model.FeaturedAgentResponse | None: - """ - A basic endpoint to get an agent as featured in the database. - """ - try: - agent = await market.db.get_agent_featured(agent_id) - if agent: - return market.model.FeaturedAgentResponse(**agent.model_dump()) - else: - return None - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - - -@router.delete("/agent/featured/{agent_id}") -async def unset_agent_featured( - agent_id: str, - category: str = "featured", - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -) -> market.model.FeaturedAgentResponse | None: - """ - A basic endpoint to unset an agent as featured in the database. - """ - try: - featured = await market.db.remove_featured_category(agent_id, category=category) - if featured: - return market.model.FeaturedAgentResponse(**featured.model_dump()) - else: - return None - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - - -@router.get("/agent/not-featured") -async def get_not_featured_agents( - page: int = fastapi.Query(1, ge=1, description="Page number"), - page_size: int = fastapi.Query( - 10, ge=1, le=100, description="Number of items per page" - ), - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -) -> market.model.ListResponse[market.model.AgentResponse]: - """ - A basic endpoint to get all not featured agents in the database. - """ - try: - agents = await market.db.get_not_featured_agents(page=page, page_size=page_size) - return market.model.ListResponse( - items=[ - market.model.AgentResponse(**agent.model_dump()) for agent in agents - ], - total_count=len(agents), - page=page, - page_size=page_size, - total_pages=999, - ) - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - - -@router.get( - "/agent/submissions", - response_model=market.model.ListResponse[market.model.AgentResponse], -) -async def get_agent_submissions( - page: int = fastapi.Query(1, ge=1, description="Page number"), - page_size: int = fastapi.Query( - 10, ge=1, le=100, description="Number of items per page" - ), - name: typing.Optional[str] = fastapi.Query( - None, description="Filter by agent name" - ), - keyword: typing.Optional[str] = fastapi.Query( - None, description="Filter by keyword" - ), - category: typing.Optional[str] = fastapi.Query( - None, description="Filter by category" - ), - description: typing.Optional[str] = fastapi.Query( - None, description="Fuzzy search in description" - ), - description_threshold: int = fastapi.Query( - 60, ge=0, le=100, description="Fuzzy search threshold" - ), - sort_by: str = fastapi.Query("createdAt", description="Field to sort by"), - sort_order: typing.Literal["asc", "desc"] = fastapi.Query( - "desc", description="Sort order (asc or desc)" - ), - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -) -> market.model.ListResponse[market.model.AgentResponse]: - logger.info("Getting agent submissions") - try: - result = await market.db.get_agents( - page=page, - page_size=page_size, - name=name, - keyword=keyword, - category=category, - description=description, - description_threshold=description_threshold, - sort_by=sort_by, - sort_order=sort_order, - submission_status=prisma.enums.SubmissionStatus.PENDING, - ) - - agents = [ - market.model.AgentResponse(**agent.dict()) for agent in result["agents"] - ] - - return market.model.ListResponse( - items=agents, - total_count=result["total_count"], - page=result["page"], - page_size=result["page_size"], - total_pages=result["total_pages"], - ) - - except market.db.AgentQueryError as e: - logger.error(f"Error getting agent submissions: {e}") - raise fastapi.HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Error getting agent submissions: {e}") - raise fastapi.HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" - ) - - -@router.post("/agent/submissions") -async def review_submission( - review_request: market.model.SubmissionReviewRequest, - user: autogpt_libs.auth.User = fastapi.Depends( - autogpt_libs.auth.requires_admin_user - ), -) -> prisma.models.Agents | None: - """ - A basic endpoint to review a submission in the database. - """ - logger.info( - f"Reviewing submission: {review_request.agent_id}, {review_request.version}" - ) - try: - agent = await market.db.update_agent_entry( - agent_id=review_request.agent_id, - version=review_request.version, - submission_state=review_request.status, - comments=review_request.comments, - ) - return agent - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - - -@router.get("/categories") -async def get_categories() -> market.model.CategoriesResponse: - """ - A basic endpoint to get all available categories. - """ - try: - categories = await market.db.get_all_categories() - return categories - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) diff --git a/autogpt_platform/market/market/routes/admin_tests.py b/autogpt_platform/market/market/routes/admin_tests.py deleted file mode 100644 index c305e8c83..000000000 --- a/autogpt_platform/market/market/routes/admin_tests.py +++ /dev/null @@ -1,76 +0,0 @@ -import datetime -from unittest import mock - -import autogpt_libs.auth.middleware -import fastapi -import fastapi.testclient -import prisma.enums -import prisma.models - -import market.app - -client = fastapi.testclient.TestClient(market.app.app) - - -async def override_auth_middleware(request: fastapi.Request): - return {"sub": "3e53486c-cf57-477e-ba2a-cb02dc828e1a", "role": "admin"} - - -market.app.app.dependency_overrides[autogpt_libs.auth.middleware.auth_middleware] = ( - override_auth_middleware -) - - -def test_get_submissions(): - with mock.patch("market.db.get_agents") as mock_get_agents: - mock_get_agents.return_value = { - "agents": [], - "total_count": 0, - "page": 1, - "page_size": 10, - "total_pages": 0, - } - response = client.get( - "/api/v1/market/admin/agent/submissions?page=1&page_size=10&description_threshold=60&sort_by=createdAt&sort_order=desc", - headers={"Bearer": ""}, - ) - assert response.status_code == 200 - assert response.json() == { - "agents": [], - "total_count": 0, - "page": 1, - "page_size": 10, - "total_pages": 0, - } - - -def test_review_submission(): - with mock.patch("market.db.update_agent_entry") as mock_update_agent_entry: - mock_update_agent_entry.return_value = prisma.models.Agents( - id="aaa-bbb-ccc", - version=1, - createdAt=datetime.datetime.fromisoformat("2021-10-01T00:00:00+00:00"), - updatedAt=datetime.datetime.fromisoformat("2021-10-01T00:00:00+00:00"), - submissionStatus=prisma.enums.SubmissionStatus.APPROVED, - submissionDate=datetime.datetime.fromisoformat("2021-10-01T00:00:00+00:00"), - submissionReviewComments="Looks good", - submissionReviewDate=datetime.datetime.fromisoformat( - "2021-10-01T00:00:00+00:00" - ), - keywords=["test"], - categories=["test"], - graph='{"name": "test", "description": "test"}', # type: ignore - ) - response = client.post( - "/api/v1/market/admin/agent/submissions", - headers={ - "Authorization": "Bearer token" - }, # Assuming you need an authorization token - json={ - "agent_id": "aaa-bbb-ccc", - "version": 1, - "status": "APPROVED", - "comments": "Looks good", - }, - ) - assert response.status_code == 200 diff --git a/autogpt_platform/market/market/routes/agents.py b/autogpt_platform/market/market/routes/agents.py deleted file mode 100644 index 672dfb64e..000000000 --- a/autogpt_platform/market/market/routes/agents.py +++ /dev/null @@ -1,368 +0,0 @@ -import json -import tempfile -import typing - -import fastapi -import fastapi.responses -import prisma -import prisma.enums - -import market.db -import market.model -import market.utils.analytics - -router = fastapi.APIRouter() - - -@router.get( - "/agents", response_model=market.model.ListResponse[market.model.AgentResponse] -) -async def list_agents( - page: int = fastapi.Query(1, ge=1, description="Page number"), - page_size: int = fastapi.Query( - 10, ge=1, le=100, description="Number of items per page" - ), - name: typing.Optional[str] = fastapi.Query( - None, description="Filter by agent name" - ), - keyword: typing.Optional[str] = fastapi.Query( - None, description="Filter by keyword" - ), - category: typing.Optional[str] = fastapi.Query( - None, description="Filter by category" - ), - description: typing.Optional[str] = fastapi.Query( - None, description="Fuzzy search in description" - ), - description_threshold: int = fastapi.Query( - 60, ge=0, le=100, description="Fuzzy search threshold" - ), - sort_by: str = fastapi.Query("createdAt", description="Field to sort by"), - sort_order: typing.Literal["asc", "desc"] = fastapi.Query( - "desc", description="Sort order (asc or desc)" - ), - submission_status: prisma.enums.SubmissionStatus = fastapi.Query( - default=prisma.enums.SubmissionStatus.APPROVED, - description="Filter by submission status", - ), -): - """ - Retrieve a list of agents based on the provided filters. - - Args: - page (int): Page number (default: 1). - page_size (int): Number of items per page (default: 10, min: 1, max: 100). - name (str, optional): Filter by agent name. - keyword (str, optional): Filter by keyword. - category (str, optional): Filter by category. - description (str, optional): Fuzzy search in description. - description_threshold (int): Fuzzy search threshold (default: 60, min: 0, max: 100). - sort_by (str): Field to sort by (default: "createdAt"). - sort_order (str): Sort order (asc or desc) (default: "desc"). - submission_status (str): Filter by submission status (default: "APPROVED"). - - Returns: - market.model.ListResponse[market.model.AgentResponse]: A response containing the list of agents and pagination information. - - Raises: - HTTPException: If there is a client error (status code 400) or an unexpected error (status code 500). - """ - try: - result = await market.db.get_agents( - page=page, - page_size=page_size, - name=name, - keyword=keyword, - category=category, - description=description, - description_threshold=description_threshold, - sort_by=sort_by, - sort_order=sort_order, - submission_status=submission_status, - ) - - agents = [ - market.model.AgentResponse(**agent.dict()) for agent in result["agents"] - ] - - return market.model.ListResponse( - items=agents, - total_count=result["total_count"], - page=result["page"], - page_size=result["page_size"], - total_pages=result["total_pages"], - ) - - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=400, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" - ) - - -@router.get("/agents/{agent_id}", response_model=market.model.AgentDetailResponse) -async def get_agent_details_endpoint( - background_tasks: fastapi.BackgroundTasks, - agent_id: str = fastapi.Path(..., description="The ID of the agent to retrieve"), - version: typing.Optional[int] = fastapi.Query( - None, description="Specific version of the agent" - ), -): - """ - Retrieve details of a specific agent. - - Args: - agent_id (str): The ID of the agent to retrieve. - version (Optional[int]): Specific version of the agent (default: None). - - Returns: - market.model.AgentDetailResponse: The response containing the agent details. - - Raises: - HTTPException: If the agent is not found or an unexpected error occurs. - """ - try: - agent = await market.db.get_agent_details(agent_id, version) - background_tasks.add_task(market.utils.analytics.track_view, agent_id) - return market.model.AgentDetailResponse(**agent.model_dump()) - - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=404, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException( - status_code=500, detail=f"An unexpected error occurred: {str(e)}" - ) - - -@router.get("/agents/{agent_id}/download") -async def download_agent( - background_tasks: fastapi.BackgroundTasks, - agent_id: str = fastapi.Path(..., description="The ID of the agent to retrieve"), - version: typing.Optional[int] = fastapi.Query( - None, description="Specific version of the agent" - ), -): - """ - Download details of a specific agent. - - NOTE: This is the same as agent details, however it also triggers - the "download" tracking. We don't actually want to download a file though - - Args: - agent_id (str): The ID of the agent to retrieve. - version (Optional[int]): Specific version of the agent (default: None). - - Returns: - market.model.AgentDetailResponse: The response containing the agent details. - - Raises: - HTTPException: If the agent is not found or an unexpected error occurs. - """ - try: - agent = await market.db.get_agent_details(agent_id, version) - background_tasks.add_task(market.utils.analytics.track_download, agent_id) - return market.model.AgentDetailResponse(**agent.model_dump()) - - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=404, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException( - status_code=500, detail=f"An unexpected error occurred: {str(e)}" - ) - - -@router.get("/agents/{agent_id}/download-file") -async def download_agent_file( - background_tasks: fastapi.BackgroundTasks, - agent_id: str = fastapi.Path(..., description="The ID of the agent to download"), - version: typing.Optional[int] = fastapi.Query( - None, description="Specific version of the agent" - ), -) -> fastapi.responses.FileResponse: - """ - Download the agent file by streaming its content. - - Args: - agent_id (str): The ID of the agent to download. - version (Optional[int]): Specific version of the agent to download. - - Returns: - StreamingResponse: A streaming response containing the agent's graph data. - - Raises: - HTTPException: If the agent is not found or an unexpected error occurs. - """ - agent = await market.db.get_agent_details(agent_id, version) - - graph_data: prisma.Json = agent.graph - - background_tasks.add_task(market.utils.analytics.track_download, agent_id) - - file_name = f"agent_{agent_id}_v{version or 'latest'}.json" - - with tempfile.NamedTemporaryFile( - mode="w", suffix=".json", delete=False - ) as tmp_file: - tmp_file.write(json.dumps(graph_data)) - tmp_file.flush() - - return fastapi.responses.FileResponse( - tmp_file.name, filename=file_name, media_type="application/json" - ) - - -# top agents by downloads -@router.get( - "/top-downloads/agents", - response_model=market.model.ListResponse[market.model.AgentResponse], -) -async def top_agents_by_downloads( - page: int = fastapi.Query(1, ge=1, description="Page number"), - page_size: int = fastapi.Query( - 10, ge=1, le=100, description="Number of items per page" - ), - submission_status: prisma.enums.SubmissionStatus = fastapi.Query( - default=prisma.enums.SubmissionStatus.APPROVED, - description="Filter by submission status", - ), -) -> market.model.ListResponse[market.model.AgentResponse]: - """ - Retrieve a list of top agents based on the number of downloads. - - Args: - page (int): Page number (default: 1). - page_size (int): Number of items per page (default: 10, min: 1, max: 100). - submission_status (str): Filter by submission status (default: "APPROVED"). - - Returns: - market.model.ListResponse[market.model.AgentResponse]: A response containing the list of top agents and pagination information. - - Raises: - HTTPException: If there is a client error (status code 400) or an unexpected error (status code 500). - """ - try: - result = await market.db.get_top_agents_by_downloads( - page=page, - page_size=page_size, - submission_status=submission_status, - ) - - ret = market.model.ListResponse( - total_count=result.total_count, - page=result.page, - page_size=result.page_size, - total_pages=result.total_pages, - items=[ - market.model.AgentResponse( - id=item.agent.id, - name=item.agent.name, - description=item.agent.description, - author=item.agent.author, - keywords=item.agent.keywords, - categories=item.agent.categories, - version=item.agent.version, - createdAt=item.agent.createdAt, - updatedAt=item.agent.updatedAt, - views=item.views, - downloads=item.downloads, - submissionStatus=item.agent.submissionStatus, - ) - for item in result.items - if item.agent is not None - ], - ) - - return ret - - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise fastapi.HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" - ) from e - - -@router.get( - "/featured/agents", - response_model=market.model.ListResponse[market.model.AgentResponse], -) -async def get_featured_agents( - category: str = fastapi.Query( - "featured", description="Category of featured agents" - ), - page: int = fastapi.Query(1, ge=1, description="Page number"), - page_size: int = fastapi.Query( - 10, ge=1, le=100, description="Number of items per page" - ), - submission_status: prisma.enums.SubmissionStatus = fastapi.Query( - default=prisma.enums.SubmissionStatus.APPROVED, - description="Filter by submission status", - ), -): - """ - Retrieve a list of featured agents based on the provided category. - - Args: - category (str): Category of featured agents (default: "featured"). - page (int): Page number (default: 1). - page_size (int): Number of items per page (default: 10, min: 1, max: 100). - submission_status (str): Filter by submission status (default: "APPROVED"). - - Returns: - market.model.ListResponse[market.model.AgentResponse]: A response containing the list of featured agents and pagination information. - - Raises: - HTTPException: If there is a client error (status code 400) or an unexpected error (status code 500). - """ - try: - result = await market.db.get_featured_agents( - category=category, - page=page, - page_size=page_size, - submission_status=submission_status, - ) - - ret = market.model.ListResponse( - total_count=result.total_count, - page=result.page, - page_size=result.page_size, - total_pages=result.total_pages, - items=[ - market.model.AgentResponse( - id=item.agent.id, - name=item.agent.name, - description=item.agent.description, - author=item.agent.author, - keywords=item.agent.keywords, - categories=item.agent.categories, - version=item.agent.version, - createdAt=item.agent.createdAt, - updatedAt=item.agent.updatedAt, - views=( - item.agent.AnalyticsTracker[0].views - if item.agent.AnalyticsTracker - and len(item.agent.AnalyticsTracker) > 0 - else 0 - ), - downloads=( - item.agent.AnalyticsTracker[0].downloads - if item.agent.AnalyticsTracker - and len(item.agent.AnalyticsTracker) > 0 - else 0 - ), - submissionStatus=item.agent.submissionStatus, - ) - for item in result.featured_agents - if item.agent is not None - ], - ) - - return ret - - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise fastapi.HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" - ) from e diff --git a/autogpt_platform/market/market/routes/analytics.py b/autogpt_platform/market/market/routes/analytics.py deleted file mode 100644 index 87adbca07..000000000 --- a/autogpt_platform/market/market/routes/analytics.py +++ /dev/null @@ -1,26 +0,0 @@ -import fastapi - -import market.db -import market.model - -router = fastapi.APIRouter() - - -@router.post("/agent-installed") -async def agent_installed_endpoint( - event_data: market.model.AgentInstalledFromMarketplaceEventData, -): - """ - Endpoint to track agent installation events from the marketplace. - - Args: - event_data (market.model.AgentInstalledFromMarketplaceEventData): The event data. - """ - try: - await market.db.create_agent_installed_event(event_data) - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=400, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" - ) diff --git a/autogpt_platform/market/market/routes/search.py b/autogpt_platform/market/market/routes/search.py deleted file mode 100644 index 15ef3ffa3..000000000 --- a/autogpt_platform/market/market/routes/search.py +++ /dev/null @@ -1,56 +0,0 @@ -import typing - -import fastapi -import prisma.enums - -import market.db -import market.model -import market.utils.extension_types - -router = fastapi.APIRouter() - - -@router.get("/search") -async def search( - query: str, - page: int = fastapi.Query(1, description="The pagination page to start on"), - page_size: int = fastapi.Query( - 10, description="The number of items to return per page" - ), - categories: typing.List[str] = fastapi.Query( - None, description="The categories to filter by" - ), - description_threshold: int = fastapi.Query( - 60, description="The number of characters to return from the description" - ), - sort_by: str = fastapi.Query("rank", description="Sorting by column"), - sort_order: typing.Literal["desc", "asc"] = fastapi.Query( - "desc", description="The sort order based on sort_by" - ), - submission_status: prisma.enums.SubmissionStatus = fastapi.Query( - prisma.enums.SubmissionStatus.APPROVED, - description="The submission status to filter by", - ), -) -> market.model.ListResponse[market.utils.extension_types.AgentsWithRank]: - """searches endpoint for agents - - Args: - query (str): the search query - page (int, optional): the pagination page to start on. Defaults to 1. - page_size (int, optional): the number of items to return per page. Defaults to 10. - category (str | None, optional): the agent category to filter by. None is no filter. Defaults to None. - description_threshold (int, optional): the number of characters to return from the description. Defaults to 60. - sort_by (str, optional): Sorting by column. Defaults to "rank". - sort_order ('asc' | 'desc', optional): the sort order based on sort_by. Defaults to "desc". - """ - agents = await market.db.search_db( - query=query, - page=page, - page_size=page_size, - categories=categories, - description_threshold=description_threshold, - sort_by=sort_by, - sort_order=sort_order, - submission_status=submission_status, - ) - return agents diff --git a/autogpt_platform/market/market/routes/submissions.py b/autogpt_platform/market/market/routes/submissions.py deleted file mode 100644 index 49a4dea14..000000000 --- a/autogpt_platform/market/market/routes/submissions.py +++ /dev/null @@ -1,35 +0,0 @@ -import autogpt_libs.auth -import fastapi -import fastapi.responses -import prisma - -import market.db -import market.model -import market.utils.analytics - -router = fastapi.APIRouter() - - -@router.post("/agents/submit", response_model=market.model.AgentResponse) -async def submit_agent( - request: market.model.AddAgentRequest, - user: autogpt_libs.auth.User = fastapi.Depends(autogpt_libs.auth.requires_user), -): - """ - A basic endpoint to create a new agent entry in the database. - """ - try: - agent = await market.db.create_agent_entry( - request.graph["name"], - request.graph["description"], - request.author, - request.keywords, - request.categories, - prisma.Json(request.graph), - ) - - return fastapi.responses.PlainTextResponse(agent.model_dump_json()) - except market.db.AgentQueryError as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) - except Exception as e: - raise fastapi.HTTPException(status_code=500, detail=str(e)) diff --git a/autogpt_platform/market/market/utils/analytics.py b/autogpt_platform/market/market/utils/analytics.py deleted file mode 100644 index 71dcaf078..000000000 --- a/autogpt_platform/market/market/utils/analytics.py +++ /dev/null @@ -1,47 +0,0 @@ -import prisma.models - - -async def track_download(agent_id: str): - """ - Track the download event in the database. - - Args: - agent_id (str): The ID of the agent. - version (int | None, optional): The version of the agent. Defaults to None. - - Raises: - Exception: If there is an error tracking the download event. - """ - try: - await prisma.models.AnalyticsTracker.prisma().upsert( - where={"agentId": agent_id}, - data={ - "update": {"downloads": {"increment": 1}}, - "create": {"agentId": agent_id, "downloads": 1, "views": 0}, - }, - ) - except Exception as e: - raise Exception(f"Error tracking download event: {str(e)}") - - -async def track_view(agent_id: str): - """ - Track the view event in the database. - - Args: - agent_id (str): The ID of the agent. - version (int | None, optional): The version of the agent. Defaults to None. - - Raises: - Exception: If there is an error tracking the view event. - """ - try: - await prisma.models.AnalyticsTracker.prisma().upsert( - where={"agentId": agent_id}, - data={ - "update": {"views": {"increment": 1}}, - "create": {"agentId": agent_id, "downloads": 0, "views": 1}, - }, - ) - except Exception as e: - raise Exception(f"Error tracking view event: {str(e)}") diff --git a/autogpt_platform/market/market/utils/extension_types.py b/autogpt_platform/market/market/utils/extension_types.py deleted file mode 100644 index d76bbb19f..000000000 --- a/autogpt_platform/market/market/utils/extension_types.py +++ /dev/null @@ -1,5 +0,0 @@ -import prisma.models - - -class AgentsWithRank(prisma.models.Agents): - rank: float diff --git a/autogpt_platform/market/market/utils/partial_types.py b/autogpt_platform/market/market/utils/partial_types.py deleted file mode 100644 index 3ec3bdc2b..000000000 --- a/autogpt_platform/market/market/utils/partial_types.py +++ /dev/null @@ -1,6 +0,0 @@ -import prisma.models - -prisma.models.Agents.create_partial( - "AgentOnlyDescriptionNameAuthorIdCategories", - include={"name", "author", "id", "categories"}, -) diff --git a/autogpt_platform/market/migrations/20240731181721_base_migration/migration.sql b/autogpt_platform/market/migrations/20240731181721_base_migration/migration.sql deleted file mode 100644 index 57bdb6d04..000000000 --- a/autogpt_platform/market/migrations/20240731181721_base_migration/migration.sql +++ /dev/null @@ -1,61 +0,0 @@ --- CreateTable -CREATE TABLE "Agents" ( - "id" UUID NOT NULL DEFAULT gen_random_uuid(), - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "version" INTEGER NOT NULL DEFAULT 1, - "name" TEXT, - "description" TEXT, - "author" TEXT, - "keywords" TEXT[], - "categories" TEXT[], - "search" tsvector DEFAULT ''::tsvector, - "graph" JSONB NOT NULL, - - CONSTRAINT "Agents_pkey" PRIMARY KEY ("id","version") -); - --- CreateTable -CREATE TABLE "AnalyticsTracker" ( - "id" UUID NOT NULL DEFAULT gen_random_uuid(), - "agentId" UUID NOT NULL, - "views" INTEGER NOT NULL, - "downloads" INTEGER NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX "Agents_id_key" ON "Agents"("id"); - --- CreateIndex -CREATE UNIQUE INDEX "AnalyticsTracker_id_key" ON "AnalyticsTracker"("id"); - --- AddForeignKey -ALTER TABLE "AnalyticsTracker" ADD CONSTRAINT "AnalyticsTracker_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agents"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - - --- Add trigger to update the search column with the tsvector of the agent --- Function to be invoked by trigger - -CREATE OR REPLACE FUNCTION update_tsvector_column() RETURNS TRIGGER AS $$ - -BEGIN - -NEW.search := to_tsvector('english', COALESCE(NEW.description, '')|| ' ' ||COALESCE(NEW.name, '')|| ' ' ||COALESCE(NEW.author, '')); - -RETURN NEW; - -END; - -$$ LANGUAGE plpgsql SECURITY definer SET search_path = public, pg_temp; - --- Trigger that keeps the TSVECTOR up to date - -DROP TRIGGER IF EXISTS "update_tsvector" ON "Agents"; - -CREATE TRIGGER "update_tsvector" - -BEFORE INSERT OR UPDATE ON "Agents" - -FOR EACH ROW - -EXECUTE FUNCTION update_tsvector_column (); \ No newline at end of file diff --git a/autogpt_platform/market/migrations/20240731213728_unique_agent_id/migration.sql b/autogpt_platform/market/migrations/20240731213728_unique_agent_id/migration.sql deleted file mode 100644 index fd421f6a6..000000000 --- a/autogpt_platform/market/migrations/20240731213728_unique_agent_id/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[agentId]` on the table `AnalyticsTracker` will be added. If there are existing duplicate values, this will fail. - -*/ --- AlterTable -ALTER TABLE "AnalyticsTracker" ADD CONSTRAINT "AnalyticsTracker_pkey" PRIMARY KEY ("id"); - --- CreateIndex -CREATE UNIQUE INDEX "AnalyticsTracker_agentId_key" ON "AnalyticsTracker"("agentId"); diff --git a/autogpt_platform/market/migrations/20240802100955_add_featured_agents/migration.sql b/autogpt_platform/market/migrations/20240802100955_add_featured_agents/migration.sql deleted file mode 100644 index e615e8671..000000000 --- a/autogpt_platform/market/migrations/20240802100955_add_featured_agents/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ --- CreateTable -CREATE TABLE "FeaturedAgent" ( - "id" UUID NOT NULL DEFAULT gen_random_uuid(), - "agentId" UUID NOT NULL, - "is_featured" BOOLEAN NOT NULL, - "category" TEXT NOT NULL DEFAULT 'featured', - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "FeaturedAgent_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "FeaturedAgent_id_key" ON "FeaturedAgent"("id"); - --- CreateIndex -CREATE UNIQUE INDEX "FeaturedAgent_agentId_key" ON "FeaturedAgent"("agentId"); - --- AddForeignKey -ALTER TABLE "FeaturedAgent" ADD CONSTRAINT "FeaturedAgent_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agents"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/autogpt_platform/market/migrations/20240802174953_default_is_featured_to_false/migration.sql b/autogpt_platform/market/migrations/20240802174953_default_is_featured_to_false/migration.sql deleted file mode 100644 index 0893c3785..000000000 --- a/autogpt_platform/market/migrations/20240802174953_default_is_featured_to_false/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "FeaturedAgent" ALTER COLUMN "is_featured" SET DEFAULT false; diff --git a/autogpt_platform/market/migrations/20240808080208_added_submissions/migration.sql b/autogpt_platform/market/migrations/20240808080208_added_submissions/migration.sql deleted file mode 100644 index e30f090fb..000000000 --- a/autogpt_platform/market/migrations/20240808080208_added_submissions/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- CreateEnum -CREATE TYPE "SubmissionStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED'); - --- AlterTable -ALTER TABLE "Agents" ADD COLUMN "submissionDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, -ADD COLUMN "submissionReviewComments" TEXT, -ADD COLUMN "submissionReviewDate" TIMESTAMP(3), -ADD COLUMN "submissionStatus" "SubmissionStatus" NOT NULL DEFAULT 'PENDING'; diff --git a/autogpt_platform/market/migrations/20240829002156_make_featured_category_a_list_of_categories_and_is_featured_is_active/migration.sql b/autogpt_platform/market/migrations/20240829002156_make_featured_category_a_list_of_categories_and_is_featured_is_active/migration.sql deleted file mode 100644 index 3dc0ca322..000000000 --- a/autogpt_platform/market/migrations/20240829002156_make_featured_category_a_list_of_categories_and_is_featured_is_active/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `category` on the `FeaturedAgent` table. All the data in the column will be lost. - - You are about to drop the column `is_featured` on the `FeaturedAgent` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "FeaturedAgent" DROP COLUMN "category", -DROP COLUMN "is_featured", -ADD COLUMN "featuredCategories" TEXT[], -ADD COLUMN "isActive" BOOLEAN NOT NULL DEFAULT false; diff --git a/autogpt_platform/market/migrations/20240905162237_/migration.sql b/autogpt_platform/market/migrations/20240905162237_/migration.sql deleted file mode 100644 index ca2dc97bc..000000000 --- a/autogpt_platform/market/migrations/20240905162237_/migration.sql +++ /dev/null @@ -1,19 +0,0 @@ --- CreateEnum -CREATE TYPE "InstallationLocation" AS ENUM ('LOCAL', 'CLOUD'); - --- CreateTable -CREATE TABLE "InstallTracker" ( - "id" UUID NOT NULL DEFAULT gen_random_uuid(), - "marketplaceAgentId" UUID NOT NULL, - "installedAgentId" UUID NOT NULL, - "installationLocation" "InstallationLocation" NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "InstallTracker_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "InstallTracker_marketplaceAgentId_installedAgentId_key" ON "InstallTracker"("marketplaceAgentId", "installedAgentId"); - --- AddForeignKey -ALTER TABLE "InstallTracker" ADD CONSTRAINT "InstallTracker_marketplaceAgentId_fkey" FOREIGN KEY ("marketplaceAgentId") REFERENCES "Agents"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/autogpt_platform/market/migrations/20241003134209_update_foreign_key_on_delete/migration.sql b/autogpt_platform/market/migrations/20241003134209_update_foreign_key_on_delete/migration.sql deleted file mode 100644 index 2e1bdc7b7..000000000 --- a/autogpt_platform/market/migrations/20241003134209_update_foreign_key_on_delete/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ --- DropForeignKey -ALTER TABLE "AnalyticsTracker" DROP CONSTRAINT "AnalyticsTracker_agentId_fkey"; - --- DropForeignKey -ALTER TABLE "FeaturedAgent" DROP CONSTRAINT "FeaturedAgent_agentId_fkey"; - --- DropForeignKey -ALTER TABLE "InstallTracker" DROP CONSTRAINT "InstallTracker_marketplaceAgentId_fkey"; - --- DropIndex -DROP INDEX "AnalyticsTracker_agentId_key"; - --- AddForeignKey -ALTER TABLE "AnalyticsTracker" ADD CONSTRAINT "AnalyticsTracker_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agents"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "InstallTracker" ADD CONSTRAINT "InstallTracker_marketplaceAgentId_fkey" FOREIGN KEY ("marketplaceAgentId") REFERENCES "Agents"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "FeaturedAgent" ADD CONSTRAINT "FeaturedAgent_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agents"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/autogpt_platform/market/migrations/20241014173713_add_unique_restriction/migration.sql b/autogpt_platform/market/migrations/20241014173713_add_unique_restriction/migration.sql deleted file mode 100644 index c1ce4b5de..000000000 --- a/autogpt_platform/market/migrations/20241014173713_add_unique_restriction/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[agentId]` on the table `AnalyticsTracker` will be added. If there are existing duplicate values, this will fail. - -*/ --- CreateIndex -CREATE UNIQUE INDEX "AnalyticsTracker_agentId_key" ON "AnalyticsTracker"("agentId"); diff --git a/autogpt_platform/market/migrations/migration_lock.toml b/autogpt_platform/market/migrations/migration_lock.toml deleted file mode 100644 index fbffa92c2..000000000 --- a/autogpt_platform/market/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file diff --git a/autogpt_platform/market/poetry.lock b/autogpt_platform/market/poetry.lock deleted file mode 100644 index f110bd3fb..000000000 --- a/autogpt_platform/market/poetry.lock +++ /dev/null @@ -1,1301 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "anyio" -version = "4.4.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "autogpt-libs" -version = "0.1.0" -description = "Shared libraries across NextGen AutoGPT" -optional = false -python-versions = ">=3.10,<4.0" -files = [] -develop = false - -[package.dependencies] -pyjwt = "^2.8.0" -python-dotenv = "^1.0.1" - -[package.source] -type = "directory" -url = "../autogpt_libs" - -[[package]] -name = "black" -version = "24.10.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.9" -files = [ - {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, - {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, - {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, - {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, - {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, - {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, - {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, - {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, - {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, - {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, - {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, - {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, - {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, - {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, - {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, - {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, - {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, - {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, - {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, - {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, - {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, - {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.10)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "certifi" -version = "2024.7.4" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "fastapi" -version = "0.115.6" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305"}, - {file = "fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654"}, -] - -[package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.40.0,<0.42.0" -typing-extensions = ">=4.8.0" - -[package.extras] -all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] - -[[package]] -name = "fuzzywuzzy" -version = "0.18.0" -description = "Fuzzy string matching in python" -optional = false -python-versions = "*" -files = [ - {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, - {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, -] - -[package.extras] -speedup = ["python-levenshtein (>=0.12)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "isort" -version = "5.13.2" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, -] - -[package.extras] -colors = ["colorama (>=0.4.6)"] - -[[package]] -name = "jinja2" -version = "3.1.4" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "levenshtein" -version = "0.26.1" -description = "Python extension for computing string edit distances and similarities." -optional = false -python-versions = ">=3.9" -files = [ - {file = "levenshtein-0.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8dc4a4aecad538d944a1264c12769c99e3c0bf8e741fc5e454cc954913befb2e"}, - {file = "levenshtein-0.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec108f368c12b25787c8b1a4537a1452bc53861c3ee4abc810cc74098278edcd"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69229d651c97ed5b55b7ce92481ed00635cdbb80fbfb282a22636e6945dc52d5"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79dcd157046d62482a7719b08ba9e3ce9ed3fc5b015af8ea989c734c702aedd4"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f53f9173ae21b650b4ed8aef1d0ad0c37821f367c221a982f4d2922b3044e0d"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3956f3c5c229257dbeabe0b6aacd2c083ebcc1e335842a6ff2217fe6cc03b6b"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1e83af732726987d2c4cd736f415dae8b966ba17b7a2239c8b7ffe70bfb5543"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4f052c55046c2a9c9b5f742f39e02fa6e8db8039048b8c1c9e9fdd27c8a240a1"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9895b3a98f6709e293615fde0dcd1bb0982364278fa2072361a1a31b3e388b7a"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a3777de1d8bfca054465229beed23994f926311ce666f5a392c8859bb2722f16"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:81c57e1135c38c5e6e3675b5e2077d8a8d3be32bf0a46c57276c092b1dffc697"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:91d5e7d984891df3eff7ea9fec8cf06fdfacc03cd074fd1a410435706f73b079"}, - {file = "levenshtein-0.26.1-cp310-cp310-win32.whl", hash = "sha256:f48abff54054b4142ad03b323e80aa89b1d15cabc48ff49eb7a6ff7621829a56"}, - {file = "levenshtein-0.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:79dd6ad799784ea7b23edd56e3bf94b3ca866c4c6dee845658ee75bb4aefdabf"}, - {file = "levenshtein-0.26.1-cp310-cp310-win_arm64.whl", hash = "sha256:3351ddb105ef010cc2ce474894c5d213c83dddb7abb96400beaa4926b0b745bd"}, - {file = "levenshtein-0.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44c51f5d33b3cfb9db518b36f1288437a509edd82da94c4400f6a681758e0cb6"}, - {file = "levenshtein-0.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56b93203e725f9df660e2afe3d26ba07d71871b6d6e05b8b767e688e23dfb076"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:270d36c5da04a0d89990660aea8542227cbd8f5bc34e9fdfadd34916ff904520"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:480674c05077eeb0b0f748546d4fcbb386d7c737f9fff0010400da3e8b552942"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13946e37323728695ba7a22f3345c2e907d23f4600bc700bf9b4352fb0c72a48"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceb673f572d1d0dc9b1cd75792bb8bad2ae8eb78a7c6721e23a3867d318cb6f2"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42d6fa242e3b310ce6bfd5af0c83e65ef10b608b885b3bb69863c01fb2fcff98"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8b68295808893a81e0a1dbc2274c30dd90880f14d23078e8eb4325ee615fc68"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b01061d377d1944eb67bc40bef5d4d2f762c6ab01598efd9297ce5d0047eb1b5"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9d12c8390f156745e533d01b30773b9753e41d8bbf8bf9dac4b97628cdf16314"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:48825c9f967f922061329d1481b70e9fee937fc68322d6979bc623f69f75bc91"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8ec137170b95736842f99c0e7a9fd8f5641d0c1b63b08ce027198545d983e2b"}, - {file = "levenshtein-0.26.1-cp311-cp311-win32.whl", hash = "sha256:798f2b525a2e90562f1ba9da21010dde0d73730e277acaa5c52d2a6364fd3e2a"}, - {file = "levenshtein-0.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:55b1024516c59df55f1cf1a8651659a568f2c5929d863d3da1ce8893753153bd"}, - {file = "levenshtein-0.26.1-cp311-cp311-win_arm64.whl", hash = "sha256:e52575cbc6b9764ea138a6f82d73d3b1bc685fe62e207ff46a963d4c773799f6"}, - {file = "levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd"}, - {file = "levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea"}, - {file = "levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b"}, - {file = "levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918"}, - {file = "levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89"}, - {file = "levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e"}, - {file = "levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17"}, - {file = "levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a"}, - {file = "levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d"}, - {file = "levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e"}, - {file = "levenshtein-0.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc54ced948fc3feafce8ad4ba4239d8ffc733a0d70e40c0363ac2a7ab2b7251e"}, - {file = "levenshtein-0.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6516f69213ae393a220e904332f1a6bfc299ba22cf27a6520a1663a08eba0fb"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4cfea4eada1746d0c75a864bc7e9e63d4a6e987c852d6cec8d9cb0c83afe25b"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a323161dfeeac6800eb13cfe76a8194aec589cd948bcf1cdc03f66cc3ec26b72"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c23e749b68ebc9a20b9047317b5cd2053b5856315bc8636037a8adcbb98bed1"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f80dd7432d4b6cf493d012d22148db7af769017deb31273e43406b1fb7f091c"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ae7cd6e4312c6ef34b2e273836d18f9fff518d84d823feff5ad7c49668256e0"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdad740e841d791b805421c2b20e859b4ed556396d3063b3aa64cd055be648c"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e07afb1613d6f5fd99abd4e53ad3b446b4efaa0f0d8e9dfb1d6d1b9f3f884d32"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f1add8f1d83099a98ae4ac472d896b7e36db48c39d3db25adf12b373823cdeff"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1010814b1d7a60833a951f2756dfc5c10b61d09976ce96a0edae8fecdfb0ea7c"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:33fa329d1bb65ce85e83ceda281aea31cee9f2f6e167092cea54f922080bcc66"}, - {file = "levenshtein-0.26.1-cp39-cp39-win32.whl", hash = "sha256:488a945312f2f16460ab61df5b4beb1ea2254c521668fd142ce6298006296c98"}, - {file = "levenshtein-0.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:9f942104adfddd4b336c3997050121328c39479f69de702d7d144abb69ea7ab9"}, - {file = "levenshtein-0.26.1-cp39-cp39-win_arm64.whl", hash = "sha256:c1d8f85b2672939f85086ed75effcf768f6077516a3e299c2ba1f91bc4644c22"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6cf8f1efaf90ca585640c5d418c30b7d66d9ac215cee114593957161f63acde0"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d5b2953978b8c158dd5cd93af8216a5cfddbf9de66cf5481c2955f44bb20767a"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b952b3732c4631c49917d4b15d78cb4a2aa006c1d5c12e2a23ba8e18a307a055"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07227281e12071168e6ae59238918a56d2a0682e529f747b5431664f302c0b42"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8191241cd8934feaf4d05d0cc0e5e72877cbb17c53bbf8c92af9f1aedaa247e9"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9e70d7ee157a9b698c73014f6e2b160830e7d2d64d2e342fefc3079af3c356fc"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0eb3059f826f6cb0a5bca4a85928070f01e8202e7ccafcba94453470f83e49d4"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c389e44da12d6fb1d7ba0a709a32a96c9391e9be4160ccb9269f37e040599ee"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e9de292f2c51a7d34a0ae23bec05391b8f61f35781cd3e4c6d0533e06250c55"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d87215113259efdca8716e53b6d59ab6d6009e119d95d45eccc083148855f33"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f00a3eebf68a82fb651d8d0e810c10bfaa60c555d21dde3ff81350c74fb4c2"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b3554c1b59de63d05075577380340c185ff41b028e541c0888fddab3c259a2b4"}, - {file = "levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575"}, -] - -[package.dependencies] -rapidfuzz = ">=3.9.0,<4.0.0" - -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nodeenv" -version = "1.9.1" -description = "Node.js virtual environment builder" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, -] - -[[package]] -name = "packaging" -version = "24.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "prisma" -version = "0.15.0" -description = "Prisma Client Python is an auto-generated and fully type-safe database client" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "prisma-0.15.0-py3-none-any.whl", hash = "sha256:de949cc94d3d91243615f22ff64490aa6e2d7cb81aabffce53d92bd3977c09a4"}, - {file = "prisma-0.15.0.tar.gz", hash = "sha256:5cd6402aa8322625db3fc1152040404e7fc471fe7f8fa3a314fa8a99529ca107"}, -] - -[package.dependencies] -click = ">=7.1.2" -httpx = ">=0.19.0" -jinja2 = ">=2.11.2" -nodeenv = "*" -pydantic = ">=1.10.0,<3" -python-dotenv = ">=0.12.0" -StrEnum = {version = "*", markers = "python_version < \"3.11\""} -tomlkit = "*" -typing-extensions = ">=4.5.0" - -[package.extras] -all = ["nodejs-bin"] -node = ["nodejs-bin"] - -[[package]] -name = "prometheus-client" -version = "0.20.0" -description = "Python client for the Prometheus monitoring system." -optional = false -python-versions = ">=3.8" -files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, -] - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "prometheus-fastapi-instrumentator" -version = "7.0.0" -description = "Instrument your FastAPI with Prometheus metrics." -optional = false -python-versions = ">=3.8.1,<4.0.0" -files = [ - {file = "prometheus_fastapi_instrumentator-7.0.0-py3-none-any.whl", hash = "sha256:96030c43c776ee938a3dae58485ec24caed7e05bfc60fe067161e0d5b5757052"}, - {file = "prometheus_fastapi_instrumentator-7.0.0.tar.gz", hash = "sha256:5ba67c9212719f244ad7942d75ded80693b26331ee5dfc1e7571e4794a9ccbed"}, -] - -[package.dependencies] -prometheus-client = ">=0.8.0,<1.0.0" -starlette = ">=0.30.0,<1.0.0" - -[[package]] -name = "pydantic" -version = "2.8.2" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, -] - -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" -typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, -] - -[package.extras] -email = ["email-validator (>=2.0.0)"] - -[[package]] -name = "pydantic-core" -version = "2.20.1" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pyjwt" -version = "2.9.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pyright" -version = "1.1.390" -description = "Command line wrapper for pyright" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyright-1.1.390-py3-none-any.whl", hash = "sha256:ecebfba5b6b50af7c1a44c2ba144ba2ab542c227eb49bc1f16984ff714e0e110"}, - {file = "pyright-1.1.390.tar.gz", hash = "sha256:aad7f160c49e0fbf8209507a15e17b781f63a86a1facb69ca877c71ef2e9538d"}, -] - -[package.dependencies] -nodeenv = ">=1.6.0" -typing-extensions = ">=4.1" - -[package.extras] -all = ["nodejs-wheel-binaries", "twine (>=3.4.1)"] -dev = ["twine (>=3.4.1)"] -nodejs = ["nodejs-wheel-binaries"] - -[[package]] -name = "pytest" -version = "8.3.4" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, - {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.25.0" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3"}, - {file = "pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609"}, -] - -[package.dependencies] -pytest = ">=8.2,<9" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] -testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] - -[[package]] -name = "pytest-watcher" -version = "0.4.3" -description = "Automatically rerun your tests on file modifications" -optional = false -python-versions = "<4.0.0,>=3.7.0" -files = [ - {file = "pytest_watcher-0.4.3-py3-none-any.whl", hash = "sha256:d59b1e1396f33a65ea4949b713d6884637755d641646960056a90b267c3460f9"}, - {file = "pytest_watcher-0.4.3.tar.gz", hash = "sha256:0cb0e4661648c8c0ff2b2d25efa5a8e421784b9e4c60fcecbf9b7c30b2d731b3"}, -] - -[package.dependencies] -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} -watchdog = ">=2.0.0" - -[[package]] -name = "python-dotenv" -version = "1.0.1" -description = "Read key-value pairs from a .env file and set them as environment variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "python-levenshtein" -version = "0.26.1" -description = "Python extension for computing string edit distances and similarities." -optional = false -python-versions = ">=3.9" -files = [ - {file = "python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef"}, - {file = "python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a"}, -] - -[package.dependencies] -Levenshtein = "0.26.1" - -[[package]] -name = "rapidfuzz" -version = "3.9.5" -description = "rapid fuzzy string matching" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rapidfuzz-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7659058863d84a2c36c5a76c28bc8713d33eab03e677e67260d9e1cca43fc3bb"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:802a018776bd3cb7c5d23ba38ebbb1663a9f742be1d58e73b62d8c7cace6e607"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da71e8fdb0d1a21f4b58b2c84bcbc2b89a472c073c5f7bdb9339f4cb3122c0e3"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9433cb12731167b358fbcff9828d2294429986a03222031f6d14308eb643c77"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e33e1d185206730b916b3e7d9bce1941c65b2a1488cdd0457ae21be385a7912"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:758719e9613c47a274768f1926460955223fe0a03e7eda264f2b78b1b97a4743"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7981cc6240d01d4480795d758ea2ee748257771f68127d630045e58fe1b5545a"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b6cdca86120c3f9aa069f8d4e1c5422e92f833d705d719a2ba7082412f4c933b"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ffa533acb1a9dcb6e26c4467fdc1347995fb168ec9f794b97545f6b72dee733c"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:13eeaeb0d5fe00fa99336f73fb5ab65c46109c7121cf87659b9601908b8b6178"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d7b1922b1403ccb3583218e8cd931b08e04c5442ca03dbaf6ea4fcf574ee2b24"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b0189f691cea4dc9fe074ea6b97da30a91d0882fa69724b4b34b51d2c1983473"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-win32.whl", hash = "sha256:72e466e5de12a327a09ed6d0116f024759b5146b335645c32241da84134a7f34"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:345011cfcafaa3674c46673baad67d2394eb58285530d8333e65c3c9a143b4f4"}, - {file = "rapidfuzz-3.9.5-cp310-cp310-win_arm64.whl", hash = "sha256:5dc19c8222475e4f7f528b94d2fa28e7979355c5cf7c6e73902d2abb2be96522"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c741972d64031535cfd76d89cf47259e590e822353be57ec2f5d56758c98296"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7452d079800cf70a7314f73044f03cbcbd90a651d9dec39443d2a8a2b63ab53"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f06f163a0341bad162e972590b73e17f9cea2ed8ee27b193875ccbc3dd6eca2f"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:529e2cf441746bd492f6c36a38bf9fa6a418df95b9c003f8e92a55d8a979bd9c"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9811a741aa1350ad36689d675ded8b34e423e68b396bd30bff751a9c582f586e"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e36c4640a789b8c922b69a548968939d1c0433fa7aac83cb08e1334d4e5d7de"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53fb2f32f14c921d2f673c5b7cd58d4cc626c574a28c0791f283880d8e57022c"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:031806eb035a6f09f4ff23b9d971d50b30b5e93aa3ee620c920bee1dc32827e7"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f6dbe1df0b9334e3cf07445d810c81734ae23d137b5efc69e1d676ff55691351"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:24345826b50aafcea26e2e4be5c103d96fe9d7fc549ac9190641300290958f3b"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bfd3b66ee1f0ebb40c672a7a7e5bda00fb763fa9bca082058084175151f8e685"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a6f1df5b0e602e94199cccb5e241bbc2319644003e34f077741ebf48aea7ed1a"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-win32.whl", hash = "sha256:f080d6709f51a8335e73826b96af9b4e3657631eca6c69e1ac501868dcc84b7f"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:bf9ed6988da6a2c1f8df367cb5d6be26a3d8543646c8eba79741ac9e764fbc59"}, - {file = "rapidfuzz-3.9.5-cp311-cp311-win_arm64.whl", hash = "sha256:599714790dfac0a23a473134e6677d0a103690a4e21ba189cfc826e322cdc8d5"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9729852038fb2de096e249899f8a9bee90fb1f92e10b6ccc539d5bb798c703bc"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9dc39435476fb3b3b3c24ab2c08c726056b2b487aa7ee450aee698b808c808ac"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6ceea632b0eb97dac54411c29feb190054e91fd0571f585b56e4a9159c55ab0"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cadd66e6ef9901909dc1b11db91048f1bf4613ba7d773386f922e28b1e1df4da"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63e34fb3586431589a5e1cd7fc61c6f057576c6c6804c1c673bac3de0516dee7"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:181073256faec68e6b8ab3329a36cfa1360f7906aa70d9aee4a39cb70889f73f"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8419c18bbbd67058ca1312f35acda2e4e4592650f105cfd166569a2ebccd01f1"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191d1057cca56641f7b919fe712cb7e48cd226342e097a78136127f8bde32caa"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fe5a11eefd0ae90d32d9ff706a894498b4efb4b0c263ad9d1e6401050863504d"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b024d9d69bb83e125adee4162991f2764f16acc3fb1ed0f0fc1ad5aeb7e394"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d5a34b8388ae99bdbd5a3646f45ac318f4c870105bdbe42a2f4c85e5b347761"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e09abc0d397019bba61c8e6dfe2ec863d4dfb1762f51c9197ce0af5d5fd9adb"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-win32.whl", hash = "sha256:e3c4be3057472c79ba6f4eab35daa9f12908cb697c472d05fbbd47949a87aec6"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:0d9fdb74df87018dd4146f3d00df9fca2c27f060936a9e8d3015e7bfb9cb69e4"}, - {file = "rapidfuzz-3.9.5-cp312-cp312-win_arm64.whl", hash = "sha256:491d3d425b5fe3f61f3b9a70abfd498ce9139d94956db7a8551e537e017c0e57"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:518dec750a30f115ba1299ef2547cf468a69f310581a030c8a875257de747c5f"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:252dc3d1c3d613b8db1b59d13381937e420c99f8a351ffa0e78c2f54746e107f"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd17688b75b6fa983e8586cad30f36eb9736b860946cc8b633b9442c9481831"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8032492021b0aa55a623d6f6e739a5d4aaabc32af379c2a5656bf1e9e178bf1"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73362eb1c3d02f32e4c7f0d77eb284e9a13f278cff224f71e8f60e2aff5b6a5d"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a42d1f7b8988f50013e703ed27b5e216ef8a725b2f4ac53754ad0476020b26f4"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4f2e985172bb76c9179e11fb67d9c9ecbee4933740eca2977797094df02498d"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e943c5cbd10e15369be1f371ef303cb413c1008f64d93bd13762ea06ca84d59"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:0d34b0e8e29f80cb2ac8afe8fb7b01a542b136ffbf7e2b9983d11bce49398f68"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:62b8f9f58e9dffaa86fef84db2705457a58e191a962124f2b815026ba79d9aba"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ebf682bdb0f01b6b1f9a9ffe918aa3ac84fbdadb998ffbfcd5f9b12bd280170f"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3ed0c17e5b6fdd2ac3230bdefa908579971377c36aa4a2f132700fa8145040db"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-win32.whl", hash = "sha256:ac460d89b9759e37eef23fed05184179654882a241f6b2363df194f8940cc55f"}, - {file = "rapidfuzz-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:cf9aceb4227fd09f9a20e505f78487b2089d6420ce232d288522ea0a78b986b9"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14587df847d0d50bd10cde0a198b5d64eedb7484c72b825f5c2ead6e6ff16eee"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd94d952299ec73ea63a0fa4b699a2750785b6bb82aa56fd886d9023b86f90ab"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:733bf3d7876bf6d8167e6436f99d6ea16a218ec2c8eb9da6048f20b9cc8733e2"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb28f2b7173ed3678b4630b0c8b21503087d1cd082bae200dc2519ca38b26686"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a4c8a2c5ae4b133fec6b5db1af9a4126ffa6eca18a558fe5b6ab8e330d3d78"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5feb75e905281e5c669e21c98d594acc3b222a8694d9342f17df988766d83748"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d047b01637a31d9bf776b66438f574fd1db856ad14cf296c1f48bb6bef8a5aff"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9e0a656274ac75ec24499a06c0bc5eee67bcd8276c6061da7c05d549f1b1a61"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:16c982dd3cdd33cf4aac91027a263a081d1a8050dc33a27470367a391a8d1576"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:9a0c878d0980508e90e973a9cbfb591acc370085f2301c6aacadbd8362d52a36"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1d9bcfec5efd55b6268328cccd12956d833582d8da6385231a5c6c6201a1156a"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8171fc6e4645e636161a9ef5b44b20605adbefe23cd990b68d72cae0b9c12509"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-win32.whl", hash = "sha256:35088e759b083398ab3c4154517476e116653b7403604677af9a894179f1042f"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:6d8cc7e6e5c6fbcacdfe3cf7a86b60dcaf216216d86e6879ff52d488e5b11e27"}, - {file = "rapidfuzz-3.9.5-cp39-cp39-win_arm64.whl", hash = "sha256:506547889f18db0acca787ffb9f287757cbfe9f0fadddd4e07c64ce0bd924e13"}, - {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f4e0122603af2119579e9f94e172c6e460860fdcdb713164332c1951c13df999"}, - {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e46cd486289d1d8e3dab779c725f5dde77b286185d32e7b874bfc3d161e3a927"}, - {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e2c0c8bbe4f4525009e3ad9b94a39cdff5d6378233e754d0b13c29cdfaa75fc"}, - {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb47513a17c935f6ee606dcae0ea9d20a3fb0fe9ca597758472ea08be62dc54"}, - {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:976ed1105a76935b6a4d2bbc7d577be1b97b43997bcec2f29a0ab48ff6f5d6b1"}, - {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9cf2028edb9ccd21d1d5aaacef2fe3e14bee4343df1c2c0f7373ef6e81013bef"}, - {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:926701c8e61319ee2e4888619143f58ddcc0e3e886668269b8e053f2d68c1e92"}, - {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:99eaa8dd8a44664813e0bef014775993ef75a134a863bc54cd855a60622203fd"}, - {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7508ef727ef4891141dd3ac7a39a2327384ece070521ac9c58f06c27d57c72d5"}, - {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f33d05db5bba1d076446c51347a6d93ff24d8f9d01b0b8b15ca8ec8b1ef382"}, - {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7252666b85c931d51a59d5308bb6827a67434917ef510747d3ce7e88ec17e7f2"}, - {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d26f7299e2872d18fb7df1bc043e53aa94fc5a4a2a6a9537ad8707579fcb1668"}, - {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2b17ecc17322b659962234799e90054e420911b8ca510a7869c2f4419f9f3ecb"}, - {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3e037b9ec621dec0157d81566e7d47a91405e379335cf8f4ed3c20d61db91d8"}, - {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c4d1ba2647c8d2a82313c4dde332de750c936b94f016308339e762c2e5e53d"}, - {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:876e663b11d9067e1096ea76a2de87227c7b513aff2b60667b20417da74183e4"}, - {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adee55488490375c1604b878fbc1eb1a51fe5e6f5bd05047df2f8c6505a48728"}, - {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:abb1ac683671000bd4ec215a494aba687d75a198db72188408154a19ea313ff4"}, - {file = "rapidfuzz-3.9.5.tar.gz", hash = "sha256:257f2406a671371bafd99a2a2c57f991783446bc2176b93a83d1d833e35d36df"}, -] - -[package.extras] -full = ["numpy"] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "ruff" -version = "0.8.3" -description = "An extremely fast Python linter and code formatter, written in Rust." -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.8.3-py3-none-linux_armv6l.whl", hash = "sha256:8d5d273ffffff0acd3db5bf626d4b131aa5a5ada1276126231c4174543ce20d6"}, - {file = "ruff-0.8.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e4d66a21de39f15c9757d00c50c8cdd20ac84f55684ca56def7891a025d7e939"}, - {file = "ruff-0.8.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c356e770811858bd20832af696ff6c7e884701115094f427b64b25093d6d932d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c0a60a825e3e177116c84009d5ebaa90cf40dfab56e1358d1df4e29a9a14b13"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fb782f4db39501210ac093c79c3de581d306624575eddd7e4e13747e61ba18"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f26bc76a133ecb09a38b7868737eded6941b70a6d34ef53a4027e83913b6502"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:01b14b2f72a37390c1b13477c1c02d53184f728be2f3ffc3ace5b44e9e87b90d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53babd6e63e31f4e96ec95ea0d962298f9f0d9cc5990a1bbb023a6baf2503a82"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ae441ce4cf925b7f363d33cd6570c51435972d697e3e58928973994e56e1452"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c65bc0cadce32255e93c57d57ecc2cca23149edd52714c0c5d6fa11ec328cd"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5be450bb18f23f0edc5a4e5585c17a56ba88920d598f04a06bd9fd76d324cb20"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8faeae3827eaa77f5721f09b9472a18c749139c891dbc17f45e72d8f2ca1f8fc"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:db503486e1cf074b9808403991663e4277f5c664d3fe237ee0d994d1305bb060"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6567be9fb62fbd7a099209257fef4ad2c3153b60579818b31a23c886ed4147ea"}, - {file = "ruff-0.8.3-py3-none-win32.whl", hash = "sha256:19048f2f878f3ee4583fc6cb23fb636e48c2635e30fb2022b3a1cd293402f964"}, - {file = "ruff-0.8.3-py3-none-win_amd64.whl", hash = "sha256:f7df94f57d7418fa7c3ffb650757e0c2b96cf2501a0b192c18e4fb5571dfada9"}, - {file = "ruff-0.8.3-py3-none-win_arm64.whl", hash = "sha256:fe2756edf68ea79707c8d68b78ca9a58ed9af22e430430491ee03e718b5e4936"}, - {file = "ruff-0.8.3.tar.gz", hash = "sha256:5e7558304353b84279042fc584a4f4cb8a07ae79b2bf3da1a7551d960b5626d3"}, -] - -[[package]] -name = "sentry-sdk" -version = "2.19.2" -description = "Python client for Sentry (https://sentry.io)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "sentry_sdk-2.19.2-py2.py3-none-any.whl", hash = "sha256:ebdc08228b4d131128e568d696c210d846e5b9d70aa0327dec6b1272d9d40b84"}, - {file = "sentry_sdk-2.19.2.tar.gz", hash = "sha256:467df6e126ba242d39952375dd816fbee0f217d119bf454a8ce74cf1e7909e8d"}, -] - -[package.dependencies] -certifi = "*" -fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} -urllib3 = ">=1.26.11" - -[package.extras] -aiohttp = ["aiohttp (>=3.5)"] -anthropic = ["anthropic (>=0.16)"] -arq = ["arq (>=0.23)"] -asyncpg = ["asyncpg (>=0.23)"] -beam = ["apache-beam (>=2.12)"] -bottle = ["bottle (>=0.12.13)"] -celery = ["celery (>=3)"] -celery-redbeat = ["celery-redbeat (>=2)"] -chalice = ["chalice (>=1.16.0)"] -clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] -django = ["django (>=1.8)"] -falcon = ["falcon (>=1.4)"] -fastapi = ["fastapi (>=0.79.0)"] -flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] -grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] -http2 = ["httpcore[http2] (==1.*)"] -httpx = ["httpx (>=0.16.0)"] -huey = ["huey (>=2)"] -huggingface-hub = ["huggingface_hub (>=0.22)"] -langchain = ["langchain (>=0.0.210)"] -launchdarkly = ["launchdarkly-server-sdk (>=9.8.0)"] -litestar = ["litestar (>=2.0.0)"] -loguru = ["loguru (>=0.5)"] -openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] -openfeature = ["openfeature-sdk (>=0.7.1)"] -opentelemetry = ["opentelemetry-distro (>=0.35b0)"] -opentelemetry-experimental = ["opentelemetry-distro"] -pure-eval = ["asttokens", "executing", "pure_eval"] -pymongo = ["pymongo (>=3.1)"] -pyspark = ["pyspark (>=2.4.4)"] -quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] -rq = ["rq (>=0.6)"] -sanic = ["sanic (>=0.8)"] -sqlalchemy = ["sqlalchemy (>=1.2)"] -starlette = ["starlette (>=0.19.1)"] -starlite = ["starlite (>=1.48)"] -tornado = ["tornado (>=6)"] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "starlette" -version = "0.41.2" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.8" -files = [ - {file = "starlette-0.41.2-py3-none-any.whl", hash = "sha256:fbc189474b4731cf30fcef52f18a8d070e3f3b46c6a04c97579e85e6ffca942d"}, - {file = "starlette-0.41.2.tar.gz", hash = "sha256:9834fd799d1a87fd346deb76158668cfa0b0d56f85caefe8268e2d97c3468b62"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] - -[[package]] -name = "strenum" -version = "0.4.15" -description = "An Enum that inherits from str." -optional = false -python-versions = "*" -files = [ - {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, - {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, -] - -[package.extras] -docs = ["myst-parser[linkify]", "sphinx", "sphinx-rtd-theme"] -release = ["twine"] -test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tomlkit" -version = "0.13.0" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, - {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "urllib3" -version = "2.2.2" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "uvicorn" -version = "0.34.0" -description = "The lightning-fast ASGI server." -optional = false -python-versions = ">=3.9" -files = [ - {file = "uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4"}, - {file = "uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9"}, -] - -[package.dependencies] -click = ">=7.0" -h11 = ">=0.8" -typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} - -[package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] - -[[package]] -name = "watchdog" -version = "4.0.1" -description = "Filesystem events monitoring" -optional = false -python-versions = ">=3.8" -files = [ - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, - {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, - {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, - {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, - {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.10" -content-hash = "5dbf6cd95ba8e80c4a6b4e6a54c6cdfb1488619e4293d1d5a8572c5330485493" diff --git a/autogpt_platform/market/pyproject.toml b/autogpt_platform/market/pyproject.toml deleted file mode 100644 index 279a11116..000000000 --- a/autogpt_platform/market/pyproject.toml +++ /dev/null @@ -1,57 +0,0 @@ -[tool.poetry] -name = "market" -version = "0.1.0" -description = "" -authors = [ - "SwiftyOS ", - "Nicholas Tindle ", -] -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.10" -prisma = "^0.15.0" -python-dotenv = "^1.0.1" -uvicorn = "^0.34.0" -fastapi = "^0.115.6" -sentry-sdk = { extras = ["fastapi"], version = "^2.19.2" } -fuzzywuzzy = "^0.18.0" -python-levenshtein = "^0.26.1" -# autogpt-platform-backend = { path = "../backend", develop = true } -prometheus-fastapi-instrumentator = "^7.0.0" - - -autogpt-libs = {path = "../autogpt_libs"} -[tool.poetry.group.dev.dependencies] -pytest = "^8.3.4" -pytest-asyncio = "^0.25.0" - -pytest-watcher = "^0.4.3" -requests = "^2.32.3" -ruff = "^0.8.3" -pyright = "^1.1.390" -isort = "^5.13.2" -black = "^24.10.0" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - -[tool.poetry.scripts] -format = "scripts:format" -lint = "scripts:lint" -app = "scripts:app" -setup = "scripts:setup" -populate = "scripts:populate_database" - -[tool.pytest-watcher] -now = false -clear = true -delay = 0.2 -runner = "pytest" -runner_args = [] -patterns = ["*.py"] -ignore_patterns = [] - -[tool.pytest.ini_options] -asyncio_mode = "auto" diff --git a/autogpt_platform/market/schema.prisma b/autogpt_platform/market/schema.prisma deleted file mode 100644 index 8a29c2b2a..000000000 --- a/autogpt_platform/market/schema.prisma +++ /dev/null @@ -1,80 +0,0 @@ -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -generator client { - provider = "prisma-client-py" - recursive_type_depth = 5 - interface = "asyncio" - previewFeatures = ["fullTextSearch"] - partial_type_generator = "market/utils/partial_types.py" -} - -enum SubmissionStatus { - PENDING - APPROVED - REJECTED -} - -model Agents { - id String @unique @default(dbgenerated("gen_random_uuid()")) @db.Uuid - version Int @default(1) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - submissionDate DateTime @default(now()) - submissionReviewDate DateTime? - submissionStatus SubmissionStatus @default(PENDING) - submissionReviewComments String? - - name String? - description String? - author String? - - keywords String[] - categories String[] - search Unsupported("tsvector")? @default(dbgenerated("''::tsvector")) - - graph Json - AnalyticsTracker AnalyticsTracker[] - FeaturedAgent FeaturedAgent? - InstallTracker InstallTracker[] - - @@id(name: "graphVersionId", [id, version]) -} - -model AnalyticsTracker { - id String @id @unique @default(dbgenerated("gen_random_uuid()")) @db.Uuid - agentId String @unique @db.Uuid - agent Agents @relation(fields: [agentId], references: [id], onDelete: Cascade) - views Int - downloads Int -} - -enum InstallationLocation { - LOCAL - CLOUD -} - -model InstallTracker { - id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid - marketplaceAgentId String @db.Uuid - marketplaceAgent Agents @relation(fields: [marketplaceAgentId], references: [id], onDelete: Cascade) - installedAgentId String @db.Uuid - installationLocation InstallationLocation - createdAt DateTime @default(now()) - - @@unique([marketplaceAgentId, installedAgentId]) -} - -model FeaturedAgent { - id String @id @unique @default(dbgenerated("gen_random_uuid()")) @db.Uuid - agentId String @unique @db.Uuid - agent Agents @relation(fields: [agentId], references: [id], onDelete: Cascade) - isActive Boolean @default(false) - featuredCategories String[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} diff --git a/autogpt_platform/market/scripts.py b/autogpt_platform/market/scripts.py deleted file mode 100644 index 5465007b7..000000000 --- a/autogpt_platform/market/scripts.py +++ /dev/null @@ -1,65 +0,0 @@ -import os -import subprocess - -directory = os.path.dirname(os.path.realpath(__file__)) - - -def run(*command: str) -> None: - print(f">>>>> Running poetry run {' '.join(command)}") - subprocess.run(["poetry", "run"] + list(command), cwd=directory, check=True) - - -def lint(): - try: - run("ruff", "check", ".", "--exit-zero") - run("isort", "--diff", "--check", "--profile", "black", ".") - run("black", "--diff", "--check", ".") - run("pyright") - except subprocess.CalledProcessError as e: - print("Lint failed, try running `poetry run format` to fix the issues: ", e) - raise e - - -def populate_database(): - import glob - import json - import pathlib - - import requests - - import market.model - - templates = pathlib.Path(__file__).parent.parent / "graph_templates" - - all_files = glob.glob(str(templates / "*.json")) - - for file in all_files: - with open(file, "r") as f: - data = f.read() - req = market.model.AddAgentRequest( - graph=json.loads(data), - author="Populate DB", - categories=["Pre-Populated"], - keywords=["test"], - ) - response = requests.post( - "http://localhost:8015/api/v1/market/admin/agent", json=req.model_dump() - ) - print(response.text) - - -def format(): - run("ruff", "check", "--fix", ".") - run("isort", "--profile", "black", ".") - run("black", ".") - run("pyright", ".") - - -def app(): - port = os.getenv("PORT", "8015") - run("uvicorn", "market.app:app", "--reload", "--port", port, "--host", "0.0.0.0") - - -def setup(): - run("prisma", "generate") - run("prisma", "migrate", "deploy") diff --git a/autogpt_platform/market/tests/test_agents.py b/autogpt_platform/market/tests/test_agents.py deleted file mode 100644 index bcf9f033f..000000000 --- a/autogpt_platform/market/tests/test_agents.py +++ /dev/null @@ -1,79 +0,0 @@ -from datetime import datetime, timezone - -import pytest -from fastapi.testclient import TestClient - -from market.app import app -from market.db import AgentQueryError - - -@pytest.fixture -def test_client(): - return TestClient(app) - - -# Mock data -mock_agents = [ - { - "id": "1", - "name": "Agent 1", - "description": "Description 1", - "author": "Author 1", - "keywords": ["AI", "chatbot"], - "categories": ["general"], - "version": 1, - "createdAt": datetime.now(timezone.utc), - "updatedAt": datetime.now(timezone.utc), - "graph": {"node1": "value1"}, - }, - { - "id": "2", - "name": "Agent 2", - "description": "Description 2", - "author": "Author 2", - "keywords": ["ML", "NLP"], - "categories": ["specialized"], - "version": 1, - "createdAt": datetime.now(timezone.utc), - "updatedAt": datetime.now(timezone.utc), - "graph": {"node2": "value2"}, - }, -] - - -# TODO: Need to mock prisma somehow - - -@pytest.mark.asyncio -async def test_list_agents(test_client): - response = test_client.get("/agents") - assert response.status_code == 200 - data = response.json() - assert len(data["agents"]) == 2 - assert data["total_count"] == 2 - - -@pytest.mark.asyncio -async def test_list_agents_with_filters(test_client): - response = await test_client.get("/agents?name=Agent 1&keyword=AI&category=general") - assert response.status_code == 200 - data = response.json() - assert len(data["agents"]) == 1 - assert data["agents"][0]["name"] == "Agent 1" - - -@pytest.mark.asyncio -async def test_get_agent_details(test_client, mock_get_agent_details): - response = await test_client.get("/agents/1") - assert response.status_code == 200 - data = response.json() - assert data["id"] == "1" - assert data["name"] == "Agent 1" - assert "graph" in data - - -@pytest.mark.asyncio -async def test_get_nonexistent_agent(test_client, mock_get_agent_details): - mock_get_agent_details.side_effect = AgentQueryError("Agent not found") - response = await test_client.get("/agents/999") - assert response.status_code == 404