Refactor Paginated GETs for better UX (#73)
* fix: remove opentelemtry code and make deriver workers configurable * feat(storage) change get route for messages and metamessages to use POST for options * feat(storage) Change remaining paginated gets to POST requests with options
This commit is contained in:
parent
487ec43362
commit
86bdd0cecf
|
|
@ -6,7 +6,6 @@ OPENAI_API_KEY=
|
|||
|
||||
# Logging
|
||||
|
||||
OPENTELEMETRY_ENABLED=false # Set to true to enable OpenTelemetry logging and tracing
|
||||
SENTRY_ENABLED=false # Set to true to enable Sentry logging and tracing
|
||||
LOGFIRE_TOKEN= # optional logfire config
|
||||
|
||||
|
|
@ -15,21 +14,8 @@ LOGFIRE_TOKEN= # optional logfire config
|
|||
USE_AUTH_SERVICE=false
|
||||
AUTH_SERVICE_URL=http://localhost:8001
|
||||
|
||||
## Sentry
|
||||
# Sentry
|
||||
SENTRY_DSN=
|
||||
|
||||
## Open Telemetry
|
||||
|
||||
OTEL_SERVICE_NAME=honcho
|
||||
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true
|
||||
OTEL_PYTHON_LOG_CORRELATION=true
|
||||
|
||||
OTEL_PYTHON_LOG_LEVEL=
|
||||
OTEL_EXPORTER_OTLP_PROTOCOL=
|
||||
OTEL_EXPORTER_OTLP_ENDPOINT=
|
||||
OTEL_EXPORTER_OTLP_HEADERS=
|
||||
OTEL_RESOURCE_ATTRIBUTES=
|
||||
|
||||
DEBUG_LOG_OTEL_TO_PROVIDER=false
|
||||
DEBUG_LOG_OTEL_TO_CONSOLE=true
|
||||
|
||||
# Deriver
|
||||
DERIVER_WORKERS=1
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -17,11 +17,6 @@ dependencies = [
|
|||
"greenlet>=3.0.3",
|
||||
"psycopg[binary]>=3.1.19",
|
||||
"httpx>=0.27.0",
|
||||
"opentelemetry-instrumentation-fastapi>=0.45b0",
|
||||
"opentelemetry-sdk>=1.24.0",
|
||||
"opentelemetry-exporter-otlp>=1.24.0",
|
||||
"opentelemetry-instrumentation-sqlalchemy>=0.45b0",
|
||||
"opentelemetry-instrumentation-logging>=0.45b0",
|
||||
"rich>=13.7.1",
|
||||
"openai>=1.43.0",
|
||||
"anthropic>=0.36.0",
|
||||
|
|
|
|||
|
|
@ -319,6 +319,9 @@ async def get_messages(
|
|||
reverse: Optional[bool] = False,
|
||||
filter: Optional[dict] = None,
|
||||
) -> Select:
|
||||
print("============")
|
||||
print(filter)
|
||||
print("============")
|
||||
stmt = (
|
||||
select(models.Message)
|
||||
.join(models.Session, models.Session.public_id == models.Message.session_id)
|
||||
|
|
@ -337,6 +340,10 @@ async def get_messages(
|
|||
else:
|
||||
stmt = stmt.order_by(models.Message.created_at)
|
||||
|
||||
print("============")
|
||||
print(stmt)
|
||||
print("============")
|
||||
|
||||
return stmt
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
from .consumer import process_item
|
||||
|
||||
__all__ = ['process_item']
|
||||
|
|
@ -1,7 +1,8 @@
|
|||
import asyncio
|
||||
import os
|
||||
from collections.abc import Sequence
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Optional, Sequence
|
||||
from typing import Any, Optional
|
||||
|
||||
import sentry_sdk
|
||||
from dotenv import load_dotenv
|
||||
|
|
@ -154,6 +155,7 @@ async def main():
|
|||
AsyncioIntegration(),
|
||||
],
|
||||
)
|
||||
semaphore = asyncio.Semaphore(2) # Limit to 5 concurrent dequeuing operations
|
||||
workers = int(os.getenv("DERIVER_WORKERS", 1)) + 1
|
||||
semaphore = asyncio.Semaphore(workers) # Limit to 5 concurrent dequeuing operations
|
||||
queue_empty_flag = asyncio.Event() # Event to signal when the queue is empty
|
||||
await polling_loop(semaphore, queue_empty_flag)
|
||||
|
|
|
|||
171
src/main.py
171
src/main.py
|
|
@ -1,40 +1,10 @@
|
|||
import json
|
||||
import logging
|
||||
import os
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
import sentry_sdk
|
||||
from fastapi import APIRouter, FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import PlainTextResponse
|
||||
from fastapi_pagination import add_pagination
|
||||
from opentelemetry import trace
|
||||
from opentelemetry._logs import (
|
||||
set_logger_provider,
|
||||
)
|
||||
from opentelemetry.exporter.otlp.proto.http._log_exporter import (
|
||||
OTLPLogExporter,
|
||||
)
|
||||
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
|
||||
OTLPSpanExporter,
|
||||
)
|
||||
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
|
||||
from opentelemetry.instrumentation.logging import LoggingInstrumentor
|
||||
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
|
||||
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
|
||||
from opentelemetry.sdk._logs.export import (
|
||||
BatchLogRecordProcessor,
|
||||
ConsoleLogExporter,
|
||||
SimpleLogRecordProcessor,
|
||||
)
|
||||
from opentelemetry.sdk.resources import Resource
|
||||
from opentelemetry.sdk.trace import TracerProvider
|
||||
from opentelemetry.sdk.trace.export import (
|
||||
BatchSpanProcessor,
|
||||
ConsoleSpanExporter,
|
||||
SimpleSpanProcessor,
|
||||
)
|
||||
from starlette.exceptions import HTTPException as StarletteHTTPException
|
||||
|
||||
from src.routers import (
|
||||
apps,
|
||||
|
|
@ -48,127 +18,6 @@ from src.routers import (
|
|||
|
||||
from .db import engine, scaffold_db
|
||||
|
||||
# Otel Setup
|
||||
|
||||
DEBUG_LOG_OTEL_TO_PROVIDER = (
|
||||
os.getenv("DEBUG_LOG_OTEL_TO_PROVIDER", "False").lower() == "true"
|
||||
)
|
||||
DEBUG_LOG_OTEL_TO_CONSOLE = (
|
||||
os.getenv("DEBUG_LOG_OTEL_TO_CONSOLE", "False").lower() == "true"
|
||||
)
|
||||
|
||||
|
||||
def otel_get_env_vars():
|
||||
otel_http_headers = {}
|
||||
try:
|
||||
decoded_http_headers = os.getenv("OTEL_EXPORTER_OTLP_HEADERS", "")
|
||||
key_values = decoded_http_headers.split(",")
|
||||
for key_value in key_values:
|
||||
key, value = key_value.split("=")
|
||||
otel_http_headers[key] = value
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error parsing OTEL_ENDPOINT_HTTP_HEADERS: {str(e)}")
|
||||
otel_endpoint_url = os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT", None)
|
||||
|
||||
return otel_endpoint_url, otel_http_headers
|
||||
|
||||
|
||||
def otel_trace_init():
|
||||
trace.set_tracer_provider(
|
||||
TracerProvider(
|
||||
resource=Resource.create({}),
|
||||
),
|
||||
)
|
||||
if DEBUG_LOG_OTEL_TO_PROVIDER:
|
||||
otel_endpoint_url, otel_http_headers = otel_get_env_vars()
|
||||
if otel_endpoint_url is not None:
|
||||
otel_endpoint_url = otel_endpoint_url + "/v1/traces"
|
||||
otlp_span_exporter = OTLPSpanExporter(
|
||||
endpoint=otel_endpoint_url, headers=otel_http_headers
|
||||
)
|
||||
trace.get_tracer_provider().add_span_processor( # type: ignore
|
||||
BatchSpanProcessor(otlp_span_exporter)
|
||||
)
|
||||
if DEBUG_LOG_OTEL_TO_CONSOLE:
|
||||
trace.get_tracer_provider().add_span_processor( # type: ignore
|
||||
SimpleSpanProcessor(ConsoleSpanExporter())
|
||||
)
|
||||
|
||||
|
||||
def otel_logging_init():
|
||||
# ------------Logging
|
||||
# Set logging level
|
||||
# CRITICAL = 50
|
||||
# ERROR = 40
|
||||
# WARNING = 30
|
||||
# INFO = 20
|
||||
# DEBUG = 10
|
||||
# NOTSET = 0
|
||||
# default = WARNING
|
||||
log_level = str(os.getenv("OTEL_PYTHON_LOG_LEVEL", "INFO")).upper()
|
||||
if log_level == "CRITICAL":
|
||||
log_level = logging.CRITICAL
|
||||
print(f"Using log level: CRITICAL / {log_level}")
|
||||
elif log_level == "ERROR":
|
||||
log_level = logging.ERROR
|
||||
print(f"Using log level: ERROR / {log_level}")
|
||||
elif log_level == "WARNING":
|
||||
log_level = logging.WARNING
|
||||
print(f"Using log level: WARNING / {log_level}")
|
||||
elif log_level == "INFO":
|
||||
log_level = logging.INFO
|
||||
print(f"Using log level: INFO / {log_level}")
|
||||
elif log_level == "DEBUG":
|
||||
log_level = logging.DEBUG
|
||||
print(f"Using log level: DEBUG / {log_level}")
|
||||
elif log_level == "NOTSET":
|
||||
log_level = logging.INFO
|
||||
print(f"Using log level: NOTSET / {log_level}")
|
||||
# ------------ Opentelemetry logging initialization
|
||||
|
||||
logger_provider = LoggerProvider(resource=Resource.create({}))
|
||||
set_logger_provider(logger_provider)
|
||||
if DEBUG_LOG_OTEL_TO_CONSOLE:
|
||||
console_log_exporter = ConsoleLogExporter()
|
||||
logger_provider.add_log_record_processor(
|
||||
SimpleLogRecordProcessor(console_log_exporter)
|
||||
)
|
||||
if DEBUG_LOG_OTEL_TO_PROVIDER:
|
||||
otel_endpoint_url, otel_http_headers = otel_get_env_vars()
|
||||
if otel_endpoint_url is not None:
|
||||
otel_endpoint_url = otel_endpoint_url + "/v1/logs"
|
||||
otlp_log_exporter = OTLPLogExporter(
|
||||
endpoint=otel_endpoint_url, headers=otel_http_headers
|
||||
)
|
||||
logger_provider.add_log_record_processor(
|
||||
BatchLogRecordProcessor(otlp_log_exporter)
|
||||
)
|
||||
|
||||
# otel_log_handler = FormattedLoggingHandler(logger_provider=logger_provider)
|
||||
otel_log_handler = LoggingHandler(
|
||||
level=logging.NOTSET, logger_provider=logger_provider
|
||||
)
|
||||
|
||||
otel_log_handler.setLevel(log_level)
|
||||
# This has to be called first before logger.getLogger().addHandler() so that it can call logging.basicConfig first to set the logging format
|
||||
# based on the environment variable OTEL_PYTHON_LOG_FORMAT
|
||||
LoggingInstrumentor(log_level=log_level).instrument(log_level=log_level)
|
||||
# logFormatter = logging.Formatter(os.getenv("OTEL_PYTHON_LOG_FORMAT", None))
|
||||
# otel_log_handler.setFormatter(logFormatter)
|
||||
logging.getLogger().addHandler(otel_log_handler)
|
||||
|
||||
|
||||
OPENTELEMTRY_ENABLED = os.getenv("OPENTELEMETRY_ENABLED", "False").lower() == "true"
|
||||
|
||||
# Instrument SQLAlchemy
|
||||
if OPENTELEMTRY_ENABLED:
|
||||
otel_trace_init()
|
||||
otel_logging_init()
|
||||
|
||||
SQLAlchemyInstrumentor().instrument(engine=engine.sync_engine)
|
||||
|
||||
|
||||
# Sentry Setup
|
||||
|
||||
SENTRY_ENABLED = os.getenv("SENTRY_ENABLED", "False").lower() == "true"
|
||||
|
|
@ -221,30 +70,10 @@ app.add_middleware(
|
|||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
if OPENTELEMTRY_ENABLED:
|
||||
FastAPIInstrumentor().instrument_app(app)
|
||||
|
||||
router = APIRouter(prefix="/apps/{app_id}/users/{user_id}")
|
||||
|
||||
add_pagination(app)
|
||||
|
||||
|
||||
@app.exception_handler(StarletteHTTPException)
|
||||
async def http_exception_handler(request, exc):
|
||||
current_span = trace.get_current_span()
|
||||
if (current_span is not None) and (current_span.is_recording()):
|
||||
current_span.set_attributes(
|
||||
{
|
||||
"http.status_text": str(exc.detail),
|
||||
"otel.status_description": f"{exc.status_code} / {str(exc.detail)}",
|
||||
"otel.status_code": "ERROR",
|
||||
}
|
||||
)
|
||||
return PlainTextResponse(
|
||||
json.dumps({"detail": str(exc.detail)}), status_code=exc.status_code
|
||||
)
|
||||
|
||||
|
||||
app.include_router(apps.router)
|
||||
app.include_router(users.router)
|
||||
app.include_router(sessions.router)
|
||||
|
|
|
|||
|
|
@ -59,28 +59,6 @@ async def create_app(app: schemas.AppCreate, db=db):
|
|||
schemas.App: Created App object
|
||||
|
||||
"""
|
||||
# USE_AUTH_SERVICE = os.getenv("USE_AUTH_SERVICE", "False").lower() == "true"
|
||||
# if USE_AUTH_SERVICE:
|
||||
# AUTH_SERVICE_URL = os.getenv("AUTH_SERVICE_URL", "http://localhost:8001")
|
||||
# authorization: Optional[str] = request.headers.get("Authorization")
|
||||
# if authorization:
|
||||
# scheme, _, token = authorization.partition(" ")
|
||||
# if token is not None:
|
||||
# honcho_app = await crud.create_app(db, app=app)
|
||||
# # if token == "default":
|
||||
# # return honcho_app
|
||||
# res = httpx.put(
|
||||
# f"{AUTH_SERVICE_URL}/organizations",
|
||||
# json={
|
||||
# "id": str(honcho_app.id),
|
||||
# "name": honcho_app.name,
|
||||
# "token": token,
|
||||
# },
|
||||
# )
|
||||
# data = res.json()
|
||||
# if data:
|
||||
# return honcho_app
|
||||
# else:
|
||||
try:
|
||||
honcho_app = await crud.create_app(db, app=app)
|
||||
return honcho_app
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import json
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
|
|
@ -16,12 +15,12 @@ router = APIRouter(
|
|||
)
|
||||
|
||||
|
||||
@router.get("", response_model=Page[schemas.Collection])
|
||||
@router.post("/list", response_model=Page[schemas.Collection])
|
||||
async def get_collections(
|
||||
app_id: str,
|
||||
user_id: str,
|
||||
options: schemas.CollectionGet,
|
||||
reverse: Optional[bool] = False,
|
||||
filter: Optional[str] = None,
|
||||
db=db,
|
||||
):
|
||||
"""Get All Collections for a User
|
||||
|
|
@ -35,13 +34,10 @@ async def get_collections(
|
|||
list[schemas.Collection]: List of Collection objects
|
||||
|
||||
"""
|
||||
data = None
|
||||
if filter is not None:
|
||||
data = json.loads(filter)
|
||||
return await paginate(
|
||||
db,
|
||||
await crud.get_collections(
|
||||
db, app_id=app_id, user_id=user_id, filter=data, reverse=reverse
|
||||
db, app_id=app_id, user_id=user_id, filter=options.filter, reverse=reverse
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import json
|
||||
from typing import Optional, Sequence
|
||||
from collections.abc import Sequence
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from fastapi_pagination import Page
|
||||
from fastapi_pagination.ext.sqlalchemy import paginate
|
||||
|
||||
|
|
@ -16,19 +16,16 @@ router = APIRouter(
|
|||
)
|
||||
|
||||
|
||||
@router.get("", response_model=Page[schemas.Document])
|
||||
@router.post("/list", response_model=Page[schemas.Document])
|
||||
async def get_documents(
|
||||
app_id: str,
|
||||
user_id: str,
|
||||
collection_id: str,
|
||||
options: schemas.DocumentGet,
|
||||
reverse: Optional[bool] = False,
|
||||
filter: Optional[str] = None,
|
||||
db=db,
|
||||
):
|
||||
try:
|
||||
data = None
|
||||
if filter is not None:
|
||||
data = json.loads(filter)
|
||||
return await paginate(
|
||||
db,
|
||||
await crud.get_documents(
|
||||
|
|
@ -36,7 +33,7 @@ async def get_documents(
|
|||
app_id=app_id,
|
||||
user_id=user_id,
|
||||
collection_id=collection_id,
|
||||
filter=data,
|
||||
filter=options.filter,
|
||||
reverse=reverse,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import json
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException
|
||||
|
|
@ -102,13 +101,13 @@ async def create_message_for_session(
|
|||
raise HTTPException(status_code=404, detail="Session not found") from None
|
||||
|
||||
|
||||
@router.get("", response_model=Page[schemas.Message])
|
||||
@router.post("/list", response_model=Page[schemas.Message])
|
||||
async def get_messages(
|
||||
app_id: str,
|
||||
user_id: str,
|
||||
session_id: str,
|
||||
options: schemas.MessageGet,
|
||||
reverse: Optional[bool] = False,
|
||||
filter: Optional[str] = None,
|
||||
db=db,
|
||||
):
|
||||
"""Get all messages for a session
|
||||
|
|
@ -128,9 +127,9 @@ async def get_messages(
|
|||
|
||||
"""
|
||||
try:
|
||||
data = None
|
||||
if filter is not None:
|
||||
data = json.loads(filter)
|
||||
filter = options.filter
|
||||
if options.filter == {}:
|
||||
filter = None
|
||||
return await paginate(
|
||||
db,
|
||||
await crud.get_messages(
|
||||
|
|
@ -138,7 +137,7 @@ async def get_messages(
|
|||
app_id=app_id,
|
||||
user_id=user_id,
|
||||
session_id=session_id,
|
||||
filter=data,
|
||||
filter=filter,
|
||||
reverse=reverse,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
import json
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from fastapi_pagination import Page
|
||||
from fastapi_pagination.ext.sqlalchemy import paginate
|
||||
|
||||
|
|
@ -58,15 +57,13 @@ async def create_metamessage(
|
|||
raise HTTPException(status_code=404, detail="Session not found") from None
|
||||
|
||||
|
||||
@router.get("", response_model=Page[schemas.Metamessage])
|
||||
@router.post("/list", response_model=Page[schemas.Metamessage])
|
||||
async def get_metamessages(
|
||||
app_id: str,
|
||||
user_id: str,
|
||||
session_id: str,
|
||||
message_id: Optional[str] = None,
|
||||
metamessage_type: Optional[str] = None,
|
||||
options: schemas.MetamessageGet,
|
||||
reverse: Optional[bool] = False,
|
||||
filter: Optional[str] = None,
|
||||
db=db,
|
||||
):
|
||||
"""Get all messages for a session
|
||||
|
|
@ -86,9 +83,6 @@ async def get_metamessages(
|
|||
|
||||
"""
|
||||
try:
|
||||
data = None
|
||||
if filter is not None:
|
||||
data = json.loads(filter)
|
||||
return await paginate(
|
||||
db,
|
||||
await crud.get_metamessages(
|
||||
|
|
@ -96,9 +90,9 @@ async def get_metamessages(
|
|||
app_id=app_id,
|
||||
user_id=user_id,
|
||||
session_id=session_id,
|
||||
message_id=message_id,
|
||||
metamessage_type=metamessage_type,
|
||||
filter=data,
|
||||
message_id=options.message_id,
|
||||
metamessage_type=options.metamessage_type,
|
||||
filter=options.filter,
|
||||
reverse=reverse,
|
||||
),
|
||||
)
|
||||
|
|
@ -106,13 +100,12 @@ async def get_metamessages(
|
|||
raise HTTPException(status_code=404, detail="Session not found") from None
|
||||
|
||||
|
||||
@router_user_level.get("", response_model=Page[schemas.Metamessage])
|
||||
@router_user_level.post("/list", response_model=Page[schemas.Metamessage])
|
||||
async def get_metamessages_by_user(
|
||||
app_id: str,
|
||||
user_id: str,
|
||||
metamessage_type: Optional[str] = None,
|
||||
options: schemas.MetamessageGetUserLevel,
|
||||
reverse: Optional[bool] = False,
|
||||
filter: Optional[str] = None,
|
||||
db=db,
|
||||
):
|
||||
"""Paginate through the user metamessages for a user
|
||||
|
|
@ -130,18 +123,15 @@ async def get_metamessages_by_user(
|
|||
|
||||
"""
|
||||
try:
|
||||
data = None
|
||||
if filter is not None:
|
||||
data = json.loads(filter)
|
||||
return await paginate(
|
||||
db,
|
||||
await crud.get_metamessages(
|
||||
db,
|
||||
app_id=app_id,
|
||||
user_id=user_id,
|
||||
metamessage_type=metamessage_type,
|
||||
metamessage_type=options.metamessage_type,
|
||||
reverse=reverse,
|
||||
filter=data,
|
||||
filter=options.filter,
|
||||
),
|
||||
)
|
||||
except ValueError:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import json
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
|
|
@ -17,13 +16,12 @@ router = APIRouter(
|
|||
)
|
||||
|
||||
|
||||
@router.get("", response_model=Page[schemas.Session])
|
||||
@router.post("/list", response_model=Page[schemas.Session])
|
||||
async def get_sessions(
|
||||
app_id: str,
|
||||
user_id: str,
|
||||
is_active: Optional[bool] = False,
|
||||
options: schemas.SessionGet,
|
||||
reverse: Optional[bool] = False,
|
||||
filter: Optional[str] = None,
|
||||
db=db,
|
||||
):
|
||||
"""Get All Sessions for a User
|
||||
|
|
@ -37,11 +35,6 @@ async def get_sessions(
|
|||
list[schemas.Session]: List of Session objects
|
||||
|
||||
"""
|
||||
|
||||
data = None
|
||||
if filter is not None:
|
||||
data = json.loads(filter)
|
||||
|
||||
return await paginate(
|
||||
db,
|
||||
await crud.get_sessions(
|
||||
|
|
@ -49,8 +42,8 @@ async def get_sessions(
|
|||
app_id=app_id,
|
||||
user_id=user_id,
|
||||
reverse=reverse,
|
||||
is_active=is_active,
|
||||
filter=data,
|
||||
is_active=options.is_active,
|
||||
filter=options.filter,
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import json
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
|
|
@ -43,11 +42,11 @@ async def create_user(
|
|||
) from e
|
||||
|
||||
|
||||
@router.get("", response_model=Page[schemas.User])
|
||||
@router.post("/list", response_model=Page[schemas.User])
|
||||
async def get_users(
|
||||
app_id: str,
|
||||
options: schemas.UserGet,
|
||||
reverse: bool = False,
|
||||
filter: Optional[str] = None,
|
||||
db=db,
|
||||
):
|
||||
"""Get All Users for an App
|
||||
|
|
@ -60,12 +59,9 @@ async def get_users(
|
|||
list[schemas.User]: List of User objects
|
||||
|
||||
"""
|
||||
data = None
|
||||
if filter is not None:
|
||||
data = json.loads(filter)
|
||||
|
||||
return await paginate(
|
||||
db, await crud.get_users(db, app_id=app_id, reverse=reverse, filter=data)
|
||||
db,
|
||||
await crud.get_users(db, app_id=app_id, reverse=reverse, filter=options.filter),
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ class AppBase(BaseModel):
|
|||
|
||||
class AppCreate(AppBase):
|
||||
name: str
|
||||
metadata: dict | None = {}
|
||||
metadata: dict = {}
|
||||
|
||||
|
||||
class AppUpdate(AppBase):
|
||||
|
|
@ -45,7 +45,11 @@ class UserBase(BaseModel):
|
|||
|
||||
class UserCreate(UserBase):
|
||||
name: str
|
||||
metadata: dict | None = {}
|
||||
metadata: dict = {}
|
||||
|
||||
|
||||
class UserGet(UserBase):
|
||||
filter: dict | None = None
|
||||
|
||||
|
||||
class UserUpdate(UserBase):
|
||||
|
|
@ -83,7 +87,11 @@ class MessageBase(BaseModel):
|
|||
class MessageCreate(MessageBase):
|
||||
content: str
|
||||
is_user: bool
|
||||
metadata: dict | None = {}
|
||||
metadata: dict = {}
|
||||
|
||||
|
||||
class MessageGet(MessageBase):
|
||||
filter: dict | None = None
|
||||
|
||||
|
||||
class MessageUpdate(MessageBase):
|
||||
|
|
@ -119,7 +127,12 @@ class SessionBase(BaseModel):
|
|||
|
||||
|
||||
class SessionCreate(SessionBase):
|
||||
metadata: dict | None = {}
|
||||
metadata: dict = {}
|
||||
|
||||
|
||||
class SessionGet(SessionBase):
|
||||
filter: dict | None = None
|
||||
is_active: bool = False
|
||||
|
||||
|
||||
class SessionUpdate(SessionBase):
|
||||
|
|
@ -162,6 +175,17 @@ class MetamessageCreate(MetamessageBase):
|
|||
metadata: dict | None = {}
|
||||
|
||||
|
||||
class MetamessageGet(MetamessageBase):
|
||||
metamessage_type: str | None = None
|
||||
message_id: str | None = None
|
||||
filter: dict | None = None
|
||||
|
||||
|
||||
class MetamessageGetUserLevel(MessageBase):
|
||||
filter: dict | None = None
|
||||
metamessage_type: str | None = None
|
||||
|
||||
|
||||
class MetamessageUpdate(MetamessageBase):
|
||||
message_id: str
|
||||
metamessage_type: str | None = None
|
||||
|
|
@ -201,6 +225,10 @@ class CollectionCreate(CollectionBase):
|
|||
metadata: dict | None = {}
|
||||
|
||||
|
||||
class CollectionGet(CollectionBase):
|
||||
filter: dict | None = None
|
||||
|
||||
|
||||
class CollectionUpdate(CollectionBase):
|
||||
name: str | None = None
|
||||
metadata: dict | None = None
|
||||
|
|
@ -238,6 +266,10 @@ class DocumentCreate(DocumentBase):
|
|||
metadata: dict | None = {}
|
||||
|
||||
|
||||
class DocumentGet(DocumentBase):
|
||||
filter: dict | None = None
|
||||
|
||||
|
||||
class DocumentUpdate(DocumentBase):
|
||||
metadata: dict | None = None
|
||||
content: str | None = None
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ logging.basicConfig(
|
|||
stream=sys.stdout, # This ensures the output goes to stdout
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
logging.getLogger("sqlalchemy.engine.Engine").disabled = True
|
||||
|
||||
# Test database URL
|
||||
# TODO use environment variable
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import uuid
|
||||
from nanoid import generate as generate_nanoid
|
||||
|
||||
|
||||
def test_create_collection(client, sample_data) -> None:
|
||||
|
|
@ -54,6 +54,43 @@ def test_get_collection_by_name(client, sample_data) -> None:
|
|||
assert "id" in data
|
||||
|
||||
|
||||
def test_get_collections(client, sample_data) -> None:
|
||||
test_app, test_user = sample_data
|
||||
# Make Sample Collections
|
||||
client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections",
|
||||
json={"name": str(generate_nanoid()), "metadata": {"test": "key"}},
|
||||
)
|
||||
client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections",
|
||||
json={"name": str(generate_nanoid()), "metadata": {"test": "key"}},
|
||||
)
|
||||
client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections",
|
||||
json={"name": str(generate_nanoid()), "metadata": {"test": "key2"}},
|
||||
)
|
||||
|
||||
# Get the Collections
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections/list",
|
||||
json={},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert len(data["items"]) == 3
|
||||
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections/list",
|
||||
json={"filter": {"test": "key"}},
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert len(data["items"]) == 2
|
||||
assert data["items"][0]["metadata"] == {"test": "key"}
|
||||
assert data["items"][1]["metadata"] == {"test": "key"}
|
||||
|
||||
|
||||
def test_update_collection(client, sample_data) -> None:
|
||||
test_app, test_user = sample_data
|
||||
# Make the collection
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
from nanoid import generate as generate_nanoid
|
||||
|
||||
|
||||
def test_create_document(client, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
# Create a collection
|
||||
|
|
@ -46,6 +49,48 @@ def test_get_document(client, sample_data):
|
|||
assert "id" in data
|
||||
|
||||
|
||||
def test_get_documents(client, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
# Create a collection
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections",
|
||||
json={"name": str(generate_nanoid()), "metadata": {}},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
collection = response.json()
|
||||
# Create a document
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections/{collection['id']}/documents",
|
||||
json={"content": "test_text", "metadata": {"test": "key"}},
|
||||
)
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections/{collection['id']}/documents",
|
||||
json={"content": "test_text", "metadata": {"test": "key"}},
|
||||
)
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections/{collection['id']}/documents",
|
||||
json={"content": "test_text", "metadata": {"test": "key2"}},
|
||||
)
|
||||
# Get the documents
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections/{collection['id']}/documents/list",
|
||||
json={},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert len(data["items"]) == 3
|
||||
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/collections/{collection['id']}/documents/list",
|
||||
json={"filter": {"test": "key"}},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert len(data["items"]) == 2
|
||||
assert data["items"][0]["metadata"]["test"] == "key"
|
||||
assert data["items"][1]["metadata"]["test"] == "key"
|
||||
|
||||
|
||||
def test_update_document(client, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
# Create a collection
|
||||
|
|
|
|||
|
|
@ -40,8 +40,9 @@ async def test_get_messages(client, db_session, sample_data):
|
|||
db_session.add(test_message)
|
||||
await db_session.commit()
|
||||
|
||||
response = client.get(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages"
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages/list",
|
||||
json={},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
|
|
@ -52,6 +53,43 @@ async def test_get_messages(client, db_session, sample_data):
|
|||
assert data["items"][0]["metadata"] == {}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_filtered_messages(client, db_session, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
# Create a test session and message
|
||||
test_session = models.Session(user_id=test_user.public_id)
|
||||
db_session.add(test_session)
|
||||
await db_session.commit()
|
||||
test_message = models.Message(
|
||||
session_id=test_session.public_id,
|
||||
content="Test message",
|
||||
is_user=True,
|
||||
h_metadata={"key": "value"},
|
||||
)
|
||||
test_message2 = models.Message(
|
||||
session_id=test_session.public_id,
|
||||
content="Test message",
|
||||
is_user=True,
|
||||
h_metadata={"key": "value2"},
|
||||
)
|
||||
db_session.add(test_message)
|
||||
db_session.add(test_message2)
|
||||
await db_session.commit()
|
||||
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/messages/list",
|
||||
json={"filter": {"key": "value2"}},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
print(data)
|
||||
assert "items" in data
|
||||
assert len(data["items"]) > 0
|
||||
assert data["items"][0]["content"] == "Test message"
|
||||
assert data["items"][0]["is_user"] is True
|
||||
assert data["items"][0]["metadata"] == {"key": "value2"}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_update_message(client, db_session, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ async def test_get_metamessage(client, db_session, sample_data):
|
|||
await db_session.commit()
|
||||
|
||||
response = client.get(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/metamessages/{test_metamessage.public_id}?message_id={test_message.public_id}"
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/metamessages/{test_metamessage.public_id}/?message_id={test_message.public_id}"
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
|
|
@ -107,8 +107,9 @@ async def test_get_metamessages(client, db_session, sample_data):
|
|||
db_session.add(test_metamessage_4)
|
||||
await db_session.commit()
|
||||
|
||||
response = client.get(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/metamessages?metamessage_type=test_type"
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}/metamessages/list",
|
||||
json={"metamessage_type": "test_type"},
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
|
|
@ -179,8 +180,9 @@ async def test_get_metamessage_by_user(client, db_session, sample_data):
|
|||
db_session.add(test_metamessage_4)
|
||||
await db_session.commit()
|
||||
|
||||
response = client.get(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/metamessages?metamessage_type=test_type"
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/metamessages/list",
|
||||
json={"metamessage_type": "test_type"},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
|
|
|
|||
|
|
@ -4,6 +4,18 @@ from src import models # Import your SQLAlchemy models
|
|||
|
||||
|
||||
def test_create_session(client, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions",
|
||||
json={},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["metadata"] == {}
|
||||
assert "id" in data
|
||||
|
||||
|
||||
def test_create_session_with_metadata(client, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions",
|
||||
|
|
@ -32,8 +44,9 @@ async def test_get_sessions(client, db_session, sample_data):
|
|||
assert data["metadata"] == {"test_key": "test_value"}
|
||||
assert "id" in data
|
||||
|
||||
response = client.get(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions"
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/list",
|
||||
json={"filter": {"test_key": "test_value"}},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
|
|
@ -42,6 +55,40 @@ async def test_get_sessions(client, db_session, sample_data):
|
|||
assert data["items"][0]["metadata"] == {"test_key": "test_value"}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_empty_update_session(client, db_session, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
# Create a test session
|
||||
test_session = models.Session(user_id=test_user.public_id, metadata={})
|
||||
db_session.add(test_session)
|
||||
await db_session.commit()
|
||||
|
||||
response = client.put(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}",
|
||||
json={},
|
||||
)
|
||||
assert response.status_code == 400
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_update_delete_metadata(client, db_session, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
# Create a test session
|
||||
test_session = models.Session(
|
||||
user_id=test_user.public_id, metadata={"default": "value"}
|
||||
)
|
||||
db_session.add(test_session)
|
||||
await db_session.commit()
|
||||
|
||||
response = client.put(
|
||||
f"/apps/{test_app.public_id}/users/{test_user.public_id}/sessions/{test_session.public_id}",
|
||||
json={"metadata": {}},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["metadata"] == {}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_update_session(client, db_session, sample_data):
|
||||
test_app, test_user = sample_data
|
||||
|
|
|
|||
|
|
@ -45,13 +45,30 @@ def test_get_or_create_user(client, sample_data):
|
|||
assert "id" in data
|
||||
|
||||
|
||||
# def test_get_users(client, sample_data):
|
||||
# test_app, _ = sample_data
|
||||
# response = client.get(f"/apps/{test_app.public_id}/users")
|
||||
# assert response.status_code == 200
|
||||
# data = response.json()
|
||||
# assert "items" in data
|
||||
# assert len(data["items"]) > 0
|
||||
def test_get_users(client, sample_data):
|
||||
test_app, _ = sample_data
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users",
|
||||
json={"name": str(generate_nanoid()), "metadata": {"user_key": "user_value"}},
|
||||
)
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users",
|
||||
json={"name": str(generate_nanoid()), "metadata": {"user_key": "user_value"}},
|
||||
)
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users",
|
||||
json={"name": str(generate_nanoid()), "metadata": {"user_key": "user_value2"}},
|
||||
)
|
||||
response = client.post(
|
||||
f"/apps/{test_app.public_id}/users/list",
|
||||
json={"filter": {"user_key": "user_value"}},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert "items" in data
|
||||
assert len(data["items"]) > 0
|
||||
assert len(data["items"]) == 2
|
||||
assert data["items"][0]["metadata"] == {"user_key": "user_value"}
|
||||
|
||||
|
||||
def test_update_user(client, sample_data):
|
||||
|
|
|
|||
391
uv.lock
391
uv.lock
|
|
@ -48,18 +48,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d", size = 90377 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "asgiref"
|
||||
version = "3.8.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "attrs"
|
||||
version = "24.2.0"
|
||||
|
|
@ -252,18 +240,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/29/f7/80e7a36288785bf0a44f6fa2a778dae85d34d8761f4c0996066f3756bdf5/coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181", size = 198831 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "deprecated"
|
||||
version = "1.2.14"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "wrapt" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/92/14/1e41f504a246fc224d2ac264c227975427a85caf37c3979979edb9b1b232/Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3", size = 2974416 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", size = 9561 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "distro"
|
||||
version = "1.9.0"
|
||||
|
|
@ -377,18 +353,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b", size = 179253 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "googleapis-common-protos"
|
||||
version = "1.65.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "protobuf" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/53/3b/1599ceafa875ffb951480c8c74f4b77646a6b80e80970698f2aa93c216ce/googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0", size = 113657 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/ec/08/49bfe7cf737952cc1a9c43e80cc258ed45dad7f183c5b8276fc94cb3862d/googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63", size = 220890 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "greenlet"
|
||||
version = "3.1.1"
|
||||
|
|
@ -450,59 +414,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/ae/02/e7d0aef2354a38709b764df50b2b83608f0621493e47f47694eb80922822/greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", size = 298306 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "grpcio"
|
||||
version = "1.67.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ec/ae/3c47d71ab4abd4bd60a7e2806071fe0a4b6937b9eabe522291787087ea1f/grpcio-1.67.0.tar.gz", hash = "sha256:e090b2553e0da1c875449c8e75073dd4415dd71c9bde6a406240fdf4c0ee467c", size = 12569330 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/46/da/c4a24a5245aba95c411a21c7525a41113b669b646a79ab8523551c4185cf/grpcio-1.67.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:bd79929b3bb96b54df1296cd3bf4d2b770bd1df6c2bdf549b49bab286b925cdc", size = 5108503 },
|
||||
{ url = "https://files.pythonhosted.org/packages/08/29/1f46e9d2d9d34f4117f7dccfd7e222f1b0ea1fa1c5bd319e7b7017f4bc32/grpcio-1.67.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:16724ffc956ea42967f5758c2f043faef43cb7e48a51948ab593570570d1e68b", size = 10930122 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f0/ff/20774848a070b544c52a6e198d4bb439528bd440678f3bd3f65a41a9d804/grpcio-1.67.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:2b7183c80b602b0ad816315d66f2fb7887614ead950416d60913a9a71c12560d", size = 5630547 },
|
||||
{ url = "https://files.pythonhosted.org/packages/60/05/4986994d96011c6b853f2f40ea2bf0c7ed97fc3a2391d004064697de01b7/grpcio-1.67.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe32b45dd6d118f5ea2e5deaed417d8a14976325c93812dd831908522b402c9", size = 6237824 },
|
||||
{ url = "https://files.pythonhosted.org/packages/fa/1c/772a501cd18baffba5f9eeb54ce353c8749e9217c262bb7953427417db40/grpcio-1.67.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe89295219b9c9e47780a0f1c75ca44211e706d1c598242249fe717af3385ec8", size = 5881526 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6c/38/6f0243ce5b5f2b5f4cc34c8e0ba6b466db4b333bfb643f61e459bbe0b92c/grpcio-1.67.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa8d025fae1595a207b4e47c2e087cb88d47008494db258ac561c00877d4c8f8", size = 6582793 },
|
||||
{ url = "https://files.pythonhosted.org/packages/ed/9f/c489cd122618ea808593d20a47ff68722b3c99c030c175550b85bb256fb0/grpcio-1.67.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f95e15db43e75a534420e04822df91f645664bf4ad21dfaad7d51773c80e6bb4", size = 6162111 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/a6/6384d59d26a5dbc7adffc0abf3d88107494ba3eb92bc9bd3f7fc7c18679d/grpcio-1.67.0-cp310-cp310-win32.whl", hash = "sha256:a6b9a5c18863fd4b6624a42e2712103fb0f57799a3b29651c0e5b8119a519d65", size = 3614488 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6b/20/5da50579c2b6341490459a44a97fd53d23a5c0e928bea78cf80ce67f8b1a/grpcio-1.67.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6eb68493a05d38b426604e1dc93bfc0137c4157f7ab4fac5771fd9a104bbaa6", size = 4350825 },
|
||||
{ url = "https://files.pythonhosted.org/packages/86/a2/5d3b07fe984e3eab147ebe141f0111ab19eb0c27dfdf19360c3de60a0341/grpcio-1.67.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:e91d154689639932305b6ea6f45c6e46bb51ecc8ea77c10ef25aa77f75443ad4", size = 5116425 },
|
||||
{ url = "https://files.pythonhosted.org/packages/79/23/18730cca0d18ffde1de132a9230745a5c113cbc6dd8cde71c2288a21f5a3/grpcio-1.67.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb204a742997277da678611a809a8409657b1398aaeebf73b3d9563b7d154c13", size = 11005387 },
|
||||
{ url = "https://files.pythonhosted.org/packages/33/30/f8fa49eb3f30e4c730f3f37aa33f49cbad592906b93a9445e8ceedeaa96c/grpcio-1.67.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:ae6de510f670137e755eb2a74b04d1041e7210af2444103c8c95f193340d17ee", size = 5627195 },
|
||||
{ url = "https://files.pythonhosted.org/packages/80/39/e1f7ac3938ac7763732d545fcfdcff23ed8e993513321b3d21cae146beb4/grpcio-1.67.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74b900566bdf68241118f2918d312d3bf554b2ce0b12b90178091ea7d0a17b3d", size = 6237935 },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/a5/b99333f0a9f4599468bb4b7cb59aa1a7e2a2f67a59b5b13fdc7ea0acf0ad/grpcio-1.67.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4e95e43447a02aa603abcc6b5e727d093d161a869c83b073f50b9390ecf0fa8", size = 5879332 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/22/b9800736805c5bddd0c9a9d3b1556c682a0dee8ae63051c565d888a2bc87/grpcio-1.67.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bb94e66cd8f0baf29bd3184b6aa09aeb1a660f9ec3d85da615c5003154bc2bf", size = 6578617 },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/a5/dd2e69777767c321ddaa886047dccc555f09f4fcdfc5164e440f1f4b589d/grpcio-1.67.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:82e5bd4b67b17c8c597273663794a6a46a45e44165b960517fe6d8a2f7f16d23", size = 6160509 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/5a/b12f69f687d9eb593405fa450a24ba4ee8f6058c6c43d1995bed023c6a61/grpcio-1.67.0-cp311-cp311-win32.whl", hash = "sha256:7fc1d2b9fd549264ae585026b266ac2db53735510a207381be509c315b4af4e8", size = 3614902 },
|
||||
{ url = "https://files.pythonhosted.org/packages/aa/81/5a3503b9757a89c7d1fa7672b788fcbcafce91cdc94a3e0c53513a3201d7/grpcio-1.67.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac11ecb34a86b831239cc38245403a8de25037b448464f95c3315819e7519772", size = 4352547 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b0/2d/b2a783f1d93735a259676de5558ef019ac3511e894b8e9d224edc0d7d034/grpcio-1.67.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:227316b5631260e0bef8a3ce04fa7db4cc81756fea1258b007950b6efc90c05d", size = 5086495 },
|
||||
{ url = "https://files.pythonhosted.org/packages/7b/13/c1f537a88dad543ca0a7be4dfee80a21b3b02b7df27750997777355e5840/grpcio-1.67.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d90cfdafcf4b45a7a076e3e2a58e7bc3d59c698c4f6470b0bb13a4d869cf2273", size = 10979109 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/83/d7cb72f2202fe8d608d25c7e9d6d75184bf6ef658688c818821add102211/grpcio-1.67.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:77196216d5dd6f99af1c51e235af2dd339159f657280e65ce7e12c1a8feffd1d", size = 5586952 },
|
||||
{ url = "https://files.pythonhosted.org/packages/e5/18/8df585d0158af9e2b46ee2388bdb21de0e7f5bf4a47a86a861ebdbf947b5/grpcio-1.67.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c05a26a0f7047f720da41dc49406b395c1470eef44ff7e2c506a47ac2c0591", size = 6212460 },
|
||||
{ url = "https://files.pythonhosted.org/packages/47/46/027f8943113961784ce1eb69a28544d9a62ffb286332820ba634d979c91c/grpcio-1.67.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3840994689cc8cbb73d60485c594424ad8adb56c71a30d8948d6453083624b52", size = 5849002 },
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/26/fb19d5bc277e665382c835d7af1f8c1e3197576eed76327824d79e2a4bef/grpcio-1.67.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a1e03c3102b6451028d5dc9f8591131d6ab3c8a0e023d94c28cb930ed4b5f81", size = 6568222 },
|
||||
{ url = "https://files.pythonhosted.org/packages/e0/cc/387efa986f166c068d48331c699e6ee662a057371065f35d3ca1bc09d799/grpcio-1.67.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:682968427a63d898759474e3b3178d42546e878fdce034fd7474ef75143b64e3", size = 6148002 },
|
||||
{ url = "https://files.pythonhosted.org/packages/24/57/529504e3e3e910f0537a0a36184cb7241d0d111109d6588096a9f8c139bf/grpcio-1.67.0-cp312-cp312-win32.whl", hash = "sha256:d01793653248f49cf47e5695e0a79805b1d9d4eacef85b310118ba1dfcd1b955", size = 3596220 },
|
||||
{ url = "https://files.pythonhosted.org/packages/1d/1f/acf03ee901313446d52c3916d527d4981de9f6f3edc69267d05509dcfa7b/grpcio-1.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:985b2686f786f3e20326c4367eebdaed3e7aa65848260ff0c6644f817042cb15", size = 4343545 },
|
||||
{ url = "https://files.pythonhosted.org/packages/7a/e7/cc7feccb18ef0b5aa67ccb7859a091fa836c5d361a0109b9fca578e59e64/grpcio-1.67.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:8c9a35b8bc50db35ab8e3e02a4f2a35cfba46c8705c3911c34ce343bd777813a", size = 5087009 },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/56/10175f4b1600b16e601680df053361924a9fcd9e1c0ad9b8bd1ba2b4c864/grpcio-1.67.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:42199e704095b62688998c2d84c89e59a26a7d5d32eed86d43dc90e7a3bd04aa", size = 10937553 },
|
||||
{ url = "https://files.pythonhosted.org/packages/aa/85/115538b1aeb09d66c6e637608a56eddacd59eb71ab0161ad59172c01d436/grpcio-1.67.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c4c425f440fb81f8d0237c07b9322fc0fb6ee2b29fbef5f62a322ff8fcce240d", size = 5586507 },
|
||||
{ url = "https://files.pythonhosted.org/packages/0f/db/f402a455e287154683235183c2843c27fffe2fc03fa4c45b57dd90011401/grpcio-1.67.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:323741b6699cd2b04a71cb38f502db98f90532e8a40cb675393d248126a268af", size = 6211948 },
|
||||
{ url = "https://files.pythonhosted.org/packages/92/e4/5957806105aad556f7df6a420b6c69044b6f707926392118772a8ba96de4/grpcio-1.67.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:662c8e105c5e5cee0317d500eb186ed7a93229586e431c1bf0c9236c2407352c", size = 5849392 },
|
||||
{ url = "https://files.pythonhosted.org/packages/88/ab/c496a406f4682c56e933bef6b0ed22b9eaec84c6915f83d5cddd94126e16/grpcio-1.67.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f6bd2ab135c64a4d1e9e44679a616c9bc944547357c830fafea5c3caa3de5153", size = 6571359 },
|
||||
{ url = "https://files.pythonhosted.org/packages/9e/a8/96b3ef565791d7282c300c07c2a7080471311e7d5a239db15678aaac47eb/grpcio-1.67.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2f55c1e0e2ae9bdd23b3c63459ee4c06d223b68aeb1961d83c48fb63dc29bc03", size = 6147905 },
|
||||
{ url = "https://files.pythonhosted.org/packages/cd/b7/846cc563209ff5af88bc7dcb269948210674c2f743e7fd8e1a2ad9708e89/grpcio-1.67.0-cp313-cp313-win32.whl", hash = "sha256:fd6bc27861e460fe28e94226e3673d46e294ca4673d46b224428d197c5935e69", size = 3594603 },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/74/49d27908b369b72fd3373ec0f16d7f58614fb7101cb38b266afeab846cca/grpcio-1.67.0-cp313-cp313-win_amd64.whl", hash = "sha256:cf51d28063338608cd8d3cd64677e922134837902b70ce00dad7f116e3998210", size = 4345468 },
|
||||
{ url = "https://files.pythonhosted.org/packages/56/6d/8d3ee8d7bbac91605beced83ebe8f12f007dd5880eef8e77d3b24e271ec7/grpcio-1.67.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:62492bd534979e6d7127b8a6b29093161a742dee3875873e01964049d5250a74", size = 5108289 },
|
||||
{ url = "https://files.pythonhosted.org/packages/c1/57/72897f615b4970d8df81f73d9f62ec52b8bf426573be8e28b258001beba1/grpcio-1.67.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eef1dce9d1a46119fd09f9a992cf6ab9d9178b696382439446ca5f399d7b96fe", size = 10993703 },
|
||||
{ url = "https://files.pythonhosted.org/packages/4e/fa/5cdb964d3e616efe032cf61f6dcc2a2ecf7032094c826b72d1d314adbcd7/grpcio-1.67.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f623c57a5321461c84498a99dddf9d13dac0e40ee056d884d6ec4ebcab647a78", size = 5630134 },
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/10/127ecd1133b7f541228a937d3769a4c8fbcb47742eea2815d647518e1cf3/grpcio-1.67.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54d16383044e681f8beb50f905249e4e7261dd169d4aaf6e52eab67b01cbbbe2", size = 6238899 },
|
||||
{ url = "https://files.pythonhosted.org/packages/af/dc/c740006554d0a3430e9909efc3a1269df170aca690774355d912ccb809b4/grpcio-1.67.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a44e572fb762c668e4812156b81835f7aba8a721b027e2d4bb29fb50ff4d33", size = 5881489 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/8a/067bb3a6ac2951e3e751971d9c7ec92b6e26fade51d2f01a2b409ff1e570/grpcio-1.67.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:391df8b0faac84d42f5b8dfc65f5152c48ed914e13c522fd05f2aca211f8bfad", size = 6584282 },
|
||||
{ url = "https://files.pythonhosted.org/packages/28/fe/538fec0df3884bcf66daab497aa43d67d3562568851b879b427e5fb5f0e5/grpcio-1.67.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfd9306511fdfc623a1ba1dc3bc07fbd24e6cfbe3c28b4d1e05177baa2f99617", size = 6161337 },
|
||||
{ url = "https://files.pythonhosted.org/packages/cc/99/c8fbe867c9d44d7d542c828a4220785d389e177369463d03dd0a85551c63/grpcio-1.67.0-cp39-cp39-win32.whl", hash = "sha256:30d47dbacfd20cbd0c8be9bfa52fdb833b395d4ec32fe5cff7220afc05d08571", size = 3615233 },
|
||||
{ url = "https://files.pythonhosted.org/packages/fe/bb/a4257cfdbef14b0c6e2dfa6b8c0242dae460d276dee34eba9941c563cb83/grpcio-1.67.0-cp39-cp39-win_amd64.whl", hash = "sha256:f55f077685f61f0fbd06ea355142b71e47e4a26d2d678b3ba27248abfe67163a", size = 4351210 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h11"
|
||||
version = "0.14.0"
|
||||
|
|
@ -524,11 +435,6 @@ dependencies = [
|
|||
{ name = "httpx" },
|
||||
{ name = "nanoid" },
|
||||
{ name = "openai" },
|
||||
{ name = "opentelemetry-exporter-otlp" },
|
||||
{ name = "opentelemetry-instrumentation-fastapi" },
|
||||
{ name = "opentelemetry-instrumentation-logging" },
|
||||
{ name = "opentelemetry-instrumentation-sqlalchemy" },
|
||||
{ name = "opentelemetry-sdk" },
|
||||
{ name = "pgvector" },
|
||||
{ name = "psycopg", extra = ["binary"] },
|
||||
{ name = "python-dotenv" },
|
||||
|
|
@ -556,11 +462,6 @@ requires-dist = [
|
|||
{ name = "httpx", specifier = ">=0.27.0" },
|
||||
{ name = "nanoid", specifier = ">=2.0.0" },
|
||||
{ name = "openai", specifier = ">=1.43.0" },
|
||||
{ name = "opentelemetry-exporter-otlp", specifier = ">=1.24.0" },
|
||||
{ name = "opentelemetry-instrumentation-fastapi", specifier = ">=0.45b0" },
|
||||
{ name = "opentelemetry-instrumentation-logging", specifier = ">=0.45b0" },
|
||||
{ name = "opentelemetry-instrumentation-sqlalchemy", specifier = ">=0.45b0" },
|
||||
{ name = "opentelemetry-sdk", specifier = ">=1.24.0" },
|
||||
{ name = "pgvector", specifier = ">=0.2.5" },
|
||||
{ name = "psycopg", extras = ["binary"], specifier = ">=3.1.19" },
|
||||
{ name = "python-dotenv", specifier = ">=1.0.0" },
|
||||
|
|
@ -678,18 +579,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "importlib-metadata"
|
||||
version = "8.4.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "zipp" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5", size = 54320 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/c0/14/362d31bf1076b21e1bcdcb0dc61944822ff263937b804a79231df2774d28/importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", size = 26269 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iniconfig"
|
||||
version = "2.0.0"
|
||||
|
|
@ -965,203 +854,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/39/1e/9dc3ccee95d0e16e54e353d3c355bb7cc506d56a2dbb0a07bc739cc48eac/openai-1.52.0-py3-none-any.whl", hash = "sha256:0c249f20920183b0a2ca4f7dba7b0452df3ecd0fa7985eb1d91ad884bc3ced9c", size = 386947 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-api"
|
||||
version = "1.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "deprecated" },
|
||||
{ name = "importlib-metadata" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/c9/83/93114b6de85a98963aec218a51509a52ed3f8de918fe91eb0f7299805c3f/opentelemetry_api-1.27.0.tar.gz", hash = "sha256:ed673583eaa5f81b5ce5e86ef7cdaf622f88ef65f0b9aab40b843dcae5bef342", size = 62693 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/fb/1f/737dcdbc9fea2fa96c1b392ae47275165a7c641663fbb08a8d252968eed2/opentelemetry_api-1.27.0-py3-none-any.whl", hash = "sha256:953d5871815e7c30c81b56d910c707588000fff7a3ca1c73e6531911d53065e7", size = 63970 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-exporter-otlp"
|
||||
version = "1.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "opentelemetry-exporter-otlp-proto-grpc" },
|
||||
{ name = "opentelemetry-exporter-otlp-proto-http" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/fc/d3/8156cc14e8f4573a3572ee7f30badc7aabd02961a09acc72ab5f2c789ef1/opentelemetry_exporter_otlp-1.27.0.tar.gz", hash = "sha256:4a599459e623868cc95d933c301199c2367e530f089750e115599fccd67cb2a1", size = 6166 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/59/6d/95e1fc2c8d945a734db32e87a5aa7a804f847c1657a21351df9338bd1c9c/opentelemetry_exporter_otlp-1.27.0-py3-none-any.whl", hash = "sha256:7688791cbdd951d71eb6445951d1cfbb7b6b2d7ee5948fac805d404802931145", size = 7001 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-exporter-otlp-proto-common"
|
||||
version = "1.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "opentelemetry-proto" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cd/2e/7eaf4ba595fb5213cf639c9158dfb64aacb2e4c7d74bfa664af89fa111f4/opentelemetry_exporter_otlp_proto_common-1.27.0.tar.gz", hash = "sha256:159d27cf49f359e3798c4c3eb8da6ef4020e292571bd8c5604a2a573231dd5c8", size = 17860 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/41/27/4610ab3d9bb3cde4309b6505f98b3aabca04a26aa480aa18cede23149837/opentelemetry_exporter_otlp_proto_common-1.27.0-py3-none-any.whl", hash = "sha256:675db7fffcb60946f3a5c43e17d1168a3307a94a930ecf8d2ea1f286f3d4f79a", size = 17848 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-exporter-otlp-proto-grpc"
|
||||
version = "1.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "deprecated" },
|
||||
{ name = "googleapis-common-protos" },
|
||||
{ name = "grpcio" },
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "opentelemetry-exporter-otlp-proto-common" },
|
||||
{ name = "opentelemetry-proto" },
|
||||
{ name = "opentelemetry-sdk" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/a1/d0/c1e375b292df26e0ffebf194e82cd197e4c26cc298582bda626ce3ce74c5/opentelemetry_exporter_otlp_proto_grpc-1.27.0.tar.gz", hash = "sha256:af6f72f76bcf425dfb5ad11c1a6d6eca2863b91e63575f89bb7b4b55099d968f", size = 26244 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/8d/80/32217460c2c64c0568cea38410124ff680a9b65f6732867bbf857c4d8626/opentelemetry_exporter_otlp_proto_grpc-1.27.0-py3-none-any.whl", hash = "sha256:56b5bbd5d61aab05e300d9d62a6b3c134827bbd28d0b12f2649c2da368006c9e", size = 18541 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-exporter-otlp-proto-http"
|
||||
version = "1.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "deprecated" },
|
||||
{ name = "googleapis-common-protos" },
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "opentelemetry-exporter-otlp-proto-common" },
|
||||
{ name = "opentelemetry-proto" },
|
||||
{ name = "opentelemetry-sdk" },
|
||||
{ name = "requests" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/31/0a/f05c55e8913bf58a033583f2580a0ec31a5f4cf2beacc9e286dcb74d6979/opentelemetry_exporter_otlp_proto_http-1.27.0.tar.gz", hash = "sha256:2103479092d8eb18f61f3fbff084f67cc7f2d4a7d37e75304b8b56c1d09ebef5", size = 15059 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2d/8d/4755884afc0b1db6000527cac0ca17273063b6142c773ce4ecd307a82e72/opentelemetry_exporter_otlp_proto_http-1.27.0-py3-none-any.whl", hash = "sha256:688027575c9da42e179a69fe17e2d1eba9b14d81de8d13553a21d3114f3b4d75", size = 17203 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-instrumentation"
|
||||
version = "0.48b0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "setuptools" },
|
||||
{ name = "wrapt" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/04/0e/d9394839af5d55c8feb3b22cd11138b953b49739b20678ca96289e30f904/opentelemetry_instrumentation-0.48b0.tar.gz", hash = "sha256:94929685d906380743a71c3970f76b5f07476eea1834abd5dd9d17abfe23cc35", size = 24724 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/0a/7f/405c41d4f359121376c9d5117dcf68149b8122d3f6c718996d037bd4d800/opentelemetry_instrumentation-0.48b0-py3-none-any.whl", hash = "sha256:a69750dc4ba6a5c3eb67986a337185a25b739966d80479befe37b546fc870b44", size = 29449 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-instrumentation-asgi"
|
||||
version = "0.48b0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "asgiref" },
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "opentelemetry-instrumentation" },
|
||||
{ name = "opentelemetry-semantic-conventions" },
|
||||
{ name = "opentelemetry-util-http" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/44/ac/fd3d40bab3234ec3f5c052a815100676baaae1832fa1067935f11e5c59c6/opentelemetry_instrumentation_asgi-0.48b0.tar.gz", hash = "sha256:04c32174b23c7fa72ddfe192dad874954968a6a924608079af9952964ecdf785", size = 23435 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/db/74/a0e0d38622856597dd8e630f2bd793760485eb165708e11b8be1696bbb5a/opentelemetry_instrumentation_asgi-0.48b0-py3-none-any.whl", hash = "sha256:ddb1b5fc800ae66e85a4e2eca4d9ecd66367a8c7b556169d9e7b57e10676e44d", size = 15958 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-instrumentation-fastapi"
|
||||
version = "0.48b0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "opentelemetry-instrumentation" },
|
||||
{ name = "opentelemetry-instrumentation-asgi" },
|
||||
{ name = "opentelemetry-semantic-conventions" },
|
||||
{ name = "opentelemetry-util-http" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/58/20/43477da5850ef2cd3792715d442aecd051e885e0603b6ee5783b2104ba8f/opentelemetry_instrumentation_fastapi-0.48b0.tar.gz", hash = "sha256:21a72563ea412c0b535815aeed75fc580240f1f02ebc72381cfab672648637a2", size = 18497 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/ee/50/745ab075a3041b7a5f29a579d2c28eaad54f64b4589d8f9fd364c62cf0f3/opentelemetry_instrumentation_fastapi-0.48b0-py3-none-any.whl", hash = "sha256:afeb820a59e139d3e5d96619600f11ce0187658b8ae9e3480857dd790bc024f2", size = 11777 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-instrumentation-logging"
|
||||
version = "0.48b0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "opentelemetry-instrumentation" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/22/3c/0d329da676f17ad3b527cdb8accf63681d99a6a458d355e4559fa31cd4a7/opentelemetry_instrumentation_logging-0.48b0.tar.gz", hash = "sha256:529eb13eedf57d6b2f94e20e996271db2957b817b9457fe4796365d6d4238dec", size = 9729 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e0/c5/119676ba0bae61887b812d5777a521327a2335ff350cbbc8864e4200fdd7/opentelemetry_instrumentation_logging-0.48b0-py3-none-any.whl", hash = "sha256:75e5357d9b8c12071a19e1fef664dc1f430ef45874445c324ba4439a00972dc0", size = 12145 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-instrumentation-sqlalchemy"
|
||||
version = "0.48b0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "opentelemetry-instrumentation" },
|
||||
{ name = "opentelemetry-semantic-conventions" },
|
||||
{ name = "packaging" },
|
||||
{ name = "wrapt" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/4c/77/3fcebbca8bd729da50dc2130d8ca869a235aa5483a85ef06c5dc8643476b/opentelemetry_instrumentation_sqlalchemy-0.48b0.tar.gz", hash = "sha256:dbf2d5a755b470e64e5e2762b56f8d56313787e4c7d71a87fe25c33f48eb3493", size = 13194 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e1/84/4b6f1e9e9f83a52d966e91963f5a8424edc4a3d5ea32854c96c2d1618284/opentelemetry_instrumentation_sqlalchemy-0.48b0-py3-none-any.whl", hash = "sha256:625848a34aa5770cb4b1dcdbd95afce4307a0230338711101325261d739f391f", size = 13360 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-proto"
|
||||
version = "1.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "protobuf" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/9a/59/959f0beea798ae0ee9c979b90f220736fbec924eedbefc60ca581232e659/opentelemetry_proto-1.27.0.tar.gz", hash = "sha256:33c9345d91dafd8a74fc3d7576c5a38f18b7fdf8d02983ac67485386132aedd6", size = 34749 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/94/56/3d2d826834209b19a5141eed717f7922150224d1a982385d19a9444cbf8d/opentelemetry_proto-1.27.0-py3-none-any.whl", hash = "sha256:b133873de5581a50063e1e4b29cdcf0c5e253a8c2d8dc1229add20a4c3830ace", size = 52464 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-sdk"
|
||||
version = "1.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "opentelemetry-api" },
|
||||
{ name = "opentelemetry-semantic-conventions" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/0d/9a/82a6ac0f06590f3d72241a587cb8b0b751bd98728e896cc4cbd4847248e6/opentelemetry_sdk-1.27.0.tar.gz", hash = "sha256:d525017dea0ccce9ba4e0245100ec46ecdc043f2d7b8315d56b19aff0904fa6f", size = 145019 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/c1/bd/a6602e71e315055d63b2ff07172bd2d012b4cba2d4e00735d74ba42fc4d6/opentelemetry_sdk-1.27.0-py3-none-any.whl", hash = "sha256:365f5e32f920faf0fd9e14fdfd92c086e317eaa5f860edba9cdc17a380d9197d", size = 110505 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-semantic-conventions"
|
||||
version = "0.48b0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "deprecated" },
|
||||
{ name = "opentelemetry-api" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/0a/89/1724ad69f7411772446067cdfa73b598694c8c91f7f8c922e344d96d81f9/opentelemetry_semantic_conventions-0.48b0.tar.gz", hash = "sha256:12d74983783b6878162208be57c9effcb89dc88691c64992d70bb89dc00daa1a", size = 89445 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/7a/4f0063dbb0b6c971568291a8bc19a4ca70d3c185db2d956230dd67429dfc/opentelemetry_semantic_conventions-0.48b0-py3-none-any.whl", hash = "sha256:a0de9f45c413a8669788a38569c7e0a11ce6ce97861a628cca785deecdc32a1f", size = 149685 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opentelemetry-util-http"
|
||||
version = "0.48b0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d6/d7/185c494754340e0a3928fd39fde2616ee78f2c9d66253affaad62d5b7935/opentelemetry_util_http-0.48b0.tar.gz", hash = "sha256:60312015153580cc20f322e5cdc3d3ecad80a71743235bdb77716e742814623c", size = 7863 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/ad/2e/36097c0a4d0115b8c7e377c90bab7783ac183bc5cb4071308f8959454311/opentelemetry_util_http-0.48b0-py3-none-any.whl", hash = "sha256:76f598af93aab50328d2a69c786beaedc8b6a7770f7a818cc307eb353debfffb", size = 6946 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "packaging"
|
||||
version = "24.1"
|
||||
|
|
@ -1192,22 +884,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "protobuf"
|
||||
version = "4.25.5"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/67/dd/48d5fdb68ec74d70fabcc252e434492e56f70944d9f17b6a15e3746d2295/protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584", size = 380315 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/00/35/1b3c5a5e6107859c4ca902f4fbb762e48599b78129a05d20684fef4a4d04/protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8", size = 392457 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a7/ad/bf3f358e90b7e70bf7fb520702cb15307ef268262292d3bdb16ad8ebc815/protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea", size = 413449 },
|
||||
{ url = "https://files.pythonhosted.org/packages/51/49/d110f0a43beb365758a252203c43eaaad169fe7749da918869a8c991f726/protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173", size = 394248 },
|
||||
{ url = "https://files.pythonhosted.org/packages/c6/ab/0f384ca0bc6054b1a7b6009000ab75d28a5506e4459378b81280ae7fd358/protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d", size = 293717 },
|
||||
{ url = "https://files.pythonhosted.org/packages/05/a6/094a2640be576d760baa34c902dcb8199d89bce9ed7dd7a6af74dcbbd62d/protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331", size = 294635 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/1e/73a7f7a6c21dcca8ba0ca90d5404a5011c388dd87e2ea1a9f11ea6b61ec0/protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f", size = 392501 },
|
||||
{ url = "https://files.pythonhosted.org/packages/26/1b/a6c17bb22bdda781ebf058fb88c3727f69bed9f7913c0c5835caf6bc09f5/protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45", size = 413396 },
|
||||
{ url = "https://files.pythonhosted.org/packages/33/90/f198a61df8381fb43ae0fe81b3d2718e8dcc51ae8502c7657ab9381fbc4f/protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41", size = 156467 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "psycopg"
|
||||
version = "3.2.3"
|
||||
|
|
@ -1570,15 +1246,6 @@ sqlalchemy = [
|
|||
{ name = "sqlalchemy" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "setuptools"
|
||||
version = "75.2.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/07/37/b31be7e4b9f13b59cde9dcaeff112d401d49e0dc5b37ed4a9fc8fb12f409/setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec", size = 1350308 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/31/2d/90165d51ecd38f9a02c6832198c13a4e48652485e2ccf863ebb942c531b6/setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8", size = 1249825 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shellingham"
|
||||
version = "1.5.4"
|
||||
|
|
@ -2039,61 +1706,3 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/f6/c5/12c6859a2eaa8c53f59a647617a27f1835a226cd7106c601067c53251d98/websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678", size = 159187 },
|
||||
{ url = "https://files.pythonhosted.org/packages/56/27/96a5cd2626d11c8280656c6c71d8ab50fe006490ef9971ccd154e0c42cd2/websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f", size = 152134 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wrapt"
|
||||
version = "1.16.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/95/4c/063a912e20bcef7124e0df97282a8af3ff3e4b603ce84c481d6d7346be0a/wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", size = 53972 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a8/c6/5375258add3777494671d8cec27cdf5402abd91016dee24aa2972c61fedf/wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4", size = 37315 },
|
||||
{ url = "https://files.pythonhosted.org/packages/32/12/e11adfde33444986135d8881b401e4de6cbb4cced046edc6b464e6ad7547/wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", size = 38160 },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/7d/3dcc4a7e96f8d3e398450ec7703db384413f79bd6c0196e0e139055ce00f/wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", size = 80419 },
|
||||
{ url = "https://files.pythonhosted.org/packages/d1/c4/8dfdc3c2f0b38be85c8d9fdf0011ebad2f54e40897f9549a356bebb63a97/wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", size = 72669 },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/83/b40bc1ad04a868b5b5bcec86349f06c1ee1ea7afe51dc3e46131e4f39308/wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", size = 80271 },
|
||||
{ url = "https://files.pythonhosted.org/packages/19/d4/cd33d3a82df73a064c9b6401d14f346e1d2fb372885f0295516ec08ed2ee/wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", size = 84748 },
|
||||
{ url = "https://files.pythonhosted.org/packages/ef/58/2fde309415b5fa98fd8f5f4a11886cbf276824c4c64d45a39da342fff6fe/wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", size = 77522 },
|
||||
{ url = "https://files.pythonhosted.org/packages/07/44/359e4724a92369b88dbf09878a7cde7393cf3da885567ea898e5904049a3/wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", size = 84780 },
|
||||
{ url = "https://files.pythonhosted.org/packages/88/8f/706f2fee019360cc1da652353330350c76aa5746b4e191082e45d6838faf/wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", size = 35335 },
|
||||
{ url = "https://files.pythonhosted.org/packages/19/2b/548d23362e3002ebbfaefe649b833fa43f6ca37ac3e95472130c4b69e0b4/wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", size = 37528 },
|
||||
{ url = "https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", size = 37313 },
|
||||
{ url = "https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", size = 38164 },
|
||||
{ url = "https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", size = 80890 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/96/bb5e08b3d6db003c9ab219c487714c13a237ee7dcc572a555eaf1ce7dc82/wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", size = 73118 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", size = 80746 },
|
||||
{ url = "https://files.pythonhosted.org/packages/11/fb/18ec40265ab81c0e82a934de04596b6ce972c27ba2592c8b53d5585e6bcd/wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", size = 85668 },
|
||||
{ url = "https://files.pythonhosted.org/packages/0f/ef/0ecb1fa23145560431b970418dce575cfaec555ab08617d82eb92afc7ccf/wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", size = 78556 },
|
||||
{ url = "https://files.pythonhosted.org/packages/25/62/cd284b2b747f175b5a96cbd8092b32e7369edab0644c45784871528eb852/wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", size = 85712 },
|
||||
{ url = "https://files.pythonhosted.org/packages/e5/a7/47b7ff74fbadf81b696872d5ba504966591a3468f1bc86bca2f407baef68/wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", size = 35327 },
|
||||
{ url = "https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", size = 37523 },
|
||||
{ url = "https://files.pythonhosted.org/packages/92/17/224132494c1e23521868cdd57cd1e903f3b6a7ba6996b7b8f077ff8ac7fe/wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", size = 37614 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/d7/cfcd73e8f4858079ac59d9db1ec5a1349bc486ae8e9ba55698cc1f4a1dff/wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", size = 38316 },
|
||||
{ url = "https://files.pythonhosted.org/packages/7e/79/5ff0a5c54bda5aec75b36453d06be4f83d5cd4932cc84b7cb2b52cee23e2/wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", size = 86322 },
|
||||
{ url = "https://files.pythonhosted.org/packages/c4/81/e799bf5d419f422d8712108837c1d9bf6ebe3cb2a81ad94413449543a923/wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", size = 79055 },
|
||||
{ url = "https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", size = 87291 },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/4e/5d2f6d7b57fc9956bf06e944eb00463551f7d52fc73ca35cfc4c2cdb7aed/wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", size = 90374 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a6/9b/c2c21b44ff5b9bf14a83252a8b973fb84923764ff63db3e6dfc3895cf2e0/wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", size = 83896 },
|
||||
{ url = "https://files.pythonhosted.org/packages/14/26/93a9fa02c6f257df54d7570dfe8011995138118d11939a4ecd82cb849613/wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", size = 91738 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a2/5b/4660897233eb2c8c4de3dc7cefed114c61bacb3c28327e64150dc44ee2f6/wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", size = 35568 },
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", size = 37653 },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/cc/b92e1da2cad6a9f8ee481000ece07a35e3b24e041e60ff8b850c079f0ebf/wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", size = 37314 },
|
||||
{ url = "https://files.pythonhosted.org/packages/4a/cc/3402bcc897978be00fef608cd9e3e39ec8869c973feeb5e1e277670e5ad2/wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", size = 38162 },
|
||||
{ url = "https://files.pythonhosted.org/packages/28/d3/4f079f649c515727c127c987b2ec2e0816b80d95784f2d28d1a57d2a1029/wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", size = 80235 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a3/1c/226c2a4932e578a2241dcb383f425995f80224b446f439c2e112eb51c3a6/wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", size = 72553 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/e7/459a8a4f40f2fa65eb73cb3f339e6d152957932516d18d0e996c7ae2d7ae/wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", size = 80129 },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/6f/6d0b3c4983f1fc764a422989dabc268ee87d937763246cd48aa92f1eed1e/wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", size = 84550 },
|
||||
{ url = "https://files.pythonhosted.org/packages/96/e8/27ef35cf61e5147c1c3abcb89cfbb8d691b2bb8364803fcc950140bc14d8/wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", size = 77352 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b6/ad/7a0766341081bfd9f18a7049e4d6d45586ae5c5bb0a640f05e2f558e849c/wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", size = 84626 },
|
||||
{ url = "https://files.pythonhosted.org/packages/09/43/b26852e9c45a1aac0d14b1080b25b612fa840ba99739c5fc55db07b7ce08/wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", size = 35327 },
|
||||
{ url = "https://files.pythonhosted.org/packages/74/f2/96ed140b08743f7f68d5bda35a2a589600781366c3da96f056043d258b1a/wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", size = 37526 },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", size = 23362 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zipp"
|
||||
version = "3.20.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200 },
|
||||
]
|
||||
|
|
|
|||
Loading…
Reference in New Issue