simonlee-cb commited on
Commit
a21dee1
·
1 Parent(s): b675cf6

feat: working mask generation agent

Browse files
app.py CHANGED
@@ -11,15 +11,15 @@ def encode_image(uploaded_file):
11
  client = OpenAI(api_key=st.secrets["OPENAI_API_KEY"])
12
  image = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])
13
 
14
- if image is not None:
15
- st.session_state.image = image
16
-
17
  if "openai_model" not in st.session_state:
18
  st.session_state["openai_model"] = "gpt-4o"
19
 
20
  if "messages" not in st.session_state:
21
  st.session_state.messages = []
22
 
 
 
 
23
  for message in st.session_state.messages:
24
  with st.chat_message(message["role"]):
25
  for content in message["content"]:
@@ -30,6 +30,8 @@ for message in st.session_state.messages:
30
 
31
  if prompt := st.chat_input("What is up?"):
32
  # Add image to the message if it exists
 
 
33
  if st.session_state.image:
34
  image_data = encode_image(st.session_state.image)
35
  image_url = f"data:image/jpeg;base64,{image_data}"
@@ -43,7 +45,8 @@ if prompt := st.chat_input("What is up?"):
43
  ]})
44
 
45
  with st.chat_message("user"):
46
- st.image(st.session_state.image)
 
47
  st.markdown(prompt)
48
 
49
  with st.chat_message("assistant"):
 
11
  client = OpenAI(api_key=st.secrets["OPENAI_API_KEY"])
12
  image = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])
13
 
 
 
 
14
  if "openai_model" not in st.session_state:
15
  st.session_state["openai_model"] = "gpt-4o"
16
 
17
  if "messages" not in st.session_state:
18
  st.session_state.messages = []
19
 
20
+ if "image" not in st.session_state:
21
+ st.session_state.image = None
22
+
23
  for message in st.session_state.messages:
24
  with st.chat_message(message["role"]):
25
  for content in message["content"]:
 
30
 
31
  if prompt := st.chat_input("What is up?"):
32
  # Add image to the message if it exists
33
+ if image is not None:
34
+ st.session_state.image = image
35
  if st.session_state.image:
36
  image_data = encode_image(st.session_state.image)
37
  image_url = f"data:image/jpeg;base64,{image_data}"
 
45
  ]})
46
 
47
  with st.chat_message("user"):
48
+ if st.session_state.image:
49
+ st.image(st.session_state.image)
50
  st.markdown(prompt)
51
 
52
  with st.chat_message("assistant"):
poetry.lock CHANGED
@@ -35,6 +35,30 @@ files = [
35
  {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
36
  ]
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  [[package]]
39
  name = "anyio"
40
  version = "4.8.0"
@@ -224,6 +248,28 @@ files = [
224
  [package.dependencies]
225
  colorama = {version = "*", markers = "platform_system == \"Windows\""}
226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  [[package]]
228
  name = "colorama"
229
  version = "0.4.6"
@@ -235,6 +281,23 @@ files = [
235
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
236
  ]
237
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
238
  [[package]]
239
  name = "distro"
240
  version = "1.9.0"
@@ -246,6 +309,20 @@ files = [
246
  {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"},
247
  ]
248
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  [[package]]
250
  name = "exceptiongroup"
251
  version = "1.2.2"
@@ -260,6 +337,121 @@ files = [
260
  [package.extras]
261
  test = ["pytest (>=6)"]
262
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
  [[package]]
264
  name = "gitdb"
265
  version = "4.0.12"
@@ -292,6 +484,80 @@ gitdb = ">=4.0.1,<5"
292
  doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"]
293
  test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"]
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  [[package]]
296
  name = "h11"
297
  version = "0.14.0"
@@ -348,6 +614,51 @@ http2 = ["h2 (>=3,<5)"]
348
  socks = ["socksio (==1.*)"]
349
  zstd = ["zstandard (>=0.18.0)"]
350
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
351
  [[package]]
352
  name = "idna"
353
  version = "3.10"
@@ -362,6 +673,29 @@ files = [
362
  [package.extras]
363
  all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
364
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
  [[package]]
366
  name = "jinja2"
367
  version = "3.1.5"
@@ -464,6 +798,17 @@ files = [
464
  {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"},
465
  ]
466
 
 
 
 
 
 
 
 
 
 
 
 
467
  [[package]]
468
  name = "jsonschema"
469
  version = "4.23.0"
@@ -499,6 +844,60 @@ files = [
499
  [package.dependencies]
500
  referencing = ">=0.31.0"
501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
502
  [[package]]
503
  name = "markdown-it-py"
504
  version = "3.0.0"
@@ -604,6 +1003,39 @@ files = [
604
  {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
605
  ]
606
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
607
  [[package]]
608
  name = "narwhals"
609
  version = "1.26.0"
@@ -719,6 +1151,117 @@ typing-extensions = ">=4.11,<5"
719
  datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
720
  realtime = ["websockets (>=13,<15)"]
721
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
722
  [[package]]
723
  name = "packaging"
724
  version = "24.2"
@@ -974,6 +1517,31 @@ files = [
974
  [package.extras]
975
  test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"]
976
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
977
  [[package]]
978
  name = "pydantic"
979
  version = "2.10.6"
@@ -994,6 +1562,59 @@ typing-extensions = ">=4.12.2"
994
  email = ["email-validator (>=2.0.0)"]
995
  timezone = ["tzdata"]
996
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
997
  [[package]]
998
  name = "pydantic-core"
999
  version = "2.27.2"
@@ -1106,6 +1727,22 @@ files = [
1106
  [package.dependencies]
1107
  typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
1108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1109
  [[package]]
1110
  name = "pydeck"
1111
  version = "0.9.1"
@@ -1153,6 +1790,20 @@ files = [
1153
  [package.dependencies]
1154
  six = ">=1.5"
1155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1156
  [[package]]
1157
  name = "pytz"
1158
  version = "2025.1"
@@ -1164,6 +1815,68 @@ files = [
1164
  {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"},
1165
  ]
1166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1167
  [[package]]
1168
  name = "referencing"
1169
  version = "0.36.2"
@@ -1332,6 +2045,20 @@ files = [
1332
  {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"},
1333
  ]
1334
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1335
  [[package]]
1336
  name = "six"
1337
  version = "1.17.0"
@@ -1415,6 +2142,38 @@ files = [
1415
  doc = ["reno", "sphinx"]
1416
  test = ["pytest", "tornado (>=4.5)", "typeguard"]
1417
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1418
  [[package]]
1419
  name = "toml"
1420
  version = "0.10.2"
@@ -1426,6 +2185,47 @@ files = [
1426
  {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
1427
  ]
1428
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1429
  [[package]]
1430
  name = "tornado"
1431
  version = "6.4.2"
@@ -1467,6 +2267,20 @@ notebook = ["ipywidgets (>=6)"]
1467
  slack = ["slack-sdk"]
1468
  telegram = ["requests"]
1469
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1470
  [[package]]
1471
  name = "typing-extensions"
1472
  version = "4.12.2"
@@ -1478,6 +2292,21 @@ files = [
1478
  {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
1479
  ]
1480
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1481
  [[package]]
1482
  name = "tzdata"
1483
  version = "2025.1"
@@ -1548,7 +2377,114 @@ files = [
1548
  [package.extras]
1549
  watchmedo = ["PyYAML (>=3.10)"]
1550
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1551
  [metadata]
1552
  lock-version = "2.0"
1553
  python-versions = "3.10"
1554
- content-hash = "91594c66fa9aaf74ef6c11001b0522f576df3644c662fbc17a113f9800b612b4"
 
35
  {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
36
  ]
37
 
38
+ [[package]]
39
+ name = "anthropic"
40
+ version = "0.45.2"
41
+ description = "The official Python library for the anthropic API"
42
+ optional = false
43
+ python-versions = ">=3.8"
44
+ files = [
45
+ {file = "anthropic-0.45.2-py3-none-any.whl", hash = "sha256:ecd746f7274451dfcb7e1180571ead624c7e1195d1d46cb7c70143d2aedb4d35"},
46
+ {file = "anthropic-0.45.2.tar.gz", hash = "sha256:32a18b9ecd12c91b2be4cae6ca2ab46a06937b5aa01b21308d97a6d29794fb5e"},
47
+ ]
48
+
49
+ [package.dependencies]
50
+ anyio = ">=3.5.0,<5"
51
+ distro = ">=1.7.0,<2"
52
+ httpx = ">=0.23.0,<1"
53
+ jiter = ">=0.4.0,<1"
54
+ pydantic = ">=1.9.0,<3"
55
+ sniffio = "*"
56
+ typing-extensions = ">=4.10,<5"
57
+
58
+ [package.extras]
59
+ bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"]
60
+ vertex = ["google-auth (>=2,<3)"]
61
+
62
  [[package]]
63
  name = "anyio"
64
  version = "4.8.0"
 
248
  [package.dependencies]
249
  colorama = {version = "*", markers = "platform_system == \"Windows\""}
250
 
251
+ [[package]]
252
+ name = "cohere"
253
+ version = "5.13.12"
254
+ description = ""
255
+ optional = false
256
+ python-versions = "<4.0,>=3.9"
257
+ files = [
258
+ {file = "cohere-5.13.12-py3-none-any.whl", hash = "sha256:2a043591a3e5280b47716a6b311e4c7f58e799364113a9cb81b50cd4f6c95f7e"},
259
+ {file = "cohere-5.13.12.tar.gz", hash = "sha256:97bb9ac107e580780b941acbabd3aa5e71960e6835398292c46aaa8a0a4cab88"},
260
+ ]
261
+
262
+ [package.dependencies]
263
+ fastavro = ">=1.9.4,<2.0.0"
264
+ httpx = ">=0.21.2"
265
+ httpx-sse = "0.4.0"
266
+ pydantic = ">=1.9.2"
267
+ pydantic-core = ">=2.18.2,<3.0.0"
268
+ requests = ">=2.0.0,<3.0.0"
269
+ tokenizers = ">=0.15,<1"
270
+ types-requests = ">=2.0.0,<3.0.0"
271
+ typing_extensions = ">=4.0.0"
272
+
273
  [[package]]
274
  name = "colorama"
275
  version = "0.4.6"
 
281
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
282
  ]
283
 
284
+ [[package]]
285
+ name = "deprecated"
286
+ version = "1.2.18"
287
+ description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
288
+ optional = false
289
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
290
+ files = [
291
+ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"},
292
+ {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"},
293
+ ]
294
+
295
+ [package.dependencies]
296
+ wrapt = ">=1.10,<2"
297
+
298
+ [package.extras]
299
+ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"]
300
+
301
  [[package]]
302
  name = "distro"
303
  version = "1.9.0"
 
309
  {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"},
310
  ]
311
 
312
+ [[package]]
313
+ name = "eval-type-backport"
314
+ version = "0.2.2"
315
+ description = "Like `typing._eval_type`, but lets older Python versions use newer typing features."
316
+ optional = false
317
+ python-versions = ">=3.8"
318
+ files = [
319
+ {file = "eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a"},
320
+ {file = "eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1"},
321
+ ]
322
+
323
+ [package.extras]
324
+ tests = ["pytest"]
325
+
326
  [[package]]
327
  name = "exceptiongroup"
328
  version = "1.2.2"
 
337
  [package.extras]
338
  test = ["pytest (>=6)"]
339
 
340
+ [[package]]
341
+ name = "executing"
342
+ version = "2.2.0"
343
+ description = "Get the currently executing AST node of a frame, and other information"
344
+ optional = false
345
+ python-versions = ">=3.8"
346
+ files = [
347
+ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"},
348
+ {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"},
349
+ ]
350
+
351
+ [package.extras]
352
+ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
353
+
354
+ [[package]]
355
+ name = "fastavro"
356
+ version = "1.10.0"
357
+ description = "Fast read/write of AVRO files"
358
+ optional = false
359
+ python-versions = ">=3.9"
360
+ files = [
361
+ {file = "fastavro-1.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1a9fe0672d2caf0fe54e3be659b13de3cad25a267f2073d6f4b9f8862acc31eb"},
362
+ {file = "fastavro-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86dd0410770e0c99363788f0584523709d85e57bb457372ec5c285a482c17fe6"},
363
+ {file = "fastavro-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:190e80dc7d77d03a6a8597a026146b32a0bbe45e3487ab4904dc8c1bebecb26d"},
364
+ {file = "fastavro-1.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bf570d63be9155c3fdc415f60a49c171548334b70fff0679a184b69c29b6bc61"},
365
+ {file = "fastavro-1.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e07abb6798e95dccecaec316265e35a018b523d1f3944ad396d0a93cb95e0a08"},
366
+ {file = "fastavro-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:37203097ed11d0b8fd3c004904748777d730cafd26e278167ea602eebdef8eb2"},
367
+ {file = "fastavro-1.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d183c075f527ab695a27ae75f210d4a86bce660cda2f85ae84d5606efc15ef50"},
368
+ {file = "fastavro-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7a95a2c0639bffd7c079b59e9a796bfc3a9acd78acff7088f7c54ade24e4a77"},
369
+ {file = "fastavro-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a678153b5da1b024a32ec3f611b2e7afd24deac588cb51dd1b0019935191a6d"},
370
+ {file = "fastavro-1.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67a597a5cfea4dddcf8b49eaf8c2b5ffee7fda15b578849185bc690ec0cd0d8f"},
371
+ {file = "fastavro-1.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fd689724760b17f69565d8a4e7785ed79becd451d1c99263c40cb2d6491f1d4"},
372
+ {file = "fastavro-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:4f949d463f9ac4221128a51e4e34e2562f401e5925adcadfd28637a73df6c2d8"},
373
+ {file = "fastavro-1.10.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cfe57cb0d72f304bd0dcc5a3208ca6a7363a9ae76f3073307d095c9d053b29d4"},
374
+ {file = "fastavro-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e517440c824cb65fb29d3e3903a9406f4d7c75490cef47e55c4c82cdc66270"},
375
+ {file = "fastavro-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203c17d44cadde76e8eecb30f2d1b4f33eb478877552d71f049265dc6f2ecd10"},
376
+ {file = "fastavro-1.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6575be7f2b5f94023b5a4e766b0251924945ad55e9a96672dc523656d17fe251"},
377
+ {file = "fastavro-1.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe471deb675ed2f01ee2aac958fbf8ebb13ea00fa4ce7f87e57710a0bc592208"},
378
+ {file = "fastavro-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:567ff515f2a5d26d9674b31c95477f3e6022ec206124c62169bc2ffaf0889089"},
379
+ {file = "fastavro-1.10.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:82263af0adfddb39c85f9517d736e1e940fe506dfcc35bc9ab9f85e0fa9236d8"},
380
+ {file = "fastavro-1.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:566c193109ff0ff84f1072a165b7106c4f96050078a4e6ac7391f81ca1ef3efa"},
381
+ {file = "fastavro-1.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e400d2e55d068404d9fea7c5021f8b999c6f9d9afa1d1f3652ec92c105ffcbdd"},
382
+ {file = "fastavro-1.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b8227497f71565270f9249fc9af32a93644ca683a0167cfe66d203845c3a038"},
383
+ {file = "fastavro-1.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e62d04c65461b30ac6d314e4197ad666371e97ae8cb2c16f971d802f6c7f514"},
384
+ {file = "fastavro-1.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:86baf8c9740ab570d0d4d18517da71626fe9be4d1142bea684db52bd5adb078f"},
385
+ {file = "fastavro-1.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5bccbb6f8e9e5b834cca964f0e6ebc27ebe65319d3940b0b397751a470f45612"},
386
+ {file = "fastavro-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0132f6b0b53f61a0a508a577f64beb5de1a5e068a9b4c0e1df6e3b66568eec4"},
387
+ {file = "fastavro-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca37a363b711202c6071a6d4787e68e15fa3ab108261058c4aae853c582339af"},
388
+ {file = "fastavro-1.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cf38cecdd67ca9bd92e6e9ba34a30db6343e7a3bedf171753ee78f8bd9f8a670"},
389
+ {file = "fastavro-1.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f4dd10e0ed42982122d20cdf1a88aa50ee09e5a9cd9b39abdffb1aa4f5b76435"},
390
+ {file = "fastavro-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:aaef147dc14dd2d7823246178fd06fc5e477460e070dc6d9e07dd8193a6bc93c"},
391
+ {file = "fastavro-1.10.0.tar.gz", hash = "sha256:47bf41ac6d52cdfe4a3da88c75a802321321b37b663a900d12765101a5d6886f"},
392
+ ]
393
+
394
+ [package.extras]
395
+ codecs = ["cramjam", "lz4", "zstandard"]
396
+ lz4 = ["lz4"]
397
+ snappy = ["cramjam"]
398
+ zstandard = ["zstandard"]
399
+
400
+ [[package]]
401
+ name = "filelock"
402
+ version = "3.17.0"
403
+ description = "A platform independent file lock."
404
+ optional = false
405
+ python-versions = ">=3.9"
406
+ files = [
407
+ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"},
408
+ {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"},
409
+ ]
410
+
411
+ [package.extras]
412
+ docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"]
413
+ 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)"]
414
+ typing = ["typing-extensions (>=4.12.2)"]
415
+
416
+ [[package]]
417
+ name = "fsspec"
418
+ version = "2025.2.0"
419
+ description = "File-system specification"
420
+ optional = false
421
+ python-versions = ">=3.8"
422
+ files = [
423
+ {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"},
424
+ {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"},
425
+ ]
426
+
427
+ [package.extras]
428
+ abfs = ["adlfs"]
429
+ adl = ["adlfs"]
430
+ arrow = ["pyarrow (>=1)"]
431
+ dask = ["dask", "distributed"]
432
+ dev = ["pre-commit", "ruff"]
433
+ doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"]
434
+ dropbox = ["dropbox", "dropboxdrivefs", "requests"]
435
+ 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"]
436
+ fuse = ["fusepy"]
437
+ gcs = ["gcsfs"]
438
+ git = ["pygit2"]
439
+ github = ["requests"]
440
+ gs = ["gcsfs"]
441
+ gui = ["panel"]
442
+ hdfs = ["pyarrow (>=1)"]
443
+ http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"]
444
+ libarchive = ["libarchive-c"]
445
+ oci = ["ocifs"]
446
+ s3 = ["s3fs"]
447
+ sftp = ["paramiko"]
448
+ smb = ["smbprotocol"]
449
+ ssh = ["paramiko"]
450
+ 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"]
451
+ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"]
452
+ 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"]
453
+ tqdm = ["tqdm"]
454
+
455
  [[package]]
456
  name = "gitdb"
457
  version = "4.0.12"
 
484
  doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"]
485
  test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"]
486
 
487
+ [[package]]
488
+ name = "google-auth"
489
+ version = "2.38.0"
490
+ description = "Google Authentication Library"
491
+ optional = false
492
+ python-versions = ">=3.7"
493
+ files = [
494
+ {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"},
495
+ {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"},
496
+ ]
497
+
498
+ [package.dependencies]
499
+ cachetools = ">=2.0.0,<6.0"
500
+ pyasn1-modules = ">=0.2.1"
501
+ rsa = ">=3.1.4,<5"
502
+
503
+ [package.extras]
504
+ aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"]
505
+ enterprise-cert = ["cryptography", "pyopenssl"]
506
+ pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"]
507
+ pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"]
508
+ reauth = ["pyu2f (>=0.1.5)"]
509
+ requests = ["requests (>=2.20.0,<3.0.0.dev0)"]
510
+
511
+ [[package]]
512
+ name = "googleapis-common-protos"
513
+ version = "1.67.0"
514
+ description = "Common protobufs used in Google APIs"
515
+ optional = false
516
+ python-versions = ">=3.7"
517
+ files = [
518
+ {file = "googleapis_common_protos-1.67.0-py2.py3-none-any.whl", hash = "sha256:579de760800d13616f51cf8be00c876f00a9f146d3e6510e19d1f4111758b741"},
519
+ {file = "googleapis_common_protos-1.67.0.tar.gz", hash = "sha256:21398025365f138be356d5923e9168737d94d46a72aefee4a6110a1f23463c86"},
520
+ ]
521
+
522
+ [package.dependencies]
523
+ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0"
524
+
525
+ [package.extras]
526
+ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"]
527
+
528
+ [[package]]
529
+ name = "griffe"
530
+ version = "1.5.7"
531
+ description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API."
532
+ optional = false
533
+ python-versions = ">=3.9"
534
+ files = [
535
+ {file = "griffe-1.5.7-py3-none-any.whl", hash = "sha256:4af8ec834b64de954d447c7b6672426bb145e71605c74a4e22d510cc79fe7d8b"},
536
+ {file = "griffe-1.5.7.tar.gz", hash = "sha256:465238c86deaf1137761f700fb343edd8ffc846d72f6de43c3c345ccdfbebe92"},
537
+ ]
538
+
539
+ [package.dependencies]
540
+ colorama = ">=0.4"
541
+
542
+ [[package]]
543
+ name = "groq"
544
+ version = "0.18.0"
545
+ description = "The official Python library for the groq API"
546
+ optional = false
547
+ python-versions = ">=3.8"
548
+ files = [
549
+ {file = "groq-0.18.0-py3-none-any.whl", hash = "sha256:81d5ac00057a45d8ce559d23ab5d3b3893011d1f12c35187ab35a9182d826ea6"},
550
+ {file = "groq-0.18.0.tar.gz", hash = "sha256:8e2ccfea406d68b3525af4b7c0e321fcb3d2a73fc60bb70b4156e6cd88c72f03"},
551
+ ]
552
+
553
+ [package.dependencies]
554
+ anyio = ">=3.5.0,<5"
555
+ distro = ">=1.7.0,<2"
556
+ httpx = ">=0.23.0,<1"
557
+ pydantic = ">=1.9.0,<3"
558
+ sniffio = "*"
559
+ typing-extensions = ">=4.10,<5"
560
+
561
  [[package]]
562
  name = "h11"
563
  version = "0.14.0"
 
614
  socks = ["socksio (==1.*)"]
615
  zstd = ["zstandard (>=0.18.0)"]
616
 
617
+ [[package]]
618
+ name = "httpx-sse"
619
+ version = "0.4.0"
620
+ description = "Consume Server-Sent Event (SSE) messages with HTTPX."
621
+ optional = false
622
+ python-versions = ">=3.8"
623
+ files = [
624
+ {file = "httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721"},
625
+ {file = "httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"},
626
+ ]
627
+
628
+ [[package]]
629
+ name = "huggingface-hub"
630
+ version = "0.28.1"
631
+ description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
632
+ optional = false
633
+ python-versions = ">=3.8.0"
634
+ files = [
635
+ {file = "huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7"},
636
+ {file = "huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae"},
637
+ ]
638
+
639
+ [package.dependencies]
640
+ filelock = "*"
641
+ fsspec = ">=2023.5.0"
642
+ packaging = ">=20.9"
643
+ pyyaml = ">=5.1"
644
+ requests = "*"
645
+ tqdm = ">=4.42.1"
646
+ typing-extensions = ">=3.7.4.3"
647
+
648
+ [package.extras]
649
+ 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)"]
650
+ cli = ["InquirerPy (==0.3.4)"]
651
+ 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)"]
652
+ fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
653
+ hf-transfer = ["hf-transfer (>=0.1.4)"]
654
+ inference = ["aiohttp"]
655
+ quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.9.0)"]
656
+ tensorflow = ["graphviz", "pydot", "tensorflow"]
657
+ tensorflow-testing = ["keras (<3.0)", "tensorflow"]
658
+ 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)"]
659
+ torch = ["safetensors[torch]", "torch"]
660
+ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
661
+
662
  [[package]]
663
  name = "idna"
664
  version = "3.10"
 
673
  [package.extras]
674
  all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
675
 
676
+ [[package]]
677
+ name = "importlib-metadata"
678
+ version = "8.5.0"
679
+ description = "Read metadata from Python packages"
680
+ optional = false
681
+ python-versions = ">=3.8"
682
+ files = [
683
+ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"},
684
+ {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"},
685
+ ]
686
+
687
+ [package.dependencies]
688
+ zipp = ">=3.20"
689
+
690
+ [package.extras]
691
+ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
692
+ cover = ["pytest-cov"]
693
+ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
694
+ enabler = ["pytest-enabler (>=2.2)"]
695
+ perf = ["ipython"]
696
+ test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
697
+ type = ["pytest-mypy"]
698
+
699
  [[package]]
700
  name = "jinja2"
701
  version = "3.1.5"
 
798
  {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"},
799
  ]
800
 
801
+ [[package]]
802
+ name = "jsonpath-python"
803
+ version = "1.0.6"
804
+ description = "A more powerful JSONPath implementation in modern python"
805
+ optional = false
806
+ python-versions = ">=3.6"
807
+ files = [
808
+ {file = "jsonpath-python-1.0.6.tar.gz", hash = "sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666"},
809
+ {file = "jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575"},
810
+ ]
811
+
812
  [[package]]
813
  name = "jsonschema"
814
  version = "4.23.0"
 
844
  [package.dependencies]
845
  referencing = ">=0.31.0"
846
 
847
+ [[package]]
848
+ name = "logfire"
849
+ version = "3.5.3"
850
+ description = "The best Python observability tool! 🪵🔥"
851
+ optional = false
852
+ python-versions = ">=3.8"
853
+ files = [
854
+ {file = "logfire-3.5.3-py3-none-any.whl", hash = "sha256:d06186aaf08fc9d144a71548ba3e3a3fcbe4dddd84241243957167b870c4a731"},
855
+ {file = "logfire-3.5.3.tar.gz", hash = "sha256:cb4863cde51a4784fcdf78ac178c2a6f739b1c6c6061bb8662edf7eed7b643ac"},
856
+ ]
857
+
858
+ [package.dependencies]
859
+ executing = ">=2.0.1"
860
+ opentelemetry-exporter-otlp-proto-http = ">=1.21.0,<1.31.0"
861
+ opentelemetry-instrumentation = ">=0.41b0"
862
+ opentelemetry-sdk = ">=1.21.0,<1.31.0"
863
+ protobuf = ">=4.23.4"
864
+ rich = ">=13.4.2"
865
+ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
866
+ typing-extensions = ">=4.1.0"
867
+
868
+ [package.extras]
869
+ aiohttp = ["opentelemetry-instrumentation-aiohttp-client (>=0.42b0)"]
870
+ asgi = ["opentelemetry-instrumentation-asgi (>=0.42b0)"]
871
+ asyncpg = ["opentelemetry-instrumentation-asyncpg (>=0.42b0)"]
872
+ aws-lambda = ["opentelemetry-instrumentation-aws-lambda (>=0.42b0)"]
873
+ celery = ["opentelemetry-instrumentation-celery (>=0.42b0)"]
874
+ django = ["opentelemetry-instrumentation-django (>=0.42b0)"]
875
+ fastapi = ["opentelemetry-instrumentation-fastapi (>=0.42b0)"]
876
+ flask = ["opentelemetry-instrumentation-flask (>=0.42b0)"]
877
+ httpx = ["opentelemetry-instrumentation-httpx (>=0.42b0)"]
878
+ mysql = ["opentelemetry-instrumentation-mysql (>=0.42b0)"]
879
+ psycopg = ["opentelemetry-instrumentation-psycopg (>=0.42b0)", "packaging"]
880
+ psycopg2 = ["opentelemetry-instrumentation-psycopg2 (>=0.42b0)", "packaging"]
881
+ pymongo = ["opentelemetry-instrumentation-pymongo (>=0.42b0)"]
882
+ redis = ["opentelemetry-instrumentation-redis (>=0.42b0)"]
883
+ requests = ["opentelemetry-instrumentation-requests (>=0.42b0)"]
884
+ sqlalchemy = ["opentelemetry-instrumentation-sqlalchemy (>=0.42b0)"]
885
+ sqlite3 = ["opentelemetry-instrumentation-sqlite3 (>=0.42b0)"]
886
+ starlette = ["opentelemetry-instrumentation-starlette (>=0.42b0)"]
887
+ system-metrics = ["opentelemetry-instrumentation-system-metrics (>=0.42b0)"]
888
+ wsgi = ["opentelemetry-instrumentation-wsgi (>=0.42b0)"]
889
+
890
+ [[package]]
891
+ name = "logfire-api"
892
+ version = "3.5.3"
893
+ description = "Shim for the Logfire SDK which does nothing unless Logfire is installed"
894
+ optional = false
895
+ python-versions = ">=3.8"
896
+ files = [
897
+ {file = "logfire_api-3.5.3-py3-none-any.whl", hash = "sha256:abecb0d2e43f900c58582c333f261c8f9b187e72933cf3f5aec93685666f86ae"},
898
+ {file = "logfire_api-3.5.3.tar.gz", hash = "sha256:2c15a0ad6f12f39003f62550a35f9247c29c87b466f7839836f346867442a55c"},
899
+ ]
900
+
901
  [[package]]
902
  name = "markdown-it-py"
903
  version = "3.0.0"
 
1003
  {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
1004
  ]
1005
 
1006
+ [[package]]
1007
+ name = "mistralai"
1008
+ version = "1.5.0"
1009
+ description = "Python Client SDK for the Mistral AI API."
1010
+ optional = false
1011
+ python-versions = ">=3.8"
1012
+ files = [
1013
+ {file = "mistralai-1.5.0-py3-none-any.whl", hash = "sha256:9372537719f87bd6f9feef4747d0bf1f4fbe971f8c02945ca4b4bf3c94571c97"},
1014
+ {file = "mistralai-1.5.0.tar.gz", hash = "sha256:fd94bc93bc25aad9c6dd8005b1a0bc4ba1250c6b3fbf855a49936989cc6e5c0d"},
1015
+ ]
1016
+
1017
+ [package.dependencies]
1018
+ eval-type-backport = ">=0.2.0"
1019
+ httpx = ">=0.27.0"
1020
+ jsonpath-python = ">=1.0.6"
1021
+ pydantic = ">=2.9.0"
1022
+ python-dateutil = ">=2.8.2"
1023
+ typing-inspect = ">=0.9.0"
1024
+
1025
+ [package.extras]
1026
+ gcp = ["google-auth (>=2.27.0)", "requests (>=2.32.3)"]
1027
+
1028
+ [[package]]
1029
+ name = "mypy-extensions"
1030
+ version = "1.0.0"
1031
+ description = "Type system extensions for programs checked with the mypy type checker."
1032
+ optional = false
1033
+ python-versions = ">=3.5"
1034
+ files = [
1035
+ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
1036
+ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
1037
+ ]
1038
+
1039
  [[package]]
1040
  name = "narwhals"
1041
  version = "1.26.0"
 
1151
  datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
1152
  realtime = ["websockets (>=13,<15)"]
1153
 
1154
+ [[package]]
1155
+ name = "opentelemetry-api"
1156
+ version = "1.30.0"
1157
+ description = "OpenTelemetry Python API"
1158
+ optional = false
1159
+ python-versions = ">=3.8"
1160
+ files = [
1161
+ {file = "opentelemetry_api-1.30.0-py3-none-any.whl", hash = "sha256:d5f5284890d73fdf47f843dda3210edf37a38d66f44f2b5aedc1e89ed455dc09"},
1162
+ {file = "opentelemetry_api-1.30.0.tar.gz", hash = "sha256:375893400c1435bf623f7dfb3bcd44825fe6b56c34d0667c542ea8257b1a1240"},
1163
+ ]
1164
+
1165
+ [package.dependencies]
1166
+ deprecated = ">=1.2.6"
1167
+ importlib-metadata = ">=6.0,<=8.5.0"
1168
+
1169
+ [[package]]
1170
+ name = "opentelemetry-exporter-otlp-proto-common"
1171
+ version = "1.30.0"
1172
+ description = "OpenTelemetry Protobuf encoding"
1173
+ optional = false
1174
+ python-versions = ">=3.8"
1175
+ files = [
1176
+ {file = "opentelemetry_exporter_otlp_proto_common-1.30.0-py3-none-any.whl", hash = "sha256:5468007c81aa9c44dc961ab2cf368a29d3475977df83b4e30aeed42aa7bc3b38"},
1177
+ {file = "opentelemetry_exporter_otlp_proto_common-1.30.0.tar.gz", hash = "sha256:ddbfbf797e518411857d0ca062c957080279320d6235a279f7b64ced73c13897"},
1178
+ ]
1179
+
1180
+ [package.dependencies]
1181
+ opentelemetry-proto = "1.30.0"
1182
+
1183
+ [[package]]
1184
+ name = "opentelemetry-exporter-otlp-proto-http"
1185
+ version = "1.30.0"
1186
+ description = "OpenTelemetry Collector Protobuf over HTTP Exporter"
1187
+ optional = false
1188
+ python-versions = ">=3.8"
1189
+ files = [
1190
+ {file = "opentelemetry_exporter_otlp_proto_http-1.30.0-py3-none-any.whl", hash = "sha256:9578e790e579931c5ffd50f1e6975cbdefb6a0a0a5dea127a6ae87df10e0a589"},
1191
+ {file = "opentelemetry_exporter_otlp_proto_http-1.30.0.tar.gz", hash = "sha256:c3ae75d4181b1e34a60662a6814d0b94dd33b628bee5588a878bed92cee6abdc"},
1192
+ ]
1193
+
1194
+ [package.dependencies]
1195
+ deprecated = ">=1.2.6"
1196
+ googleapis-common-protos = ">=1.52,<2.0"
1197
+ opentelemetry-api = ">=1.15,<2.0"
1198
+ opentelemetry-exporter-otlp-proto-common = "1.30.0"
1199
+ opentelemetry-proto = "1.30.0"
1200
+ opentelemetry-sdk = ">=1.30.0,<1.31.0"
1201
+ requests = ">=2.7,<3.0"
1202
+
1203
+ [[package]]
1204
+ name = "opentelemetry-instrumentation"
1205
+ version = "0.51b0"
1206
+ description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python"
1207
+ optional = false
1208
+ python-versions = ">=3.8"
1209
+ files = [
1210
+ {file = "opentelemetry_instrumentation-0.51b0-py3-none-any.whl", hash = "sha256:c6de8bd26b75ec8b0e54dff59e198946e29de6a10ec65488c357d4b34aa5bdcf"},
1211
+ {file = "opentelemetry_instrumentation-0.51b0.tar.gz", hash = "sha256:4ca266875e02f3988536982467f7ef8c32a38b8895490ddce9ad9604649424fa"},
1212
+ ]
1213
+
1214
+ [package.dependencies]
1215
+ opentelemetry-api = ">=1.4,<2.0"
1216
+ opentelemetry-semantic-conventions = "0.51b0"
1217
+ packaging = ">=18.0"
1218
+ wrapt = ">=1.0.0,<2.0.0"
1219
+
1220
+ [[package]]
1221
+ name = "opentelemetry-proto"
1222
+ version = "1.30.0"
1223
+ description = "OpenTelemetry Python Proto"
1224
+ optional = false
1225
+ python-versions = ">=3.8"
1226
+ files = [
1227
+ {file = "opentelemetry_proto-1.30.0-py3-none-any.whl", hash = "sha256:c6290958ff3ddacc826ca5abbeb377a31c2334387352a259ba0df37c243adc11"},
1228
+ {file = "opentelemetry_proto-1.30.0.tar.gz", hash = "sha256:afe5c9c15e8b68d7c469596e5b32e8fc085eb9febdd6fb4e20924a93a0389179"},
1229
+ ]
1230
+
1231
+ [package.dependencies]
1232
+ protobuf = ">=5.0,<6.0"
1233
+
1234
+ [[package]]
1235
+ name = "opentelemetry-sdk"
1236
+ version = "1.30.0"
1237
+ description = "OpenTelemetry Python SDK"
1238
+ optional = false
1239
+ python-versions = ">=3.8"
1240
+ files = [
1241
+ {file = "opentelemetry_sdk-1.30.0-py3-none-any.whl", hash = "sha256:14fe7afc090caad881addb6926cec967129bd9260c4d33ae6a217359f6b61091"},
1242
+ {file = "opentelemetry_sdk-1.30.0.tar.gz", hash = "sha256:c9287a9e4a7614b9946e933a67168450b9ab35f08797eb9bc77d998fa480fa18"},
1243
+ ]
1244
+
1245
+ [package.dependencies]
1246
+ opentelemetry-api = "1.30.0"
1247
+ opentelemetry-semantic-conventions = "0.51b0"
1248
+ typing-extensions = ">=3.7.4"
1249
+
1250
+ [[package]]
1251
+ name = "opentelemetry-semantic-conventions"
1252
+ version = "0.51b0"
1253
+ description = "OpenTelemetry Semantic Conventions"
1254
+ optional = false
1255
+ python-versions = ">=3.8"
1256
+ files = [
1257
+ {file = "opentelemetry_semantic_conventions-0.51b0-py3-none-any.whl", hash = "sha256:fdc777359418e8d06c86012c3dc92c88a6453ba662e941593adb062e48c2eeae"},
1258
+ {file = "opentelemetry_semantic_conventions-0.51b0.tar.gz", hash = "sha256:3fabf47f35d1fd9aebcdca7e6802d86bd5ebc3bc3408b7e3248dde6e87a18c47"},
1259
+ ]
1260
+
1261
+ [package.dependencies]
1262
+ deprecated = ">=1.2.6"
1263
+ opentelemetry-api = "1.30.0"
1264
+
1265
  [[package]]
1266
  name = "packaging"
1267
  version = "24.2"
 
1517
  [package.extras]
1518
  test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"]
1519
 
1520
+ [[package]]
1521
+ name = "pyasn1"
1522
+ version = "0.6.1"
1523
+ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
1524
+ optional = false
1525
+ python-versions = ">=3.8"
1526
+ files = [
1527
+ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"},
1528
+ {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"},
1529
+ ]
1530
+
1531
+ [[package]]
1532
+ name = "pyasn1-modules"
1533
+ version = "0.4.1"
1534
+ description = "A collection of ASN.1-based protocols modules"
1535
+ optional = false
1536
+ python-versions = ">=3.8"
1537
+ files = [
1538
+ {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"},
1539
+ {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"},
1540
+ ]
1541
+
1542
+ [package.dependencies]
1543
+ pyasn1 = ">=0.4.6,<0.7.0"
1544
+
1545
  [[package]]
1546
  name = "pydantic"
1547
  version = "2.10.6"
 
1562
  email = ["email-validator (>=2.0.0)"]
1563
  timezone = ["tzdata"]
1564
 
1565
+ [[package]]
1566
+ name = "pydantic-ai"
1567
+ version = "0.0.24"
1568
+ description = "Agent Framework / shim to use Pydantic with LLMs"
1569
+ optional = false
1570
+ python-versions = ">=3.9"
1571
+ files = [
1572
+ {file = "pydantic_ai-0.0.24-py3-none-any.whl", hash = "sha256:dc75f01be0218c2f46fe90a3d43ef4700d764bfbe6240fca9c18a4509f6b86cf"},
1573
+ {file = "pydantic_ai-0.0.24.tar.gz", hash = "sha256:7af076cbdb5f4c6ac8fae5273f02b67130b69d1cdaed87a022f79f42449f83a9"},
1574
+ ]
1575
+
1576
+ [package.dependencies]
1577
+ pydantic-ai-slim = {version = "0.0.24", extras = ["anthropic", "cohere", "groq", "mistral", "openai", "vertexai"]}
1578
+
1579
+ [package.extras]
1580
+ examples = ["pydantic-ai-examples (==0.0.24)"]
1581
+ logfire = ["logfire (>=2.3)"]
1582
+
1583
+ [[package]]
1584
+ name = "pydantic-ai-slim"
1585
+ version = "0.0.24"
1586
+ description = "Agent Framework / shim to use Pydantic with LLMs, slim package"
1587
+ optional = false
1588
+ python-versions = ">=3.9"
1589
+ files = [
1590
+ {file = "pydantic_ai_slim-0.0.24-py3-none-any.whl", hash = "sha256:7cd3aec6df572780323169a6dfa114640f76c2e2b21105efcd5cce2b459c7b17"},
1591
+ {file = "pydantic_ai_slim-0.0.24.tar.gz", hash = "sha256:c82d5ffed6d3a149e64701d0e4cfa09256a8ef9feb296281f908af19050d2bf1"},
1592
+ ]
1593
+
1594
+ [package.dependencies]
1595
+ anthropic = {version = ">=0.40.0", optional = true, markers = "extra == \"anthropic\""}
1596
+ cohere = {version = ">=5.13.11", optional = true, markers = "extra == \"cohere\""}
1597
+ eval-type-backport = ">=0.2.0"
1598
+ google-auth = {version = ">=2.36.0", optional = true, markers = "extra == \"vertexai\""}
1599
+ griffe = ">=1.3.2"
1600
+ groq = {version = ">=0.12.0", optional = true, markers = "extra == \"groq\""}
1601
+ httpx = ">=0.27"
1602
+ logfire-api = ">=1.2.0"
1603
+ mistralai = {version = ">=1.2.5", optional = true, markers = "extra == \"mistral\""}
1604
+ openai = {version = ">=1.61.0", optional = true, markers = "extra == \"openai\""}
1605
+ pydantic = ">=2.10"
1606
+ pydantic-graph = "0.0.24"
1607
+ requests = {version = ">=2.32.3", optional = true, markers = "extra == \"vertexai\""}
1608
+
1609
+ [package.extras]
1610
+ anthropic = ["anthropic (>=0.40.0)"]
1611
+ cohere = ["cohere (>=5.13.11)"]
1612
+ groq = ["groq (>=0.12.0)"]
1613
+ logfire = ["logfire (>=2.3)"]
1614
+ mistral = ["mistralai (>=1.2.5)"]
1615
+ openai = ["openai (>=1.61.0)"]
1616
+ vertexai = ["google-auth (>=2.36.0)", "requests (>=2.32.3)"]
1617
+
1618
  [[package]]
1619
  name = "pydantic-core"
1620
  version = "2.27.2"
 
1727
  [package.dependencies]
1728
  typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
1729
 
1730
+ [[package]]
1731
+ name = "pydantic-graph"
1732
+ version = "0.0.24"
1733
+ description = "Graph and state machine library"
1734
+ optional = false
1735
+ python-versions = ">=3.9"
1736
+ files = [
1737
+ {file = "pydantic_graph-0.0.24-py3-none-any.whl", hash = "sha256:29d763cb77a2533bcbd07ff34fff36316617d1e62a926a7a15df59f6103fc74e"},
1738
+ {file = "pydantic_graph-0.0.24.tar.gz", hash = "sha256:40550e2310002f411b1fc0636206222caa5459ede7c44da5c856b3526b3096cd"},
1739
+ ]
1740
+
1741
+ [package.dependencies]
1742
+ httpx = ">=0.27"
1743
+ logfire-api = ">=1.2.0"
1744
+ pydantic = ">=2.10"
1745
+
1746
  [[package]]
1747
  name = "pydeck"
1748
  version = "0.9.1"
 
1790
  [package.dependencies]
1791
  six = ">=1.5"
1792
 
1793
+ [[package]]
1794
+ name = "python-dotenv"
1795
+ version = "1.0.1"
1796
+ description = "Read key-value pairs from a .env file and set them as environment variables"
1797
+ optional = false
1798
+ python-versions = ">=3.8"
1799
+ files = [
1800
+ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
1801
+ {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
1802
+ ]
1803
+
1804
+ [package.extras]
1805
+ cli = ["click (>=5.0)"]
1806
+
1807
  [[package]]
1808
  name = "pytz"
1809
  version = "2025.1"
 
1815
  {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"},
1816
  ]
1817
 
1818
+ [[package]]
1819
+ name = "pyyaml"
1820
+ version = "6.0.2"
1821
+ description = "YAML parser and emitter for Python"
1822
+ optional = false
1823
+ python-versions = ">=3.8"
1824
+ files = [
1825
+ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
1826
+ {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
1827
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
1828
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
1829
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
1830
+ {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
1831
+ {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
1832
+ {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
1833
+ {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
1834
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
1835
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
1836
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
1837
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
1838
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
1839
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
1840
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
1841
+ {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
1842
+ {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
1843
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
1844
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
1845
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
1846
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
1847
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
1848
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
1849
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
1850
+ {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
1851
+ {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
1852
+ {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
1853
+ {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
1854
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
1855
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
1856
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
1857
+ {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
1858
+ {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
1859
+ {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
1860
+ {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
1861
+ {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
1862
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
1863
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
1864
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
1865
+ {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
1866
+ {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
1867
+ {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
1868
+ {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
1869
+ {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
1870
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
1871
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
1872
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
1873
+ {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
1874
+ {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
1875
+ {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
1876
+ {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
1877
+ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
1878
+ ]
1879
+
1880
  [[package]]
1881
  name = "referencing"
1882
  version = "0.36.2"
 
2045
  {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"},
2046
  ]
2047
 
2048
+ [[package]]
2049
+ name = "rsa"
2050
+ version = "4.9"
2051
+ description = "Pure-Python RSA implementation"
2052
+ optional = false
2053
+ python-versions = ">=3.6,<4"
2054
+ files = [
2055
+ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"},
2056
+ {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"},
2057
+ ]
2058
+
2059
+ [package.dependencies]
2060
+ pyasn1 = ">=0.1.3"
2061
+
2062
  [[package]]
2063
  name = "six"
2064
  version = "1.17.0"
 
2142
  doc = ["reno", "sphinx"]
2143
  test = ["pytest", "tornado (>=4.5)", "typeguard"]
2144
 
2145
+ [[package]]
2146
+ name = "tokenizers"
2147
+ version = "0.21.0"
2148
+ description = ""
2149
+ optional = false
2150
+ python-versions = ">=3.7"
2151
+ files = [
2152
+ {file = "tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2"},
2153
+ {file = "tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e"},
2154
+ {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193"},
2155
+ {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e"},
2156
+ {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e"},
2157
+ {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba"},
2158
+ {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273"},
2159
+ {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04"},
2160
+ {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e"},
2161
+ {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b"},
2162
+ {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74"},
2163
+ {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff"},
2164
+ {file = "tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a"},
2165
+ {file = "tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c"},
2166
+ {file = "tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4"},
2167
+ ]
2168
+
2169
+ [package.dependencies]
2170
+ huggingface-hub = ">=0.16.4,<1.0"
2171
+
2172
+ [package.extras]
2173
+ dev = ["tokenizers[testing]"]
2174
+ docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"]
2175
+ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"]
2176
+
2177
  [[package]]
2178
  name = "toml"
2179
  version = "0.10.2"
 
2185
  {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
2186
  ]
2187
 
2188
+ [[package]]
2189
+ name = "tomli"
2190
+ version = "2.2.1"
2191
+ description = "A lil' TOML parser"
2192
+ optional = false
2193
+ python-versions = ">=3.8"
2194
+ files = [
2195
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
2196
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
2197
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
2198
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
2199
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
2200
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
2201
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
2202
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
2203
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
2204
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
2205
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
2206
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
2207
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
2208
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
2209
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
2210
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
2211
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
2212
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
2213
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
2214
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
2215
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
2216
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
2217
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
2218
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
2219
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
2220
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
2221
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
2222
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
2223
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
2224
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
2225
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
2226
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
2227
+ ]
2228
+
2229
  [[package]]
2230
  name = "tornado"
2231
  version = "6.4.2"
 
2267
  slack = ["slack-sdk"]
2268
  telegram = ["requests"]
2269
 
2270
+ [[package]]
2271
+ name = "types-requests"
2272
+ version = "2.32.0.20241016"
2273
+ description = "Typing stubs for requests"
2274
+ optional = false
2275
+ python-versions = ">=3.8"
2276
+ files = [
2277
+ {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"},
2278
+ {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"},
2279
+ ]
2280
+
2281
+ [package.dependencies]
2282
+ urllib3 = ">=2"
2283
+
2284
  [[package]]
2285
  name = "typing-extensions"
2286
  version = "4.12.2"
 
2292
  {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
2293
  ]
2294
 
2295
+ [[package]]
2296
+ name = "typing-inspect"
2297
+ version = "0.9.0"
2298
+ description = "Runtime inspection utilities for typing module."
2299
+ optional = false
2300
+ python-versions = "*"
2301
+ files = [
2302
+ {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"},
2303
+ {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"},
2304
+ ]
2305
+
2306
+ [package.dependencies]
2307
+ mypy-extensions = ">=0.3.0"
2308
+ typing-extensions = ">=3.7.4"
2309
+
2310
  [[package]]
2311
  name = "tzdata"
2312
  version = "2025.1"
 
2377
  [package.extras]
2378
  watchmedo = ["PyYAML (>=3.10)"]
2379
 
2380
+ [[package]]
2381
+ name = "wrapt"
2382
+ version = "1.17.2"
2383
+ description = "Module for decorators, wrappers and monkey patching."
2384
+ optional = false
2385
+ python-versions = ">=3.8"
2386
+ files = [
2387
+ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"},
2388
+ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"},
2389
+ {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"},
2390
+ {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"},
2391
+ {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"},
2392
+ {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"},
2393
+ {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"},
2394
+ {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"},
2395
+ {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"},
2396
+ {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"},
2397
+ {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"},
2398
+ {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"},
2399
+ {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"},
2400
+ {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"},
2401
+ {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"},
2402
+ {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"},
2403
+ {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"},
2404
+ {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"},
2405
+ {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"},
2406
+ {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"},
2407
+ {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"},
2408
+ {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"},
2409
+ {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"},
2410
+ {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"},
2411
+ {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"},
2412
+ {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"},
2413
+ {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"},
2414
+ {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"},
2415
+ {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"},
2416
+ {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"},
2417
+ {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"},
2418
+ {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"},
2419
+ {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"},
2420
+ {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"},
2421
+ {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"},
2422
+ {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"},
2423
+ {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"},
2424
+ {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"},
2425
+ {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"},
2426
+ {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"},
2427
+ {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"},
2428
+ {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"},
2429
+ {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"},
2430
+ {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"},
2431
+ {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"},
2432
+ {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"},
2433
+ {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"},
2434
+ {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"},
2435
+ {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"},
2436
+ {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"},
2437
+ {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"},
2438
+ {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"},
2439
+ {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"},
2440
+ {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"},
2441
+ {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"},
2442
+ {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"},
2443
+ {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"},
2444
+ {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"},
2445
+ {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"},
2446
+ {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"},
2447
+ {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"},
2448
+ {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"},
2449
+ {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"},
2450
+ {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"},
2451
+ {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"},
2452
+ {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"},
2453
+ {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"},
2454
+ {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"},
2455
+ {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"},
2456
+ {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"},
2457
+ {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"},
2458
+ {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"},
2459
+ {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"},
2460
+ {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"},
2461
+ {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"},
2462
+ {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"},
2463
+ {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"},
2464
+ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"},
2465
+ {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"},
2466
+ ]
2467
+
2468
+ [[package]]
2469
+ name = "zipp"
2470
+ version = "3.21.0"
2471
+ description = "Backport of pathlib-compatible object wrapper for zip files"
2472
+ optional = false
2473
+ python-versions = ">=3.9"
2474
+ files = [
2475
+ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"},
2476
+ {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"},
2477
+ ]
2478
+
2479
+ [package.extras]
2480
+ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
2481
+ cover = ["pytest-cov"]
2482
+ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
2483
+ enabler = ["pytest-enabler (>=2.2)"]
2484
+ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
2485
+ type = ["pytest-mypy"]
2486
+
2487
  [metadata]
2488
  lock-version = "2.0"
2489
  python-versions = "3.10"
2490
+ content-hash = "bafe1276871675a1d904b4309d57185b79d491027371bcd5afda1aa59551457e"
pyproject.toml CHANGED
@@ -10,6 +10,9 @@ python = "3.10"
10
  streamlit = "^1.42.0"
11
  openai = "^1.63.0"
12
  watchdog = "^6.0.0"
 
 
 
13
 
14
 
15
  [build-system]
 
10
  streamlit = "^1.42.0"
11
  openai = "^1.63.0"
12
  watchdog = "^6.0.0"
13
+ pydantic-ai = "^0.0.24"
14
+ python-dotenv = "^1.0.1"
15
+ logfire = "^3.5.3"
16
 
17
 
18
  [build-system]
src/agents/Untitled-1.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "image_editing_instruction",
3
+ "strict": true,
4
+ "schema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "category": {
8
+ "type": "string",
9
+ "description": "The editing category based on the instruction. Must be one of: Addition, Remove, Local, Global, Background.",
10
+ "enum": [
11
+ "Addition",
12
+ "Remove",
13
+ "Local",
14
+ "Global",
15
+ "Background"
16
+ ]
17
+ },
18
+ "subject": {
19
+ "type": "string",
20
+ "description": "The subject of the editing instruction. Must be a noun in no more than 5 words."
21
+ },
22
+ "caption": {
23
+ "type": "string",
24
+ "description": "The detailed description of the image."
25
+ },
26
+ "target_caption": {
27
+ "type": "string",
28
+ "description": "Apply the editing instruction to the image caption. The target caption should describe the image after the editing instruction is applied."
29
+ }
30
+ },
31
+ "required": [
32
+ "category",
33
+ "subject",
34
+ "caption",
35
+ "target_caption"
36
+ ],
37
+ "additionalProperties": false
38
+ }
39
+ }
src/agents/__init__.py ADDED
File without changes
src/agents/image-edit-agent.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic_ai import Agent, RunContext
2
+ from pydantic_ai.settings import ModelSettings
3
+ from pydantic_ai.models.openai import OpenAIModel
4
+ from dotenv import load_dotenv
5
+ import os
6
+ import asyncio
7
+ import base64
8
+ from dataclasses import dataclass
9
+
10
+ load_dotenv()
11
+
12
+ @dataclass
13
+ class ImageEditDeps:
14
+ edit_instruction: str
15
+ image_url: str
16
+
17
+ model = OpenAIModel(
18
+ "gpt-4o",
19
+ api_key=os.environ.get("OPENAI_API_KEY"),
20
+ )
21
+
22
+ image_edit_agent = Agent(
23
+ model,
24
+ system_prompt=[
25
+ 'Be concise, reply with one sentence.',
26
+ "You are an image editing agent. You will be given an image and an editing instruction. Use the tools available to you and come up with a plan to edit the image according to the instruction."
27
+ ],
28
+ deps_type=ImageEditDeps
29
+ )
30
+
31
+
32
+ @image_edit_agent.tool
33
+ async def identify_editing_subject(ctx: RunContext[ImageEditDeps]) -> str:
34
+ """
35
+ Identify the subject of the image editing instruction.
36
+
37
+ Args:
38
+ instruction: The image editing instruction.
39
+ image_url: The URL of the image.
40
+
41
+ Returns:
42
+ The subject of the image editing instruction.
43
+ """
44
+ messages = [
45
+ {
46
+ "type": "text",
47
+ "text": ctx.deps.edit_instruction
48
+ },
49
+ {
50
+ "type": "image_url",
51
+ "image_url": {
52
+ "url": ctx.deps.image_url
53
+ }
54
+ }
55
+ ]
56
+ r = await mask_generation_agent.run(messages, usage=ctx.usage, deps=ctx.deps)
57
+ return r.data
58
+
59
+ mask_generation_agent = Agent(
60
+ model,
61
+ system_prompt=[
62
+ "I will give you an editing instruction of the image. Please output the object needed to be edited.",
63
+ "You only need to output the basic description of the object in no more than 5 words.",
64
+ "The output should only contain one noun.",
65
+ "For example, the editing instruction is 'Change the white cat to a black dog'. Then you need to output: 'white cat'. Only output the new content. Do not output anything else."
66
+ ],
67
+ deps_type=ImageEditDeps
68
+ )
69
+
70
+ @mask_generation_agent.tool
71
+ async def generate_mask(ctx: RunContext[ImageEditDeps], mask_subject: str) -> str:
72
+ """
73
+ Generate a mask for the image editing instruction.
74
+ """
75
+ pass
76
+
77
+ async def main():
78
+ image_file_path = "./assets/lakeview.jpg"
79
+ with open(image_file_path, "rb") as image_file:
80
+ image_bytes = image_file.read()
81
+ image_base64 = base64.b64encode(image_bytes).decode("utf-8")
82
+ image_url = f"data:image/jpeg;base64,{image_base64}"
83
+
84
+ prompt = "remove the light post"
85
+ messages = [
86
+ {
87
+ "type": "text",
88
+ "text": prompt
89
+ },
90
+ {
91
+ "type": "image_url",
92
+ "image_url": {
93
+ "url": image_url
94
+ }
95
+ }
96
+ ]
97
+
98
+ deps = ImageEditDeps(
99
+ edit_instruction=prompt,
100
+ image_url=image_url
101
+ )
102
+ r = await mask_generation_agent.run(messages, deps=deps)
103
+ print(r.data)
104
+
105
+
106
+ if __name__ == "__main__":
107
+ asyncio.run(main())
src/agents/mask-generation-agent.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic_ai import Agent, RunContext
2
+ from pydantic_ai.settings import ModelSettings
3
+ from pydantic_ai.models.openai import OpenAIModel
4
+ from dotenv import load_dotenv
5
+ import os
6
+ import asyncio
7
+ import base64
8
+ from dataclasses import dataclass
9
+ import logfire
10
+ from src.services.generate_mask import GenerateMaskService
11
+
12
+ load_dotenv()
13
+
14
+ logfire.configure(token=os.environ.get("LOGFIRE_TOKEN"))
15
+ logfire.instrument_openai()
16
+
17
+ system_prompt = """
18
+ I will give you an editing instruction of the image.
19
+ if the edit instruction involved modifying parts of the image, please generate a mask for it.
20
+ """
21
+
22
+ @dataclass
23
+ class ImageEditDeps:
24
+ edit_instruction: str
25
+ image_url: str
26
+
27
+ model = OpenAIModel(
28
+ "gpt-4o",
29
+ api_key=os.environ.get("OPENAI_API_KEY"),
30
+ )
31
+
32
+ @dataclass
33
+ class MaskGenerationResult:
34
+ mask_image_base64: str
35
+
36
+ mask_generation_agent = Agent(
37
+ model,
38
+ system_prompt=system_prompt,
39
+ deps_type=ImageEditDeps
40
+ )
41
+
42
+ @mask_generation_agent.tool
43
+ async def generate_mask(ctx: RunContext[ImageEditDeps]) -> MaskGenerationResult:
44
+ """
45
+ Generate a mask for the image editing instruction.
46
+ """
47
+ print("Invoking generate_mask tool")
48
+ service = GenerateMaskService()
49
+ mask_instruction = await service.get_mask_generation_instruction(ctx.deps.edit_instruction, ctx.deps.image_url)
50
+ response = mask_instruction.model_dump_json(indent=4)
51
+ print(f"generate_mask tool response: {response}")
52
+
53
+ mask = await service.generate_mask(mask_instruction, ctx.deps.image_url)
54
+ print("Exiting generate_mask tool")
55
+ return MaskGenerationResult(mask_image_base64=mask)
56
+
57
+ async def main():
58
+ image_file_path = "./assets/lakeview.jpg"
59
+ with open(image_file_path, "rb") as image_file:
60
+ image_bytes = image_file.read()
61
+ image_base64 = base64.b64encode(image_bytes).decode("utf-8")
62
+ image_url = f"data:image/jpeg;base64,{image_base64}"
63
+
64
+ prompt = "remove the light post"
65
+ messages = [
66
+ {
67
+ "type": "text",
68
+ "text": prompt
69
+ },
70
+ {
71
+ "type": "image_url",
72
+ "image_url": {
73
+ "url": image_url
74
+ }
75
+ }
76
+ ]
77
+
78
+ deps = ImageEditDeps(
79
+ edit_instruction=prompt,
80
+ image_url=image_url
81
+ )
82
+ r = await mask_generation_agent.run(messages, deps=deps)
83
+ print(r.all_messages())
84
+
85
+
86
+ if __name__ == "__main__":
87
+ asyncio.run(main())
src/hopter/client.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import httpx
3
+ from enum import Enum
4
+ from src.models.generate_mask_instruction import GenerateMaskInstruction
5
+ import base64
6
+ from dotenv import load_dotenv
7
+ import os
8
+ from pydantic import BaseModel, Field
9
+ from typing import List
10
+
11
+ load_dotenv()
12
+
13
+ class Environment(Enum):
14
+ STAGING = "staging"
15
+ PRODUCTION = "production"
16
+
17
+ @property
18
+ def base_url(self) -> str:
19
+ match self:
20
+ case Environment.STAGING:
21
+ return "https://serving.hopter.staging.picc.co"
22
+ case Environment.PRODUCTION:
23
+ return "https://serving.hopter.picc.co"
24
+
25
+ class RamGroundedSamInput(BaseModel):
26
+ text_prompt: str = Field(..., description="The text prompt for the mask generation.")
27
+ image_b64: str = Field(..., description="The image in base64 format.")
28
+
29
+ class RamGroundedSamResult(BaseModel):
30
+ mask_b64: str = Field(..., description="The mask image in base64 format.")
31
+ class_label: str = Field(..., description="The class label of the mask.")
32
+ confidence: float = Field(..., description="The confidence score of the mask.")
33
+ bbox: List[float] = Field(..., description="The bounding box of the mask in the format [x1, y1, x2, y2].")
34
+
35
+ class Hopter:
36
+ def __init__(
37
+ self,
38
+ api_key: str,
39
+ environment: Environment = Environment.PRODUCTION
40
+ ):
41
+ self.api_key = api_key
42
+ self.base_url = environment.base_url
43
+ self.client = httpx.AsyncClient()
44
+
45
+ async def generate_mask(self, input: RamGroundedSamInput) -> RamGroundedSamResult:
46
+ print(f"Generating mask with input: {input.text_prompt}")
47
+ try:
48
+ response = await self.client.post(
49
+ f"{self.base_url}/api/v1/services/ram-grounded-sam-api/predictions",
50
+ headers={
51
+ "Authorization": f"Bearer {self.api_key}",
52
+ "Content-Type": "application/json"
53
+ },
54
+ json={
55
+ "input": input.model_dump()
56
+ }
57
+ )
58
+ response.raise_for_status() # Raise an error for bad responses
59
+ instance = response.json().get("output").get("instances")[0]
60
+ print("Generated mask.")
61
+ return RamGroundedSamResult(**instance)
62
+ except httpx.HTTPStatusError as exc:
63
+ print(f"HTTP error occurred: {exc.response.status_code} - {exc.response.text}")
64
+ except Exception as exc:
65
+ print(f"An unexpected error occurred: {exc}")
66
+
67
+ # async def _ram_grounded_sam(self, prompt: str, image_base64: str) -> str:
68
+
69
+ async def main():
70
+ hopter = Hopter(
71
+ api_key=os.getenv("HOPTER_API_KEY"),
72
+ environment=Environment.STAGING
73
+ )
74
+ image_file_path = "./assets/lakeview.jpg"
75
+ with open(image_file_path, "rb") as image_file:
76
+ image_bytes = image_file.read()
77
+ image_base64 = base64.b64encode(image_bytes).decode("utf-8")
78
+ image_url = f"data:image/jpeg;base64,{image_base64}"
79
+
80
+ input = RamGroundedSamInput(
81
+ text_prompt="pole",
82
+ image_b64=image_url
83
+ )
84
+ mask = await hopter.generate_mask(input)
85
+ print(mask)
86
+
87
+ if __name__ == "__main__":
88
+ asyncio.run(main())
src/models/generate_mask_instruction.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel, Field
2
+
3
+ class GenerateMaskInstruction(BaseModel):
4
+ category: str = Field(
5
+ ...,
6
+ description="The editing category based on the instruction. Must be one of: Addition, Remove, Local, Global, Background."
7
+ )
8
+ subject: str = Field(
9
+ ...,
10
+ description="The subject of the editing instruction. Must be a noun in no more than 5 words."
11
+ )
12
+ caption: str = Field(
13
+ ...,
14
+ description="The detailed description of the image."
15
+ )
16
+ target_caption: str = Field(
17
+ ...,
18
+ description="Apply the editing instruction to the image caption. The target caption should describe the image after the editing instruction is applied."
19
+ )
src/services/__init__.py ADDED
File without changes
src/services/generate_mask.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel, Field
2
+ from openai import OpenAI
3
+ import os
4
+ from dotenv import load_dotenv
5
+ import base64
6
+ import asyncio
7
+ from src.hopter.client import Hopter, RamGroundedSamInput, Environment
8
+ from src.models.generate_mask_instruction import GenerateMaskInstruction
9
+ load_dotenv()
10
+
11
+ system_prompt = """
12
+ I will give you an editing instruction of the image. Perform the following tasks:
13
+
14
+ <task_1>
15
+ Please output which type of editing category it is in.
16
+ You can choose from the following categories:
17
+ 1. Addition: Adding new objects within the images, e.g., add a bird
18
+ 2. Remove: Removing objects, e.g., remove the mask
19
+ 3. Local: Replace local parts of an object and later the object's attributes (e.g., make it smile) or alter an object's visual appearance without affecting its structure (e.g., change the cat to a dog)
20
+ 4. Global: Edit the entire image, e.g., let's see it in winter
21
+ 5. Background: Change the scene's background, e.g., have her walk on water, change the background to a beach, make the hedgehog in France, etc.
22
+ Only output a single word, e.g., 'Addition'.
23
+ </task_1>
24
+
25
+ <task_2>
26
+ Please output the subject needed to be edited. You only need to output the basic description of the object in no more than 5 words. The output should only contain one noun.
27
+
28
+ For example, the editing instruction is 'Change the white cat to a black dog'. Then you need to output: 'white cat'. Only output the new content. Do not output anything else.
29
+ </task_2>
30
+
31
+ <task_3>
32
+ Please describe the new content that should be present in the image after applying the instruction.
33
+
34
+ For example, if the original image content shows a grandmother wearing a mask and the instruction is 'remove the mask', your output should be: 'a grandmother'.
35
+ The output should only include elements that remain in the image after the edit and should not mention elements that have been changed or removed, such as 'mask' in this example.
36
+ Do not output 'sorry, xxx', even if it's a guess, directly output the answer you think is correct.
37
+ </task_3>
38
+ """
39
+
40
+ class GenerateMaskService:
41
+ def __init__(self):
42
+ self.llm = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
43
+ self.hopter = Hopter(api_key=os.environ.get("HOPTER_API_KEY"), environment=Environment.STAGING)
44
+ self.model = "gpt-4o"
45
+
46
+ async def get_mask_generation_instruction(self, edit_instruction: str, image_url: str) -> GenerateMaskInstruction:
47
+
48
+ messages = [
49
+ {
50
+ "role": "system",
51
+ "content": system_prompt
52
+ },
53
+ {
54
+ "role": "user",
55
+ "content": [
56
+ {
57
+ "type": "text",
58
+ "text": edit_instruction
59
+ },
60
+ {
61
+ "type": "image_url",
62
+ "image_url": {
63
+ "url": image_url
64
+ }
65
+ }
66
+ ]
67
+ }
68
+ ]
69
+
70
+ response = self.llm.beta.chat.completions.parse(
71
+ model=self.model,
72
+ messages=messages,
73
+ response_format=GenerateMaskInstruction
74
+ )
75
+ instruction = response.choices[0].message.parsed
76
+ return instruction
77
+
78
+ async def generate_mask(self, mask_instruction: GenerateMaskInstruction, image_url: str) -> str:
79
+ """
80
+ Generate a mask for the image editing instruction.
81
+
82
+ Args:
83
+ mask_instruction (GenerateMaskInstruction): The mask generation instruction.
84
+
85
+ Returns:
86
+ str: The mask image in base64 format.
87
+ """
88
+ input = RamGroundedSamInput(
89
+ text_prompt=mask_instruction.subject,
90
+ image_b64=image_url
91
+ )
92
+ generate_mask_result = await self.hopter.generate_mask(input)
93
+ return generate_mask_result.mask_b64
94
+
95
+ async def main():
96
+ service = GenerateMaskService()
97
+ edit_instruction = "remove the light post"
98
+ image_file_path = "./assets/lakeview.jpg"
99
+ with open(image_file_path, "rb") as image_file:
100
+ image_bytes = image_file.read()
101
+ image_base64 = base64.b64encode(image_bytes).decode("utf-8")
102
+ image_url = f"data:image/jpeg;base64,{image_base64}"
103
+
104
+ instruction = await service.get_mask_generation_instruction(edit_instruction, image_url)
105
+ print(instruction)
106
+ mask = await service.generate_mask(instruction, image_url)
107
+ print(mask)
108
+
109
+ if __name__ == "__main__":
110
+ asyncio.run(main())