ryanbalch commited on
Commit
d1009a4
·
1 Parent(s): 3653851

first pass at gradio integration

Browse files
api/event_handlers/gradio_handler.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import queue
2
+ from colorama import Fore, Style
3
+ from langchain_core.callbacks import AsyncCallbackHandler
4
+ from langchain_core.outputs.llm_result import LLMResult
5
+ from typing import List
6
+ from langchain_core.messages import BaseMessage
7
+
8
+
9
+ class GradioEventHandler(AsyncCallbackHandler):
10
+ """
11
+ Example async event handler: prints streaming tokens and tool results.
12
+ Replace with websocket or other side effects as needed.
13
+ """
14
+
15
+ def __init__(self, *args, **kwargs):
16
+ super().__init__(*args, **kwargs)
17
+ self.queue = queue.Queue()
18
+
19
+ def info_box(self, message: str):
20
+ self.queue.put(
21
+ {
22
+ "type": "info",
23
+ "message": message,
24
+ }
25
+ )
26
+
27
+ async def on_chat_model_start(self, *args, **kwargs):
28
+ self.info_box('[CHAT START]')
29
+
30
+ async def on_llm_new_token(self, token: str, **kwargs):
31
+ if token:
32
+ self.queue.put(token)
33
+
34
+ async def on_llm_end(self, result: LLMResult, *args, **kwargs):
35
+ if self.is_chat_stream_end(result):
36
+ self.queue.put(None)
37
+
38
+ async def on_tool_end(self, output: any, **kwargs):
39
+ print(f"\n{Fore.CYAN}[TOOL RESULT] {output}{Style.RESET_ALL}")
40
+
41
+ async def on_tool_start(self, input: any, *args, **kwargs):
42
+ self.info_box(f"[TOOL START]")
43
+
44
+ async def on_workflow_end(self, state, *args, **kwargs):
45
+ print(f"\n{Fore.CYAN}[WORKFLOW END]{Style.RESET_ALL}")
46
+ for msg in state["messages"]:
47
+ print(f'{Fore.YELLOW}{msg.content}{Style.RESET_ALL}')
48
+
49
+ @staticmethod
50
+ def is_chat_stream_end(result: LLMResult) -> bool:
51
+ try:
52
+ content = result.generations[0][0].message.content
53
+ return bool(content and content.strip())
54
+ except (IndexError, AttributeError):
55
+ return False
api/event_handlers/print_handler.py CHANGED
@@ -1,7 +1,8 @@
1
  from colorama import Fore, Style
2
  from langchain_core.callbacks import AsyncCallbackHandler
3
  from langchain_core.outputs.llm_result import LLMResult
4
-
 
5
 
6
  class PrintEventHandler(AsyncCallbackHandler):
7
  """
@@ -30,6 +31,9 @@ class PrintEventHandler(AsyncCallbackHandler):
30
  async def on_tool_start(self, input: any, *args, **kwargs):
31
  print(f"\n{Fore.CYAN}[TOOL START]{Style.RESET_ALL}")
32
 
 
 
 
33
  @staticmethod
34
  def is_chat_stream_end(result: LLMResult) -> bool:
35
  try:
 
1
  from colorama import Fore, Style
2
  from langchain_core.callbacks import AsyncCallbackHandler
3
  from langchain_core.outputs.llm_result import LLMResult
4
+ from typing import List
5
+ from langchain_core.messages import BaseMessage
6
 
7
  class PrintEventHandler(AsyncCallbackHandler):
8
  """
 
31
  async def on_tool_start(self, input: any, *args, **kwargs):
32
  print(f"\n{Fore.CYAN}[TOOL START]{Style.RESET_ALL}")
33
 
34
+ async def on_workflow_end(self, state, *args, **kwargs):
35
+ print(f"\n{Fore.CYAN}[WORKFLOW END]{Style.RESET_ALL}")
36
+
37
  @staticmethod
38
  def is_chat_stream_end(result: LLMResult) -> bool:
39
  try:
api/poetry.lock CHANGED
@@ -1,5 +1,17 @@
1
  # This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand.
2
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  [[package]]
4
  name = "annotated-types"
5
  version = "0.7.0"
@@ -48,6 +60,50 @@ files = [
48
  {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"},
49
  ]
50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  [[package]]
52
  name = "certifi"
53
  version = "2025.1.31"
@@ -270,6 +326,21 @@ files = [
270
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
271
  ]
272
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273
  [[package]]
274
  name = "debugpy"
275
  version = "1.8.13"
@@ -339,6 +410,160 @@ typing-extensions = ">=4.8.0"
339
  all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
340
  standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
341
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  [[package]]
343
  name = "greenlet"
344
  version = "3.2.2"
@@ -351,6 +576,7 @@ files = [
351
  {file = "greenlet-3.2.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c49e9f7c6f625507ed83a7485366b46cbe325717c60837f7244fc99ba16ba9d6"},
352
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3cc1a3ed00ecfea8932477f729a9f616ad7347a5e55d50929efa50a86cb7be7"},
353
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c9896249fbef2c615853b890ee854f22c671560226c9221cfd27c995db97e5c"},
 
354
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7791dcb496ec53d60c7f1c78eaa156c21f402dda38542a00afc3e20cae0f480f"},
355
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8009ae46259e31bc73dc183e402f548e980c96f33a6ef58cc2e7865db012e13"},
356
  {file = "greenlet-3.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5"},
@@ -359,6 +585,7 @@ files = [
359
  {file = "greenlet-3.2.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068"},
360
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce"},
361
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b"},
 
362
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74"},
363
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe"},
364
  {file = "greenlet-3.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e"},
@@ -367,6 +594,7 @@ files = [
367
  {file = "greenlet-3.2.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330"},
368
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b"},
369
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e"},
 
370
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65"},
371
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3"},
372
  {file = "greenlet-3.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e"},
@@ -375,6 +603,7 @@ files = [
375
  {file = "greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59"},
376
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf"},
377
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325"},
 
378
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825"},
379
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d"},
380
  {file = "greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf"},
@@ -382,6 +611,7 @@ files = [
382
  {file = "greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421"},
383
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418"},
384
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4"},
 
385
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b"},
386
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207"},
387
  {file = "greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8"},
@@ -390,18 +620,35 @@ files = [
390
  {file = "greenlet-3.2.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:1e4747712c4365ef6765708f948acc9c10350719ca0545e362c24ab973017370"},
391
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782743700ab75716650b5238a4759f840bb2dcf7bff56917e9ffdf9f1f23ec59"},
392
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:354f67445f5bed6604e493a06a9a49ad65675d3d03477d38a4db4a427e9aad0e"},
 
393
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cb8553ee954536500d88a1a2f58fcb867e45125e600e80f586ade399b3f8819"},
394
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1592a615b598643dbfd566bac8467f06c8c8ab6e56f069e573832ed1d5d528cc"},
395
  {file = "greenlet-3.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f72667cc341c95184f1c68f957cb2d4fc31eef81646e8e59358a10ce6689457"},
396
  {file = "greenlet-3.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a8fa80665b1a29faf76800173ff5325095f3e66a78e62999929809907aca5659"},
397
  {file = "greenlet-3.2.2-cp39-cp39-win32.whl", hash = "sha256:6629311595e3fe7304039c67f00d145cd1d38cf723bb5b99cc987b23c1433d61"},
398
  {file = "greenlet-3.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:eeb27bece45c0c2a5842ac4c5a1b5c2ceaefe5711078eed4e8043159fa05c834"},
 
399
  ]
400
 
401
  [package.extras]
402
  docs = ["Sphinx", "furo"]
403
  test = ["objgraph", "psutil"]
404
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  [[package]]
406
  name = "h11"
407
  version = "0.14.0"
@@ -517,6 +764,42 @@ http2 = ["h2 (>=3,<5)"]
517
  socks = ["socksio (==1.*)"]
518
  zstd = ["zstandard (>=0.18.0)"]
519
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
520
  [[package]]
521
  name = "idna"
522
  version = "3.10"
@@ -544,6 +827,24 @@ files = [
544
  {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"},
545
  ]
546
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
547
  [[package]]
548
  name = "jiter"
549
  version = "0.9.0"
@@ -851,6 +1152,116 @@ openai-agents = ["openai-agents (>=0.0.3,<0.1)"]
851
  otel = ["opentelemetry-api (>=1.30.0,<2.0.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0,<2.0.0)", "opentelemetry-sdk (>=1.30.0,<2.0.0)"]
852
  pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4,<14.0.0)"]
853
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
854
  [[package]]
855
  name = "numpy"
856
  version = "2.2.5"
@@ -1088,6 +1499,189 @@ files = [
1088
  {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
1089
  ]
1090
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1091
  [[package]]
1092
  name = "pluggy"
1093
  version = "1.5.0"
@@ -1251,6 +1845,51 @@ files = [
1251
  [package.dependencies]
1252
  typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
1253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1254
  [[package]]
1255
  name = "pytest"
1256
  version = "7.4.4"
@@ -1272,6 +1911,21 @@ pluggy = ">=0.12,<2.0"
1272
  [package.extras]
1273
  testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
1274
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1275
  [[package]]
1276
  name = "python-dotenv"
1277
  version = "1.1.0"
@@ -1287,6 +1941,18 @@ files = [
1287
  [package.extras]
1288
  cli = ["click (>=5.0)"]
1289
 
 
 
 
 
 
 
 
 
 
 
 
 
1290
  [[package]]
1291
  name = "python-slugify"
1292
  version = "8.0.4"
@@ -1305,6 +1971,18 @@ text-unidecode = ">=1.3"
1305
  [package.extras]
1306
  unidecode = ["Unidecode (>=1.1.1)"]
1307
 
 
 
 
 
 
 
 
 
 
 
 
 
1308
  [[package]]
1309
  name = "pyyaml"
1310
  version = "6.0.2"
@@ -1509,6 +2187,114 @@ files = [
1509
  [package.dependencies]
1510
  requests = ">=2.0.1,<3.0.0"
1511
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1512
  [[package]]
1513
  name = "sniffio"
1514
  version = "1.3.1"
@@ -1711,6 +2497,18 @@ requests = ">=2.26.0"
1711
  [package.extras]
1712
  blobfile = ["blobfile (>=2)"]
1713
 
 
 
 
 
 
 
 
 
 
 
 
 
1714
  [[package]]
1715
  name = "tqdm"
1716
  version = "4.67.1"
@@ -1733,6 +2531,25 @@ notebook = ["ipywidgets (>=6)"]
1733
  slack = ["slack-sdk"]
1734
  telegram = ["requests"]
1735
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1736
  [[package]]
1737
  name = "typing-extensions"
1738
  version = "4.13.1"
@@ -1760,6 +2577,18 @@ files = [
1760
  [package.dependencies]
1761
  typing-extensions = ">=4.12.0"
1762
 
 
 
 
 
 
 
 
 
 
 
 
 
1763
  [[package]]
1764
  name = "urllib3"
1765
  version = "2.4.0"
@@ -2286,4 +3115,4 @@ cffi = ["cffi (>=1.11)"]
2286
  [metadata]
2287
  lock-version = "2.1"
2288
  python-versions = "^3.12"
2289
- content-hash = "ecf9a8b4cd13afeac7a43e99a62dae386c72cc2656e8c7c2e9bced60e3983757"
 
1
  # This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand.
2
 
3
+ [[package]]
4
+ name = "aiofiles"
5
+ version = "24.1.0"
6
+ description = "File support for asyncio."
7
+ optional = false
8
+ python-versions = ">=3.8"
9
+ groups = ["main"]
10
+ files = [
11
+ {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
12
+ {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
13
+ ]
14
+
15
  [[package]]
16
  name = "annotated-types"
17
  version = "0.7.0"
 
60
  {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"},
61
  ]
62
 
63
+ [[package]]
64
+ name = "audioop-lts"
65
+ version = "0.2.1"
66
+ description = "LTS Port of Python audioop"
67
+ optional = false
68
+ python-versions = ">=3.13"
69
+ groups = ["main"]
70
+ markers = "python_version >= \"3.13\""
71
+ files = [
72
+ {file = "audioop_lts-0.2.1-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd1345ae99e17e6910f47ce7d52673c6a1a70820d78b67de1b7abb3af29c426a"},
73
+ {file = "audioop_lts-0.2.1-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:e175350da05d2087e12cea8e72a70a1a8b14a17e92ed2022952a4419689ede5e"},
74
+ {file = "audioop_lts-0.2.1-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:4a8dd6a81770f6ecf019c4b6d659e000dc26571b273953cef7cd1d5ce2ff3ae6"},
75
+ {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cd3c0b6f2ca25c7d2b1c3adeecbe23e65689839ba73331ebc7d893fcda7ffe"},
76
+ {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff3f97b3372c97782e9c6d3d7fdbe83bce8f70de719605bd7ee1839cd1ab360a"},
77
+ {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a351af79edefc2a1bd2234bfd8b339935f389209943043913a919df4b0f13300"},
78
+ {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aeb6f96f7f6da80354330470b9134d81b4cf544cdd1c549f2f45fe964d28059"},
79
+ {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c589f06407e8340e81962575fcffbba1e92671879a221186c3d4662de9fe804e"},
80
+ {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fbae5d6925d7c26e712f0beda5ed69ebb40e14212c185d129b8dfbfcc335eb48"},
81
+ {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_i686.whl", hash = "sha256:d2d5434717f33117f29b5691fbdf142d36573d751716249a288fbb96ba26a281"},
82
+ {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:f626a01c0a186b08f7ff61431c01c055961ee28769591efa8800beadd27a2959"},
83
+ {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:05da64e73837f88ee5c6217d732d2584cf638003ac72df124740460531e95e47"},
84
+ {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:56b7a0a4dba8e353436f31a932f3045d108a67b5943b30f85a5563f4d8488d77"},
85
+ {file = "audioop_lts-0.2.1-cp313-abi3-win32.whl", hash = "sha256:6e899eb8874dc2413b11926b5fb3857ec0ab55222840e38016a6ba2ea9b7d5e3"},
86
+ {file = "audioop_lts-0.2.1-cp313-abi3-win_amd64.whl", hash = "sha256:64562c5c771fb0a8b6262829b9b4f37a7b886c01b4d3ecdbae1d629717db08b4"},
87
+ {file = "audioop_lts-0.2.1-cp313-abi3-win_arm64.whl", hash = "sha256:c45317debeb64002e980077642afbd977773a25fa3dfd7ed0c84dccfc1fafcb0"},
88
+ {file = "audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3827e3fce6fee4d69d96a3d00cd2ab07f3c0d844cb1e44e26f719b34a5b15455"},
89
+ {file = "audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:161249db9343b3c9780ca92c0be0d1ccbfecdbccac6844f3d0d44b9c4a00a17f"},
90
+ {file = "audioop_lts-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5b7b4ff9de7a44e0ad2618afdc2ac920b91f4a6d3509520ee65339d4acde5abf"},
91
+ {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e37f416adb43b0ced93419de0122b42753ee74e87070777b53c5d2241e7fab"},
92
+ {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534ce808e6bab6adb65548723c8cbe189a3379245db89b9d555c4210b4aaa9b6"},
93
+ {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2de9b6fb8b1cf9f03990b299a9112bfdf8b86b6987003ca9e8a6c4f56d39543"},
94
+ {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f24865991b5ed4b038add5edbf424639d1358144f4e2a3e7a84bc6ba23e35074"},
95
+ {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bdb3b7912ccd57ea53197943f1bbc67262dcf29802c4a6df79ec1c715d45a78"},
96
+ {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:120678b208cca1158f0a12d667af592e067f7a50df9adc4dc8f6ad8d065a93fb"},
97
+ {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:54cd4520fc830b23c7d223693ed3e1b4d464997dd3abc7c15dce9a1f9bd76ab2"},
98
+ {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:d6bd20c7a10abcb0fb3d8aaa7508c0bf3d40dfad7515c572014da4b979d3310a"},
99
+ {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f0ed1ad9bd862539ea875fb339ecb18fcc4148f8d9908f4502df28f94d23491a"},
100
+ {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e1af3ff32b8c38a7d900382646e91f2fc515fd19dea37e9392275a5cbfdbff63"},
101
+ {file = "audioop_lts-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:f51bb55122a89f7a0817d7ac2319744b4640b5b446c4c3efcea5764ea99ae509"},
102
+ {file = "audioop_lts-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f0f2f336aa2aee2bce0b0dcc32bbba9178995454c7b979cf6ce086a8801e14c7"},
103
+ {file = "audioop_lts-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:78bfb3703388c780edf900be66e07de5a3d4105ca8e8720c5c4d67927e0b15d0"},
104
+ {file = "audioop_lts-0.2.1.tar.gz", hash = "sha256:e81268da0baa880431b68b1308ab7257eb33f356e57a5f9b1f915dfb13dd1387"},
105
+ ]
106
+
107
  [[package]]
108
  name = "certifi"
109
  version = "2025.1.31"
 
326
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
327
  ]
328
 
329
+ [[package]]
330
+ name = "dacite"
331
+ version = "1.9.2"
332
+ description = "Simple creation of data classes from dictionaries."
333
+ optional = false
334
+ python-versions = ">=3.7"
335
+ groups = ["main"]
336
+ files = [
337
+ {file = "dacite-1.9.2-py3-none-any.whl", hash = "sha256:053f7c3f5128ca2e9aceb66892b1a3c8936d02c686e707bee96e19deef4bc4a0"},
338
+ {file = "dacite-1.9.2.tar.gz", hash = "sha256:6ccc3b299727c7aa17582f0021f6ae14d5de47c7227932c47fec4cdfefd26f09"},
339
+ ]
340
+
341
+ [package.extras]
342
+ dev = ["black", "coveralls", "mypy", "pre-commit", "pylint", "pytest (>=5)", "pytest-benchmark", "pytest-cov"]
343
+
344
  [[package]]
345
  name = "debugpy"
346
  version = "1.8.13"
 
410
  all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
411
  standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
412
 
413
+ [[package]]
414
+ name = "ffmpy"
415
+ version = "0.5.0"
416
+ description = "A simple Python wrapper for FFmpeg"
417
+ optional = false
418
+ python-versions = "<4.0,>=3.8"
419
+ groups = ["main"]
420
+ files = [
421
+ {file = "ffmpy-0.5.0-py3-none-any.whl", hash = "sha256:df3799cf5816daa56d4959a023630ee53c6768b66009dae6d131519ba4b80233"},
422
+ {file = "ffmpy-0.5.0.tar.gz", hash = "sha256:277e131f246d18e9dcfee9bb514c50749031c43582ce5ef82c57b51e3d3955c3"},
423
+ ]
424
+
425
+ [[package]]
426
+ name = "filelock"
427
+ version = "3.18.0"
428
+ description = "A platform independent file lock."
429
+ optional = false
430
+ python-versions = ">=3.9"
431
+ groups = ["main"]
432
+ files = [
433
+ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"},
434
+ {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"},
435
+ ]
436
+
437
+ [package.extras]
438
+ docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"]
439
+ 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)"]
440
+ typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""]
441
+
442
+ [[package]]
443
+ name = "freeplay"
444
+ version = "0.3.21"
445
+ description = ""
446
+ optional = false
447
+ python-versions = "<4,>=3.8"
448
+ groups = ["main"]
449
+ files = [
450
+ {file = "freeplay-0.3.21-py3-none-any.whl", hash = "sha256:963d2046bc656de840303a987942a3fc5d60ce706ce9b9adb8a199a8ca70106d"},
451
+ {file = "freeplay-0.3.21.tar.gz", hash = "sha256:19418e4b5c469e766262c3d4e027af2d58f06e591b59c307a089ab74e7e16496"},
452
+ ]
453
+
454
+ [package.dependencies]
455
+ click = ">=8.1.7,<9.0.0"
456
+ dacite = ">=1.8.0,<2.0.0"
457
+ pystache = ">=0.6.5,<0.7.0"
458
+ requests = ">=2.20.0,<3.0.0dev"
459
+
460
+ [[package]]
461
+ name = "fsspec"
462
+ version = "2025.3.2"
463
+ description = "File-system specification"
464
+ optional = false
465
+ python-versions = ">=3.9"
466
+ groups = ["main"]
467
+ files = [
468
+ {file = "fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711"},
469
+ {file = "fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6"},
470
+ ]
471
+
472
+ [package.extras]
473
+ abfs = ["adlfs"]
474
+ adl = ["adlfs"]
475
+ arrow = ["pyarrow (>=1)"]
476
+ dask = ["dask", "distributed"]
477
+ dev = ["pre-commit", "ruff"]
478
+ doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"]
479
+ dropbox = ["dropbox", "dropboxdrivefs", "requests"]
480
+ full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"]
481
+ fuse = ["fusepy"]
482
+ gcs = ["gcsfs"]
483
+ git = ["pygit2"]
484
+ github = ["requests"]
485
+ gs = ["gcsfs"]
486
+ gui = ["panel"]
487
+ hdfs = ["pyarrow (>=1)"]
488
+ http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"]
489
+ libarchive = ["libarchive-c"]
490
+ oci = ["ocifs"]
491
+ s3 = ["s3fs"]
492
+ sftp = ["paramiko"]
493
+ smb = ["smbprotocol"]
494
+ ssh = ["paramiko"]
495
+ test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"]
496
+ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"]
497
+ test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"]
498
+ tqdm = ["tqdm"]
499
+
500
+ [[package]]
501
+ name = "gradio"
502
+ version = "5.29.1"
503
+ description = "Python library for easily interacting with trained machine learning models"
504
+ optional = false
505
+ python-versions = ">=3.10"
506
+ groups = ["main"]
507
+ files = [
508
+ {file = "gradio-5.29.1-py3-none-any.whl", hash = "sha256:e6fb5e984c514a8a863feaa7a6d56a8c5ded16e14c301bb3716ebe2c1ca0556c"},
509
+ {file = "gradio-5.29.1.tar.gz", hash = "sha256:34a39d1d2d21e73f01912ec59d15a507d6501b158840ebf63696b5cff1a9d8a6"},
510
+ ]
511
+
512
+ [package.dependencies]
513
+ aiofiles = ">=22.0,<25.0"
514
+ anyio = ">=3.0,<5.0"
515
+ audioop-lts = {version = "<1.0", markers = "python_version >= \"3.13\""}
516
+ fastapi = ">=0.115.2,<1.0"
517
+ ffmpy = "*"
518
+ gradio-client = "1.10.1"
519
+ groovy = ">=0.1,<1.0"
520
+ httpx = ">=0.24.1"
521
+ huggingface-hub = ">=0.28.1"
522
+ jinja2 = "<4.0"
523
+ markupsafe = ">=2.0,<4.0"
524
+ numpy = ">=1.0,<3.0"
525
+ orjson = ">=3.0,<4.0"
526
+ packaging = "*"
527
+ pandas = ">=1.0,<3.0"
528
+ pillow = ">=8.0,<12.0"
529
+ pydantic = ">=2.0,<2.12"
530
+ pydub = "*"
531
+ python-multipart = ">=0.0.18"
532
+ pyyaml = ">=5.0,<7.0"
533
+ ruff = {version = ">=0.9.3", markers = "sys_platform != \"emscripten\""}
534
+ safehttpx = ">=0.1.6,<0.2.0"
535
+ semantic-version = ">=2.0,<3.0"
536
+ starlette = {version = ">=0.40.0,<1.0", markers = "sys_platform != \"emscripten\""}
537
+ tomlkit = ">=0.12.0,<0.14.0"
538
+ typer = {version = ">=0.12,<1.0", markers = "sys_platform != \"emscripten\""}
539
+ typing-extensions = ">=4.0,<5.0"
540
+ urllib3 = {version = ">=2.0,<3.0", markers = "sys_platform == \"emscripten\""}
541
+ uvicorn = {version = ">=0.14.0", markers = "sys_platform != \"emscripten\""}
542
+
543
+ [package.extras]
544
+ mcp = ["mcp (>=1.6.0,<2.0.0)", "pydantic (>=2.11) ; sys_platform != \"emscripten\""]
545
+ oauth = ["authlib", "itsdangerous"]
546
+
547
+ [[package]]
548
+ name = "gradio-client"
549
+ version = "1.10.1"
550
+ description = "Python library for easily interacting with trained machine learning models"
551
+ optional = false
552
+ python-versions = ">=3.10"
553
+ groups = ["main"]
554
+ files = [
555
+ {file = "gradio_client-1.10.1-py3-none-any.whl", hash = "sha256:fcff53f6aad3dfa9dd082adedb94256172d6b20666b1ef66480d82023e1907db"},
556
+ {file = "gradio_client-1.10.1.tar.gz", hash = "sha256:550662eae8dc0d06d44cb8d42be74f214db1e793ad4d789d7b7ecb42e82ca045"},
557
+ ]
558
+
559
+ [package.dependencies]
560
+ fsspec = "*"
561
+ httpx = ">=0.24.1"
562
+ huggingface-hub = ">=0.19.3"
563
+ packaging = "*"
564
+ typing-extensions = ">=4.0,<5.0"
565
+ websockets = ">=10.0,<16.0"
566
+
567
  [[package]]
568
  name = "greenlet"
569
  version = "3.2.2"
 
576
  {file = "greenlet-3.2.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c49e9f7c6f625507ed83a7485366b46cbe325717c60837f7244fc99ba16ba9d6"},
577
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3cc1a3ed00ecfea8932477f729a9f616ad7347a5e55d50929efa50a86cb7be7"},
578
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c9896249fbef2c615853b890ee854f22c671560226c9221cfd27c995db97e5c"},
579
+ {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7409796591d879425997a518138889d8d17e63ada7c99edc0d7a1c22007d4907"},
580
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7791dcb496ec53d60c7f1c78eaa156c21f402dda38542a00afc3e20cae0f480f"},
581
  {file = "greenlet-3.2.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8009ae46259e31bc73dc183e402f548e980c96f33a6ef58cc2e7865db012e13"},
582
  {file = "greenlet-3.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5"},
 
585
  {file = "greenlet-3.2.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068"},
586
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce"},
587
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b"},
588
+ {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd139e4943547ce3a56ef4b8b1b9479f9e40bb47e72cc906f0f66b9d0d5cab3"},
589
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74"},
590
  {file = "greenlet-3.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe"},
591
  {file = "greenlet-3.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e"},
 
594
  {file = "greenlet-3.2.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330"},
595
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b"},
596
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e"},
597
+ {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275"},
598
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65"},
599
  {file = "greenlet-3.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3"},
600
  {file = "greenlet-3.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e"},
 
603
  {file = "greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59"},
604
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf"},
605
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325"},
606
+ {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5"},
607
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825"},
608
  {file = "greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d"},
609
  {file = "greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf"},
 
611
  {file = "greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421"},
612
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418"},
613
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4"},
614
+ {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763"},
615
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b"},
616
  {file = "greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207"},
617
  {file = "greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8"},
 
620
  {file = "greenlet-3.2.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:1e4747712c4365ef6765708f948acc9c10350719ca0545e362c24ab973017370"},
621
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782743700ab75716650b5238a4759f840bb2dcf7bff56917e9ffdf9f1f23ec59"},
622
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:354f67445f5bed6604e493a06a9a49ad65675d3d03477d38a4db4a427e9aad0e"},
623
+ {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3aeca9848d08ce5eb653cf16e15bb25beeab36e53eb71cc32569f5f3afb2a3aa"},
624
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cb8553ee954536500d88a1a2f58fcb867e45125e600e80f586ade399b3f8819"},
625
  {file = "greenlet-3.2.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1592a615b598643dbfd566bac8467f06c8c8ab6e56f069e573832ed1d5d528cc"},
626
  {file = "greenlet-3.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f72667cc341c95184f1c68f957cb2d4fc31eef81646e8e59358a10ce6689457"},
627
  {file = "greenlet-3.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a8fa80665b1a29faf76800173ff5325095f3e66a78e62999929809907aca5659"},
628
  {file = "greenlet-3.2.2-cp39-cp39-win32.whl", hash = "sha256:6629311595e3fe7304039c67f00d145cd1d38cf723bb5b99cc987b23c1433d61"},
629
  {file = "greenlet-3.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:eeb27bece45c0c2a5842ac4c5a1b5c2ceaefe5711078eed4e8043159fa05c834"},
630
+ {file = "greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485"},
631
  ]
632
 
633
  [package.extras]
634
  docs = ["Sphinx", "furo"]
635
  test = ["objgraph", "psutil"]
636
 
637
+ [[package]]
638
+ name = "groovy"
639
+ version = "0.1.2"
640
+ description = "A small Python library created to help developers protect their applications from Server Side Request Forgery (SSRF) attacks."
641
+ optional = false
642
+ python-versions = ">3.9"
643
+ groups = ["main"]
644
+ files = [
645
+ {file = "groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64"},
646
+ {file = "groovy-0.1.2.tar.gz", hash = "sha256:25c1dc09b3f9d7e292458aa762c6beb96ea037071bf5e917fc81fb78d2231083"},
647
+ ]
648
+
649
+ [package.extras]
650
+ dev = ["pytest", "ruff (==0.9.3)"]
651
+
652
  [[package]]
653
  name = "h11"
654
  version = "0.14.0"
 
764
  socks = ["socksio (==1.*)"]
765
  zstd = ["zstandard (>=0.18.0)"]
766
 
767
+ [[package]]
768
+ name = "huggingface-hub"
769
+ version = "0.31.2"
770
+ description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
771
+ optional = false
772
+ python-versions = ">=3.8.0"
773
+ groups = ["main"]
774
+ files = [
775
+ {file = "huggingface_hub-0.31.2-py3-none-any.whl", hash = "sha256:8138cd52aa2326b4429bb00a4a1ba8538346b7b8a808cdce30acb6f1f1bdaeec"},
776
+ {file = "huggingface_hub-0.31.2.tar.gz", hash = "sha256:7053561376ed7f6ffdaecf09cc54d70dc784ac6315fa4bb9b93e19662b029675"},
777
+ ]
778
+
779
+ [package.dependencies]
780
+ filelock = "*"
781
+ fsspec = ">=2023.5.0"
782
+ packaging = ">=20.9"
783
+ pyyaml = ">=5.1"
784
+ requests = "*"
785
+ tqdm = ">=4.42.1"
786
+ typing-extensions = ">=3.7.4.3"
787
+
788
+ [package.extras]
789
+ all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
790
+ cli = ["InquirerPy (==0.3.4)"]
791
+ dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
792
+ fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
793
+ hf-transfer = ["hf-transfer (>=0.1.4)"]
794
+ hf-xet = ["hf-xet (>=1.1.1,<2.0.0)"]
795
+ inference = ["aiohttp"]
796
+ quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.9.0)"]
797
+ tensorflow = ["graphviz", "pydot", "tensorflow"]
798
+ tensorflow-testing = ["keras (<3.0)", "tensorflow"]
799
+ testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
800
+ torch = ["safetensors[torch]", "torch"]
801
+ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
802
+
803
  [[package]]
804
  name = "idna"
805
  version = "3.10"
 
827
  {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"},
828
  ]
829
 
830
+ [[package]]
831
+ name = "jinja2"
832
+ version = "3.1.6"
833
+ description = "A very fast and expressive template engine."
834
+ optional = false
835
+ python-versions = ">=3.7"
836
+ groups = ["main"]
837
+ files = [
838
+ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
839
+ {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
840
+ ]
841
+
842
+ [package.dependencies]
843
+ MarkupSafe = ">=2.0"
844
+
845
+ [package.extras]
846
+ i18n = ["Babel (>=2.7)"]
847
+
848
  [[package]]
849
  name = "jiter"
850
  version = "0.9.0"
 
1152
  otel = ["opentelemetry-api (>=1.30.0,<2.0.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0,<2.0.0)", "opentelemetry-sdk (>=1.30.0,<2.0.0)"]
1153
  pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4,<14.0.0)"]
1154
 
1155
+ [[package]]
1156
+ name = "markdown-it-py"
1157
+ version = "3.0.0"
1158
+ description = "Python port of markdown-it. Markdown parsing, done right!"
1159
+ optional = false
1160
+ python-versions = ">=3.8"
1161
+ groups = ["main"]
1162
+ markers = "sys_platform != \"emscripten\""
1163
+ files = [
1164
+ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
1165
+ {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
1166
+ ]
1167
+
1168
+ [package.dependencies]
1169
+ mdurl = ">=0.1,<1.0"
1170
+
1171
+ [package.extras]
1172
+ benchmarking = ["psutil", "pytest", "pytest-benchmark"]
1173
+ code-style = ["pre-commit (>=3.0,<4.0)"]
1174
+ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
1175
+ linkify = ["linkify-it-py (>=1,<3)"]
1176
+ plugins = ["mdit-py-plugins"]
1177
+ profiling = ["gprof2dot"]
1178
+ rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
1179
+ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
1180
+
1181
+ [[package]]
1182
+ name = "markupsafe"
1183
+ version = "3.0.2"
1184
+ description = "Safely add untrusted strings to HTML/XML markup."
1185
+ optional = false
1186
+ python-versions = ">=3.9"
1187
+ groups = ["main"]
1188
+ files = [
1189
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
1190
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
1191
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
1192
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
1193
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
1194
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
1195
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
1196
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
1197
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
1198
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
1199
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
1200
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
1201
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
1202
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
1203
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
1204
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
1205
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
1206
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
1207
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
1208
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
1209
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
1210
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
1211
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
1212
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
1213
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
1214
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
1215
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
1216
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
1217
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
1218
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
1219
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
1220
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
1221
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
1222
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
1223
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
1224
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
1225
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
1226
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
1227
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
1228
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
1229
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
1230
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
1231
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
1232
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
1233
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
1234
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
1235
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
1236
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
1237
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
1238
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
1239
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
1240
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
1241
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
1242
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
1243
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
1244
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
1245
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
1246
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
1247
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
1248
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
1249
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
1250
+ ]
1251
+
1252
+ [[package]]
1253
+ name = "mdurl"
1254
+ version = "0.1.2"
1255
+ description = "Markdown URL utilities"
1256
+ optional = false
1257
+ python-versions = ">=3.7"
1258
+ groups = ["main"]
1259
+ markers = "sys_platform != \"emscripten\""
1260
+ files = [
1261
+ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
1262
+ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
1263
+ ]
1264
+
1265
  [[package]]
1266
  name = "numpy"
1267
  version = "2.2.5"
 
1499
  {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
1500
  ]
1501
 
1502
+ [[package]]
1503
+ name = "pandas"
1504
+ version = "2.2.3"
1505
+ description = "Powerful data structures for data analysis, time series, and statistics"
1506
+ optional = false
1507
+ python-versions = ">=3.9"
1508
+ groups = ["main"]
1509
+ files = [
1510
+ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
1511
+ {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
1512
+ {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
1513
+ {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
1514
+ {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
1515
+ {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
1516
+ {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
1517
+ {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
1518
+ {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
1519
+ {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
1520
+ {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
1521
+ {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
1522
+ {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
1523
+ {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
1524
+ {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
1525
+ {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
1526
+ {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
1527
+ {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
1528
+ {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
1529
+ {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
1530
+ {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
1531
+ {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
1532
+ {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
1533
+ {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
1534
+ {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
1535
+ {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
1536
+ {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
1537
+ {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
1538
+ {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
1539
+ {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
1540
+ {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
1541
+ {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
1542
+ {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
1543
+ {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
1544
+ {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
1545
+ {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
1546
+ {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
1547
+ {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
1548
+ {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
1549
+ {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
1550
+ {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
1551
+ {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
1552
+ ]
1553
+
1554
+ [package.dependencies]
1555
+ numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""}
1556
+ python-dateutil = ">=2.8.2"
1557
+ pytz = ">=2020.1"
1558
+ tzdata = ">=2022.7"
1559
+
1560
+ [package.extras]
1561
+ all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"]
1562
+ aws = ["s3fs (>=2022.11.0)"]
1563
+ clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"]
1564
+ compression = ["zstandard (>=0.19.0)"]
1565
+ computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"]
1566
+ consortium-standard = ["dataframe-api-compat (>=0.1.7)"]
1567
+ excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"]
1568
+ feather = ["pyarrow (>=10.0.1)"]
1569
+ fss = ["fsspec (>=2022.11.0)"]
1570
+ gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"]
1571
+ hdf5 = ["tables (>=3.8.0)"]
1572
+ html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"]
1573
+ mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"]
1574
+ output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"]
1575
+ parquet = ["pyarrow (>=10.0.1)"]
1576
+ performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"]
1577
+ plot = ["matplotlib (>=3.6.3)"]
1578
+ postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"]
1579
+ pyarrow = ["pyarrow (>=10.0.1)"]
1580
+ spss = ["pyreadstat (>=1.2.0)"]
1581
+ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"]
1582
+ test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
1583
+ xml = ["lxml (>=4.9.2)"]
1584
+
1585
+ [[package]]
1586
+ name = "pillow"
1587
+ version = "11.2.1"
1588
+ description = "Python Imaging Library (Fork)"
1589
+ optional = false
1590
+ python-versions = ">=3.9"
1591
+ groups = ["main"]
1592
+ files = [
1593
+ {file = "pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047"},
1594
+ {file = "pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95"},
1595
+ {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61"},
1596
+ {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1"},
1597
+ {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c"},
1598
+ {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d"},
1599
+ {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97"},
1600
+ {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579"},
1601
+ {file = "pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d"},
1602
+ {file = "pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad"},
1603
+ {file = "pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2"},
1604
+ {file = "pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70"},
1605
+ {file = "pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf"},
1606
+ {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7"},
1607
+ {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8"},
1608
+ {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600"},
1609
+ {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788"},
1610
+ {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e"},
1611
+ {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e"},
1612
+ {file = "pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6"},
1613
+ {file = "pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193"},
1614
+ {file = "pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7"},
1615
+ {file = "pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f"},
1616
+ {file = "pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b"},
1617
+ {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d"},
1618
+ {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4"},
1619
+ {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d"},
1620
+ {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4"},
1621
+ {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443"},
1622
+ {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c"},
1623
+ {file = "pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3"},
1624
+ {file = "pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941"},
1625
+ {file = "pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb"},
1626
+ {file = "pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28"},
1627
+ {file = "pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830"},
1628
+ {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0"},
1629
+ {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1"},
1630
+ {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f"},
1631
+ {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155"},
1632
+ {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14"},
1633
+ {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b"},
1634
+ {file = "pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2"},
1635
+ {file = "pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691"},
1636
+ {file = "pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c"},
1637
+ {file = "pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22"},
1638
+ {file = "pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7"},
1639
+ {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16"},
1640
+ {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b"},
1641
+ {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406"},
1642
+ {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91"},
1643
+ {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751"},
1644
+ {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9"},
1645
+ {file = "pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd"},
1646
+ {file = "pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e"},
1647
+ {file = "pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681"},
1648
+ {file = "pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8"},
1649
+ {file = "pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909"},
1650
+ {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928"},
1651
+ {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79"},
1652
+ {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35"},
1653
+ {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb"},
1654
+ {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a"},
1655
+ {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36"},
1656
+ {file = "pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67"},
1657
+ {file = "pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1"},
1658
+ {file = "pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e"},
1659
+ {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156"},
1660
+ {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772"},
1661
+ {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363"},
1662
+ {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0"},
1663
+ {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01"},
1664
+ {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193"},
1665
+ {file = "pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013"},
1666
+ {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed"},
1667
+ {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c"},
1668
+ {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd"},
1669
+ {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076"},
1670
+ {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b"},
1671
+ {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f"},
1672
+ {file = "pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044"},
1673
+ {file = "pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6"},
1674
+ ]
1675
+
1676
+ [package.extras]
1677
+ docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"]
1678
+ fpx = ["olefile"]
1679
+ mic = ["olefile"]
1680
+ test-arrow = ["pyarrow"]
1681
+ tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"]
1682
+ typing = ["typing-extensions ; python_version < \"3.10\""]
1683
+ xmp = ["defusedxml"]
1684
+
1685
  [[package]]
1686
  name = "pluggy"
1687
  version = "1.5.0"
 
1845
  [package.dependencies]
1846
  typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
1847
 
1848
+ [[package]]
1849
+ name = "pydub"
1850
+ version = "0.25.1"
1851
+ description = "Manipulate audio with an simple and easy high level interface"
1852
+ optional = false
1853
+ python-versions = "*"
1854
+ groups = ["main"]
1855
+ files = [
1856
+ {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
1857
+ {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
1858
+ ]
1859
+
1860
+ [[package]]
1861
+ name = "pygments"
1862
+ version = "2.19.1"
1863
+ description = "Pygments is a syntax highlighting package written in Python."
1864
+ optional = false
1865
+ python-versions = ">=3.8"
1866
+ groups = ["main"]
1867
+ markers = "sys_platform != \"emscripten\""
1868
+ files = [
1869
+ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
1870
+ {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
1871
+ ]
1872
+
1873
+ [package.extras]
1874
+ windows-terminal = ["colorama (>=0.4.6)"]
1875
+
1876
+ [[package]]
1877
+ name = "pystache"
1878
+ version = "0.6.8"
1879
+ description = "Mustache for Python"
1880
+ optional = false
1881
+ python-versions = ">=3.8"
1882
+ groups = ["main"]
1883
+ files = [
1884
+ {file = "pystache-0.6.8-py3-none-any.whl", hash = "sha256:7211e000974a6e06bce2d4d5cad8df03bcfffefd367209117376e4527a1c3cb8"},
1885
+ {file = "pystache-0.6.8.tar.gz", hash = "sha256:3707518e6a4d26dd189b07c10c669b1fc17df72684617c327bd3550e7075c72c"},
1886
+ ]
1887
+
1888
+ [package.extras]
1889
+ cov = ["coverage", "coverage_python_version"]
1890
+ doc = ["recommonmark", "sphinx", "sphinx_git", "sphinx_rtd_theme", "sphinxcontrib-apidoc"]
1891
+ test = ["pytest", "pytest-cov"]
1892
+
1893
  [[package]]
1894
  name = "pytest"
1895
  version = "7.4.4"
 
1911
  [package.extras]
1912
  testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
1913
 
1914
+ [[package]]
1915
+ name = "python-dateutil"
1916
+ version = "2.9.0.post0"
1917
+ description = "Extensions to the standard Python datetime module"
1918
+ optional = false
1919
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
1920
+ groups = ["main"]
1921
+ files = [
1922
+ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
1923
+ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
1924
+ ]
1925
+
1926
+ [package.dependencies]
1927
+ six = ">=1.5"
1928
+
1929
  [[package]]
1930
  name = "python-dotenv"
1931
  version = "1.1.0"
 
1941
  [package.extras]
1942
  cli = ["click (>=5.0)"]
1943
 
1944
+ [[package]]
1945
+ name = "python-multipart"
1946
+ version = "0.0.20"
1947
+ description = "A streaming multipart parser for Python"
1948
+ optional = false
1949
+ python-versions = ">=3.8"
1950
+ groups = ["main"]
1951
+ files = [
1952
+ {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"},
1953
+ {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"},
1954
+ ]
1955
+
1956
  [[package]]
1957
  name = "python-slugify"
1958
  version = "8.0.4"
 
1971
  [package.extras]
1972
  unidecode = ["Unidecode (>=1.1.1)"]
1973
 
1974
+ [[package]]
1975
+ name = "pytz"
1976
+ version = "2025.2"
1977
+ description = "World timezone definitions, modern and historical"
1978
+ optional = false
1979
+ python-versions = "*"
1980
+ groups = ["main"]
1981
+ files = [
1982
+ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"},
1983
+ {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"},
1984
+ ]
1985
+
1986
  [[package]]
1987
  name = "pyyaml"
1988
  version = "6.0.2"
 
2187
  [package.dependencies]
2188
  requests = ">=2.0.1,<3.0.0"
2189
 
2190
+ [[package]]
2191
+ name = "rich"
2192
+ version = "14.0.0"
2193
+ description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
2194
+ optional = false
2195
+ python-versions = ">=3.8.0"
2196
+ groups = ["main"]
2197
+ markers = "sys_platform != \"emscripten\""
2198
+ files = [
2199
+ {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"},
2200
+ {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"},
2201
+ ]
2202
+
2203
+ [package.dependencies]
2204
+ markdown-it-py = ">=2.2.0"
2205
+ pygments = ">=2.13.0,<3.0.0"
2206
+
2207
+ [package.extras]
2208
+ jupyter = ["ipywidgets (>=7.5.1,<9)"]
2209
+
2210
+ [[package]]
2211
+ name = "ruff"
2212
+ version = "0.11.10"
2213
+ description = "An extremely fast Python linter and code formatter, written in Rust."
2214
+ optional = false
2215
+ python-versions = ">=3.7"
2216
+ groups = ["main"]
2217
+ markers = "sys_platform != \"emscripten\""
2218
+ files = [
2219
+ {file = "ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58"},
2220
+ {file = "ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed"},
2221
+ {file = "ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca"},
2222
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2"},
2223
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5"},
2224
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641"},
2225
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947"},
2226
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4"},
2227
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f"},
2228
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b"},
2229
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2"},
2230
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523"},
2231
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125"},
2232
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad"},
2233
+ {file = "ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19"},
2234
+ {file = "ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224"},
2235
+ {file = "ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1"},
2236
+ {file = "ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6"},
2237
+ ]
2238
+
2239
+ [[package]]
2240
+ name = "safehttpx"
2241
+ version = "0.1.6"
2242
+ description = "A small Python library created to help developers protect their applications from Server Side Request Forgery (SSRF) attacks."
2243
+ optional = false
2244
+ python-versions = ">3.9"
2245
+ groups = ["main"]
2246
+ files = [
2247
+ {file = "safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c"},
2248
+ {file = "safehttpx-0.1.6.tar.gz", hash = "sha256:b356bfc82cee3a24c395b94a2dbeabbed60aff1aa5fa3b5fe97c4f2456ebce42"},
2249
+ ]
2250
+
2251
+ [package.dependencies]
2252
+ httpx = "*"
2253
+
2254
+ [package.extras]
2255
+ dev = ["pytest"]
2256
+
2257
+ [[package]]
2258
+ name = "semantic-version"
2259
+ version = "2.10.0"
2260
+ description = "A library implementing the 'SemVer' scheme."
2261
+ optional = false
2262
+ python-versions = ">=2.7"
2263
+ groups = ["main"]
2264
+ files = [
2265
+ {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"},
2266
+ {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"},
2267
+ ]
2268
+
2269
+ [package.extras]
2270
+ 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]"]
2271
+ doc = ["Sphinx", "sphinx-rtd-theme"]
2272
+
2273
+ [[package]]
2274
+ name = "shellingham"
2275
+ version = "1.5.4"
2276
+ description = "Tool to Detect Surrounding Shell"
2277
+ optional = false
2278
+ python-versions = ">=3.7"
2279
+ groups = ["main"]
2280
+ markers = "sys_platform != \"emscripten\""
2281
+ files = [
2282
+ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"},
2283
+ {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"},
2284
+ ]
2285
+
2286
+ [[package]]
2287
+ name = "six"
2288
+ version = "1.17.0"
2289
+ description = "Python 2 and 3 compatibility utilities"
2290
+ optional = false
2291
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
2292
+ groups = ["main"]
2293
+ files = [
2294
+ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
2295
+ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
2296
+ ]
2297
+
2298
  [[package]]
2299
  name = "sniffio"
2300
  version = "1.3.1"
 
2497
  [package.extras]
2498
  blobfile = ["blobfile (>=2)"]
2499
 
2500
+ [[package]]
2501
+ name = "tomlkit"
2502
+ version = "0.13.2"
2503
+ description = "Style preserving TOML library"
2504
+ optional = false
2505
+ python-versions = ">=3.8"
2506
+ groups = ["main"]
2507
+ files = [
2508
+ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
2509
+ {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
2510
+ ]
2511
+
2512
  [[package]]
2513
  name = "tqdm"
2514
  version = "4.67.1"
 
2531
  slack = ["slack-sdk"]
2532
  telegram = ["requests"]
2533
 
2534
+ [[package]]
2535
+ name = "typer"
2536
+ version = "0.15.4"
2537
+ description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
2538
+ optional = false
2539
+ python-versions = ">=3.7"
2540
+ groups = ["main"]
2541
+ markers = "sys_platform != \"emscripten\""
2542
+ files = [
2543
+ {file = "typer-0.15.4-py3-none-any.whl", hash = "sha256:eb0651654dcdea706780c466cf06d8f174405a659ffff8f163cfbfee98c0e173"},
2544
+ {file = "typer-0.15.4.tar.gz", hash = "sha256:89507b104f9b6a0730354f27c39fae5b63ccd0c95b1ce1f1a6ba0cfd329997c3"},
2545
+ ]
2546
+
2547
+ [package.dependencies]
2548
+ click = ">=8.0.0,<8.2"
2549
+ rich = ">=10.11.0"
2550
+ shellingham = ">=1.3.0"
2551
+ typing-extensions = ">=3.7.4.3"
2552
+
2553
  [[package]]
2554
  name = "typing-extensions"
2555
  version = "4.13.1"
 
2577
  [package.dependencies]
2578
  typing-extensions = ">=4.12.0"
2579
 
2580
+ [[package]]
2581
+ name = "tzdata"
2582
+ version = "2025.2"
2583
+ description = "Provider of IANA time zone data"
2584
+ optional = false
2585
+ python-versions = ">=2"
2586
+ groups = ["main"]
2587
+ files = [
2588
+ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"},
2589
+ {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
2590
+ ]
2591
+
2592
  [[package]]
2593
  name = "urllib3"
2594
  version = "2.4.0"
 
3115
  [metadata]
3116
  lock-version = "2.1"
3117
  python-versions = "^3.12"
3118
+ content-hash = "b60012f5dd4982e945bd68bac9e2ad63f588b2a539b6934d3042146dd205ae79"
api/pyproject.toml CHANGED
@@ -23,6 +23,8 @@ zep-cloud = "^2.12.1"
23
  colorama = "^0.4.6"
24
  langchain = "^0.3.25"
25
  langgraph = "^0.4.3"
 
 
26
 
27
  [tool.poetry.group.dev.dependencies]
28
  pytest = "^7.4.0"
 
23
  colorama = "^0.4.6"
24
  langchain = "^0.3.25"
25
  langgraph = "^0.4.3"
26
+ freeplay = "^0.3.21"
27
+ gradio = "^5.29.1"
28
 
29
  [tool.poetry.group.dev.dependencies]
30
  pytest = "^7.4.0"
api/scripts/freeplay_playground.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ from pprint import pprint
3
+ from utils.freeplay_helpers import get_formatted_prompt, get_prompt
4
+ import datetime
5
+
6
+ async def main():
7
+ template = "casual_fan_prompt"
8
+ environment = "latest"
9
+ variables = {
10
+ "now": datetime.datetime.now(datetime.UTC).strftime('%Y-%m-%d'),
11
+ "zep_context": "Zep is your daddy",
12
+ }
13
+ history = [
14
+ {"role": "user", "content": "what are some dinner ideas..."},
15
+ {"role": "assistant", "content": "here are some dinner ideas..."},
16
+ ]
17
+
18
+ prompt = get_formatted_prompt(template, environment, variables, history=history)
19
+ # print(prompt.system_content)
20
+ pprint(prompt.llm_prompt)
21
+
22
+ # template_prompt = await get_prompt(template, environment)
23
+ # print(template_prompt.messages)
24
+
25
+ if __name__ == "__main__":
26
+ asyncio.run(main())
27
+
api/scripts/generate_freeplay_dataset.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import datetime
4
+
5
+
6
+ def export_dict_as_jsonl(data: dict, filename: str):
7
+ """
8
+ Export a dictionary as a JSONL file.
9
+ """
10
+ with open(filename, "w") as f:
11
+ for item in data:
12
+ f.write(json.dumps(item) + "\n")
13
+
14
+
15
+ """
16
+ {
17
+ "inputs": {"": ""},
18
+ "output": "",
19
+ },
20
+ """
21
+
22
+
23
+ if __name__ == "__main__":
24
+ data = [
25
+ {
26
+ "inputs": {
27
+ "now": datetime.datetime.now(datetime.UTC).strftime('%Y-%m-%d'),
28
+ "zep_context": "Zep is your daddy",
29
+ "history": [
30
+ {"role": "user", "content": "what are some dinner ideas..."},
31
+ # {"role": "assistant", "content": "here are some dinner ideas..."},
32
+ ],
33
+ },
34
+ "output": "here are some dinner ideas...",
35
+ },
36
+ ]
37
+ # export dict as jsonl
38
+ export_dict_as_jsonl(data, "formatted_prompt.jsonl")
api/server_gradio.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import gradio as gr
3
+ import time
4
+ from pydantic import BaseModel
5
+ from threading import Thread
6
+ from langchain_core.messages import HumanMessage, AIMessage
7
+ from event_handlers.gradio_handler import GradioEventHandler
8
+ from workflows.base import build_workflow
9
+
10
+ lorem_ipsum = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."""
11
+ show_state = True
12
+
13
+
14
+ class AppState(BaseModel):
15
+ count: int = 0
16
+ persona: str = "Casual Fan"
17
+ user_query: str = ""
18
+ history: list = []
19
+
20
+ def clear(self) -> None:
21
+ """Reset the state to default values."""
22
+ self.count = 0
23
+ self.persona = "Casual Fan"
24
+ self.user_query = ""
25
+ self.history = []
26
+
27
+
28
+ with gr.Blocks() as demo:
29
+ state = gr.State(AppState())
30
+ handler = GradioEventHandler()
31
+ workflow_state = {
32
+ "session_id": "5aed14ff09fb415ba77439409f458909",
33
+ "messages": [],
34
+ }
35
+
36
+ gr.Markdown("# Huge League Soccer")
37
+ llm_response = gr.Textbox(label="LLM Response", lines=10)
38
+ count = gr.Number(
39
+ label="Count",
40
+ interactive=False,
41
+ visible=show_state,
42
+ )
43
+ persona_disp = gr.Text(
44
+ label="Persona",
45
+ interactive=False,
46
+ value=state.value.persona,
47
+ visible=show_state,
48
+ )
49
+
50
+ with gr.Row(scale=1):
51
+ with gr.Column(scale=1):
52
+ persona = gr.Radio(
53
+ choices=["Casual Fan", "Super Fan"],
54
+ value="Casual Fan",
55
+ label="Select Persona",
56
+ )
57
+ with gr.Column(scale=2):
58
+ user_query = gr.Textbox(
59
+ label="User Query",
60
+ placeholder="Ask me about Huge League Soccer...",
61
+ # lines=3,
62
+ autofocus=True,
63
+ show_label=False,
64
+ )
65
+ submit_btn = gr.Button("Submit", variant="primary", scale=0)
66
+
67
+ clear_state_btn = gr.Button("Clear State", variant="stop", scale=1)
68
+
69
+ @submit_btn.click(inputs=[user_query, state], outputs=[llm_response])
70
+ def submit(user_query, state):
71
+ state.user_query = user_query or "tell me about some players in everglade fc"
72
+ message = HumanMessage(content=state.user_query)
73
+ state.history.append(message)
74
+ workflow_state["messages"] = state.history
75
+
76
+ def start_async_loop():
77
+ workflow = build_workflow(handler)
78
+ async def run_workflow():
79
+ print(workflow_state)
80
+ await workflow.ainvoke(workflow_state)
81
+ asyncio.run(run_workflow())
82
+
83
+ thread = Thread(target=start_async_loop, daemon=True)
84
+ thread.start()
85
+
86
+ result = ""
87
+ while True:
88
+ token = handler.queue.get()
89
+ from colorama import Fore, Style
90
+ print(f'{Fore.GREEN}{token}{Style.RESET_ALL}')
91
+ if token is None:
92
+ break
93
+ if isinstance(token, dict):
94
+ if token["type"] == "info":
95
+ gr.Info(token["message"])
96
+ continue
97
+ result += token
98
+ yield result
99
+
100
+ state.history.append(AIMessage(content=result))
101
+
102
+ @user_query.submit(inputs=[user_query, state], outputs=[llm_response])
103
+ def user_query_change(user_query, state):
104
+ state.user_query = user_query
105
+
106
+ result = state.user_query
107
+ for i in range(0, len(lorem_ipsum), 4):
108
+ time.sleep(0.1)
109
+ result += lorem_ipsum[i:i+4]
110
+ yield result
111
+
112
+ @persona.change(inputs=[persona, state], outputs=[persona_disp])
113
+ def persona_change(persona, state):
114
+ state.persona = persona
115
+ return persona
116
+
117
+ @submit_btn.click(inputs=[state], outputs=[count])
118
+ def submit(state):
119
+ state.count += 1
120
+ return state.count
121
+
122
+ @user_query.submit(inputs=[state], outputs=[count, user_query])
123
+ def user_query_change(state):
124
+ state.count += 1
125
+ return state.count, ''
126
+
127
+ @clear_state_btn.click(inputs=[state], outputs=[count, persona_disp, user_query, llm_response])
128
+ def clear_state(state):
129
+ state.clear()
130
+ return state.count, state.persona, state.user_query, ""
131
+
132
+
133
+ if __name__ == "__main__":
134
+ demo.launch(server_name="0.0.0.0", server_port=8000)
api/utils/freeplay_helpers.py ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # import datetime
2
+ import os
3
+ from functools import lru_cache
4
+ from typing import Union, Optional, List
5
+ from freeplay import Freeplay, RecordPayload, ResponseInfo, CallInfo
6
+ from langchain_core.messages import BaseMessage
7
+
8
+ FREEPLAY_PROJECT_ID = os.getenv("FREEPLAY_PROJECT_ID")
9
+
10
+
11
+ # @lru_cache(maxsize=1)
12
+ def get_fp_client():
13
+ return Freeplay(
14
+ freeplay_api_key=os.getenv("FREEPLAY_API_KEY"),
15
+ api_base=os.getenv("FREEPLAY_URL"),
16
+ )
17
+
18
+
19
+ # retreive and format your prompt
20
+ def get_formatted_prompt(
21
+ template: str,
22
+ environment: str = "latest",
23
+ variables: dict = {},
24
+ history: Optional[List[BaseMessage]] = None,
25
+ ):
26
+ """
27
+ Get a formatted prompt from Freeplay.
28
+ """
29
+ # get fp client
30
+ fpClient = get_fp_client()
31
+ # variables = {**variables, "now": datetime.datetime.now(datetime.UTC).strftime('%Y-%m-%d')}
32
+ # get formatted prompt
33
+ formatted_prompt = fpClient.prompts.get_formatted(
34
+ project_id=FREEPLAY_PROJECT_ID,
35
+ template_name=template,
36
+ environment=environment,
37
+ variables=variables,
38
+ history=history
39
+ )
40
+ return formatted_prompt
41
+
42
+
43
+ async def get_prompt(
44
+ template: str,
45
+ environment: str = "latest",
46
+ ):
47
+ """
48
+ Get an unformatted prompt template from Freeplay.
49
+ """
50
+ # get fp client
51
+ fpClient = get_fp_client()
52
+ # get unformatted prompt template
53
+ template_prompt = fpClient.prompts.get(
54
+ project_id=FREEPLAY_PROJECT_ID,
55
+ template_name=template,
56
+ environment=environment
57
+ )
58
+ return template_prompt
api/utils/zep_helpers.py CHANGED
@@ -4,7 +4,7 @@ from zep_cloud.client import AsyncZep
4
  from zep_cloud.types import Message
5
 
6
 
7
- @lru_cache(maxsize=1)
8
  def get_zep_client():
9
  return AsyncZep()
10
 
 
4
  from zep_cloud.types import Message
5
 
6
 
7
+ # @lru_cache(maxsize=1)
8
  def get_zep_client():
9
  return AsyncZep()
10
 
api/workflows/base.py CHANGED
@@ -18,6 +18,7 @@ from langgraph.prebuilt import ToolNode
18
 
19
 
20
  from utils.zep_helpers import (
 
21
  get_zep_client,
22
  record_session,
23
  )
@@ -39,15 +40,13 @@ tool_node = ToolNode(available_tools)
39
  llm = ChatOpenAI(model="gpt-4o-mini")
40
  llm_with_tools = llm.bind_tools(tools=available_tools)
41
 
42
- zep_client = get_zep_client()
43
-
44
 
45
  class AgentState(TypedDict):
46
  session_id: str
47
  messages: Annotated[Sequence[BaseMessage], operator.add]
48
 
49
 
50
- async def call_model(state: AgentState, handler: AsyncCallbackHandler) -> dict:
51
  session_id = state["session_id"]
52
  memory = await zep_client.memory.get(session_id=session_id)
53
  messages = state["messages"]
@@ -86,25 +85,28 @@ async def call_tool(state: AgentState, handler: AsyncCallbackHandler) -> dict:
86
  return {"messages": results}
87
 
88
 
89
- async def should_continue(state):
90
  messages = state["messages"]
91
  last_message = messages[-1]
92
  if 'tool_calls' not in last_message.additional_kwargs:
93
  # inform zep of final response
94
  await record_session(state["session_id"], messages)
 
 
95
  return 'end'
96
  return 'continue'
97
 
98
 
99
  def build_workflow(handler: AsyncCallbackHandler):
100
  workflow = StateGraph(AgentState)
101
- workflow.add_node('agent', partial(call_model, handler=handler))
 
102
  workflow.add_node('tools', partial(call_tool, handler=handler))
103
  workflow.set_entry_point('agent')
104
 
105
  workflow.add_conditional_edges(
106
  'agent',
107
- should_continue,
108
  {
109
  'continue': 'tools',
110
  'end': END,
 
18
 
19
 
20
  from utils.zep_helpers import (
21
+ AsyncZep,
22
  get_zep_client,
23
  record_session,
24
  )
 
40
  llm = ChatOpenAI(model="gpt-4o-mini")
41
  llm_with_tools = llm.bind_tools(tools=available_tools)
42
 
 
 
43
 
44
  class AgentState(TypedDict):
45
  session_id: str
46
  messages: Annotated[Sequence[BaseMessage], operator.add]
47
 
48
 
49
+ async def call_model(state: AgentState, handler: AsyncCallbackHandler, zep_client: AsyncZep) -> dict:
50
  session_id = state["session_id"]
51
  memory = await zep_client.memory.get(session_id=session_id)
52
  messages = state["messages"]
 
85
  return {"messages": results}
86
 
87
 
88
+ async def should_continue(state: AgentState, handler: AsyncCallbackHandler, zep_client: AsyncZep) -> str:
89
  messages = state["messages"]
90
  last_message = messages[-1]
91
  if 'tool_calls' not in last_message.additional_kwargs:
92
  # inform zep of final response
93
  await record_session(state["session_id"], messages)
94
+ if hasattr(handler, 'on_workflow_end'):
95
+ await handler.on_workflow_end(state)
96
  return 'end'
97
  return 'continue'
98
 
99
 
100
  def build_workflow(handler: AsyncCallbackHandler):
101
  workflow = StateGraph(AgentState)
102
+ zep_client = get_zep_client()
103
+ workflow.add_node('agent', partial(call_model, handler=handler, zep_client=zep_client))
104
  workflow.add_node('tools', partial(call_tool, handler=handler))
105
  workflow.set_entry_point('agent')
106
 
107
  workflow.add_conditional_edges(
108
  'agent',
109
+ partial(should_continue, handler=handler, zep_client=zep_client),
110
  {
111
  'continue': 'tools',
112
  'end': END,
docker-compose.yaml CHANGED
@@ -18,7 +18,8 @@ services:
18
  - .env
19
  environment:
20
  DEBUG: false
21
- command: uvicorn server:app --reload --host 0.0.0.0 --port 8000 --reload --log-level debug
 
22
 
23
  volumes:
24
  root_hist:
 
18
  - .env
19
  environment:
20
  DEBUG: false
21
+ # command: uvicorn server:app --reload --host 0.0.0.0 --port 8000 --reload --log-level debug
22
+ command: gradio server_gradio.py
23
 
24
  volumes:
25
  root_hist: