Vector73 commited on
Commit
4a5a5c6
·
1 Parent(s): 1d07116

Add scheduler for fetching papers and storing in db.

Browse files
paperflux/src/__init__.py ADDED
File without changes
paperflux/src/__pycache__/scheduler.cpython-311.pyc ADDED
Binary file (1.61 kB). View file
 
paperflux/src/__pycache__/tasks.cpython-311.pyc ADDED
Binary file (5.11 kB). View file
 
paperflux/src/app.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from threading import Thread
2
+ from scheduler import start_scheduler
3
+ from flask import Flask
4
+
5
+ app = Flask(__name__)
6
+
7
+
8
+ @app.route("/")
9
+ def home():
10
+ return "Welcome!"
11
+
12
+
13
+ if __name__ == "__main__":
14
+ # Run scheduler to fetch papers in a separate thread
15
+ scheduler_thread = Thread(target=start_scheduler, daemon=True)
16
+ scheduler_thread.start()
17
+
18
+ app.run(debug=True, use_reloader=False)
paperflux/src/scheduler.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ import asyncio
3
+ from apscheduler.schedulers.background import BackgroundScheduler
4
+ from tasks import run_paper_fetch_job
5
+ from datetime import datetime
6
+
7
+
8
+ def job():
9
+ print("Fetching papers 📝")
10
+ asyncio.run(run_paper_fetch_job())
11
+
12
+
13
+ def start_scheduler():
14
+ scheduler = BackgroundScheduler()
15
+ scheduler.add_job(job, "interval", hours=24, next_run_time=datetime.now())
16
+ scheduler.start()
17
+ print("Scheduler started. Running in background.")
18
+
19
+ try:
20
+ while True:
21
+ time.sleep(60)
22
+ except (KeyboardInterrupt, SystemExit):
23
+ scheduler.shutdown()
24
+ print("Scheduler stopped.")
paperflux/src/tasks.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import aiohttp
3
+ from pymongo import MongoClient
4
+ from datetime import datetime, timezone
5
+ import os
6
+
7
+ API_URL = "https://huggingface.co/api/daily_papers"
8
+ PDF_BASE_URL = "https://arxiv.org/pdf/{id}.pdf"
9
+
10
+ client = MongoClient("mongodb://localhost:27017/")
11
+ db = client["papers_summary_database"]
12
+ collection = db["papers"]
13
+
14
+
15
+ async def fetch_papers(session):
16
+ async with session.get(API_URL) as response:
17
+ if response.status == 200:
18
+ return await response.json()
19
+ raise Exception(f"API request failed: {response.status}")
20
+
21
+
22
+ async def download_pdf(session, paper_entry):
23
+ try:
24
+ paper_id = paper_entry["paper"]["id"]
25
+ pdf_url = PDF_BASE_URL.format(id=paper_id)
26
+
27
+ async with session.get(pdf_url) as response:
28
+ if response.status == 200:
29
+ content = await response.read()
30
+ os.makedirs("pdfs", exist_ok=True)
31
+ with open(f"pdfs/{paper_id}", "wb") as f:
32
+ f.write(content)
33
+
34
+ return (paper_id, True)
35
+
36
+ return (paper_id, False)
37
+ except Exception as e:
38
+ print(f"Error downloading {paper_id}: {str(e)}")
39
+ return (paper_id, False)
40
+
41
+
42
+ async def run_paper_fetch_job():
43
+ async with aiohttp.ClientSession() as session:
44
+ papers = await fetch_papers(session)
45
+ tasks = []
46
+
47
+ for paper in papers:
48
+ paper_data = paper["paper"]
49
+ paper_data["fetchedAt"] = datetime.now(timezone.utc).isoformat()
50
+ collection.insert_one(paper_data)
51
+
52
+ tasks = [download_pdf(session, paper) for paper in papers]
53
+ results = await asyncio.gather(*tasks)
54
+
55
+ successful = sum(1 for _, status in results if status)
56
+ print(f"Downloaded {successful}/{len(papers)} papers successfully")
poetry.lock CHANGED
@@ -1,4 +1,4 @@
1
- # This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand.
2
 
3
  [[package]]
4
  name = "aiofiles"
@@ -7,7 +7,6 @@ description = "File support for asyncio."
7
  optional = false
8
  python-versions = ">=3.7"
9
  groups = ["main"]
10
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
11
  files = [
12
  {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"},
13
  {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"},
@@ -20,7 +19,6 @@ description = "Reusable constraint types to use with typing.Annotated"
20
  optional = false
21
  python-versions = ">=3.8"
22
  groups = ["main"]
23
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
24
  files = [
25
  {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
26
  {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
@@ -33,7 +31,6 @@ description = "High level compatibility layer for multiple asynchronous event lo
33
  optional = false
34
  python-versions = ">=3.9"
35
  groups = ["main"]
36
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
37
  files = [
38
  {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
39
  {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
@@ -47,7 +44,7 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
47
 
48
  [package.extras]
49
  doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
50
- test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"]
51
  trio = ["trio (>=0.26.1)"]
52
 
53
  [[package]]
@@ -57,7 +54,6 @@ description = "In-process task scheduler with Cron-like capabilities"
57
  optional = false
58
  python-versions = ">=3.8"
59
  groups = ["main"]
60
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
61
  files = [
62
  {file = "APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da"},
63
  {file = "apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133"},
@@ -74,7 +70,7 @@ mongodb = ["pymongo (>=3.0)"]
74
  redis = ["redis (>=3.0)"]
75
  rethinkdb = ["rethinkdb (>=2.4.0)"]
76
  sqlalchemy = ["sqlalchemy (>=1.4)"]
77
- test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6", "anyio (>=4.5.2)", "gevent", "pytest", "pytz", "twisted"]
78
  tornado = ["tornado (>=4.3)"]
79
  twisted = ["twisted"]
80
  zookeeper = ["kazoo"]
@@ -136,6 +132,65 @@ files = [
136
  {file = "audioop_lts-0.2.1.tar.gz", hash = "sha256:e81268da0baa880431b68b1308ab7257eb33f356e57a5f9b1f915dfb13dd1387"},
137
  ]
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  [[package]]
140
  name = "cachetools"
141
  version = "5.5.1"
@@ -143,7 +198,6 @@ description = "Extensible memoizing collections and decorators"
143
  optional = false
144
  python-versions = ">=3.7"
145
  groups = ["main"]
146
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
147
  files = [
148
  {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"},
149
  {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"},
@@ -156,7 +210,6 @@ description = "Python package for providing Mozilla's CA Bundle."
156
  optional = false
157
  python-versions = ">=3.6"
158
  groups = ["main"]
159
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
160
  files = [
161
  {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
162
  {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
@@ -169,7 +222,6 @@ description = "The Real First Universal Charset Detector. Open, modern and activ
169
  optional = false
170
  python-versions = ">=3.7"
171
  groups = ["main"]
172
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
173
  files = [
174
  {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
175
  {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
@@ -271,8 +323,7 @@ version = "8.1.8"
271
  description = "Composable command line interface toolkit"
272
  optional = false
273
  python-versions = ">=3.7"
274
- groups = ["main"]
275
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
276
  files = [
277
  {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
278
  {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
@@ -287,13 +338,34 @@ version = "0.4.6"
287
  description = "Cross-platform colored terminal text."
288
  optional = false
289
  python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
290
- groups = ["main"]
291
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and platform_system == \"Windows\""
292
  files = [
293
  {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
294
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
295
  ]
296
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  [[package]]
298
  name = "exceptiongroup"
299
  version = "1.2.2"
@@ -317,7 +389,6 @@ description = "FastAPI framework, high performance, easy to learn, fast to code,
317
  optional = false
318
  python-versions = ">=3.8"
319
  groups = ["main"]
320
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
321
  files = [
322
  {file = "fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf"},
323
  {file = "fastapi-0.115.8.tar.gz", hash = "sha256:0ce9111231720190473e222cdf0f07f7206ad7e53ea02beb1d2dc36e2f0741e9"},
@@ -339,7 +410,6 @@ description = "A simple Python wrapper for ffmpeg"
339
  optional = false
340
  python-versions = "*"
341
  groups = ["main"]
342
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
343
  files = [
344
  {file = "ffmpy-0.3.2.tar.gz", hash = "sha256:475ebfff1044661b8d969349dbcd2db9bf56d3ee78c0627e324769b49a27a78f"},
345
  ]
@@ -351,7 +421,6 @@ description = "A platform independent file lock."
351
  optional = false
352
  python-versions = ">=3.9"
353
  groups = ["main"]
354
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
355
  files = [
356
  {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"},
357
  {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"},
@@ -360,7 +429,47 @@ files = [
360
  [package.extras]
361
  docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"]
362
  testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"]
363
- typing = ["typing-extensions (>=4.12.2)"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
364
 
365
  [[package]]
366
  name = "fsspec"
@@ -369,7 +478,6 @@ description = "File-system specification"
369
  optional = false
370
  python-versions = ">=3.8"
371
  groups = ["main"]
372
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
373
  files = [
374
  {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"},
375
  {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"},
@@ -410,7 +518,6 @@ description = "Google Ai Generativelanguage API client library"
410
  optional = false
411
  python-versions = ">=3.7"
412
  groups = ["main"]
413
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
414
  files = [
415
  {file = "google_ai_generativelanguage-0.6.15-py3-none-any.whl", hash = "sha256:5a03ef86377aa184ffef3662ca28f19eeee158733e45d7947982eb953c6ebb6c"},
416
  {file = "google_ai_generativelanguage-0.6.15.tar.gz", hash = "sha256:8f6d9dc4c12b065fe2d0289026171acea5183ebf2d0b11cefe12f3821e159ec3"},
@@ -421,7 +528,7 @@ google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extr
421
  google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev"
422
  proto-plus = [
423
  {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""},
424
- {version = ">=1.22.3,<2.0.0dev", markers = "python_version < \"3.13\""},
425
  ]
426
  protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev"
427
 
@@ -432,7 +539,6 @@ description = "Google API client core library"
432
  optional = false
433
  python-versions = ">=3.7"
434
  groups = ["main"]
435
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
436
  files = [
437
  {file = "google_api_core-2.24.1-py3-none-any.whl", hash = "sha256:bc78d608f5a5bf853b80bd70a795f703294de656c096c0968320830a4bc280f1"},
438
  {file = "google_api_core-2.24.1.tar.gz", hash = "sha256:f8b36f5456ab0dd99a1b693a40a31d1e7757beea380ad1b38faaf8941eae9d8a"},
@@ -443,11 +549,11 @@ google-auth = ">=2.14.1,<3.0.dev0"
443
  googleapis-common-protos = ">=1.56.2,<2.0.dev0"
444
  grpcio = [
445
  {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""},
446
- {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""},
447
  ]
448
  grpcio-status = [
449
  {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""},
450
- {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""},
451
  ]
452
  proto-plus = [
453
  {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""},
@@ -458,7 +564,7 @@ requests = ">=2.18.0,<3.0.0.dev0"
458
 
459
  [package.extras]
460
  async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"]
461
- grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"]
462
  grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
463
  grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
464
 
@@ -469,7 +575,6 @@ description = "Google API Client Library for Python"
469
  optional = false
470
  python-versions = ">=3.7"
471
  groups = ["main"]
472
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
473
  files = [
474
  {file = "google_api_python_client-2.161.0-py2.py3-none-any.whl", hash = "sha256:9476a5a4f200bae368140453df40f9cda36be53fa7d0e9a9aac4cdb859a26448"},
475
  {file = "google_api_python_client-2.161.0.tar.gz", hash = "sha256:324c0cce73e9ea0a0d2afd5937e01b7c2d6a4d7e2579cdb6c384f9699d6c9f37"},
@@ -489,7 +594,6 @@ description = "Google Authentication Library"
489
  optional = false
490
  python-versions = ">=3.7"
491
  groups = ["main"]
492
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
493
  files = [
494
  {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"},
495
  {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"},
@@ -515,7 +619,6 @@ description = "Google Authentication Library: httplib2 transport"
515
  optional = false
516
  python-versions = "*"
517
  groups = ["main"]
518
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
519
  files = [
520
  {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"},
521
  {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"},
@@ -532,7 +635,6 @@ description = "Google Generative AI High level API client library and tools."
532
  optional = false
533
  python-versions = ">=3.9"
534
  groups = ["main"]
535
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
536
  files = [
537
  {file = "google_generativeai-0.8.4-py3-none-any.whl", hash = "sha256:e987b33ea6decde1e69191ddcaec6ef974458864d243de7191db50c21a7c5b82"},
538
  ]
@@ -557,7 +659,6 @@ description = "Common protobufs used in Google APIs"
557
  optional = false
558
  python-versions = ">=3.7"
559
  groups = ["main"]
560
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
561
  files = [
562
  {file = "googleapis_common_protos-1.67.0-py2.py3-none-any.whl", hash = "sha256:579de760800d13616f51cf8be00c876f00a9f146d3e6510e19d1f4111758b741"},
563
  {file = "googleapis_common_protos-1.67.0.tar.gz", hash = "sha256:21398025365f138be356d5923e9168737d94d46a72aefee4a6110a1f23463c86"},
@@ -576,7 +677,6 @@ description = "Python library for easily interacting with trained machine learni
576
  optional = false
577
  python-versions = ">=3.10"
578
  groups = ["main"]
579
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
580
  files = [
581
  {file = "gradio-5.16.0-py3-none-any.whl", hash = "sha256:0cae0fb5a261981d6ba2d1b24732d86bb0daa9596f9aa9a98123aaf45f98dfa6"},
582
  ]
@@ -621,7 +721,6 @@ description = "Python library for easily interacting with trained machine learni
621
  optional = false
622
  python-versions = ">=3.10"
623
  groups = ["main"]
624
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
625
  files = [
626
  {file = "gradio_client-1.7.0-py3-none-any.whl", hash = "sha256:b403570c67f121ebbbc19ac1f0afa2ab1bab085ce60d96eb190832fe871aa946"},
627
  {file = "gradio_client-1.7.0.tar.gz", hash = "sha256:87f6ade197951f38bac0431b2a436a8ebb2f33b2ceba2ef8e1e5bef8d8b238e4"},
@@ -642,7 +741,6 @@ description = "HTTP/2-based RPC framework"
642
  optional = false
643
  python-versions = ">=3.8"
644
  groups = ["main"]
645
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
646
  files = [
647
  {file = "grpcio-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:95469d1977429f45fe7df441f586521361e235982a0b39e33841549143ae2851"},
648
  {file = "grpcio-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ed9718f17fbdb472e33b869c77a16d0b55e166b100ec57b016dc7de9c8d236bf"},
@@ -711,7 +809,6 @@ description = "Status proto mapping for gRPC"
711
  optional = false
712
  python-versions = ">=3.8"
713
  groups = ["main"]
714
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
715
  files = [
716
  {file = "grpcio_status-1.70.0-py3-none-any.whl", hash = "sha256:fc5a2ae2b9b1c1969cc49f3262676e6854aa2398ec69cb5bd6c47cd501904a85"},
717
  {file = "grpcio_status-1.70.0.tar.gz", hash = "sha256:0e7b42816512433b18b9d764285ff029bde059e9d41f8fe10a60631bd8348101"},
@@ -729,7 +826,6 @@ description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
729
  optional = false
730
  python-versions = ">=3.7"
731
  groups = ["main"]
732
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
733
  files = [
734
  {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
735
  {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
@@ -742,7 +838,6 @@ description = "A minimal low-level HTTP client."
742
  optional = false
743
  python-versions = ">=3.8"
744
  groups = ["main"]
745
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
746
  files = [
747
  {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
748
  {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
@@ -765,7 +860,6 @@ description = "A comprehensive HTTP client library."
765
  optional = false
766
  python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
767
  groups = ["main"]
768
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
769
  files = [
770
  {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"},
771
  {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"},
@@ -781,7 +875,6 @@ description = "The next generation HTTP client."
781
  optional = false
782
  python-versions = ">=3.8"
783
  groups = ["main"]
784
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
785
  files = [
786
  {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"},
787
  {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"},
@@ -794,7 +887,7 @@ httpcore = "==1.*"
794
  idna = "*"
795
 
796
  [package.extras]
797
- brotli = ["brotli", "brotlicffi"]
798
  cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
799
  http2 = ["h2 (>=3,<5)"]
800
  socks = ["socksio (==1.*)"]
@@ -807,7 +900,6 @@ description = "Client library to download and publish models, datasets and other
807
  optional = false
808
  python-versions = ">=3.8.0"
809
  groups = ["main"]
810
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
811
  files = [
812
  {file = "huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7"},
813
  {file = "huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae"},
@@ -843,7 +935,6 @@ description = "Internationalized Domain Names in Applications (IDNA)"
843
  optional = false
844
  python-versions = ">=3.6"
845
  groups = ["main"]
846
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
847
  files = [
848
  {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
849
  {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
@@ -852,6 +943,18 @@ files = [
852
  [package.extras]
853
  all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
854
 
 
 
 
 
 
 
 
 
 
 
 
 
855
  [[package]]
856
  name = "jinja2"
857
  version = "3.1.5"
@@ -859,7 +962,6 @@ description = "A very fast and expressive template engine."
859
  optional = false
860
  python-versions = ">=3.7"
861
  groups = ["main"]
862
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
863
  files = [
864
  {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
865
  {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
@@ -878,7 +980,6 @@ description = "Python implementation of John Gruber's Markdown."
878
  optional = false
879
  python-versions = ">=3.8"
880
  groups = ["main"]
881
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
882
  files = [
883
  {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
884
  {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
@@ -895,7 +996,7 @@ description = "Python port of markdown-it. Markdown parsing, done right!"
895
  optional = false
896
  python-versions = ">=3.8"
897
  groups = ["main"]
898
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
899
  files = [
900
  {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
901
  {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
@@ -921,7 +1022,6 @@ description = "Safely add untrusted strings to HTML/XML markup."
921
  optional = false
922
  python-versions = ">=3.7"
923
  groups = ["main"]
924
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
925
  files = [
926
  {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
927
  {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
@@ -985,6 +1085,18 @@ files = [
985
  {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
986
  ]
987
 
 
 
 
 
 
 
 
 
 
 
 
 
988
  [[package]]
989
  name = "mdurl"
990
  version = "0.1.2"
@@ -992,12 +1104,24 @@ description = "Markdown URL utilities"
992
  optional = false
993
  python-versions = ">=3.7"
994
  groups = ["main"]
995
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
996
  files = [
997
  {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
998
  {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
999
  ]
1000
 
 
 
 
 
 
 
 
 
 
 
 
 
1001
  [[package]]
1002
  name = "numpy"
1003
  version = "2.2.3"
@@ -1005,7 +1129,6 @@ description = "Fundamental package for array computing in Python"
1005
  optional = false
1006
  python-versions = ">=3.10"
1007
  groups = ["main"]
1008
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1009
  files = [
1010
  {file = "numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71"},
1011
  {file = "numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787"},
@@ -1071,7 +1194,6 @@ description = "Fast, correct Python JSON library supporting dataclasses, datetim
1071
  optional = false
1072
  python-versions = ">=3.8"
1073
  groups = ["main"]
1074
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1075
  files = [
1076
  {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"},
1077
  {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"},
@@ -1160,8 +1282,7 @@ version = "24.2"
1160
  description = "Core utilities for Python packages"
1161
  optional = false
1162
  python-versions = ">=3.8"
1163
- groups = ["main"]
1164
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1165
  files = [
1166
  {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
1167
  {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
@@ -1174,7 +1295,6 @@ description = "Powerful data structures for data analysis, time series, and stat
1174
  optional = false
1175
  python-versions = ">=3.9"
1176
  groups = ["main"]
1177
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1178
  files = [
1179
  {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
1180
  {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
@@ -1255,6 +1375,18 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d
1255
  test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
1256
  xml = ["lxml (>=4.9.2)"]
1257
 
 
 
 
 
 
 
 
 
 
 
 
 
1258
  [[package]]
1259
  name = "pillow"
1260
  version = "11.1.0"
@@ -1262,7 +1394,6 @@ description = "Python Imaging Library (Fork)"
1262
  optional = false
1263
  python-versions = ">=3.9"
1264
  groups = ["main"]
1265
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1266
  files = [
1267
  {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"},
1268
  {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"},
@@ -1342,9 +1473,26 @@ docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline
1342
  fpx = ["olefile"]
1343
  mic = ["olefile"]
1344
  tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"]
1345
- typing = ["typing-extensions"]
1346
  xmp = ["defusedxml"]
1347
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1348
  [[package]]
1349
  name = "proto-plus"
1350
  version = "1.26.0"
@@ -1352,7 +1500,6 @@ description = "Beautiful, Pythonic protocol buffers"
1352
  optional = false
1353
  python-versions = ">=3.7"
1354
  groups = ["main"]
1355
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1356
  files = [
1357
  {file = "proto_plus-1.26.0-py3-none-any.whl", hash = "sha256:bf2dfaa3da281fc3187d12d224c707cb57214fb2c22ba854eb0c105a3fb2d4d7"},
1358
  {file = "proto_plus-1.26.0.tar.gz", hash = "sha256:6e93d5f5ca267b54300880fff156b6a3386b3fa3f43b1da62e680fc0c586ef22"},
@@ -1371,7 +1518,6 @@ description = ""
1371
  optional = false
1372
  python-versions = ">=3.8"
1373
  groups = ["main"]
1374
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1375
  files = [
1376
  {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"},
1377
  {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"},
@@ -1393,7 +1539,6 @@ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs
1393
  optional = false
1394
  python-versions = ">=3.8"
1395
  groups = ["main"]
1396
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1397
  files = [
1398
  {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"},
1399
  {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"},
@@ -1406,7 +1551,6 @@ description = "A collection of ASN.1-based protocols modules"
1406
  optional = false
1407
  python-versions = ">=3.8"
1408
  groups = ["main"]
1409
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1410
  files = [
1411
  {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"},
1412
  {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"},
@@ -1415,6 +1559,18 @@ files = [
1415
  [package.dependencies]
1416
  pyasn1 = ">=0.4.6,<0.7.0"
1417
 
 
 
 
 
 
 
 
 
 
 
 
 
1418
  [[package]]
1419
  name = "pydantic"
1420
  version = "2.10.6"
@@ -1422,7 +1578,6 @@ description = "Data validation using Python type hints"
1422
  optional = false
1423
  python-versions = ">=3.8"
1424
  groups = ["main"]
1425
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1426
  files = [
1427
  {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"},
1428
  {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"},
@@ -1435,7 +1590,7 @@ typing-extensions = ">=4.12.2"
1435
 
1436
  [package.extras]
1437
  email = ["email-validator (>=2.0.0)"]
1438
- timezone = ["tzdata"]
1439
 
1440
  [[package]]
1441
  name = "pydantic-core"
@@ -1444,7 +1599,6 @@ description = "Core functionality for Pydantic validation and serialization"
1444
  optional = false
1445
  python-versions = ">=3.8"
1446
  groups = ["main"]
1447
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1448
  files = [
1449
  {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
1450
  {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
@@ -1558,12 +1712,23 @@ description = "Manipulate audio with an simple and easy high level interface"
1558
  optional = false
1559
  python-versions = "*"
1560
  groups = ["main"]
1561
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1562
  files = [
1563
  {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
1564
  {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
1565
  ]
1566
 
 
 
 
 
 
 
 
 
 
 
 
 
1567
  [[package]]
1568
  name = "pygments"
1569
  version = "2.19.1"
@@ -1571,7 +1736,7 @@ description = "Pygments is a syntax highlighting package written in Python."
1571
  optional = false
1572
  python-versions = ">=3.8"
1573
  groups = ["main"]
1574
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
1575
  files = [
1576
  {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
1577
  {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
@@ -1580,6 +1745,86 @@ files = [
1580
  [package.extras]
1581
  windows-terminal = ["colorama (>=0.4.6)"]
1582
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1583
  [[package]]
1584
  name = "pyparsing"
1585
  version = "3.2.1"
@@ -1587,7 +1832,6 @@ description = "pyparsing module - Classes and methods to define and execute pars
1587
  optional = false
1588
  python-versions = ">=3.9"
1589
  groups = ["main"]
1590
- markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
1591
  files = [
1592
  {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"},
1593
  {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"},
@@ -1603,7 +1847,6 @@ description = "A pure-python PDF library capable of splitting, merging, cropping
1603
  optional = false
1604
  python-versions = ">=3.6"
1605
  groups = ["main"]
1606
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1607
  files = [
1608
  {file = "PyPDF2-3.0.1.tar.gz", hash = "sha256:a74408f69ba6271f71b9352ef4ed03dc53a31aa404d29b5d31f53bfecfee1440"},
1609
  {file = "pypdf2-3.0.1-py3-none-any.whl", hash = "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928"},
@@ -1623,7 +1866,6 @@ description = "Extensions to the standard Python datetime module"
1623
  optional = false
1624
  python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
1625
  groups = ["main"]
1626
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1627
  files = [
1628
  {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
1629
  {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
@@ -1639,7 +1881,6 @@ description = "Read key-value pairs from a .env file and set them as environment
1639
  optional = false
1640
  python-versions = ">=3.8"
1641
  groups = ["main"]
1642
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1643
  files = [
1644
  {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
1645
  {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
@@ -1655,7 +1896,6 @@ description = "A streaming multipart parser for Python"
1655
  optional = false
1656
  python-versions = ">=3.8"
1657
  groups = ["main"]
1658
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1659
  files = [
1660
  {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"},
1661
  {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"},
@@ -1668,7 +1908,6 @@ description = "World timezone definitions, modern and historical"
1668
  optional = false
1669
  python-versions = "*"
1670
  groups = ["main"]
1671
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1672
  files = [
1673
  {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"},
1674
  {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"},
@@ -1681,7 +1920,6 @@ description = "YAML parser and emitter for Python"
1681
  optional = false
1682
  python-versions = ">=3.8"
1683
  groups = ["main"]
1684
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1685
  files = [
1686
  {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
1687
  {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
@@ -1745,7 +1983,6 @@ description = "Python client for Redis database and key-value store"
1745
  optional = false
1746
  python-versions = ">=3.8"
1747
  groups = ["main"]
1748
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1749
  files = [
1750
  {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"},
1751
  {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"},
@@ -1765,7 +2002,6 @@ description = "Python HTTP for Humans."
1765
  optional = false
1766
  python-versions = ">=3.8"
1767
  groups = ["main"]
1768
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1769
  files = [
1770
  {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
1771
  {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
@@ -1788,7 +2024,7 @@ description = "Render rich text, tables, progress bars, syntax highlighting, mar
1788
  optional = false
1789
  python-versions = ">=3.8.0"
1790
  groups = ["main"]
1791
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
1792
  files = [
1793
  {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
1794
  {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
@@ -1809,7 +2045,6 @@ description = "Pure-Python RSA implementation"
1809
  optional = false
1810
  python-versions = "*"
1811
  groups = ["main"]
1812
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1813
  files = [
1814
  {file = "rsa-4.2.tar.gz", hash = "sha256:aaefa4b84752e3e99bd8333a2e1e3e7a7da64614042bd66f775573424370108a"},
1815
  ]
@@ -1823,8 +2058,7 @@ version = "0.9.6"
1823
  description = "An extremely fast Python linter and code formatter, written in Rust."
1824
  optional = false
1825
  python-versions = ">=3.7"
1826
- groups = ["main"]
1827
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
1828
  files = [
1829
  {file = "ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba"},
1830
  {file = "ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504"},
@@ -1853,7 +2087,6 @@ description = "A small Python library created to help developers protect their a
1853
  optional = false
1854
  python-versions = ">3.9"
1855
  groups = ["main"]
1856
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1857
  files = [
1858
  {file = "safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c"},
1859
  {file = "safehttpx-0.1.6.tar.gz", hash = "sha256:b356bfc82cee3a24c395b94a2dbeabbed60aff1aa5fa3b5fe97c4f2456ebce42"},
@@ -1872,14 +2105,13 @@ description = "A library implementing the 'SemVer' scheme."
1872
  optional = false
1873
  python-versions = ">=2.7"
1874
  groups = ["main"]
1875
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1876
  files = [
1877
  {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"},
1878
  {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"},
1879
  ]
1880
 
1881
  [package.extras]
1882
- dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"]
1883
  doc = ["Sphinx", "sphinx-rtd-theme"]
1884
 
1885
  [[package]]
@@ -1889,7 +2121,7 @@ description = "Tool to Detect Surrounding Shell"
1889
  optional = false
1890
  python-versions = ">=3.7"
1891
  groups = ["main"]
1892
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
1893
  files = [
1894
  {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"},
1895
  {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"},
@@ -1902,7 +2134,6 @@ description = "Python 2 and 3 compatibility utilities"
1902
  optional = false
1903
  python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
1904
  groups = ["main"]
1905
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1906
  files = [
1907
  {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
1908
  {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
@@ -1915,7 +2146,6 @@ description = "Sniff out which async library your code is running under"
1915
  optional = false
1916
  python-versions = ">=3.7"
1917
  groups = ["main"]
1918
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1919
  files = [
1920
  {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
1921
  {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
@@ -1928,7 +2158,6 @@ description = "The little ASGI library that shines."
1928
  optional = false
1929
  python-versions = ">=3.9"
1930
  groups = ["main"]
1931
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1932
  files = [
1933
  {file = "starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d"},
1934
  {file = "starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f"},
@@ -1940,6 +2169,49 @@ anyio = ">=3.6.2,<5"
1940
  [package.extras]
1941
  full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
1942
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1943
  [[package]]
1944
  name = "tomlkit"
1945
  version = "0.13.2"
@@ -1947,7 +2219,6 @@ description = "Style preserving TOML library"
1947
  optional = false
1948
  python-versions = ">=3.8"
1949
  groups = ["main"]
1950
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1951
  files = [
1952
  {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
1953
  {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
@@ -1960,7 +2231,6 @@ description = "Fast, Extensible Progress Meter"
1960
  optional = false
1961
  python-versions = ">=3.7"
1962
  groups = ["main"]
1963
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
1964
  files = [
1965
  {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"},
1966
  {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"},
@@ -1983,7 +2253,7 @@ description = "Typer, build great CLIs. Easy to code. Based on Python type hints
1983
  optional = false
1984
  python-versions = ">=3.7"
1985
  groups = ["main"]
1986
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
1987
  files = [
1988
  {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"},
1989
  {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"},
@@ -2001,12 +2271,12 @@ version = "4.12.2"
2001
  description = "Backported and Experimental Type Hints for Python 3.8+"
2002
  optional = false
2003
  python-versions = ">=3.8"
2004
- groups = ["main"]
2005
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
2006
  files = [
2007
  {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
2008
  {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
2009
  ]
 
2010
 
2011
  [[package]]
2012
  name = "tzdata"
@@ -2015,7 +2285,6 @@ description = "Provider of IANA time zone data"
2015
  optional = false
2016
  python-versions = ">=2"
2017
  groups = ["main"]
2018
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
2019
  files = [
2020
  {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"},
2021
  {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"},
@@ -2028,7 +2297,6 @@ description = "tzinfo object for the local timezone"
2028
  optional = false
2029
  python-versions = ">=3.9"
2030
  groups = ["main"]
2031
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
2032
  files = [
2033
  {file = "tzlocal-5.3-py3-none-any.whl", hash = "sha256:3814135a1bb29763c6e4f08fd6e41dbb435c7a60bfbb03270211bcc537187d8c"},
2034
  {file = "tzlocal-5.3.tar.gz", hash = "sha256:2fafbfc07e9d8b49ade18f898d6bcd37ae88ce3ad6486842a2e4f03af68323d2"},
@@ -2047,7 +2315,6 @@ description = "Implementation of RFC 6570 URI Templates"
2047
  optional = false
2048
  python-versions = ">=3.6"
2049
  groups = ["main"]
2050
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
2051
  files = [
2052
  {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"},
2053
  {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"},
@@ -2060,14 +2327,13 @@ description = "HTTP library with thread-safe connection pooling, file post, and
2060
  optional = false
2061
  python-versions = ">=3.9"
2062
  groups = ["main"]
2063
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
2064
  files = [
2065
  {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
2066
  {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
2067
  ]
2068
 
2069
  [package.extras]
2070
- brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
2071
  h2 = ["h2 (>=4,<5)"]
2072
  socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
2073
  zstd = ["zstandard (>=0.18.0)"]
@@ -2079,7 +2345,7 @@ description = "The lightning-fast ASGI server."
2079
  optional = false
2080
  python-versions = ">=3.9"
2081
  groups = ["main"]
2082
- markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\""
2083
  files = [
2084
  {file = "uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4"},
2085
  {file = "uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9"},
@@ -2091,7 +2357,7 @@ h11 = ">=0.8"
2091
  typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
2092
 
2093
  [package.extras]
2094
- 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)"]
2095
 
2096
  [[package]]
2097
  name = "websockets"
@@ -2100,7 +2366,6 @@ description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
2100
  optional = false
2101
  python-versions = ">=3.9"
2102
  groups = ["main"]
2103
- markers = "python_version >= \"3.12\" or python_version <= \"3.11\""
2104
  files = [
2105
  {file = "websockets-14.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e8179f95323b9ab1c11723e5d91a89403903f7b001828161b480a7810b334885"},
2106
  {file = "websockets-14.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d8c3e2cdb38f31d8bd7d9d28908005f6fa9def3324edb9bf336d7e4266fd397"},
@@ -2173,7 +2438,25 @@ files = [
2173
  {file = "websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5"},
2174
  ]
2175
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2176
  [metadata]
2177
  lock-version = "2.1"
2178
  python-versions = ">=3.10"
2179
- content-hash = "0eb03d779436a977b62a1cc0ae8a7b57eae8f2d403ad4a1c2c969e4a5a533344"
 
1
+ # This file is automatically @generated by Poetry 2.1.0 and should not be changed by hand.
2
 
3
  [[package]]
4
  name = "aiofiles"
 
7
  optional = false
8
  python-versions = ">=3.7"
9
  groups = ["main"]
 
10
  files = [
11
  {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"},
12
  {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"},
 
19
  optional = false
20
  python-versions = ">=3.8"
21
  groups = ["main"]
 
22
  files = [
23
  {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
24
  {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
 
31
  optional = false
32
  python-versions = ">=3.9"
33
  groups = ["main"]
 
34
  files = [
35
  {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
36
  {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
 
44
 
45
  [package.extras]
46
  doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
47
+ test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""]
48
  trio = ["trio (>=0.26.1)"]
49
 
50
  [[package]]
 
54
  optional = false
55
  python-versions = ">=3.8"
56
  groups = ["main"]
 
57
  files = [
58
  {file = "APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da"},
59
  {file = "apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133"},
 
70
  redis = ["redis (>=3.0)"]
71
  rethinkdb = ["rethinkdb (>=2.4.0)"]
72
  sqlalchemy = ["sqlalchemy (>=1.4)"]
73
+ test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6 ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "anyio (>=4.5.2)", "gevent ; python_version < \"3.14\"", "pytest", "pytz", "twisted ; python_version < \"3.14\""]
74
  tornado = ["tornado (>=4.3)"]
75
  twisted = ["twisted"]
76
  zookeeper = ["kazoo"]
 
132
  {file = "audioop_lts-0.2.1.tar.gz", hash = "sha256:e81268da0baa880431b68b1308ab7257eb33f356e57a5f9b1f915dfb13dd1387"},
133
  ]
134
 
135
+ [[package]]
136
+ name = "black"
137
+ version = "25.1.0"
138
+ description = "The uncompromising code formatter."
139
+ optional = false
140
+ python-versions = ">=3.9"
141
+ groups = ["dev"]
142
+ files = [
143
+ {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"},
144
+ {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"},
145
+ {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"},
146
+ {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"},
147
+ {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"},
148
+ {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"},
149
+ {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"},
150
+ {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"},
151
+ {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"},
152
+ {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"},
153
+ {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"},
154
+ {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"},
155
+ {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"},
156
+ {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"},
157
+ {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"},
158
+ {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"},
159
+ {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"},
160
+ {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"},
161
+ {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"},
162
+ {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"},
163
+ {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"},
164
+ {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"},
165
+ ]
166
+
167
+ [package.dependencies]
168
+ click = ">=8.0.0"
169
+ mypy-extensions = ">=0.4.3"
170
+ packaging = ">=22.0"
171
+ pathspec = ">=0.9.0"
172
+ platformdirs = ">=2"
173
+ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
174
+ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
175
+
176
+ [package.extras]
177
+ colorama = ["colorama (>=0.4.3)"]
178
+ d = ["aiohttp (>=3.10)"]
179
+ jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
180
+ uvloop = ["uvloop (>=0.15.2)"]
181
+
182
+ [[package]]
183
+ name = "blinker"
184
+ version = "1.9.0"
185
+ description = "Fast, simple object-to-object and broadcast signaling"
186
+ optional = false
187
+ python-versions = ">=3.9"
188
+ groups = ["main"]
189
+ files = [
190
+ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"},
191
+ {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"},
192
+ ]
193
+
194
  [[package]]
195
  name = "cachetools"
196
  version = "5.5.1"
 
198
  optional = false
199
  python-versions = ">=3.7"
200
  groups = ["main"]
 
201
  files = [
202
  {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"},
203
  {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"},
 
210
  optional = false
211
  python-versions = ">=3.6"
212
  groups = ["main"]
 
213
  files = [
214
  {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
215
  {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
 
222
  optional = false
223
  python-versions = ">=3.7"
224
  groups = ["main"]
 
225
  files = [
226
  {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
227
  {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
 
323
  description = "Composable command line interface toolkit"
324
  optional = false
325
  python-versions = ">=3.7"
326
+ groups = ["main", "dev"]
 
327
  files = [
328
  {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
329
  {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
 
338
  description = "Cross-platform colored terminal text."
339
  optional = false
340
  python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
341
+ groups = ["main", "dev"]
342
+ markers = "platform_system == \"Windows\""
343
  files = [
344
  {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
345
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
346
  ]
347
 
348
+ [[package]]
349
+ name = "dnspython"
350
+ version = "2.7.0"
351
+ description = "DNS toolkit"
352
+ optional = false
353
+ python-versions = ">=3.9"
354
+ groups = ["main"]
355
+ files = [
356
+ {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"},
357
+ {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"},
358
+ ]
359
+
360
+ [package.extras]
361
+ dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"]
362
+ dnssec = ["cryptography (>=43)"]
363
+ doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"]
364
+ doq = ["aioquic (>=1.0.0)"]
365
+ idna = ["idna (>=3.7)"]
366
+ trio = ["trio (>=0.23)"]
367
+ wmi = ["wmi (>=1.5.1)"]
368
+
369
  [[package]]
370
  name = "exceptiongroup"
371
  version = "1.2.2"
 
389
  optional = false
390
  python-versions = ">=3.8"
391
  groups = ["main"]
 
392
  files = [
393
  {file = "fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf"},
394
  {file = "fastapi-0.115.8.tar.gz", hash = "sha256:0ce9111231720190473e222cdf0f07f7206ad7e53ea02beb1d2dc36e2f0741e9"},
 
410
  optional = false
411
  python-versions = "*"
412
  groups = ["main"]
 
413
  files = [
414
  {file = "ffmpy-0.3.2.tar.gz", hash = "sha256:475ebfff1044661b8d969349dbcd2db9bf56d3ee78c0627e324769b49a27a78f"},
415
  ]
 
421
  optional = false
422
  python-versions = ">=3.9"
423
  groups = ["main"]
 
424
  files = [
425
  {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"},
426
  {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"},
 
429
  [package.extras]
430
  docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"]
431
  testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"]
432
+ typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""]
433
+
434
+ [[package]]
435
+ name = "flake8"
436
+ version = "7.1.1"
437
+ description = "the modular source code checker: pep8 pyflakes and co"
438
+ optional = false
439
+ python-versions = ">=3.8.1"
440
+ groups = ["dev"]
441
+ files = [
442
+ {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"},
443
+ {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"},
444
+ ]
445
+
446
+ [package.dependencies]
447
+ mccabe = ">=0.7.0,<0.8.0"
448
+ pycodestyle = ">=2.12.0,<2.13.0"
449
+ pyflakes = ">=3.2.0,<3.3.0"
450
+
451
+ [[package]]
452
+ name = "flask"
453
+ version = "3.1.0"
454
+ description = "A simple framework for building complex web applications."
455
+ optional = false
456
+ python-versions = ">=3.9"
457
+ groups = ["main"]
458
+ files = [
459
+ {file = "flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136"},
460
+ {file = "flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac"},
461
+ ]
462
+
463
+ [package.dependencies]
464
+ blinker = ">=1.9"
465
+ click = ">=8.1.3"
466
+ itsdangerous = ">=2.2"
467
+ Jinja2 = ">=3.1.2"
468
+ Werkzeug = ">=3.1"
469
+
470
+ [package.extras]
471
+ async = ["asgiref (>=3.2)"]
472
+ dotenv = ["python-dotenv"]
473
 
474
  [[package]]
475
  name = "fsspec"
 
478
  optional = false
479
  python-versions = ">=3.8"
480
  groups = ["main"]
 
481
  files = [
482
  {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"},
483
  {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"},
 
518
  optional = false
519
  python-versions = ">=3.7"
520
  groups = ["main"]
 
521
  files = [
522
  {file = "google_ai_generativelanguage-0.6.15-py3-none-any.whl", hash = "sha256:5a03ef86377aa184ffef3662ca28f19eeee158733e45d7947982eb953c6ebb6c"},
523
  {file = "google_ai_generativelanguage-0.6.15.tar.gz", hash = "sha256:8f6d9dc4c12b065fe2d0289026171acea5183ebf2d0b11cefe12f3821e159ec3"},
 
528
  google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev"
529
  proto-plus = [
530
  {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""},
531
+ {version = ">=1.22.3,<2.0.0dev"},
532
  ]
533
  protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev"
534
 
 
539
  optional = false
540
  python-versions = ">=3.7"
541
  groups = ["main"]
 
542
  files = [
543
  {file = "google_api_core-2.24.1-py3-none-any.whl", hash = "sha256:bc78d608f5a5bf853b80bd70a795f703294de656c096c0968320830a4bc280f1"},
544
  {file = "google_api_core-2.24.1.tar.gz", hash = "sha256:f8b36f5456ab0dd99a1b693a40a31d1e7757beea380ad1b38faaf8941eae9d8a"},
 
549
  googleapis-common-protos = ">=1.56.2,<2.0.dev0"
550
  grpcio = [
551
  {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""},
552
+ {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""},
553
  ]
554
  grpcio-status = [
555
  {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""},
556
+ {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""},
557
  ]
558
  proto-plus = [
559
  {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""},
 
564
 
565
  [package.extras]
566
  async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"]
567
+ grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev) ; python_version >= \"3.11\"", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0) ; python_version >= \"3.11\""]
568
  grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
569
  grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
570
 
 
575
  optional = false
576
  python-versions = ">=3.7"
577
  groups = ["main"]
 
578
  files = [
579
  {file = "google_api_python_client-2.161.0-py2.py3-none-any.whl", hash = "sha256:9476a5a4f200bae368140453df40f9cda36be53fa7d0e9a9aac4cdb859a26448"},
580
  {file = "google_api_python_client-2.161.0.tar.gz", hash = "sha256:324c0cce73e9ea0a0d2afd5937e01b7c2d6a4d7e2579cdb6c384f9699d6c9f37"},
 
594
  optional = false
595
  python-versions = ">=3.7"
596
  groups = ["main"]
 
597
  files = [
598
  {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"},
599
  {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"},
 
619
  optional = false
620
  python-versions = "*"
621
  groups = ["main"]
 
622
  files = [
623
  {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"},
624
  {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"},
 
635
  optional = false
636
  python-versions = ">=3.9"
637
  groups = ["main"]
 
638
  files = [
639
  {file = "google_generativeai-0.8.4-py3-none-any.whl", hash = "sha256:e987b33ea6decde1e69191ddcaec6ef974458864d243de7191db50c21a7c5b82"},
640
  ]
 
659
  optional = false
660
  python-versions = ">=3.7"
661
  groups = ["main"]
 
662
  files = [
663
  {file = "googleapis_common_protos-1.67.0-py2.py3-none-any.whl", hash = "sha256:579de760800d13616f51cf8be00c876f00a9f146d3e6510e19d1f4111758b741"},
664
  {file = "googleapis_common_protos-1.67.0.tar.gz", hash = "sha256:21398025365f138be356d5923e9168737d94d46a72aefee4a6110a1f23463c86"},
 
677
  optional = false
678
  python-versions = ">=3.10"
679
  groups = ["main"]
 
680
  files = [
681
  {file = "gradio-5.16.0-py3-none-any.whl", hash = "sha256:0cae0fb5a261981d6ba2d1b24732d86bb0daa9596f9aa9a98123aaf45f98dfa6"},
682
  ]
 
721
  optional = false
722
  python-versions = ">=3.10"
723
  groups = ["main"]
 
724
  files = [
725
  {file = "gradio_client-1.7.0-py3-none-any.whl", hash = "sha256:b403570c67f121ebbbc19ac1f0afa2ab1bab085ce60d96eb190832fe871aa946"},
726
  {file = "gradio_client-1.7.0.tar.gz", hash = "sha256:87f6ade197951f38bac0431b2a436a8ebb2f33b2ceba2ef8e1e5bef8d8b238e4"},
 
741
  optional = false
742
  python-versions = ">=3.8"
743
  groups = ["main"]
 
744
  files = [
745
  {file = "grpcio-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:95469d1977429f45fe7df441f586521361e235982a0b39e33841549143ae2851"},
746
  {file = "grpcio-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ed9718f17fbdb472e33b869c77a16d0b55e166b100ec57b016dc7de9c8d236bf"},
 
809
  optional = false
810
  python-versions = ">=3.8"
811
  groups = ["main"]
 
812
  files = [
813
  {file = "grpcio_status-1.70.0-py3-none-any.whl", hash = "sha256:fc5a2ae2b9b1c1969cc49f3262676e6854aa2398ec69cb5bd6c47cd501904a85"},
814
  {file = "grpcio_status-1.70.0.tar.gz", hash = "sha256:0e7b42816512433b18b9d764285ff029bde059e9d41f8fe10a60631bd8348101"},
 
826
  optional = false
827
  python-versions = ">=3.7"
828
  groups = ["main"]
 
829
  files = [
830
  {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
831
  {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
 
838
  optional = false
839
  python-versions = ">=3.8"
840
  groups = ["main"]
 
841
  files = [
842
  {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
843
  {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
 
860
  optional = false
861
  python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
862
  groups = ["main"]
 
863
  files = [
864
  {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"},
865
  {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"},
 
875
  optional = false
876
  python-versions = ">=3.8"
877
  groups = ["main"]
 
878
  files = [
879
  {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"},
880
  {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"},
 
887
  idna = "*"
888
 
889
  [package.extras]
890
+ brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""]
891
  cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
892
  http2 = ["h2 (>=3,<5)"]
893
  socks = ["socksio (==1.*)"]
 
900
  optional = false
901
  python-versions = ">=3.8.0"
902
  groups = ["main"]
 
903
  files = [
904
  {file = "huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7"},
905
  {file = "huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae"},
 
935
  optional = false
936
  python-versions = ">=3.6"
937
  groups = ["main"]
 
938
  files = [
939
  {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
940
  {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
 
943
  [package.extras]
944
  all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
945
 
946
+ [[package]]
947
+ name = "itsdangerous"
948
+ version = "2.2.0"
949
+ description = "Safely pass data to untrusted environments and back."
950
+ optional = false
951
+ python-versions = ">=3.8"
952
+ groups = ["main"]
953
+ files = [
954
+ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"},
955
+ {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"},
956
+ ]
957
+
958
  [[package]]
959
  name = "jinja2"
960
  version = "3.1.5"
 
962
  optional = false
963
  python-versions = ">=3.7"
964
  groups = ["main"]
 
965
  files = [
966
  {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
967
  {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
 
980
  optional = false
981
  python-versions = ">=3.8"
982
  groups = ["main"]
 
983
  files = [
984
  {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
985
  {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
 
996
  optional = false
997
  python-versions = ">=3.8"
998
  groups = ["main"]
999
+ markers = "sys_platform != \"emscripten\""
1000
  files = [
1001
  {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
1002
  {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
 
1022
  optional = false
1023
  python-versions = ">=3.7"
1024
  groups = ["main"]
 
1025
  files = [
1026
  {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
1027
  {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
 
1085
  {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
1086
  ]
1087
 
1088
+ [[package]]
1089
+ name = "mccabe"
1090
+ version = "0.7.0"
1091
+ description = "McCabe checker, plugin for flake8"
1092
+ optional = false
1093
+ python-versions = ">=3.6"
1094
+ groups = ["dev"]
1095
+ files = [
1096
+ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
1097
+ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
1098
+ ]
1099
+
1100
  [[package]]
1101
  name = "mdurl"
1102
  version = "0.1.2"
 
1104
  optional = false
1105
  python-versions = ">=3.7"
1106
  groups = ["main"]
1107
+ markers = "sys_platform != \"emscripten\""
1108
  files = [
1109
  {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
1110
  {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
1111
  ]
1112
 
1113
+ [[package]]
1114
+ name = "mypy-extensions"
1115
+ version = "1.0.0"
1116
+ description = "Type system extensions for programs checked with the mypy type checker."
1117
+ optional = false
1118
+ python-versions = ">=3.5"
1119
+ groups = ["dev"]
1120
+ files = [
1121
+ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
1122
+ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
1123
+ ]
1124
+
1125
  [[package]]
1126
  name = "numpy"
1127
  version = "2.2.3"
 
1129
  optional = false
1130
  python-versions = ">=3.10"
1131
  groups = ["main"]
 
1132
  files = [
1133
  {file = "numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71"},
1134
  {file = "numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787"},
 
1194
  optional = false
1195
  python-versions = ">=3.8"
1196
  groups = ["main"]
 
1197
  files = [
1198
  {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"},
1199
  {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"},
 
1282
  description = "Core utilities for Python packages"
1283
  optional = false
1284
  python-versions = ">=3.8"
1285
+ groups = ["main", "dev"]
 
1286
  files = [
1287
  {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
1288
  {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
 
1295
  optional = false
1296
  python-versions = ">=3.9"
1297
  groups = ["main"]
 
1298
  files = [
1299
  {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
1300
  {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
 
1375
  test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
1376
  xml = ["lxml (>=4.9.2)"]
1377
 
1378
+ [[package]]
1379
+ name = "pathspec"
1380
+ version = "0.12.1"
1381
+ description = "Utility library for gitignore style pattern matching of file paths."
1382
+ optional = false
1383
+ python-versions = ">=3.8"
1384
+ groups = ["dev"]
1385
+ files = [
1386
+ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
1387
+ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
1388
+ ]
1389
+
1390
  [[package]]
1391
  name = "pillow"
1392
  version = "11.1.0"
 
1394
  optional = false
1395
  python-versions = ">=3.9"
1396
  groups = ["main"]
 
1397
  files = [
1398
  {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"},
1399
  {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"},
 
1473
  fpx = ["olefile"]
1474
  mic = ["olefile"]
1475
  tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"]
1476
+ typing = ["typing-extensions ; python_version < \"3.10\""]
1477
  xmp = ["defusedxml"]
1478
 
1479
+ [[package]]
1480
+ name = "platformdirs"
1481
+ version = "4.3.6"
1482
+ description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
1483
+ optional = false
1484
+ python-versions = ">=3.8"
1485
+ groups = ["dev"]
1486
+ files = [
1487
+ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
1488
+ {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
1489
+ ]
1490
+
1491
+ [package.extras]
1492
+ docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
1493
+ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
1494
+ type = ["mypy (>=1.11.2)"]
1495
+
1496
  [[package]]
1497
  name = "proto-plus"
1498
  version = "1.26.0"
 
1500
  optional = false
1501
  python-versions = ">=3.7"
1502
  groups = ["main"]
 
1503
  files = [
1504
  {file = "proto_plus-1.26.0-py3-none-any.whl", hash = "sha256:bf2dfaa3da281fc3187d12d224c707cb57214fb2c22ba854eb0c105a3fb2d4d7"},
1505
  {file = "proto_plus-1.26.0.tar.gz", hash = "sha256:6e93d5f5ca267b54300880fff156b6a3386b3fa3f43b1da62e680fc0c586ef22"},
 
1518
  optional = false
1519
  python-versions = ">=3.8"
1520
  groups = ["main"]
 
1521
  files = [
1522
  {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"},
1523
  {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"},
 
1539
  optional = false
1540
  python-versions = ">=3.8"
1541
  groups = ["main"]
 
1542
  files = [
1543
  {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"},
1544
  {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"},
 
1551
  optional = false
1552
  python-versions = ">=3.8"
1553
  groups = ["main"]
 
1554
  files = [
1555
  {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"},
1556
  {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"},
 
1559
  [package.dependencies]
1560
  pyasn1 = ">=0.4.6,<0.7.0"
1561
 
1562
+ [[package]]
1563
+ name = "pycodestyle"
1564
+ version = "2.12.1"
1565
+ description = "Python style guide checker"
1566
+ optional = false
1567
+ python-versions = ">=3.8"
1568
+ groups = ["dev"]
1569
+ files = [
1570
+ {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"},
1571
+ {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"},
1572
+ ]
1573
+
1574
  [[package]]
1575
  name = "pydantic"
1576
  version = "2.10.6"
 
1578
  optional = false
1579
  python-versions = ">=3.8"
1580
  groups = ["main"]
 
1581
  files = [
1582
  {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"},
1583
  {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"},
 
1590
 
1591
  [package.extras]
1592
  email = ["email-validator (>=2.0.0)"]
1593
+ timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""]
1594
 
1595
  [[package]]
1596
  name = "pydantic-core"
 
1599
  optional = false
1600
  python-versions = ">=3.8"
1601
  groups = ["main"]
 
1602
  files = [
1603
  {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
1604
  {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
 
1712
  optional = false
1713
  python-versions = "*"
1714
  groups = ["main"]
 
1715
  files = [
1716
  {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
1717
  {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
1718
  ]
1719
 
1720
+ [[package]]
1721
+ name = "pyflakes"
1722
+ version = "3.2.0"
1723
+ description = "passive checker of Python programs"
1724
+ optional = false
1725
+ python-versions = ">=3.8"
1726
+ groups = ["dev"]
1727
+ files = [
1728
+ {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"},
1729
+ {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"},
1730
+ ]
1731
+
1732
  [[package]]
1733
  name = "pygments"
1734
  version = "2.19.1"
 
1736
  optional = false
1737
  python-versions = ">=3.8"
1738
  groups = ["main"]
1739
+ markers = "sys_platform != \"emscripten\""
1740
  files = [
1741
  {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
1742
  {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
 
1745
  [package.extras]
1746
  windows-terminal = ["colorama (>=0.4.6)"]
1747
 
1748
+ [[package]]
1749
+ name = "pymongo"
1750
+ version = "4.11.1"
1751
+ description = "Python driver for MongoDB <http://www.mongodb.org>"
1752
+ optional = false
1753
+ python-versions = ">=3.9"
1754
+ groups = ["main"]
1755
+ files = [
1756
+ {file = "pymongo-4.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e596caec72db62a3f438559dfa46d22faefea1967279f553f936ddcb873903df"},
1757
+ {file = "pymongo-4.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15a88b25efcd61c5e539e9204932849b20f393efa330771676e860c4466fe8ad"},
1758
+ {file = "pymongo-4.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7073a740aad257f9d2c12cb95a08f17db1f273d422e7ddfed9895738571cac7"},
1759
+ {file = "pymongo-4.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25b7cadae1d5287b2eed3d901a347f3fa9bc3f898532e1cb7f28a1c9237d824d"},
1760
+ {file = "pymongo-4.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fe9589d9a83f6e2abe88f32daa410276eddd038eb8f8f75975cf8ce834cea1f"},
1761
+ {file = "pymongo-4.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cc6d48b74e9abe544dd71b000453ad06e65cbfcfd57c7342a9f012f65532eb2"},
1762
+ {file = "pymongo-4.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1518931a4a26d3cb31a97b9187087c6378cd0b0401d7a7cc160e92223a2a3059"},
1763
+ {file = "pymongo-4.11.1-cp310-cp310-win32.whl", hash = "sha256:163c887384cb9fd16e0463128600867138a5a9a5344fc0903db08494b39a2d6e"},
1764
+ {file = "pymongo-4.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e147e08df329a7d23cbcb6213bc2fd360e51551626be828092fe2027f3473abc"},
1765
+ {file = "pymongo-4.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac125f2782d8fe3f3ff93a396af5482d694093b3be3e06052197096c83acadc"},
1766
+ {file = "pymongo-4.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:681806d3ecaf29b11e16a45c1f4c28f99d9d8283238f7b6ea9eee93b5d7bc6d2"},
1767
+ {file = "pymongo-4.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50210249a9bf67937e97205a312b96a4b1250b111cbaaff532d7a61bc2b1562d"},
1768
+ {file = "pymongo-4.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdd0e404d5c3b1203ee61fcfee40a1f062f3780ce272febdc2378797b00401d1"},
1769
+ {file = "pymongo-4.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6e46bcd3c2f86f442b721551ed5e5812294e4a93fce42517e173bd41d4cd2d8"},
1770
+ {file = "pymongo-4.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f28d179e7d434869e23f4582c941cb400f75e996cfea472693ec756ee213c685"},
1771
+ {file = "pymongo-4.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b56dbb6883ce7adad8588464948e0723a3d881e5549f48c4767f1654e8e4cb7d"},
1772
+ {file = "pymongo-4.11.1-cp311-cp311-win32.whl", hash = "sha256:27bc58e0b1bebb17d2426d0cc191c579f2eeaf9692be880f93fe4180cf850ca7"},
1773
+ {file = "pymongo-4.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:7751e6e99c79057b09441c6ab2a93fae10b4028478aac5b455db8b12f884a3c0"},
1774
+ {file = "pymongo-4.11.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f96683f1dec7d28f12fe43a4d5c0df35d6b80348a9fbf5aac47fa284332a1f92"},
1775
+ {file = "pymongo-4.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:157e6a722d051c4bab3e6bc34a1f80fc98101cf2d12139a94e51638d023198c5"},
1776
+ {file = "pymongo-4.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74503e853758e1eaa1cad2df9c08c8c35a3d26222cf6426d2cde4b2e8593b9b3"},
1777
+ {file = "pymongo-4.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b630596089106c968ddd252bde3fe692c420e24f214dd39ca517d26343d81012"},
1778
+ {file = "pymongo-4.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7007669eef871079d39a9bbcda0fbcd4252f9b575592804343d0b5c05849d65b"},
1779
+ {file = "pymongo-4.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d1da6201e1350cfcd4deab599b32237ac2ac591180d44553a2c8e614f2c0e"},
1780
+ {file = "pymongo-4.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:908e65ab42cd4bf1ffeaafe8f11bb86b3f804d54227058794e33fff2963ccc86"},
1781
+ {file = "pymongo-4.11.1-cp312-cp312-win32.whl", hash = "sha256:2d1d956c15dd05f1e41c61f0dbcaec59f274db4814cff2c3d9c2508f58004c39"},
1782
+ {file = "pymongo-4.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:c71655f4188c70032ba56ac7ead688449e4f86a4ccd8e57201ee283f2f591e1d"},
1783
+ {file = "pymongo-4.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f845b46d77a5bcf0c9ee16f11c5bc84c63f4668d9ea4fc54cd923c8d48a1d521"},
1784
+ {file = "pymongo-4.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aadea45e01103f6ee4e80d76d4a27393a4e2bd93472ce4ebb894781f395e1053"},
1785
+ {file = "pymongo-4.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63348c850df796199abef7e9afbd86c34449f56731c7ec70b3901df1f5c135b"},
1786
+ {file = "pymongo-4.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dd7656794bfbfbe10723813332ec33eed29bd9bb7fc122c63829fd445eb8425"},
1787
+ {file = "pymongo-4.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7146ae04300ce6f83b75c639e97c3d0ce873f30edaac4b719ae173e886b9ff90"},
1788
+ {file = "pymongo-4.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698fb3d13126c0719077c98b40378cb9a6f4ab4a72b7691779aa01f1f6c66493"},
1789
+ {file = "pymongo-4.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f415d9569720f408cc4dcc171f60299d454b0414f120666e6fdd349d414bf010"},
1790
+ {file = "pymongo-4.11.1-cp313-cp313-win32.whl", hash = "sha256:4aa2c40e391ca29a337bef2b46b495c3f24b5696a87a58f0a0676a8bf131f9f8"},
1791
+ {file = "pymongo-4.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:1f871efa14a1f368559edff39ec03799ca108bfa8e1ba330b7ffc05eb958661f"},
1792
+ {file = "pymongo-4.11.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d293cec18624825937bd7f1d8bacf16104c79ced45a8ada93f08ec8a7a2ad17a"},
1793
+ {file = "pymongo-4.11.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b3ea3494f3e166a524529bb05a4fdda97afd77031fed3a63862fd815288c9df"},
1794
+ {file = "pymongo-4.11.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d12f4c4579076b7351c63378e22f43d4ce4ed4f2c93208b653c4752f18f47309"},
1795
+ {file = "pymongo-4.11.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a8aba4818350d2a463e084ae2426d395e725525fe86bd0219240b265dc1ca52"},
1796
+ {file = "pymongo-4.11.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f97f62e6edde15d1d3d08abd7e43f1787ee9e672b1bb8e9d9f5fd6ded24f5599"},
1797
+ {file = "pymongo-4.11.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a4e82dce301c97bb132dec28a487c1a609dc67948e9db7cbd23485875367204"},
1798
+ {file = "pymongo-4.11.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:985a614ec24519f4a3d82aafb766c3f782a452fc46b32112d508a4e19b33fff3"},
1799
+ {file = "pymongo-4.11.1-cp313-cp313t-win32.whl", hash = "sha256:889d20850d5aaa4f19814462c06488553e70ed4c62195dbaad5d5662884778af"},
1800
+ {file = "pymongo-4.11.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3854db4be39cb9e0c34add1fd7e515deab0b4ee30f3cc3978e057746d119ac12"},
1801
+ {file = "pymongo-4.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:61f9a7ca6eb47378809c94cd8fbdbc5ee90c4bbb0c18ddf5592d25ed95cf939c"},
1802
+ {file = "pymongo-4.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b01623eb4a7ac58706e1920a94fbb47465f8ee19e7fbbb077e1707e37678863"},
1803
+ {file = "pymongo-4.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2737ad54f0cd38e19ebf76e6f34dbbc6927615a2973425e64475d15a65fc2f6b"},
1804
+ {file = "pymongo-4.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7f291245c1688655aa308bbba7c9afa8116692c4fa6ad2646a835ed277a67b"},
1805
+ {file = "pymongo-4.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:892f2137282a0a993d342db6e4e6dc2f3db0b771831c2d505f7055c52c023198"},
1806
+ {file = "pymongo-4.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:822a73d22970978a6e55751d53eb0948521fc8e1380e306b8644096b5230412f"},
1807
+ {file = "pymongo-4.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18b669e15922316e25a318cf9ba594eae5a6c24285a70f455ea01571d70a47d2"},
1808
+ {file = "pymongo-4.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e7bac5fb1383a0df8b6881046207da20deb582a54e70c4c53ac9d4bbce323a3"},
1809
+ {file = "pymongo-4.11.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:34d8b0ee57ad2a07ecdccec06269a4530767c2befb68f4a185113c866ad20b00"},
1810
+ {file = "pymongo-4.11.1-cp39-cp39-win32.whl", hash = "sha256:490d3fd8006154894319af3a974764bf16baea87100222779f49c75cd8b16d3d"},
1811
+ {file = "pymongo-4.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ed3c885ac221ddebd3e894aeae7b6bd84e7dbd4fd59f03e551d8f51455c7e9b"},
1812
+ {file = "pymongo-4.11.1.tar.gz", hash = "sha256:3757ce9257c3486eead45680a8895a0ed9ba27efaf1791fc0cf854367c21c638"},
1813
+ ]
1814
+
1815
+ [package.dependencies]
1816
+ dnspython = ">=1.16.0,<3.0.0"
1817
+
1818
+ [package.extras]
1819
+ aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"]
1820
+ docs = ["furo (==2024.8.6)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<9)", "sphinx-autobuild (>=2020.9.1)", "sphinx-rtd-theme (>=2,<4)", "sphinxcontrib-shellcheck (>=1,<2)"]
1821
+ encryption = ["certifi ; os_name == \"nt\" or sys_platform == \"darwin\"", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.12.0,<2.0.0)"]
1822
+ gssapi = ["pykerberos ; os_name != \"nt\"", "winkerberos (>=0.5.0) ; os_name == \"nt\""]
1823
+ ocsp = ["certifi ; os_name == \"nt\" or sys_platform == \"darwin\"", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"]
1824
+ snappy = ["python-snappy"]
1825
+ test = ["pytest (>=8.2)", "pytest-asyncio (>=0.24.0)"]
1826
+ zstd = ["zstandard"]
1827
+
1828
  [[package]]
1829
  name = "pyparsing"
1830
  version = "3.2.1"
 
1832
  optional = false
1833
  python-versions = ">=3.9"
1834
  groups = ["main"]
 
1835
  files = [
1836
  {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"},
1837
  {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"},
 
1847
  optional = false
1848
  python-versions = ">=3.6"
1849
  groups = ["main"]
 
1850
  files = [
1851
  {file = "PyPDF2-3.0.1.tar.gz", hash = "sha256:a74408f69ba6271f71b9352ef4ed03dc53a31aa404d29b5d31f53bfecfee1440"},
1852
  {file = "pypdf2-3.0.1-py3-none-any.whl", hash = "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928"},
 
1866
  optional = false
1867
  python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
1868
  groups = ["main"]
 
1869
  files = [
1870
  {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
1871
  {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
 
1881
  optional = false
1882
  python-versions = ">=3.8"
1883
  groups = ["main"]
 
1884
  files = [
1885
  {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
1886
  {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
 
1896
  optional = false
1897
  python-versions = ">=3.8"
1898
  groups = ["main"]
 
1899
  files = [
1900
  {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"},
1901
  {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"},
 
1908
  optional = false
1909
  python-versions = "*"
1910
  groups = ["main"]
 
1911
  files = [
1912
  {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"},
1913
  {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"},
 
1920
  optional = false
1921
  python-versions = ">=3.8"
1922
  groups = ["main"]
 
1923
  files = [
1924
  {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
1925
  {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
 
1983
  optional = false
1984
  python-versions = ">=3.8"
1985
  groups = ["main"]
 
1986
  files = [
1987
  {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"},
1988
  {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"},
 
2002
  optional = false
2003
  python-versions = ">=3.8"
2004
  groups = ["main"]
 
2005
  files = [
2006
  {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
2007
  {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
 
2024
  optional = false
2025
  python-versions = ">=3.8.0"
2026
  groups = ["main"]
2027
+ markers = "sys_platform != \"emscripten\""
2028
  files = [
2029
  {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
2030
  {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
 
2045
  optional = false
2046
  python-versions = "*"
2047
  groups = ["main"]
 
2048
  files = [
2049
  {file = "rsa-4.2.tar.gz", hash = "sha256:aaefa4b84752e3e99bd8333a2e1e3e7a7da64614042bd66f775573424370108a"},
2050
  ]
 
2058
  description = "An extremely fast Python linter and code formatter, written in Rust."
2059
  optional = false
2060
  python-versions = ">=3.7"
2061
+ groups = ["main", "dev"]
 
2062
  files = [
2063
  {file = "ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba"},
2064
  {file = "ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504"},
 
2087
  optional = false
2088
  python-versions = ">3.9"
2089
  groups = ["main"]
 
2090
  files = [
2091
  {file = "safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c"},
2092
  {file = "safehttpx-0.1.6.tar.gz", hash = "sha256:b356bfc82cee3a24c395b94a2dbeabbed60aff1aa5fa3b5fe97c4f2456ebce42"},
 
2105
  optional = false
2106
  python-versions = ">=2.7"
2107
  groups = ["main"]
 
2108
  files = [
2109
  {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"},
2110
  {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"},
2111
  ]
2112
 
2113
  [package.extras]
2114
+ dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1) ; python_version == \"3.4\"", "coverage", "flake8", "nose2", "readme-renderer (<25.0) ; python_version == \"3.4\"", "tox", "wheel", "zest.releaser[recommended]"]
2115
  doc = ["Sphinx", "sphinx-rtd-theme"]
2116
 
2117
  [[package]]
 
2121
  optional = false
2122
  python-versions = ">=3.7"
2123
  groups = ["main"]
2124
+ markers = "sys_platform != \"emscripten\""
2125
  files = [
2126
  {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"},
2127
  {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"},
 
2134
  optional = false
2135
  python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
2136
  groups = ["main"]
 
2137
  files = [
2138
  {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
2139
  {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
 
2146
  optional = false
2147
  python-versions = ">=3.7"
2148
  groups = ["main"]
 
2149
  files = [
2150
  {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
2151
  {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
 
2158
  optional = false
2159
  python-versions = ">=3.9"
2160
  groups = ["main"]
 
2161
  files = [
2162
  {file = "starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d"},
2163
  {file = "starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f"},
 
2169
  [package.extras]
2170
  full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
2171
 
2172
+ [[package]]
2173
+ name = "tomli"
2174
+ version = "2.2.1"
2175
+ description = "A lil' TOML parser"
2176
+ optional = false
2177
+ python-versions = ">=3.8"
2178
+ groups = ["dev"]
2179
+ markers = "python_version < \"3.11\""
2180
+ files = [
2181
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
2182
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
2183
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
2184
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
2185
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
2186
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
2187
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
2188
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
2189
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
2190
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
2191
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
2192
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
2193
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
2194
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
2195
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
2196
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
2197
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
2198
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
2199
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
2200
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
2201
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
2202
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
2203
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
2204
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
2205
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
2206
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
2207
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
2208
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
2209
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
2210
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
2211
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
2212
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
2213
+ ]
2214
+
2215
  [[package]]
2216
  name = "tomlkit"
2217
  version = "0.13.2"
 
2219
  optional = false
2220
  python-versions = ">=3.8"
2221
  groups = ["main"]
 
2222
  files = [
2223
  {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
2224
  {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
 
2231
  optional = false
2232
  python-versions = ">=3.7"
2233
  groups = ["main"]
 
2234
  files = [
2235
  {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"},
2236
  {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"},
 
2253
  optional = false
2254
  python-versions = ">=3.7"
2255
  groups = ["main"]
2256
+ markers = "sys_platform != \"emscripten\""
2257
  files = [
2258
  {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"},
2259
  {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"},
 
2271
  description = "Backported and Experimental Type Hints for Python 3.8+"
2272
  optional = false
2273
  python-versions = ">=3.8"
2274
+ groups = ["main", "dev"]
 
2275
  files = [
2276
  {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
2277
  {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
2278
  ]
2279
+ markers = {dev = "python_version < \"3.11\""}
2280
 
2281
  [[package]]
2282
  name = "tzdata"
 
2285
  optional = false
2286
  python-versions = ">=2"
2287
  groups = ["main"]
 
2288
  files = [
2289
  {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"},
2290
  {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"},
 
2297
  optional = false
2298
  python-versions = ">=3.9"
2299
  groups = ["main"]
 
2300
  files = [
2301
  {file = "tzlocal-5.3-py3-none-any.whl", hash = "sha256:3814135a1bb29763c6e4f08fd6e41dbb435c7a60bfbb03270211bcc537187d8c"},
2302
  {file = "tzlocal-5.3.tar.gz", hash = "sha256:2fafbfc07e9d8b49ade18f898d6bcd37ae88ce3ad6486842a2e4f03af68323d2"},
 
2315
  optional = false
2316
  python-versions = ">=3.6"
2317
  groups = ["main"]
 
2318
  files = [
2319
  {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"},
2320
  {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"},
 
2327
  optional = false
2328
  python-versions = ">=3.9"
2329
  groups = ["main"]
 
2330
  files = [
2331
  {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
2332
  {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
2333
  ]
2334
 
2335
  [package.extras]
2336
+ brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
2337
  h2 = ["h2 (>=4,<5)"]
2338
  socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
2339
  zstd = ["zstandard (>=0.18.0)"]
 
2345
  optional = false
2346
  python-versions = ">=3.9"
2347
  groups = ["main"]
2348
+ markers = "sys_platform != \"emscripten\""
2349
  files = [
2350
  {file = "uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4"},
2351
  {file = "uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9"},
 
2357
  typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
2358
 
2359
  [package.extras]
2360
+ standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"]
2361
 
2362
  [[package]]
2363
  name = "websockets"
 
2366
  optional = false
2367
  python-versions = ">=3.9"
2368
  groups = ["main"]
 
2369
  files = [
2370
  {file = "websockets-14.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e8179f95323b9ab1c11723e5d91a89403903f7b001828161b480a7810b334885"},
2371
  {file = "websockets-14.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d8c3e2cdb38f31d8bd7d9d28908005f6fa9def3324edb9bf336d7e4266fd397"},
 
2438
  {file = "websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5"},
2439
  ]
2440
 
2441
+ [[package]]
2442
+ name = "werkzeug"
2443
+ version = "3.1.3"
2444
+ description = "The comprehensive WSGI web application library."
2445
+ optional = false
2446
+ python-versions = ">=3.9"
2447
+ groups = ["main"]
2448
+ files = [
2449
+ {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"},
2450
+ {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"},
2451
+ ]
2452
+
2453
+ [package.dependencies]
2454
+ MarkupSafe = ">=2.1.1"
2455
+
2456
+ [package.extras]
2457
+ watchdog = ["watchdog (>=2.3)"]
2458
+
2459
  [metadata]
2460
  lock-version = "2.1"
2461
  python-versions = ">=3.10"
2462
+ content-hash = "08fc3d7727c2b05ff4409c7e4eafbe8175a572ee081831982e85a55f9c7b4499"
pyproject.toml CHANGED
@@ -18,10 +18,19 @@ dependencies = [
18
  "apscheduler (>=3.11.0,<4.0.0)",
19
  "python-multipart (>=0.0.20,<0.0.21)",
20
  "httpx (>=0.28.1,<0.29.0)",
21
- "markdown (>=3.7,<4.0)"
 
 
 
22
  ]
23
 
24
 
25
  [build-system]
26
  requires = ["poetry-core>=2.0.0,<3.0.0"]
27
  build-backend = "poetry.core.masonry.api"
 
 
 
 
 
 
 
18
  "apscheduler (>=3.11.0,<4.0.0)",
19
  "python-multipart (>=0.0.20,<0.0.21)",
20
  "httpx (>=0.28.1,<0.29.0)",
21
+ "markdown (>=3.7,<4.0)",
22
+ "pymongo (>=4.11.1,<5.0.0)",
23
+ "flask (>=3.1.0,<4.0.0)",
24
+ "tqdm (>=4.67.1,<5.0.0)"
25
  ]
26
 
27
 
28
  [build-system]
29
  requires = ["poetry-core>=2.0.0,<3.0.0"]
30
  build-backend = "poetry.core.masonry.api"
31
+
32
+ [tool.poetry.group.dev.dependencies]
33
+ ruff = "^0.9.6"
34
+ black = "^25.1.0"
35
+ flake8 = "^7.1.1"
36
+
tests/api_test.py CHANGED
@@ -7,54 +7,61 @@ API_URL = "https://huggingface.co/api/daily_papers"
7
  PDF_BASE_URL = "https://arxiv.org/pdf/{id}.pdf"
8
  DOWNLOAD_DIR = "papers"
9
 
 
10
  async def fetch_papers(session):
11
- async with session.get(API_URL) as response:
12
- if response.status == 200:
13
- return await response.json()
14
- raise Exception(f"API request failed: {response.status}")
 
15
 
16
  async def download_pdf(session, paper_entry):
17
- try:
18
- paper_id = paper_entry["paper"]["id"]
19
- pdf_url = PDF_BASE_URL.format(id=paper_id)
20
- clean_id = paper_id.replace("/", "_")
21
- filename = f"{datetime.now().date()}_{clean_id}.pdf"
22
- filepath = os.path.join(DOWNLOAD_DIR, filename)
23
-
24
- async with session.get(pdf_url) as response:
25
- if response.status == 200:
26
- content = await response.read()
27
- with open(filepath, "wb") as f:
28
- f.write(content)
29
- return (paper_id, True)
 
 
 
30
  return (paper_id, False)
31
- except Exception as e:
32
- print(f"Error downloading {paper_id}: {str(e)}")
33
- return (paper_id, False)
34
-
35
  os.makedirs(DOWNLOAD_DIR, exist_ok=True)
36
 
 
37
  async def main():
38
  async with aiohttp.ClientSession() as session:
39
  papers = await fetch_papers(session)
40
  print(f"Found {len(papers)} papers")
41
-
42
  print(f"\nFound {len(papers)} papers:")
43
  for i, paper_entry in enumerate(papers, 1):
44
  paper = paper_entry.get("paper", {})
45
  print(f"\nPaper {i}:")
46
  print(f"ID: {paper.get('id')}")
47
  print(f"Title: {paper.get('title')}")
48
- print(f"Authors: {', '.join([author.get('name') for author in paper.get('authors', [])])}")
 
 
49
  print(f"Published: {paper.get('publishedAt')}")
50
  print(f"Summary: {paper.get('summary')[:200]}...")
51
  print(f"PDF URL: {PDF_BASE_URL.format(id=paper.get('id'))}")
52
 
53
  tasks = [download_pdf(session, paper) for paper in papers]
54
  results = await asyncio.gather(*tasks)
55
-
56
  successful = sum(1 for _, status in results if status)
57
  print(f"Downloaded {successful}/{len(papers)} papers successfully")
58
 
 
59
  if __name__ == "__main__":
60
- asyncio.run(main())
 
7
  PDF_BASE_URL = "https://arxiv.org/pdf/{id}.pdf"
8
  DOWNLOAD_DIR = "papers"
9
 
10
+
11
  async def fetch_papers(session):
12
+ async with session.get(API_URL) as response:
13
+ if response.status == 200:
14
+ return await response.json()
15
+ raise Exception(f"API request failed: {response.status}")
16
+
17
 
18
  async def download_pdf(session, paper_entry):
19
+ try:
20
+ paper_id = paper_entry["paper"]["id"]
21
+ pdf_url = PDF_BASE_URL.format(id=paper_id)
22
+ clean_id = paper_id.replace("/", "_")
23
+ filename = f"{datetime.now().date()}_{clean_id}.pdf"
24
+ filepath = os.path.join(DOWNLOAD_DIR, filename)
25
+
26
+ async with session.get(pdf_url) as response:
27
+ if response.status == 200:
28
+ content = await response.read()
29
+ with open(filepath, "wb") as f:
30
+ f.write(content)
31
+ return (paper_id, True)
32
+ return (paper_id, False)
33
+ except Exception as e:
34
+ print(f"Error downloading {paper_id}: {str(e)}")
35
  return (paper_id, False)
36
+
37
+
 
 
38
  os.makedirs(DOWNLOAD_DIR, exist_ok=True)
39
 
40
+
41
  async def main():
42
  async with aiohttp.ClientSession() as session:
43
  papers = await fetch_papers(session)
44
  print(f"Found {len(papers)} papers")
45
+
46
  print(f"\nFound {len(papers)} papers:")
47
  for i, paper_entry in enumerate(papers, 1):
48
  paper = paper_entry.get("paper", {})
49
  print(f"\nPaper {i}:")
50
  print(f"ID: {paper.get('id')}")
51
  print(f"Title: {paper.get('title')}")
52
+ print(
53
+ f"Authors: {', '.join([author.get('name') for author in paper.get('authors', [])])}"
54
+ )
55
  print(f"Published: {paper.get('publishedAt')}")
56
  print(f"Summary: {paper.get('summary')[:200]}...")
57
  print(f"PDF URL: {PDF_BASE_URL.format(id=paper.get('id'))}")
58
 
59
  tasks = [download_pdf(session, paper) for paper in papers]
60
  results = await asyncio.gather(*tasks)
61
+
62
  successful = sum(1 for _, status in results if status)
63
  print(f"Downloaded {successful}/{len(papers)} papers successfully")
64
 
65
+
66
  if __name__ == "__main__":
67
+ asyncio.run(main())
tests/pdf_workflow_test.py CHANGED
@@ -6,14 +6,15 @@ from pathlib import Path
6
  GEMINI_API_KEY = ""
7
  genai.configure(api_key=GEMINI_API_KEY)
8
 
 
9
  class PaperAnalyzer:
10
  def __init__(self):
11
- self.model = genai.GenerativeModel('gemini-1.5-pro-latest')
12
  self.safety_settings = {
13
  HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_NONE,
14
  HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_NONE,
15
  HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
16
- HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE
17
  }
18
 
19
  def analyze_paper(self, pdf_path: str) -> str:
@@ -24,17 +25,17 @@ class PaperAnalyzer:
24
  try:
25
  abs_path = Path(pdf_path).absolute()
26
  print(f"Looking for PDF at: {abs_path}")
27
-
28
  if not abs_path.exists():
29
- available_files = list(abs_path.parent.glob('*'))
30
  print(f"Available files: {available_files}")
31
  return f"File not found: {abs_path}"
32
 
33
  uploaded_file = genai.upload_file(str(abs_path))
34
 
35
  uploaded_file = genai.upload_file(pdf_path)
36
-
37
- prompt = f"""Analyze this research paper thoroughly, considering both text and visual elements:
38
  Provide in depth explanation with all core mathematical concepts and intuition behind them.
39
 
40
  1. Paper Structure Analysis:
@@ -68,25 +69,26 @@ class PaperAnalyzer:
68
  response = self.model.generate_content(
69
  [prompt, uploaded_file],
70
  safety_settings=self.safety_settings,
71
- generation_config={"temperature": 0.2}
72
  )
73
-
74
  genai.delete_file(uploaded_file.name)
75
  return response.text
76
 
77
  except Exception as e:
78
  return f"Analysis failed: {str(e)}"
79
 
 
80
  if __name__ == "__main__":
81
  analyzer = PaperAnalyzer()
82
-
83
  paper_path = r"papers/test_pdf.pdf"
84
-
85
  print(f"Current working directory: {os.getcwd()}")
86
  print(f"Path exists: {Path(paper_path).exists()}")
87
-
88
  analysis = analyzer.analyze_paper(paper_path)
89
  print(analysis)
90
-
91
  with open("full_analysis.md", "w") as f:
92
- f.write(analysis)
 
6
  GEMINI_API_KEY = ""
7
  genai.configure(api_key=GEMINI_API_KEY)
8
 
9
+
10
  class PaperAnalyzer:
11
  def __init__(self):
12
+ self.model = genai.GenerativeModel("gemini-1.5-pro-latest")
13
  self.safety_settings = {
14
  HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_NONE,
15
  HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_NONE,
16
  HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
17
+ HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE,
18
  }
19
 
20
  def analyze_paper(self, pdf_path: str) -> str:
 
25
  try:
26
  abs_path = Path(pdf_path).absolute()
27
  print(f"Looking for PDF at: {abs_path}")
28
+
29
  if not abs_path.exists():
30
+ available_files = list(abs_path.parent.glob("*"))
31
  print(f"Available files: {available_files}")
32
  return f"File not found: {abs_path}"
33
 
34
  uploaded_file = genai.upload_file(str(abs_path))
35
 
36
  uploaded_file = genai.upload_file(pdf_path)
37
+
38
+ prompt = """Analyze this research paper thoroughly, considering both text and visual elements:
39
  Provide in depth explanation with all core mathematical concepts and intuition behind them.
40
 
41
  1. Paper Structure Analysis:
 
69
  response = self.model.generate_content(
70
  [prompt, uploaded_file],
71
  safety_settings=self.safety_settings,
72
+ generation_config={"temperature": 0.2},
73
  )
74
+
75
  genai.delete_file(uploaded_file.name)
76
  return response.text
77
 
78
  except Exception as e:
79
  return f"Analysis failed: {str(e)}"
80
 
81
+
82
  if __name__ == "__main__":
83
  analyzer = PaperAnalyzer()
84
+
85
  paper_path = r"papers/test_pdf.pdf"
86
+
87
  print(f"Current working directory: {os.getcwd()}")
88
  print(f"Path exists: {Path(paper_path).exists()}")
89
+
90
  analysis = analyzer.analyze_paper(paper_path)
91
  print(analysis)
92
+
93
  with open("full_analysis.md", "w") as f:
94
+ f.write(analysis)