vikramvasudevan commited on
Commit
e4e8447
·
verified ·
1 Parent(s): 6693267

Upload folder using huggingface_hub

Browse files
app.py CHANGED
@@ -6,6 +6,7 @@ import gradio as gr
6
  from gradio_modal import Modal
7
  import chromadb
8
  from downloader import export_channel_json
 
9
  from modules.collector import fetch_all_channel_videos
10
  from modules.db import (
11
  delete_channel_from_collection,
@@ -18,6 +19,7 @@ from dotenv import load_dotenv
18
 
19
  from youtube_poller import start_poll
20
  from youtube_sync import sync_channels_from_youtube
 
21
 
22
  load_dotenv()
23
 
@@ -137,71 +139,6 @@ def list_channels_radio():
137
  return choices
138
 
139
 
140
- # -------------------------------
141
- # Fetch channel videos as HTML table with pagination
142
- # -------------------------------
143
- def fetch_channel_html(channel_id: str, page: int = 1, page_size: int = 10):
144
- collection = get_collection()
145
- offset = (page - 1) * page_size
146
-
147
- all_results = collection.get(
148
- where={"channel_id": channel_id}, include=["metadatas"]
149
- )
150
- total_count = (
151
- len(all_results["metadatas"])
152
- if all_results and "metadatas" in all_results
153
- else 0
154
- )
155
- results = collection.get(
156
- where={"channel_id": channel_id},
157
- include=["documents", "metadatas"],
158
- limit=page_size,
159
- offset=offset,
160
- )
161
-
162
- # handle empty
163
- if not results or not results.get("metadatas"):
164
- return f"""
165
- <div style="display:flex;justify-content:center;align-items:center;
166
- height:200px;flex-direction:column;color:#666;">
167
- ⚠️ No videos found for this channel (page {page}).
168
- </div>
169
- """
170
-
171
- videos = results["metadatas"]
172
-
173
- # build table
174
- html = (
175
- f"<div>Total: {total_count} videos</div>"
176
- + """
177
- <table border="1" style="border-collapse:collapse;width:100%;font-family:sans-serif;">
178
- <thead style="background:#f0f0f0;">
179
- <tr>
180
- <th>#</th>
181
- <th>Title</th>
182
- <th>Video URL</th>
183
- <th>Description</th>
184
- </tr>
185
- </thead>
186
- <tbody>
187
- """
188
- )
189
-
190
- for idx, v in enumerate(videos, start=offset + 1):
191
- html += f"""
192
- <tr>
193
- <td>{idx}</td>
194
- <td>{v.get('video_title','')}</td>
195
- <td><a href="https://youtube.com/watch?v={v.get('video_id')}"
196
- target="_blank">Watch Video</a></td>
197
- <td>{v.get('description','')}</td>
198
- </tr>
199
- """
200
-
201
- html += "</tbody></table>"
202
- return html
203
-
204
-
205
  # Delete a channel
206
  # -------------------------------
207
  def delete_channel(channel_url: str):
@@ -250,43 +187,22 @@ with gr.Blocks() as demo:
250
  gr.Markdown("### Videos List")
251
 
252
  # the HTML table that shows one page of videos
253
- modal_html = gr.HTML()
254
-
255
- # row for pagination controls
256
- with gr.Row(equal_height=True):
257
- gr.Column()
258
- prev_btn = gr.Button("⬅️ Prev", size="sm", variant="huggingface", scale=0)
259
- page_info = gr.Textbox(
260
- value="Page 1",
261
- interactive=False,
262
- show_label=False,
263
- container=False,
264
- scale=0,
265
- )
266
- next_btn = gr.Button("Next ➡️", size="sm", variant="huggingface", scale=0)
267
- gr.Column()
268
-
269
- current_page = gr.State(1)
270
- page_size = 10 # change if you like
271
-
272
- def update_table(channel_id, page):
273
- return fetch_channel_html(channel_id, page, page_size), f"Page {page}"
274
-
275
- def prev_page(channel_id, page):
276
- new_page = max(1, page - 1)
277
- return (
278
- fetch_channel_html(channel_id, new_page, page_size),
279
- f"Page {new_page}",
280
- new_page,
281
- )
282
-
283
- def next_page(channel_id, page):
284
- new_page = page + 1
285
- return (
286
- fetch_channel_html(channel_id, new_page, page_size),
287
- f"Page {new_page}",
288
- new_page,
289
- )
290
 
291
  # Modal to add new channels
292
  with Modal(visible=False) as add_channel_modal:
@@ -372,7 +288,7 @@ with gr.Blocks() as demo:
372
  size="sm",
373
  scale=0,
374
  variant="stop",
375
- visible=False
376
  )
377
  add_channels_btn = gr.Button(
378
  "➕ Add", size="sm", scale=0, variant="primary"
@@ -503,7 +419,8 @@ with gr.Blocks() as demo:
503
  # Show videos modal when button clicked
504
  def show_selected_channel_videos(selected_channel_id):
505
  # print("selected_channel_id = ", selected_channel_id)
506
- return fetch_channel_html(selected_channel_id)
 
507
 
508
  channel_radio.change(
509
  enable_if_not_none, inputs=[channel_radio], outputs=[show_videos_btn]
@@ -513,7 +430,7 @@ with gr.Blocks() as demo:
513
  ).then(
514
  show_selected_channel_videos,
515
  inputs=[channel_radio],
516
- outputs=[modal_html],
517
  ).then(
518
  show_component, outputs=[videos_list_modal]
519
  ).then(
@@ -546,17 +463,6 @@ with gr.Blocks() as demo:
546
  get_channel_choices, inputs=[channel_list_state], outputs=[search_channel]
547
  )
548
 
549
- prev_btn.click(
550
- prev_page,
551
- [channel_radio, current_page], # you’ll need to pass channel_id here
552
- [modal_html, page_info, current_page],
553
- )
554
-
555
- next_btn.click(
556
- next_page,
557
- [channel_radio, current_page],
558
- [modal_html, page_info, current_page],
559
- )
560
  export_btn.click(close_component, outputs=[my_sidebar]).then(
561
  show_component, outputs=[download_status]
562
  ).then(hide_component, outputs=[download_ready_btn]).then(
 
6
  from gradio_modal import Modal
7
  import chromadb
8
  from downloader import export_channel_json
9
+ from modules.channel_utils import fetch_channel_dataframe
10
  from modules.collector import fetch_all_channel_videos
11
  from modules.db import (
12
  delete_channel_from_collection,
 
19
 
20
  from youtube_poller import start_poll
21
  from youtube_sync import sync_channels_from_youtube
22
+ import pandas as pd
23
 
24
  load_dotenv()
25
 
 
139
  return choices
140
 
141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  # Delete a channel
143
  # -------------------------------
144
  def delete_channel(channel_url: str):
 
187
  gr.Markdown("### Videos List")
188
 
189
  # the HTML table that shows one page of videos
190
+ # modal_html = gr.HTML()
191
+ channel_videos_df = gr.DataFrame(
192
+ show_search=True,
193
+ show_copy_button=True,
194
+ show_fullscreen_button=True,
195
+ datatype=[
196
+ "int",
197
+ "str",
198
+ "str",
199
+ "html",
200
+ ],
201
+ headers=["#", "title", "description", "url"],
202
+ column_widths=["5%","25%","60%","10%"],
203
+ wrap=True,
204
+ col_count=(4, "fixed"),
205
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
 
207
  # Modal to add new channels
208
  with Modal(visible=False) as add_channel_modal:
 
288
  size="sm",
289
  scale=0,
290
  variant="stop",
291
+ visible=False,
292
  )
293
  add_channels_btn = gr.Button(
294
  "➕ Add", size="sm", scale=0, variant="primary"
 
419
  # Show videos modal when button clicked
420
  def show_selected_channel_videos(selected_channel_id):
421
  # print("selected_channel_id = ", selected_channel_id)
422
+ df = fetch_channel_dataframe(selected_channel_id)
423
+ return gr.update(value=df, label=f"{len(df)} videos")
424
 
425
  channel_radio.change(
426
  enable_if_not_none, inputs=[channel_radio], outputs=[show_videos_btn]
 
430
  ).then(
431
  show_selected_channel_videos,
432
  inputs=[channel_radio],
433
+ outputs=[channel_videos_df],
434
  ).then(
435
  show_component, outputs=[videos_list_modal]
436
  ).then(
 
463
  get_channel_choices, inputs=[channel_list_state], outputs=[search_channel]
464
  )
465
 
 
 
 
 
 
 
 
 
 
 
 
466
  export_btn.click(close_component, outputs=[my_sidebar]).then(
467
  show_component, outputs=[download_status]
468
  ).then(hide_component, outputs=[download_ready_btn]).then(
modules/channel_utils.py ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from modules.db import get_collection
2
+ import pandas as pd
3
+
4
+ page_size = 10 # change if you like
5
+
6
+
7
+ # -------------------------------
8
+ # Fetch channel videos as HTML table with pagination
9
+ # -------------------------------
10
+ def fetch_channel_html(channel_id: str, page: int = 1, page_size: int = 10):
11
+ collection = get_collection()
12
+ offset = (page - 1) * page_size
13
+
14
+ all_results = collection.get(
15
+ where={"channel_id": channel_id}, include=["metadatas"]
16
+ )
17
+ total_count = (
18
+ len(all_results["metadatas"])
19
+ if all_results and "metadatas" in all_results
20
+ else 0
21
+ )
22
+ results = collection.get(
23
+ where={"channel_id": channel_id},
24
+ include=["documents", "metadatas"],
25
+ limit=page_size,
26
+ offset=offset,
27
+ )
28
+
29
+ # handle empty
30
+ if not results or not results.get("metadatas"):
31
+ return f"""
32
+ <div style="display:flex;justify-content:center;align-items:center;
33
+ height:200px;flex-direction:column;color:#666;">
34
+ ⚠️ No videos found for this channel (page {page}).
35
+ </div>
36
+ """
37
+
38
+ videos = results["metadatas"]
39
+
40
+ # build table
41
+ html = (
42
+ f"<div>Total: {total_count} videos</div>"
43
+ + """
44
+ <table border="1" style="border-collapse:collapse;width:100%;font-family:sans-serif;">
45
+ <thead style="background:#f0f0f0;">
46
+ <tr>
47
+ <th>#</th>
48
+ <th>Title</th>
49
+ <th>Video URL</th>
50
+ <th>Description</th>
51
+ </tr>
52
+ </thead>
53
+ <tbody>
54
+ """
55
+ )
56
+
57
+ for idx, v in enumerate(videos, start=offset + 1):
58
+ html += f"""
59
+ <tr>
60
+ <td>{idx}</td>
61
+ <td>{v.get('video_title','')}</td>
62
+ <td><a href="https://youtube.com/watch?v={v.get('video_id')}"
63
+ target="_blank">Watch Video</a></td>
64
+ <td>{v.get('description','')}</td>
65
+ </tr>
66
+ """
67
+
68
+ html += "</tbody></table>"
69
+ return html
70
+
71
+
72
+ # -------------------------------
73
+ # Fetch channel videos as HTML table with pagination
74
+ # -------------------------------
75
+ def fetch_channel_dataframe(channel_id: str):
76
+ collection = get_collection()
77
+
78
+ results = collection.get(
79
+ where={"channel_id": channel_id}, include=["documents", "metadatas"]
80
+ )
81
+ total_count = len(results["metadatas"]) if results and "metadatas" in results else 0
82
+ # handle empty
83
+ if not results or not results.get("metadatas"):
84
+ return pd.DataFrame(data=[])
85
+
86
+ videos = results["metadatas"]
87
+
88
+ items = []
89
+ for idx, v in enumerate(videos, start=1):
90
+ item = {
91
+ "#": idx,
92
+ "title": v.get("video_title", "-"),
93
+ "description": v.get("description", ""),
94
+ "url": f"""<a style="color: blue" href="https://youtube.com/watch?v={v.get('video_id')}"
95
+ target="_blank">▶️Watch Video</a>""",
96
+ }
97
+ items.append(item)
98
+ return pd.DataFrame(data=items)
99
+
100
+
101
+ def update_table(channel_id, page):
102
+ return fetch_channel_html(channel_id, page, page_size), f"Page {page}"
103
+
104
+
105
+ def prev_page(channel_id, page):
106
+ new_page = max(1, page - 1)
107
+ return (
108
+ fetch_channel_html(channel_id, new_page, page_size),
109
+ f"Page {new_page}",
110
+ new_page,
111
+ )
112
+
113
+
114
+ def next_page(channel_id, page):
115
+ new_page = page + 1
116
+ return (
117
+ fetch_channel_html(channel_id, new_page, page_size),
118
+ f"Page {new_page}",
119
+ new_page,
120
+ )
modules/db.py CHANGED
@@ -15,14 +15,14 @@ def get_collection():
15
  except Exception:
16
  collection = client.create_collection("yt_metadata")
17
 
18
- # Check dimension mismatch
19
- try:
20
- # quick test query
21
- collection.query(query_embeddings=[[0.0] * 1536], n_results=1)
22
- except Exception:
23
- # Delete and recreate with fresh schema
24
- client.delete_collection("yt_metadata")
25
- collection = client.create_collection("yt_metadata")
26
 
27
  return collection
28
 
 
15
  except Exception:
16
  collection = client.create_collection("yt_metadata")
17
 
18
+ # # Check dimension mismatch
19
+ # try:
20
+ # # quick test query
21
+ # collection.query(query_embeddings=[[0.0] * 1536], n_results=1)
22
+ # except Exception:
23
+ # # Delete and recreate with fresh schema
24
+ # client.delete_collection("yt_metadata")
25
+ # collection = client.create_collection("yt_metadata")
26
 
27
  return collection
28
 
modules/embeddings.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sentence_transformers import SentenceTransformer
2
+ from openai import OpenAI
3
+ from dotenv import load_dotenv
4
+ load_dotenv()
5
+
6
+
7
+ # Step 1: Load SentenceTransformer model
8
+ # Old MiniLM version:
9
+ # model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
10
+
11
+ # Better MPNet alternative:
12
+ model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-mpnet-base-v2")
13
+ client = OpenAI()
14
+
15
+ def _get_hf_embedding(text: str) -> list:
16
+ return model.encode(text).tolist()
17
+
18
+ def _get_openai_embedding(text: str) -> list:
19
+ response = client.embeddings.create(
20
+ model="text-embedding-3-large", # or "text-embedding-3-large"
21
+ input=text
22
+ )
23
+ return response.data[0].embedding
24
+
25
+
26
+ def get_embedding(text: str) -> list:
27
+ """
28
+ Switch according to the embedding model you want.
29
+ """
30
+ # return _get_hf_embedding(text)
31
+ return _get_openai_embedding(text)
modules/indexer.py CHANGED
@@ -2,6 +2,8 @@
2
  from typing import Dict, List
3
  from openai import OpenAI
4
 
 
 
5
  def index_videos(videos: List[Dict], collection, channel_url: str, batch_size: int = 50):
6
  client = OpenAI()
7
 
@@ -19,13 +21,7 @@ def index_videos(videos: List[Dict], collection, channel_url: str, batch_size: i
19
  # Prepare text inputs
20
  texts = [f"{vid.get('title', '')} - {vid.get('description', '')}" for vid in batch]
21
 
22
- # Call embeddings API in batch
23
- response = client.embeddings.create(
24
- input=texts,
25
- model="text-embedding-3-small"
26
- )
27
-
28
- embeddings = [item.embedding for item in response.data]
29
 
30
  # Build metadata + ids
31
  metadatas, ids = [], []
 
2
  from typing import Dict, List
3
  from openai import OpenAI
4
 
5
+ from modules.embeddings import get_embedding
6
+
7
  def index_videos(videos: List[Dict], collection, channel_url: str, batch_size: int = 50):
8
  client = OpenAI()
9
 
 
21
  # Prepare text inputs
22
  texts = [f"{vid.get('title', '')} - {vid.get('description', '')}" for vid in batch]
23
 
24
+ embeddings = [get_embedding(text) for text in texts]
 
 
 
 
 
 
25
 
26
  # Build metadata + ids
27
  metadatas, ids = [], []
modules/retriever.py CHANGED
@@ -2,6 +2,8 @@
2
  from typing import List, Dict
3
  from openai import OpenAI
4
 
 
 
5
 
6
  def retrieve_videos(
7
  query: str, collection, top_k: int = 3, channel_id: str = None
@@ -9,11 +11,7 @@ def retrieve_videos(
9
  client = OpenAI()
10
 
11
  # Create embedding for query
12
- embedding = (
13
- client.embeddings.create(input=query, model="text-embedding-3-small")
14
- .data[0]
15
- .embedding
16
- )
17
 
18
  # Query Chroma
19
  if not channel_id:
 
2
  from typing import List, Dict
3
  from openai import OpenAI
4
 
5
+ from modules.embeddings import get_embedding
6
+
7
 
8
  def retrieve_videos(
9
  query: str, collection, top_k: int = 3, channel_id: str = None
 
11
  client = OpenAI()
12
 
13
  # Create embedding for query
14
+ embedding = get_embedding(query)
 
 
 
 
15
 
16
  # Query Chroma
17
  if not channel_id:
pyproject.toml CHANGED
@@ -12,4 +12,5 @@ dependencies = [
12
  "gradio>=5.44.0",
13
  "gradio-modal>=0.0.4",
14
  "openai>=1.102.0",
 
15
  ]
 
12
  "gradio>=5.44.0",
13
  "gradio-modal>=0.0.4",
14
  "openai>=1.102.0",
15
+ "sentence-transformers>=5.1.0",
16
  ]
uv.lock CHANGED
@@ -762,6 +762,15 @@ wheels = [
762
  { url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213, upload-time = "2025-05-18T19:04:41.894Z" },
763
  ]
764
 
 
 
 
 
 
 
 
 
 
765
  [[package]]
766
  name = "jsonschema"
767
  version = "4.25.1"
@@ -933,6 +942,15 @@ wheels = [
933
  { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
934
  ]
935
 
 
 
 
 
 
 
 
 
 
936
  [[package]]
937
  name = "numpy"
938
  version = "2.3.2"
@@ -985,6 +1003,132 @@ wheels = [
985
  { url = "https://files.pythonhosted.org/packages/c1/9e/1652778bce745a67b5fe05adde60ed362d38eb17d919a540e813d30f6874/numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631", size = 10544226, upload-time = "2025-07-24T20:56:34.509Z" },
986
  ]
987
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
988
  [[package]]
989
  name = "oauthlib"
990
  version = "3.3.1"
@@ -1568,6 +1712,42 @@ wheels = [
1568
  { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" },
1569
  ]
1570
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1571
  [[package]]
1572
  name = "requests"
1573
  version = "2.32.5"
@@ -1725,6 +1905,99 @@ wheels = [
1725
  { url = "https://files.pythonhosted.org/packages/4d/c0/1108ad9f01567f66b3154063605b350b69c3c9366732e09e45f9fd0d1deb/safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c", size = 8692, upload-time = "2024-12-02T18:44:08.555Z" },
1726
  ]
1727
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1728
  [[package]]
1729
  name = "semantic-version"
1730
  version = "2.10.0"
@@ -1734,6 +2007,34 @@ wheels = [
1734
  { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" },
1735
  ]
1736
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1737
  [[package]]
1738
  name = "sgmllib3k"
1739
  version = "1.0.0"
@@ -1800,6 +2101,15 @@ wheels = [
1800
  { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" },
1801
  ]
1802
 
 
 
 
 
 
 
 
 
 
1803
  [[package]]
1804
  name = "tokenizers"
1805
  version = "0.21.4"
@@ -1834,6 +2144,45 @@ wheels = [
1834
  { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" },
1835
  ]
1836
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1837
  [[package]]
1838
  name = "tqdm"
1839
  version = "4.67.1"
@@ -1846,6 +2195,39 @@ wheels = [
1846
  { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
1847
  ]
1848
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1849
  [[package]]
1850
  name = "typer"
1851
  version = "0.16.1"
@@ -2042,6 +2424,7 @@ dependencies = [
2042
  { name = "gradio" },
2043
  { name = "gradio-modal" },
2044
  { name = "openai" },
 
2045
  ]
2046
 
2047
  [package.metadata]
@@ -2053,6 +2436,7 @@ requires-dist = [
2053
  { name = "gradio", specifier = ">=5.44.0" },
2054
  { name = "gradio-modal", specifier = ">=0.0.4" },
2055
  { name = "openai", specifier = ">=1.102.0" },
 
2056
  ]
2057
 
2058
  [[package]]
 
762
  { url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213, upload-time = "2025-05-18T19:04:41.894Z" },
763
  ]
764
 
765
+ [[package]]
766
+ name = "joblib"
767
+ version = "1.5.2"
768
+ source = { registry = "https://pypi.org/simple" }
769
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload-time = "2025-08-27T12:15:46.575Z" }
770
+ wheels = [
771
+ { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" },
772
+ ]
773
+
774
  [[package]]
775
  name = "jsonschema"
776
  version = "4.25.1"
 
942
  { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
943
  ]
944
 
945
+ [[package]]
946
+ name = "networkx"
947
+ version = "3.5"
948
+ source = { registry = "https://pypi.org/simple" }
949
+ sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" }
950
+ wheels = [
951
+ { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" },
952
+ ]
953
+
954
  [[package]]
955
  name = "numpy"
956
  version = "2.3.2"
 
1003
  { url = "https://files.pythonhosted.org/packages/c1/9e/1652778bce745a67b5fe05adde60ed362d38eb17d919a540e813d30f6874/numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631", size = 10544226, upload-time = "2025-07-24T20:56:34.509Z" },
1004
  ]
1005
 
1006
+ [[package]]
1007
+ name = "nvidia-cublas-cu12"
1008
+ version = "12.8.4.1"
1009
+ source = { registry = "https://pypi.org/simple" }
1010
+ wheels = [
1011
+ { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" },
1012
+ ]
1013
+
1014
+ [[package]]
1015
+ name = "nvidia-cuda-cupti-cu12"
1016
+ version = "12.8.90"
1017
+ source = { registry = "https://pypi.org/simple" }
1018
+ wheels = [
1019
+ { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" },
1020
+ ]
1021
+
1022
+ [[package]]
1023
+ name = "nvidia-cuda-nvrtc-cu12"
1024
+ version = "12.8.93"
1025
+ source = { registry = "https://pypi.org/simple" }
1026
+ wheels = [
1027
+ { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" },
1028
+ ]
1029
+
1030
+ [[package]]
1031
+ name = "nvidia-cuda-runtime-cu12"
1032
+ version = "12.8.90"
1033
+ source = { registry = "https://pypi.org/simple" }
1034
+ wheels = [
1035
+ { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" },
1036
+ ]
1037
+
1038
+ [[package]]
1039
+ name = "nvidia-cudnn-cu12"
1040
+ version = "9.10.2.21"
1041
+ source = { registry = "https://pypi.org/simple" }
1042
+ dependencies = [
1043
+ { name = "nvidia-cublas-cu12" },
1044
+ ]
1045
+ wheels = [
1046
+ { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" },
1047
+ ]
1048
+
1049
+ [[package]]
1050
+ name = "nvidia-cufft-cu12"
1051
+ version = "11.3.3.83"
1052
+ source = { registry = "https://pypi.org/simple" }
1053
+ dependencies = [
1054
+ { name = "nvidia-nvjitlink-cu12" },
1055
+ ]
1056
+ wheels = [
1057
+ { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" },
1058
+ ]
1059
+
1060
+ [[package]]
1061
+ name = "nvidia-cufile-cu12"
1062
+ version = "1.13.1.3"
1063
+ source = { registry = "https://pypi.org/simple" }
1064
+ wheels = [
1065
+ { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" },
1066
+ ]
1067
+
1068
+ [[package]]
1069
+ name = "nvidia-curand-cu12"
1070
+ version = "10.3.9.90"
1071
+ source = { registry = "https://pypi.org/simple" }
1072
+ wheels = [
1073
+ { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" },
1074
+ ]
1075
+
1076
+ [[package]]
1077
+ name = "nvidia-cusolver-cu12"
1078
+ version = "11.7.3.90"
1079
+ source = { registry = "https://pypi.org/simple" }
1080
+ dependencies = [
1081
+ { name = "nvidia-cublas-cu12" },
1082
+ { name = "nvidia-cusparse-cu12" },
1083
+ { name = "nvidia-nvjitlink-cu12" },
1084
+ ]
1085
+ wheels = [
1086
+ { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" },
1087
+ ]
1088
+
1089
+ [[package]]
1090
+ name = "nvidia-cusparse-cu12"
1091
+ version = "12.5.8.93"
1092
+ source = { registry = "https://pypi.org/simple" }
1093
+ dependencies = [
1094
+ { name = "nvidia-nvjitlink-cu12" },
1095
+ ]
1096
+ wheels = [
1097
+ { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" },
1098
+ ]
1099
+
1100
+ [[package]]
1101
+ name = "nvidia-cusparselt-cu12"
1102
+ version = "0.7.1"
1103
+ source = { registry = "https://pypi.org/simple" }
1104
+ wheels = [
1105
+ { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" },
1106
+ ]
1107
+
1108
+ [[package]]
1109
+ name = "nvidia-nccl-cu12"
1110
+ version = "2.27.3"
1111
+ source = { registry = "https://pypi.org/simple" }
1112
+ wheels = [
1113
+ { url = "https://files.pythonhosted.org/packages/5c/5b/4e4fff7bad39adf89f735f2bc87248c81db71205b62bcc0d5ca5b606b3c3/nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adf27ccf4238253e0b826bce3ff5fa532d65fc42322c8bfdfaf28024c0fbe039", size = 322364134, upload-time = "2025-06-03T21:58:04.013Z" },
1114
+ ]
1115
+
1116
+ [[package]]
1117
+ name = "nvidia-nvjitlink-cu12"
1118
+ version = "12.8.93"
1119
+ source = { registry = "https://pypi.org/simple" }
1120
+ wheels = [
1121
+ { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" },
1122
+ ]
1123
+
1124
+ [[package]]
1125
+ name = "nvidia-nvtx-cu12"
1126
+ version = "12.8.90"
1127
+ source = { registry = "https://pypi.org/simple" }
1128
+ wheels = [
1129
+ { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" },
1130
+ ]
1131
+
1132
  [[package]]
1133
  name = "oauthlib"
1134
  version = "3.3.1"
 
1712
  { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" },
1713
  ]
1714
 
1715
+ [[package]]
1716
+ name = "regex"
1717
+ version = "2025.7.34"
1718
+ source = { registry = "https://pypi.org/simple" }
1719
+ sdist = { url = "https://files.pythonhosted.org/packages/0b/de/e13fa6dc61d78b30ba47481f99933a3b49a57779d625c392d8036770a60d/regex-2025.7.34.tar.gz", hash = "sha256:9ead9765217afd04a86822dfcd4ed2747dfe426e887da413b15ff0ac2457e21a", size = 400714, upload-time = "2025-07-31T00:21:16.262Z" }
1720
+ wheels = [
1721
+ { url = "https://files.pythonhosted.org/packages/15/16/b709b2119975035169a25aa8e4940ca177b1a2e25e14f8d996d09130368e/regex-2025.7.34-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3c9740a77aeef3f5e3aaab92403946a8d34437db930a0280e7e81ddcada61f5", size = 485334, upload-time = "2025-07-31T00:19:56.58Z" },
1722
+ { url = "https://files.pythonhosted.org/packages/94/a6/c09136046be0595f0331bc58a0e5f89c2d324cf734e0b0ec53cf4b12a636/regex-2025.7.34-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:69ed3bc611540f2ea70a4080f853741ec698be556b1df404599f8724690edbcd", size = 289942, upload-time = "2025-07-31T00:19:57.943Z" },
1723
+ { url = "https://files.pythonhosted.org/packages/36/91/08fc0fd0f40bdfb0e0df4134ee37cfb16e66a1044ac56d36911fd01c69d2/regex-2025.7.34-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d03c6f9dcd562c56527c42b8530aad93193e0b3254a588be1f2ed378cdfdea1b", size = 285991, upload-time = "2025-07-31T00:19:59.837Z" },
1724
+ { url = "https://files.pythonhosted.org/packages/be/2f/99dc8f6f756606f0c214d14c7b6c17270b6bbe26d5c1f05cde9dbb1c551f/regex-2025.7.34-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6164b1d99dee1dfad33f301f174d8139d4368a9fb50bf0a3603b2eaf579963ad", size = 797415, upload-time = "2025-07-31T00:20:01.668Z" },
1725
+ { url = "https://files.pythonhosted.org/packages/62/cf/2fcdca1110495458ba4e95c52ce73b361cf1cafd8a53b5c31542cde9a15b/regex-2025.7.34-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1e4f4f62599b8142362f164ce776f19d79bdd21273e86920a7b604a4275b4f59", size = 862487, upload-time = "2025-07-31T00:20:03.142Z" },
1726
+ { url = "https://files.pythonhosted.org/packages/90/38/899105dd27fed394e3fae45607c1983e138273ec167e47882fc401f112b9/regex-2025.7.34-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72a26dcc6a59c057b292f39d41465d8233a10fd69121fa24f8f43ec6294e5415", size = 910717, upload-time = "2025-07-31T00:20:04.727Z" },
1727
+ { url = "https://files.pythonhosted.org/packages/ee/f6/4716198dbd0bcc9c45625ac4c81a435d1c4d8ad662e8576dac06bab35b17/regex-2025.7.34-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5273fddf7a3e602695c92716c420c377599ed3c853ea669c1fe26218867002f", size = 801943, upload-time = "2025-07-31T00:20:07.1Z" },
1728
+ { url = "https://files.pythonhosted.org/packages/40/5d/cff8896d27e4e3dd11dd72ac78797c7987eb50fe4debc2c0f2f1682eb06d/regex-2025.7.34-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c1844be23cd40135b3a5a4dd298e1e0c0cb36757364dd6cdc6025770363e06c1", size = 786664, upload-time = "2025-07-31T00:20:08.818Z" },
1729
+ { url = "https://files.pythonhosted.org/packages/10/29/758bf83cf7b4c34f07ac3423ea03cee3eb3176941641e4ccc05620f6c0b8/regex-2025.7.34-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dde35e2afbbe2272f8abee3b9fe6772d9b5a07d82607b5788e8508974059925c", size = 856457, upload-time = "2025-07-31T00:20:10.328Z" },
1730
+ { url = "https://files.pythonhosted.org/packages/d7/30/c19d212b619963c5b460bfed0ea69a092c6a43cba52a973d46c27b3e2975/regex-2025.7.34-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f6e8e7af516a7549412ce57613e859c3be27d55341a894aacaa11703a4c31a", size = 849008, upload-time = "2025-07-31T00:20:11.823Z" },
1731
+ { url = "https://files.pythonhosted.org/packages/9e/b8/3c35da3b12c87e3cc00010ef6c3a4ae787cff0bc381aa3d251def219969a/regex-2025.7.34-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:469142fb94a869beb25b5f18ea87646d21def10fbacb0bcb749224f3509476f0", size = 788101, upload-time = "2025-07-31T00:20:13.729Z" },
1732
+ { url = "https://files.pythonhosted.org/packages/47/80/2f46677c0b3c2b723b2c358d19f9346e714113865da0f5f736ca1a883bde/regex-2025.7.34-cp313-cp313-win32.whl", hash = "sha256:da7507d083ee33ccea1310447410c27ca11fb9ef18c95899ca57ff60a7e4d8f1", size = 264401, upload-time = "2025-07-31T00:20:15.233Z" },
1733
+ { url = "https://files.pythonhosted.org/packages/be/fa/917d64dd074682606a003cba33585c28138c77d848ef72fc77cbb1183849/regex-2025.7.34-cp313-cp313-win_amd64.whl", hash = "sha256:9d644de5520441e5f7e2db63aec2748948cc39ed4d7a87fd5db578ea4043d997", size = 275368, upload-time = "2025-07-31T00:20:16.711Z" },
1734
+ { url = "https://files.pythonhosted.org/packages/65/cd/f94383666704170a2154a5df7b16be28f0c27a266bffcd843e58bc84120f/regex-2025.7.34-cp313-cp313-win_arm64.whl", hash = "sha256:7bf1c5503a9f2cbd2f52d7e260acb3131b07b6273c470abb78568174fe6bde3f", size = 268482, upload-time = "2025-07-31T00:20:18.189Z" },
1735
+ { url = "https://files.pythonhosted.org/packages/ac/23/6376f3a23cf2f3c00514b1cdd8c990afb4dfbac3cb4a68b633c6b7e2e307/regex-2025.7.34-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:8283afe7042d8270cecf27cca558873168e771183d4d593e3c5fe5f12402212a", size = 485385, upload-time = "2025-07-31T00:20:19.692Z" },
1736
+ { url = "https://files.pythonhosted.org/packages/73/5b/6d4d3a0b4d312adbfd6d5694c8dddcf1396708976dd87e4d00af439d962b/regex-2025.7.34-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6c053f9647e3421dd2f5dff8172eb7b4eec129df9d1d2f7133a4386319b47435", size = 289788, upload-time = "2025-07-31T00:20:21.941Z" },
1737
+ { url = "https://files.pythonhosted.org/packages/92/71/5862ac9913746e5054d01cb9fb8125b3d0802c0706ef547cae1e7f4428fa/regex-2025.7.34-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a16dd56bbcb7d10e62861c3cd000290ddff28ea142ffb5eb3470f183628011ac", size = 286136, upload-time = "2025-07-31T00:20:26.146Z" },
1738
+ { url = "https://files.pythonhosted.org/packages/27/df/5b505dc447eb71278eba10d5ec940769ca89c1af70f0468bfbcb98035dc2/regex-2025.7.34-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69c593ff5a24c0d5c1112b0df9b09eae42b33c014bdca7022d6523b210b69f72", size = 797753, upload-time = "2025-07-31T00:20:27.919Z" },
1739
+ { url = "https://files.pythonhosted.org/packages/86/38/3e3dc953d13998fa047e9a2414b556201dbd7147034fbac129392363253b/regex-2025.7.34-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98d0ce170fcde1a03b5df19c5650db22ab58af375aaa6ff07978a85c9f250f0e", size = 863263, upload-time = "2025-07-31T00:20:29.803Z" },
1740
+ { url = "https://files.pythonhosted.org/packages/68/e5/3ff66b29dde12f5b874dda2d9dec7245c2051f2528d8c2a797901497f140/regex-2025.7.34-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d72765a4bff8c43711d5b0f5b452991a9947853dfa471972169b3cc0ba1d0751", size = 910103, upload-time = "2025-07-31T00:20:31.313Z" },
1741
+ { url = "https://files.pythonhosted.org/packages/9e/fe/14176f2182125977fba3711adea73f472a11f3f9288c1317c59cd16ad5e6/regex-2025.7.34-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4494f8fd95a77eb434039ad8460e64d57baa0434f1395b7da44015bef650d0e4", size = 801709, upload-time = "2025-07-31T00:20:33.323Z" },
1742
+ { url = "https://files.pythonhosted.org/packages/5a/0d/80d4e66ed24f1ba876a9e8e31b709f9fd22d5c266bf5f3ab3c1afe683d7d/regex-2025.7.34-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4f42b522259c66e918a0121a12429b2abcf696c6f967fa37bdc7b72e61469f98", size = 786726, upload-time = "2025-07-31T00:20:35.252Z" },
1743
+ { url = "https://files.pythonhosted.org/packages/12/75/c3ebb30e04a56c046f5c85179dc173818551037daae2c0c940c7b19152cb/regex-2025.7.34-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:aaef1f056d96a0a5d53ad47d019d5b4c66fe4be2da87016e0d43b7242599ffc7", size = 857306, upload-time = "2025-07-31T00:20:37.12Z" },
1744
+ { url = "https://files.pythonhosted.org/packages/b1/b2/a4dc5d8b14f90924f27f0ac4c4c4f5e195b723be98adecc884f6716614b6/regex-2025.7.34-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:656433e5b7dccc9bc0da6312da8eb897b81f5e560321ec413500e5367fcd5d47", size = 848494, upload-time = "2025-07-31T00:20:38.818Z" },
1745
+ { url = "https://files.pythonhosted.org/packages/0d/21/9ac6e07a4c5e8646a90b56b61f7e9dac11ae0747c857f91d3d2bc7c241d9/regex-2025.7.34-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e91eb2c62c39705e17b4d42d4b86c4e86c884c0d15d9c5a47d0835f8387add8e", size = 787850, upload-time = "2025-07-31T00:20:40.478Z" },
1746
+ { url = "https://files.pythonhosted.org/packages/be/6c/d51204e28e7bc54f9a03bb799b04730d7e54ff2718862b8d4e09e7110a6a/regex-2025.7.34-cp314-cp314-win32.whl", hash = "sha256:f978ddfb6216028c8f1d6b0f7ef779949498b64117fc35a939022f67f810bdcb", size = 269730, upload-time = "2025-07-31T00:20:42.253Z" },
1747
+ { url = "https://files.pythonhosted.org/packages/74/52/a7e92d02fa1fdef59d113098cb9f02c5d03289a0e9f9e5d4d6acccd10677/regex-2025.7.34-cp314-cp314-win_amd64.whl", hash = "sha256:4b7dc33b9b48fb37ead12ffc7bdb846ac72f99a80373c4da48f64b373a7abeae", size = 278640, upload-time = "2025-07-31T00:20:44.42Z" },
1748
+ { url = "https://files.pythonhosted.org/packages/d1/78/a815529b559b1771080faa90c3ab401730661f99d495ab0071649f139ebd/regex-2025.7.34-cp314-cp314-win_arm64.whl", hash = "sha256:4b8c4d39f451e64809912c82392933d80fe2e4a87eeef8859fcc5380d0173c64", size = 271757, upload-time = "2025-07-31T00:20:46.355Z" },
1749
+ ]
1750
+
1751
  [[package]]
1752
  name = "requests"
1753
  version = "2.32.5"
 
1905
  { url = "https://files.pythonhosted.org/packages/4d/c0/1108ad9f01567f66b3154063605b350b69c3c9366732e09e45f9fd0d1deb/safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c", size = 8692, upload-time = "2024-12-02T18:44:08.555Z" },
1906
  ]
1907
 
1908
+ [[package]]
1909
+ name = "safetensors"
1910
+ version = "0.6.2"
1911
+ source = { registry = "https://pypi.org/simple" }
1912
+ sdist = { url = "https://files.pythonhosted.org/packages/ac/cc/738f3011628920e027a11754d9cae9abec1aed00f7ae860abbf843755233/safetensors-0.6.2.tar.gz", hash = "sha256:43ff2aa0e6fa2dc3ea5524ac7ad93a9839256b8703761e76e2d0b2a3fa4f15d9", size = 197968, upload-time = "2025-08-08T13:13:58.654Z" }
1913
+ wheels = [
1914
+ { url = "https://files.pythonhosted.org/packages/4d/b1/3f5fd73c039fc87dba3ff8b5d528bfc5a32b597fea8e7a6a4800343a17c7/safetensors-0.6.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9c85ede8ec58f120bad982ec47746981e210492a6db876882aa021446af8ffba", size = 454797, upload-time = "2025-08-08T13:13:52.066Z" },
1915
+ { url = "https://files.pythonhosted.org/packages/8c/c9/bb114c158540ee17907ec470d01980957fdaf87b4aa07914c24eba87b9c6/safetensors-0.6.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d6675cf4b39c98dbd7d940598028f3742e0375a6b4d4277e76beb0c35f4b843b", size = 432206, upload-time = "2025-08-08T13:13:50.931Z" },
1916
+ { url = "https://files.pythonhosted.org/packages/d3/8e/f70c34e47df3110e8e0bb268d90db8d4be8958a54ab0336c9be4fe86dac8/safetensors-0.6.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d2d2b3ce1e2509c68932ca03ab8f20570920cd9754b05063d4368ee52833ecd", size = 473261, upload-time = "2025-08-08T13:13:41.259Z" },
1917
+ { url = "https://files.pythonhosted.org/packages/2a/f5/be9c6a7c7ef773e1996dc214e73485286df1836dbd063e8085ee1976f9cb/safetensors-0.6.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:93de35a18f46b0f5a6a1f9e26d91b442094f2df02e9fd7acf224cfec4238821a", size = 485117, upload-time = "2025-08-08T13:13:43.506Z" },
1918
+ { url = "https://files.pythonhosted.org/packages/c9/55/23f2d0a2c96ed8665bf17a30ab4ce5270413f4d74b6d87dd663258b9af31/safetensors-0.6.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89a89b505f335640f9120fac65ddeb83e40f1fd081cb8ed88b505bdccec8d0a1", size = 616154, upload-time = "2025-08-08T13:13:45.096Z" },
1919
+ { url = "https://files.pythonhosted.org/packages/98/c6/affb0bd9ce02aa46e7acddbe087912a04d953d7a4d74b708c91b5806ef3f/safetensors-0.6.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4d0d0b937e04bdf2ae6f70cd3ad51328635fe0e6214aa1fc811f3b576b3bda", size = 520713, upload-time = "2025-08-08T13:13:46.25Z" },
1920
+ { url = "https://files.pythonhosted.org/packages/fe/5d/5a514d7b88e310c8b146e2404e0dc161282e78634d9358975fd56dfd14be/safetensors-0.6.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8045db2c872db8f4cbe3faa0495932d89c38c899c603f21e9b6486951a5ecb8f", size = 485835, upload-time = "2025-08-08T13:13:49.373Z" },
1921
+ { url = "https://files.pythonhosted.org/packages/7a/7b/4fc3b2ba62c352b2071bea9cfbad330fadda70579f617506ae1a2f129cab/safetensors-0.6.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:81e67e8bab9878bb568cffbc5f5e655adb38d2418351dc0859ccac158f753e19", size = 521503, upload-time = "2025-08-08T13:13:47.651Z" },
1922
+ { url = "https://files.pythonhosted.org/packages/5a/50/0057e11fe1f3cead9254315a6c106a16dd4b1a19cd247f7cc6414f6b7866/safetensors-0.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0e4d029ab0a0e0e4fdf142b194514695b1d7d3735503ba700cf36d0fc7136ce", size = 652256, upload-time = "2025-08-08T13:13:53.167Z" },
1923
+ { url = "https://files.pythonhosted.org/packages/e9/29/473f789e4ac242593ac1656fbece6e1ecd860bb289e635e963667807afe3/safetensors-0.6.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fa48268185c52bfe8771e46325a1e21d317207bcabcb72e65c6e28e9ffeb29c7", size = 747281, upload-time = "2025-08-08T13:13:54.656Z" },
1924
+ { url = "https://files.pythonhosted.org/packages/68/52/f7324aad7f2df99e05525c84d352dc217e0fa637a4f603e9f2eedfbe2c67/safetensors-0.6.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:d83c20c12c2d2f465997c51b7ecb00e407e5f94d7dec3ea0cc11d86f60d3fde5", size = 692286, upload-time = "2025-08-08T13:13:55.884Z" },
1925
+ { url = "https://files.pythonhosted.org/packages/ad/fe/cad1d9762868c7c5dc70c8620074df28ebb1a8e4c17d4c0cb031889c457e/safetensors-0.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d944cea65fad0ead848b6ec2c37cc0b197194bec228f8020054742190e9312ac", size = 655957, upload-time = "2025-08-08T13:13:57.029Z" },
1926
+ { url = "https://files.pythonhosted.org/packages/59/a7/e2158e17bbe57d104f0abbd95dff60dda916cf277c9f9663b4bf9bad8b6e/safetensors-0.6.2-cp38-abi3-win32.whl", hash = "sha256:cab75ca7c064d3911411461151cb69380c9225798a20e712b102edda2542ddb1", size = 308926, upload-time = "2025-08-08T13:14:01.095Z" },
1927
+ { url = "https://files.pythonhosted.org/packages/2c/c3/c0be1135726618dc1e28d181b8c442403d8dbb9e273fd791de2d4384bcdd/safetensors-0.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:c7b214870df923cbc1593c3faee16bec59ea462758699bd3fee399d00aac072c", size = 320192, upload-time = "2025-08-08T13:13:59.467Z" },
1928
+ ]
1929
+
1930
+ [[package]]
1931
+ name = "scikit-learn"
1932
+ version = "1.7.1"
1933
+ source = { registry = "https://pypi.org/simple" }
1934
+ dependencies = [
1935
+ { name = "joblib" },
1936
+ { name = "numpy" },
1937
+ { name = "scipy" },
1938
+ { name = "threadpoolctl" },
1939
+ ]
1940
+ sdist = { url = "https://files.pythonhosted.org/packages/41/84/5f4af978fff619706b8961accac84780a6d298d82a8873446f72edb4ead0/scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802", size = 7190445, upload-time = "2025-07-18T08:01:54.5Z" }
1941
+ wheels = [
1942
+ { url = "https://files.pythonhosted.org/packages/52/f8/e0533303f318a0f37b88300d21f79b6ac067188d4824f1047a37214ab718/scikit_learn-1.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b7839687fa46d02e01035ad775982f2470be2668e13ddd151f0f55a5bf123bae", size = 9213143, upload-time = "2025-07-18T08:01:32.942Z" },
1943
+ { url = "https://files.pythonhosted.org/packages/71/f3/f1df377d1bdfc3e3e2adc9c119c238b182293e6740df4cbeac6de2cc3e23/scikit_learn-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a10f276639195a96c86aa572ee0698ad64ee939a7b042060b98bd1930c261d10", size = 8591977, upload-time = "2025-07-18T08:01:34.967Z" },
1944
+ { url = "https://files.pythonhosted.org/packages/99/72/c86a4cd867816350fe8dee13f30222340b9cd6b96173955819a5561810c5/scikit_learn-1.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13679981fdaebc10cc4c13c43344416a86fcbc61449cb3e6517e1df9d12c8309", size = 9436142, upload-time = "2025-07-18T08:01:37.397Z" },
1945
+ { url = "https://files.pythonhosted.org/packages/e8/66/277967b29bd297538dc7a6ecfb1a7dce751beabd0d7f7a2233be7a4f7832/scikit_learn-1.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f1262883c6a63f067a980a8cdd2d2e7f2513dddcef6a9eaada6416a7a7cbe43", size = 9282996, upload-time = "2025-07-18T08:01:39.721Z" },
1946
+ { url = "https://files.pythonhosted.org/packages/e2/47/9291cfa1db1dae9880420d1e07dbc7e8dd4a7cdbc42eaba22512e6bde958/scikit_learn-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca6d31fb10e04d50bfd2b50d66744729dbb512d4efd0223b864e2fdbfc4cee11", size = 8707418, upload-time = "2025-07-18T08:01:42.124Z" },
1947
+ { url = "https://files.pythonhosted.org/packages/61/95/45726819beccdaa34d3362ea9b2ff9f2b5d3b8bf721bd632675870308ceb/scikit_learn-1.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:781674d096303cfe3d351ae6963ff7c958db61cde3421cd490e3a5a58f2a94ae", size = 9561466, upload-time = "2025-07-18T08:01:44.195Z" },
1948
+ { url = "https://files.pythonhosted.org/packages/ee/1c/6f4b3344805de783d20a51eb24d4c9ad4b11a7f75c1801e6ec6d777361fd/scikit_learn-1.7.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:10679f7f125fe7ecd5fad37dd1aa2daae7e3ad8df7f3eefa08901b8254b3e12c", size = 9040467, upload-time = "2025-07-18T08:01:46.671Z" },
1949
+ { url = "https://files.pythonhosted.org/packages/6f/80/abe18fe471af9f1d181904203d62697998b27d9b62124cd281d740ded2f9/scikit_learn-1.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f812729e38c8cb37f760dce71a9b83ccfb04f59b3dca7c6079dcdc60544fa9e", size = 9532052, upload-time = "2025-07-18T08:01:48.676Z" },
1950
+ { url = "https://files.pythonhosted.org/packages/14/82/b21aa1e0c4cee7e74864d3a5a721ab8fcae5ca55033cb6263dca297ed35b/scikit_learn-1.7.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88e1a20131cf741b84b89567e1717f27a2ced228e0f29103426102bc2e3b8ef7", size = 9361575, upload-time = "2025-07-18T08:01:50.639Z" },
1951
+ { url = "https://files.pythonhosted.org/packages/f2/20/f4777fcd5627dc6695fa6b92179d0edb7a3ac1b91bcd9a1c7f64fa7ade23/scikit_learn-1.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b1bd1d919210b6a10b7554b717c9000b5485aa95a1d0f177ae0d7ee8ec750da5", size = 9277310, upload-time = "2025-07-18T08:01:52.547Z" },
1952
+ ]
1953
+
1954
+ [[package]]
1955
+ name = "scipy"
1956
+ version = "1.16.1"
1957
+ source = { registry = "https://pypi.org/simple" }
1958
+ dependencies = [
1959
+ { name = "numpy" },
1960
+ ]
1961
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/4a/b927028464795439faec8eaf0b03b011005c487bb2d07409f28bf30879c4/scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3", size = 30580861, upload-time = "2025-07-27T16:33:30.834Z" }
1962
+ wheels = [
1963
+ { url = "https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f", size = 36533717, upload-time = "2025-07-27T16:28:51.706Z" },
1964
+ { url = "https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb", size = 28570009, upload-time = "2025-07-27T16:28:57.017Z" },
1965
+ { url = "https://files.pythonhosted.org/packages/f4/69/bd75dbfdd3cf524f4d753484d723594aed62cfaac510123e91a6686d520b/scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c", size = 20841942, upload-time = "2025-07-27T16:29:01.152Z" },
1966
+ { url = "https://files.pythonhosted.org/packages/ea/74/add181c87663f178ba7d6144b370243a87af8476664d5435e57d599e6874/scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608", size = 23498507, upload-time = "2025-07-27T16:29:05.202Z" },
1967
+ { url = "https://files.pythonhosted.org/packages/1d/74/ece2e582a0d9550cee33e2e416cc96737dce423a994d12bbe59716f47ff1/scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f", size = 33286040, upload-time = "2025-07-27T16:29:10.201Z" },
1968
+ { url = "https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b", size = 35176096, upload-time = "2025-07-27T16:29:17.091Z" },
1969
+ { url = "https://files.pythonhosted.org/packages/fa/79/cd710aab8c921375711a8321c6be696e705a120e3011a643efbbcdeeabcc/scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45", size = 35490328, upload-time = "2025-07-27T16:29:22.928Z" },
1970
+ { url = "https://files.pythonhosted.org/packages/71/73/e9cc3d35ee4526d784520d4494a3e1ca969b071fb5ae5910c036a375ceec/scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65", size = 37939921, upload-time = "2025-07-27T16:29:29.108Z" },
1971
+ { url = "https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab", size = 38479462, upload-time = "2025-07-27T16:30:24.078Z" },
1972
+ { url = "https://files.pythonhosted.org/packages/7a/19/c3d08b675260046a991040e1ea5d65f91f40c7df1045fffff412dcfc6765/scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6", size = 36938832, upload-time = "2025-07-27T16:29:35.057Z" },
1973
+ { url = "https://files.pythonhosted.org/packages/81/f2/ce53db652c033a414a5b34598dba6b95f3d38153a2417c5a3883da429029/scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27", size = 29093084, upload-time = "2025-07-27T16:29:40.201Z" },
1974
+ { url = "https://files.pythonhosted.org/packages/a9/ae/7a10ff04a7dc15f9057d05b33737ade244e4bd195caa3f7cc04d77b9e214/scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7", size = 21365098, upload-time = "2025-07-27T16:29:44.295Z" },
1975
+ { url = "https://files.pythonhosted.org/packages/36/ac/029ff710959932ad3c2a98721b20b405f05f752f07344622fd61a47c5197/scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6", size = 23896858, upload-time = "2025-07-27T16:29:48.784Z" },
1976
+ { url = "https://files.pythonhosted.org/packages/71/13/d1ef77b6bd7898720e1f0b6b3743cb945f6c3cafa7718eaac8841035ab60/scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4", size = 33438311, upload-time = "2025-07-27T16:29:54.164Z" },
1977
+ { url = "https://files.pythonhosted.org/packages/2d/e0/e64a6821ffbb00b4c5b05169f1c1fddb4800e9307efe3db3788995a82a2c/scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3", size = 35279542, upload-time = "2025-07-27T16:30:00.249Z" },
1978
+ { url = "https://files.pythonhosted.org/packages/57/59/0dc3c8b43e118f1e4ee2b798dcc96ac21bb20014e5f1f7a8e85cc0653bdb/scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7", size = 35667665, upload-time = "2025-07-27T16:30:05.916Z" },
1979
+ { url = "https://files.pythonhosted.org/packages/45/5f/844ee26e34e2f3f9f8febb9343748e72daeaec64fe0c70e9bf1ff84ec955/scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc", size = 38045210, upload-time = "2025-07-27T16:30:11.655Z" },
1980
+ { url = "https://files.pythonhosted.org/packages/8d/d7/210f2b45290f444f1de64bc7353aa598ece9f0e90c384b4a156f9b1a5063/scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39", size = 38593661, upload-time = "2025-07-27T16:30:17.825Z" },
1981
+ { url = "https://files.pythonhosted.org/packages/81/ea/84d481a5237ed223bd3d32d6e82d7a6a96e34756492666c260cef16011d1/scipy-1.16.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:796a5a9ad36fa3a782375db8f4241ab02a091308eb079746bc0f874c9b998318", size = 36525921, upload-time = "2025-07-27T16:30:30.081Z" },
1982
+ { url = "https://files.pythonhosted.org/packages/4e/9f/d9edbdeff9f3a664807ae3aea383e10afaa247e8e6255e6d2aa4515e8863/scipy-1.16.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:3ea0733a2ff73fd6fdc5fecca54ee9b459f4d74f00b99aced7d9a3adb43fb1cc", size = 28564152, upload-time = "2025-07-27T16:30:35.336Z" },
1983
+ { url = "https://files.pythonhosted.org/packages/3b/95/8125bcb1fe04bc267d103e76516243e8d5e11229e6b306bda1024a5423d1/scipy-1.16.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:85764fb15a2ad994e708258bb4ed8290d1305c62a4e1ef07c414356a24fcfbf8", size = 20836028, upload-time = "2025-07-27T16:30:39.421Z" },
1984
+ { url = "https://files.pythonhosted.org/packages/77/9c/bf92e215701fc70bbcd3d14d86337cf56a9b912a804b9c776a269524a9e9/scipy-1.16.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ca66d980469cb623b1759bdd6e9fd97d4e33a9fad5b33771ced24d0cb24df67e", size = 23489666, upload-time = "2025-07-27T16:30:43.663Z" },
1985
+ { url = "https://files.pythonhosted.org/packages/5e/00/5e941d397d9adac41b02839011594620d54d99488d1be5be755c00cde9ee/scipy-1.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e7cc1ffcc230f568549fc56670bcf3df1884c30bd652c5da8138199c8c76dae0", size = 33358318, upload-time = "2025-07-27T16:30:48.982Z" },
1986
+ { url = "https://files.pythonhosted.org/packages/0e/87/8db3aa10dde6e3e8e7eb0133f24baa011377d543f5b19c71469cf2648026/scipy-1.16.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ddfb1e8d0b540cb4ee9c53fc3dea3186f97711248fb94b4142a1b27178d8b4b", size = 35185724, upload-time = "2025-07-27T16:30:54.26Z" },
1987
+ { url = "https://files.pythonhosted.org/packages/89/b4/6ab9ae443216807622bcff02690262d8184078ea467efee2f8c93288a3b1/scipy-1.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4dc0e7be79e95d8ba3435d193e0d8ce372f47f774cffd882f88ea4e1e1ddc731", size = 35554335, upload-time = "2025-07-27T16:30:59.765Z" },
1988
+ { url = "https://files.pythonhosted.org/packages/9c/9a/d0e9dc03c5269a1afb60661118296a32ed5d2c24298af61b676c11e05e56/scipy-1.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f23634f9e5adb51b2a77766dac217063e764337fbc816aa8ad9aaebcd4397fd3", size = 37960310, upload-time = "2025-07-27T16:31:06.151Z" },
1989
+ { url = "https://files.pythonhosted.org/packages/5e/00/c8f3130a50521a7977874817ca89e0599b1b4ee8e938bad8ae798a0e1f0d/scipy-1.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:57d75524cb1c5a374958a2eae3d84e1929bb971204cc9d52213fb8589183fc19", size = 39319239, upload-time = "2025-07-27T16:31:59.942Z" },
1990
+ { url = "https://files.pythonhosted.org/packages/f2/f2/1ca3eda54c3a7e4c92f6acef7db7b3a057deb135540d23aa6343ef8ad333/scipy-1.16.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:d8da7c3dd67bcd93f15618938f43ed0995982eb38973023d46d4646c4283ad65", size = 36939460, upload-time = "2025-07-27T16:31:11.865Z" },
1991
+ { url = "https://files.pythonhosted.org/packages/80/30/98c2840b293a132400c0940bb9e140171dcb8189588619048f42b2ce7b4f/scipy-1.16.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:cc1d2f2fd48ba1e0620554fe5bc44d3e8f5d4185c8c109c7fbdf5af2792cfad2", size = 29093322, upload-time = "2025-07-27T16:31:17.045Z" },
1992
+ { url = "https://files.pythonhosted.org/packages/c1/e6/1e6e006e850622cf2a039b62d1a6ddc4497d4851e58b68008526f04a9a00/scipy-1.16.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:21a611ced9275cb861bacadbada0b8c0623bc00b05b09eb97f23b370fc2ae56d", size = 21365329, upload-time = "2025-07-27T16:31:21.188Z" },
1993
+ { url = "https://files.pythonhosted.org/packages/8e/02/72a5aa5b820589dda9a25e329ca752842bfbbaf635e36bc7065a9b42216e/scipy-1.16.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dfbb25dffc4c3dd9371d8ab456ca81beeaf6f9e1c2119f179392f0dc1ab7695", size = 23897544, upload-time = "2025-07-27T16:31:25.408Z" },
1994
+ { url = "https://files.pythonhosted.org/packages/2b/dc/7122d806a6f9eb8a33532982234bed91f90272e990f414f2830cfe656e0b/scipy-1.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0ebb7204f063fad87fc0a0e4ff4a2ff40b2a226e4ba1b7e34bf4b79bf97cd86", size = 33442112, upload-time = "2025-07-27T16:31:30.62Z" },
1995
+ { url = "https://files.pythonhosted.org/packages/24/39/e383af23564daa1021a5b3afbe0d8d6a68ec639b943661841f44ac92de85/scipy-1.16.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1b9e5962656f2734c2b285a8745358ecb4e4efbadd00208c80a389227ec61ff", size = 35286594, upload-time = "2025-07-27T16:31:36.112Z" },
1996
+ { url = "https://files.pythonhosted.org/packages/95/47/1a0b0aff40c3056d955f38b0df5d178350c3d74734ec54f9c68d23910be5/scipy-1.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e1a106f8c023d57a2a903e771228bf5c5b27b5d692088f457acacd3b54511e4", size = 35665080, upload-time = "2025-07-27T16:31:42.025Z" },
1997
+ { url = "https://files.pythonhosted.org/packages/64/df/ce88803e9ed6e27fe9b9abefa157cf2c80e4fa527cf17ee14be41f790ad4/scipy-1.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:709559a1db68a9abc3b2c8672c4badf1614f3b440b3ab326d86a5c0491eafae3", size = 38050306, upload-time = "2025-07-27T16:31:48.109Z" },
1998
+ { url = "https://files.pythonhosted.org/packages/6e/6c/a76329897a7cae4937d403e623aa6aaea616a0bb5b36588f0b9d1c9a3739/scipy-1.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c0c804d60492a0aad7f5b2bb1862f4548b990049e27e828391ff2bf6f7199998", size = 39427705, upload-time = "2025-07-27T16:31:53.96Z" },
1999
+ ]
2000
+
2001
  [[package]]
2002
  name = "semantic-version"
2003
  version = "2.10.0"
 
2007
  { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" },
2008
  ]
2009
 
2010
+ [[package]]
2011
+ name = "sentence-transformers"
2012
+ version = "5.1.0"
2013
+ source = { registry = "https://pypi.org/simple" }
2014
+ dependencies = [
2015
+ { name = "huggingface-hub" },
2016
+ { name = "pillow" },
2017
+ { name = "scikit-learn" },
2018
+ { name = "scipy" },
2019
+ { name = "torch" },
2020
+ { name = "tqdm" },
2021
+ { name = "transformers" },
2022
+ { name = "typing-extensions" },
2023
+ ]
2024
+ sdist = { url = "https://files.pythonhosted.org/packages/46/b8/1b99379b730bc403d8e9ddc2db56f8ac9ce743734b44a1dbeebb900490d4/sentence_transformers-5.1.0.tar.gz", hash = "sha256:70c7630697cc1c64ffca328d6e8688430ebd134b3c2df03dc07cb3a016b04739", size = 370745, upload-time = "2025-08-06T13:48:55.226Z" }
2025
+ wheels = [
2026
+ { url = "https://files.pythonhosted.org/packages/6d/70/2b5b76e98191ec3b8b0d1dde52d00ddcc3806799149a9ce987b0d2d31015/sentence_transformers-5.1.0-py3-none-any.whl", hash = "sha256:fc803929f6a3ce82e2b2c06e0efed7a36de535c633d5ce55efac0b710ea5643e", size = 483377, upload-time = "2025-08-06T13:48:53.627Z" },
2027
+ ]
2028
+
2029
+ [[package]]
2030
+ name = "setuptools"
2031
+ version = "80.9.0"
2032
+ source = { registry = "https://pypi.org/simple" }
2033
+ sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
2034
+ wheels = [
2035
+ { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
2036
+ ]
2037
+
2038
  [[package]]
2039
  name = "sgmllib3k"
2040
  version = "1.0.0"
 
2101
  { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" },
2102
  ]
2103
 
2104
+ [[package]]
2105
+ name = "threadpoolctl"
2106
+ version = "3.6.0"
2107
+ source = { registry = "https://pypi.org/simple" }
2108
+ sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" }
2109
+ wheels = [
2110
+ { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" },
2111
+ ]
2112
+
2113
  [[package]]
2114
  name = "tokenizers"
2115
  version = "0.21.4"
 
2144
  { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" },
2145
  ]
2146
 
2147
+ [[package]]
2148
+ name = "torch"
2149
+ version = "2.8.0"
2150
+ source = { registry = "https://pypi.org/simple" }
2151
+ dependencies = [
2152
+ { name = "filelock" },
2153
+ { name = "fsspec" },
2154
+ { name = "jinja2" },
2155
+ { name = "networkx" },
2156
+ { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2157
+ { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2158
+ { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2159
+ { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2160
+ { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2161
+ { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2162
+ { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2163
+ { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2164
+ { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2165
+ { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2166
+ { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2167
+ { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2168
+ { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2169
+ { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2170
+ { name = "setuptools" },
2171
+ { name = "sympy" },
2172
+ { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
2173
+ { name = "typing-extensions" },
2174
+ ]
2175
+ wheels = [
2176
+ { url = "https://files.pythonhosted.org/packages/10/4e/469ced5a0603245d6a19a556e9053300033f9c5baccf43a3d25ba73e189e/torch-2.8.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2b2f96814e0345f5a5aed9bf9734efa913678ed19caf6dc2cddb7930672d6128", size = 101936856, upload-time = "2025-08-06T14:54:01.526Z" },
2177
+ { url = "https://files.pythonhosted.org/packages/16/82/3948e54c01b2109238357c6f86242e6ecbf0c63a1af46906772902f82057/torch-2.8.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:65616ca8ec6f43245e1f5f296603e33923f4c30f93d65e103d9e50c25b35150b", size = 887922844, upload-time = "2025-08-06T14:55:50.78Z" },
2178
+ { url = "https://files.pythonhosted.org/packages/e3/54/941ea0a860f2717d86a811adf0c2cd01b3983bdd460d0803053c4e0b8649/torch-2.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:659df54119ae03e83a800addc125856effda88b016dfc54d9f65215c3975be16", size = 241330968, upload-time = "2025-08-06T14:54:45.293Z" },
2179
+ { url = "https://files.pythonhosted.org/packages/de/69/8b7b13bba430f5e21d77708b616f767683629fc4f8037564a177d20f90ed/torch-2.8.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:1a62a1ec4b0498930e2543535cf70b1bef8c777713de7ceb84cd79115f553767", size = 73915128, upload-time = "2025-08-06T14:54:34.769Z" },
2180
+ { url = "https://files.pythonhosted.org/packages/15/0e/8a800e093b7f7430dbaefa80075aee9158ec22e4c4fc3c1a66e4fb96cb4f/torch-2.8.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:83c13411a26fac3d101fe8035a6b0476ae606deb8688e904e796a3534c197def", size = 102020139, upload-time = "2025-08-06T14:54:39.047Z" },
2181
+ { url = "https://files.pythonhosted.org/packages/4a/15/5e488ca0bc6162c86a33b58642bc577c84ded17c7b72d97e49b5833e2d73/torch-2.8.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:8f0a9d617a66509ded240add3754e462430a6c1fc5589f86c17b433dd808f97a", size = 887990692, upload-time = "2025-08-06T14:56:18.286Z" },
2182
+ { url = "https://files.pythonhosted.org/packages/b4/a8/6a04e4b54472fc5dba7ca2341ab219e529f3c07b6941059fbf18dccac31f/torch-2.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a7242b86f42be98ac674b88a4988643b9bc6145437ec8f048fea23f72feb5eca", size = 241603453, upload-time = "2025-08-06T14:55:22.945Z" },
2183
+ { url = "https://files.pythonhosted.org/packages/04/6e/650bb7f28f771af0cb791b02348db8b7f5f64f40f6829ee82aa6ce99aabe/torch-2.8.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:7b677e17f5a3e69fdef7eb3b9da72622f8d322692930297e4ccb52fefc6c8211", size = 73632395, upload-time = "2025-08-06T14:55:28.645Z" },
2184
+ ]
2185
+
2186
  [[package]]
2187
  name = "tqdm"
2188
  version = "4.67.1"
 
2195
  { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
2196
  ]
2197
 
2198
+ [[package]]
2199
+ name = "transformers"
2200
+ version = "4.55.4"
2201
+ source = { registry = "https://pypi.org/simple" }
2202
+ dependencies = [
2203
+ { name = "filelock" },
2204
+ { name = "huggingface-hub" },
2205
+ { name = "numpy" },
2206
+ { name = "packaging" },
2207
+ { name = "pyyaml" },
2208
+ { name = "regex" },
2209
+ { name = "requests" },
2210
+ { name = "safetensors" },
2211
+ { name = "tokenizers" },
2212
+ { name = "tqdm" },
2213
+ ]
2214
+ sdist = { url = "https://files.pythonhosted.org/packages/2b/43/3cb831d5f28cc723516e5bb43a8c6042aca3038bb36b6bd6016b40dfd1e8/transformers-4.55.4.tar.gz", hash = "sha256:574a30559bc273c7a4585599ff28ab6b676e96dc56ffd2025ecfce2fd0ab915d", size = 9573015, upload-time = "2025-08-22T15:18:43.192Z" }
2215
+ wheels = [
2216
+ { url = "https://files.pythonhosted.org/packages/fa/0a/8791a6ee0529c45f669566969e99b75e2ab20eb0bfee8794ce295c18bdad/transformers-4.55.4-py3-none-any.whl", hash = "sha256:df28f3849665faba4af5106f0db4510323277c4bb595055340544f7e59d06458", size = 11269659, upload-time = "2025-08-22T15:18:40.025Z" },
2217
+ ]
2218
+
2219
+ [[package]]
2220
+ name = "triton"
2221
+ version = "3.4.0"
2222
+ source = { registry = "https://pypi.org/simple" }
2223
+ dependencies = [
2224
+ { name = "setuptools" },
2225
+ ]
2226
+ wheels = [
2227
+ { url = "https://files.pythonhosted.org/packages/30/7b/0a685684ed5322d2af0bddefed7906674f67974aa88b0fae6e82e3b766f6/triton-3.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00be2964616f4c619193cb0d1b29a99bd4b001d7dc333816073f92cf2a8ccdeb", size = 155569223, upload-time = "2025-07-30T19:58:44.017Z" },
2228
+ { url = "https://files.pythonhosted.org/packages/20/63/8cb444ad5cdb25d999b7d647abac25af0ee37d292afc009940c05b82dda0/triton-3.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7936b18a3499ed62059414d7df563e6c163c5e16c3773678a3ee3d417865035d", size = 155659780, upload-time = "2025-07-30T19:58:51.171Z" },
2229
+ ]
2230
+
2231
  [[package]]
2232
  name = "typer"
2233
  version = "0.16.1"
 
2424
  { name = "gradio" },
2425
  { name = "gradio-modal" },
2426
  { name = "openai" },
2427
+ { name = "sentence-transformers" },
2428
  ]
2429
 
2430
  [package.metadata]
 
2436
  { name = "gradio", specifier = ">=5.44.0" },
2437
  { name = "gradio-modal", specifier = ">=0.0.4" },
2438
  { name = "openai", specifier = ">=1.102.0" },
2439
+ { name = "sentence-transformers", specifier = ">=5.1.0" },
2440
  ]
2441
 
2442
  [[package]]