Vasanth6 commited on
Commit
e4bcad4
·
1 Parent(s): 69f7a1c

Configure for 100% self-contained CPU deployment

Browse files
Dockerfile ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ WORKDIR /app
4
+
5
+ # Set Hugging Face cache directory to a build-in writeable directory
6
+ ENV HF_HOME=/app/.cache/huggingface
7
+ # Tell NLTK where to find downloaded data
8
+ ENV NLTK_DATA=/app/nltk_data
9
+
10
+ # Install system deps for numpy/umap
11
+ RUN apt-get update && apt-get install -y --no-install-recommends \
12
+ build-essential gcc && \
13
+ rm -rf /var/lib/apt/lists/*
14
+
15
+ # Copy and install Python deps
16
+ COPY pyproject.toml .
17
+ RUN pip install --no-cache-dir .
18
+
19
+ # Pre-download NLTK data at build time to the app-owned directory
20
+ RUN mkdir -p /app/nltk_data && \
21
+ python -c "import nltk; nltk.download('punkt', download_dir='/app/nltk_data'); nltk.download('punkt_tab', download_dir='/app/nltk_data'); nltk.download('stopwords', download_dir='/app/nltk_data')"
22
+
23
+ # Pre-download HF embedding models at build time
24
+ RUN python -c "from sentence_transformers import SentenceTransformer; \
25
+ SentenceTransformer('nomic-ai/nomic-embed-text-v1.5', trust_remote_code=True); \
26
+ SentenceTransformer('google/gemma-3n-embedding-exp', trust_remote_code=True); \
27
+ SentenceTransformer('Qwen/Qwen3-Embedding-0.6B', trust_remote_code=True)"
28
+
29
+ # Pre-download HF Qwen LLM model at build time
30
+ RUN python -c "from transformers import AutoTokenizer, AutoModelForCausalLM; \
31
+ AutoTokenizer.from_pretrained('Qwen/Qwen2.5-1.5B-Instruct'); \
32
+ AutoModelForCausalLM.from_pretrained('Qwen/Qwen2.5-1.5B-Instruct')"
33
+
34
+ # Copy app code
35
+ COPY . .
36
+
37
+ # Grant full read/write/execute permissions on /app for non-root containers in Hugging Face
38
+ RUN chmod -R 777 /app
39
+
40
+ # HF Spaces expects port 7860
41
+ EXPOSE 7860
42
+
43
+ CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "7860"]
backend/constants.py CHANGED
@@ -9,24 +9,24 @@ The chunks are labelled "Chunk A" and "Chunk B". You must ignore any model names
9
  Score each dimension independently. Do not let one dimension influence another.
10
 
11
  1. Query Relevance
12
- Does the chunk directly address the specific question asked?
13
- 10 = precisely on-topic, 1 = entirely off-topic.
14
- Penalise chunks that are topically adjacent but don't answer the actual query.
15
 
16
  2. Answer Completeness
17
- Is the answer self-contained within the chunk, or does it trail off / require external context?
18
- 10 = standalone complete answer, 1 = fragment with no usable answer.
19
- Do NOT reward length. A concise, complete answer scores higher than a verbose partial one.
20
 
21
  3. Factual Plausibility
22
- Based on your knowledge, does the chunk contain accurate, internally consistent information?
23
- 10 = no detectable errors, 1 = clearly wrong or contradictory.
24
- If you cannot verify a claim, score conservatively (5–6) rather than assuming correctness.
25
- Do not penalise a chunk for information you simply don't recognise.
26
 
27
  4. Clarity & Parsability
28
- Is the chunk clean, readable, and free from noise (broken formatting, encoding artefacts, truncation mid-sentence)?
29
- 10 = polished and easy to parse, 1 = heavily noisy or unreadable.
30
 
31
  # OVERALL SCORE
32
  overall = (relevance + completeness + plausibility + clarity) / 4
@@ -58,28 +58,28 @@ Search Query: {search_query}
58
  # OUTPUT RULE
59
  OUTPUT: respond with this exact JSON structure and nothing else:
60
  {{
61
- "winner": "chunk_a" | "chunk_b" | "tie",
62
- "confidence": float,
63
- "chunk_a_score": {{
64
  "query_relevance": int,
65
  "answer_completeness": int,
66
  "factual_plausibility": int,
67
  "clarity": int,
68
  "overall": float
69
- }},
70
- "chunk_b_score": {{
71
  "query_relevance": int,
72
  "answer_completeness": int,
73
  "factual_plausibility": int,
74
  "clarity": int,
75
  "overall": float
76
- }},
77
- "winner_reason": "2-3 sentences",
78
- "deciding_dimension": "e.g. query_relevance",
79
- "chunk_a_strengths": ["..."],
80
- "chunk_a_weaknesses": ["..."],
81
- "chunk_b_strengths": ["..."],
82
- "chunk_b_weaknesses": ["..."]
83
  }}
84
  """
85
 
@@ -91,3 +91,10 @@ Match the tone and vocabulary a subject-matter expert would use when writing abo
91
  Query: {search_text}
92
 
93
  Passage:"""
 
 
 
 
 
 
 
 
9
  Score each dimension independently. Do not let one dimension influence another.
10
 
11
  1. Query Relevance
12
+ Does the chunk directly address the specific question asked?
13
+ 10 = precisely on-topic, 1 = entirely off-topic.
14
+ Penalise chunks that are topically adjacent but don't answer the actual query.
15
 
16
  2. Answer Completeness
17
+ Is the answer self-contained within the chunk, or does it trail off / require external context?
18
+ 10 = standalone complete answer, 1 = fragment with no usable answer.
19
+ Do NOT reward length. A concise, complete answer scores higher than a verbose partial one.
20
 
21
  3. Factual Plausibility
22
+ Based on your knowledge, does the chunk contain accurate, internally consistent information?
23
+ 10 = no detectable errors, 1 = clearly wrong or contradictory.
24
+ If you cannot verify a claim, score conservatively (5–6) rather than assuming correctness.
25
+ Do not penalise a chunk for information you simply don't recognise.
26
 
27
  4. Clarity & Parsability
28
+ Is the chunk clean, readable, and free from noise (broken formatting, encoding artefacts, truncation mid-sentence)?
29
+ 10 = polished and easy to parse, 1 = heavily noisy or unreadable.
30
 
31
  # OVERALL SCORE
32
  overall = (relevance + completeness + plausibility + clarity) / 4
 
58
  # OUTPUT RULE
59
  OUTPUT: respond with this exact JSON structure and nothing else:
60
  {{
61
+ "winner": "chunk_a" | "chunk_b" | "tie",
62
+ "confidence": float,
63
+ "chunk_a_score": {{
64
  "query_relevance": int,
65
  "answer_completeness": int,
66
  "factual_plausibility": int,
67
  "clarity": int,
68
  "overall": float
69
+ }},
70
+ "chunk_b_score": {{
71
  "query_relevance": int,
72
  "answer_completeness": int,
73
  "factual_plausibility": int,
74
  "clarity": int,
75
  "overall": float
76
+ }},
77
+ "winner_reason": "2-3 sentences",
78
+ "deciding_dimension": "e.g. query_relevance",
79
+ "chunk_a_strengths": ["..."],
80
+ "chunk_a_weaknesses": ["..."],
81
+ "chunk_b_strengths": ["..."],
82
+ "chunk_b_weaknesses": ["..."]
83
  }}
84
  """
85
 
 
91
  Query: {search_text}
92
 
93
  Passage:"""
94
+
95
+
96
+ MODEL_MAP = {
97
+ "nomic-embed-text": "nomic-ai/nomic-embed-text-v1.5",
98
+ "EmbeddingGemma": "google/gemma-3n-embedding-exp",
99
+ "qwen3-embedding:0.6b": "Qwen/Qwen3-Embedding-0.6B",
100
+ }
backend/engines/embedding.py CHANGED
@@ -1,29 +1,44 @@
1
  from typing import Sequence
2
- import httpx
3
 
4
- from backend.models.schemas import ChunkNode, EmbeddingModel
 
 
 
 
 
 
 
5
 
6
 
7
  class EmbeddingEngine:
8
  def __init__(self, embedding_model):
9
  self.embedding_model = embedding_model
10
- self.client = httpx.AsyncClient(timeout=60)
 
 
 
 
 
11
 
12
  async def generate_embeddings(self, chunks: Sequence[ChunkNode | str]):
13
  texts = [c if isinstance(c, str) else c.text for c in chunks]
14
- res = await self.client.post(
15
- "http://localhost:11434/api/embed",
16
- json={
17
- "model": self.embedding_model,
18
- "input": texts,
19
- },
20
- )
21
-
22
- res_json = res.json()
23
-
24
- if "embeddings" not in res_json or not res_json["embeddings"]:
25
- raise ValueError(
26
- f"Ollama failed to generate embeddings for {self.embedding_model}. Response: {res_json}"
27
- )
28
-
29
- return res_json["embeddings"]
 
 
 
 
 
1
  from typing import Sequence
 
2
 
3
+ # import httpx
4
+ import os
5
+ from backend.constants import MODEL_MAP
6
+ from backend.models.schemas import ChunkNode
7
+ from sentence_transformers import SentenceTransformer
8
+
9
+
10
+ _model_cache = {}
11
 
12
 
13
  class EmbeddingEngine:
14
  def __init__(self, embedding_model):
15
  self.embedding_model = embedding_model
16
+ # self.client = httpx.AsyncClient(timeout=60)
17
+ hf_name = MODEL_MAP.get(embedding_model, embedding_model)
18
+
19
+ if hf_name not in _model_cache:
20
+ _model_cache[hf_name] = SentenceTransformer(hf_name, trust_remote_code=True)
21
+ self.model = _model_cache[hf_name]
22
 
23
  async def generate_embeddings(self, chunks: Sequence[ChunkNode | str]):
24
  texts = [c if isinstance(c, str) else c.text for c in chunks]
25
+ # commented for using sentence transformer.
26
+ # res = await self.client.post(
27
+ # "http://localhost:11434/api/embed",
28
+ # json={
29
+ # "model": self.embedding_model,
30
+ # "input": texts,
31
+ # },
32
+ # )
33
+
34
+ # res_json = res.json()
35
+
36
+ # if "embeddings" not in res_json or not res_json["embeddings"]:
37
+ # raise ValueError(
38
+ # f"Ollama failed to generate embeddings for {self.embedding_model}. Response: {res_json}"
39
+ # )
40
+
41
+ # return res_json["embeddings"]
42
+ # sentence-transformers is sync, but it's fast on CPU for small batches
43
+ embeddings = self.model.encode(texts, normalize_embeddings=True)
44
+ return embeddings.tolist()
backend/engines/llm_client.py CHANGED
@@ -1,17 +1,56 @@
1
  from typing import Optional
2
- import ollama
 
 
 
3
 
4
 
5
  class OllamaClient:
6
  def __init__(self):
7
- self.model = "gemma4:e2b"
8
- self.client = ollama.AsyncClient()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  async def generate(self, prompt: str, response_format: Optional[str] = "json"):
11
- args = {"model": self.model, "prompt": prompt}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
- if response_format:
14
- args["format"] = response_format
15
 
16
- response = await self.client.generate(**args) # type: ignore
17
- return response["response"]
 
1
  from typing import Optional
2
+ import torch
3
+ from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
4
+
5
+ _llm_pipeline = None
6
 
7
 
8
  class OllamaClient:
9
  def __init__(self):
10
+ self.model_name = "Qwen/Qwen2.5-1.5B-Instruct"
11
+
12
+ def _get_pipeline(self):
13
+ global _llm_pipeline
14
+ if _llm_pipeline is None:
15
+ tokenizer = AutoTokenizer.from_pretrained(self.model_name)
16
+ model = AutoModelForCausalLM.from_pretrained(
17
+ self.model_name,
18
+ torch_dtype=torch.float32,
19
+ device_map="cpu"
20
+ )
21
+ _llm_pipeline = pipeline(
22
+ "text-generation",
23
+ model=model,
24
+ tokenizer=tokenizer
25
+ )
26
+ return _llm_pipeline
27
 
28
  async def generate(self, prompt: str, response_format: Optional[str] = "json"):
29
+ pipe = self._get_pipeline()
30
+
31
+ messages = [
32
+ {"role": "system", "content": "You are a helpful evaluation referee. Output raw JSON only, matching the exact format requested."},
33
+ {"role": "user", "content": prompt}
34
+ ]
35
+
36
+ generation_kwargs = {
37
+ "max_new_tokens": 512,
38
+ "temperature": 0.1,
39
+ "do_sample": False
40
+ }
41
+
42
+ outputs = pipe(messages, **generation_kwargs)
43
+ result_text = outputs[0]["generated_text"][-1]["content"]
44
+
45
+ cleaned_text = result_text.strip()
46
+ if cleaned_text.startswith("```"):
47
+ lines = cleaned_text.splitlines()
48
+ if lines[0].startswith("```"):
49
+ lines = lines[1:]
50
+ if lines and lines[-1].strip() == "```":
51
+ lines = lines[:-1]
52
+ cleaned_text = "\n".join(lines).strip()
53
+
54
+ return cleaned_text
55
 
 
 
56
 
 
 
backend/main.py CHANGED
@@ -8,12 +8,13 @@ from fastapi.responses import FileResponse
8
 
9
 
10
  def initialize_nltk():
11
- nltk_data_dir = os.path.expanduser("~/nltk_data")
12
  os.makedirs(nltk_data_dir, exist_ok=True)
13
 
14
  if nltk_data_dir not in nltk.data.path:
15
  nltk.data.path.append(nltk_data_dir)
16
 
 
17
  resources = {
18
  "tokenizers/punkt": "punkt",
19
  "tokenizers/punkt_tab": "punkt_tab",
 
8
 
9
 
10
  def initialize_nltk():
11
+ nltk_data_dir = os.environ.get("NLTK_DATA", os.path.expanduser("~/nltk_data"))
12
  os.makedirs(nltk_data_dir, exist_ok=True)
13
 
14
  if nltk_data_dir not in nltk.data.path:
15
  nltk.data.path.append(nltk_data_dir)
16
 
17
+
18
  resources = {
19
  "tokenizers/punkt": "punkt",
20
  "tokenizers/punkt_tab": "punkt_tab",
backend/rate_limiter.py ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from collections import defaultdict, deque
2
+ from datetime import datetime, timedelta
3
+
4
+
5
+ class RateLimiter:
6
+ def __init__(
7
+ self, requests_per_minute=2, violation_threshold=10, ban_duration_minutes=60
8
+ ):
9
+ self.requests_per_minute = requests_per_minute
10
+ self.violation_threshold = violation_threshold
11
+ self.ban_duration = timedelta(minutes=ban_duration_minutes)
12
+
13
+ self.requests = defaultdict(deque)
14
+ self.violations = defaultdict(int)
15
+ self.banned_until = {}
16
+
17
+ def allow(self, ip: str) -> bool:
18
+ now = datetime.utcnow()
19
+
20
+ # Check ban
21
+ if ip in self.banned_until:
22
+ if now < self.banned_until[ip]:
23
+ return False
24
+ del self.banned_until[ip]
25
+
26
+ # Remove requests older than 1 minute
27
+ window = now - timedelta(minutes=1)
28
+ reqs = self.requests[ip]
29
+
30
+ while reqs and reqs[0] < window:
31
+ reqs.popleft()
32
+
33
+ # Rate limit hit
34
+ if len(reqs) >= self.requests_per_minute:
35
+ self.violations[ip] += 1
36
+
37
+ if self.violations[ip] >= self.violation_threshold:
38
+ self.banned_until[ip] = now + self.ban_duration
39
+
40
+ return False
41
+
42
+ reqs.append(now)
43
+ return True
44
+
45
+
46
+ limiter = RateLimiter(
47
+ requests_per_minute=5, violation_threshold=10, ban_duration_minutes=60
48
+ )
backend/routers/retrieval_router.py CHANGED
@@ -4,10 +4,12 @@ from backend.engines.llm_client import OllamaClient
4
  from backend.constants import system_instructions
5
  import asyncio
6
  from typing import Any, Dict, List, Optional
7
- from fastapi import APIRouter
8
  import json
9
  from backend.engines.embedding import EmbeddingEngine
10
  from backend.engines.reducer import ReducerEngine
 
 
11
  from backend.models.schemas import (
12
  CompareRequest,
13
  CompareResponse,
@@ -25,13 +27,19 @@ router = APIRouter(prefix="/api", tags=["retrieval"])
25
 
26
 
27
  @router.post("/retrieve", response_model=QueryResponse)
28
- async def retrieve(request: QueryRequest):
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- search_text = (
31
- await get_hyde_text(request.search_text)
32
- if request.use_hyde
33
- else request.search_text
34
- )
35
 
36
  limit = request.top_k * 4 if request.use_reranking else request.top_k
37
 
@@ -69,12 +77,18 @@ async def retrieve(request: QueryRequest):
69
 
70
 
71
  @router.post("/compare", response_model=CompareResponse)
72
- async def compare(request: CompareRequest):
73
- retrieval_text = (
74
- await get_hyde_text(request.search_text)
75
- if request.use_hyde
76
- else request.search_text
77
- )
 
 
 
 
 
 
78
  limit = request.top_k * 4 if request.use_reranking else request.top_k
79
  (
80
  (retrieved_chunks_a, _),
@@ -125,8 +139,15 @@ async def compare(request: CompareRequest):
125
 
126
 
127
  @router.post("/judge", response_model=JudgeResponse)
128
- async def judge(request: JudgeRequest):
 
 
 
 
 
 
129
  prompt = system_instructions.format(
 
130
  search_query=request.search_query,
131
  chunk_a=request.chunk_a,
132
  chunk_b=request.chunk_b,
 
4
  from backend.constants import system_instructions
5
  import asyncio
6
  from typing import Any, Dict, List, Optional
7
+ from fastapi import APIRouter, Request, HTTPException
8
  import json
9
  from backend.engines.embedding import EmbeddingEngine
10
  from backend.engines.reducer import ReducerEngine
11
+ from backend.rate_limiter import limiter
12
+
13
  from backend.models.schemas import (
14
  CompareRequest,
15
  CompareResponse,
 
27
 
28
 
29
  @router.post("/retrieve", response_model=QueryResponse)
30
+ async def retrieve(request: QueryRequest, http_request: Request):
31
+
32
+ if request.use_hyde:
33
+ client_ip = http_request.client.host if http_request.client else "127.0.0.1"
34
+ if not limiter.allow(client_ip):
35
+ raise HTTPException(
36
+ status_code=429,
37
+ detail="Rate limit exceeded. You can only make 2 LLM requests per minute."
38
+ )
39
+ search_text = await get_hyde_text(request.search_text)
40
+ else:
41
+ search_text = request.search_text
42
 
 
 
 
 
 
43
 
44
  limit = request.top_k * 4 if request.use_reranking else request.top_k
45
 
 
77
 
78
 
79
  @router.post("/compare", response_model=CompareResponse)
80
+ async def compare(request: CompareRequest, http_request: Request):
81
+ if request.use_hyde:
82
+ client_ip = http_request.client.host if http_request.client else "127.0.0.1"
83
+ if not limiter.allow(client_ip):
84
+ raise HTTPException(
85
+ status_code=429,
86
+ detail="Rate limit exceeded. You can only make 2 LLM requests per minute."
87
+ )
88
+ retrieval_text = await get_hyde_text(request.search_text)
89
+ else:
90
+ retrieval_text = request.search_text
91
+
92
  limit = request.top_k * 4 if request.use_reranking else request.top_k
93
  (
94
  (retrieved_chunks_a, _),
 
139
 
140
 
141
  @router.post("/judge", response_model=JudgeResponse)
142
+ async def judge(request: JudgeRequest, http_request: Request):
143
+ client_ip = http_request.client.host if http_request.client else "127.0.0.1"
144
+ if not limiter.allow(client_ip):
145
+ raise HTTPException(
146
+ status_code=429,
147
+ detail="Rate limit exceeded. You can only make 2 LLM requests per minute."
148
+ )
149
  prompt = system_instructions.format(
150
+
151
  search_query=request.search_query,
152
  chunk_a=request.chunk_a,
153
  chunk_b=request.chunk_b,
frontend/app.js CHANGED
@@ -1296,11 +1296,19 @@ async function runQuerySimulator() {
1296
  });
1297
 
1298
  if (!res.ok) {
1299
- throw new Error(`HTTP error! status: ${res.status}`);
 
 
 
 
 
 
 
1300
  }
1301
 
1302
  const data = await res.json();
1303
 
 
1304
  // Parse the query coordinates returned by UMAP
1305
  const targetX = data.query_coords[0];
1306
  const targetY = data.query_coords[1];
@@ -1418,7 +1426,7 @@ async function runQuerySimulator() {
1418
  // ----------------------------------------------
1419
  } catch (err) {
1420
  console.error("Query failed:", err);
1421
- dom.queryResultsList.innerHTML = `<div style="color: #ef4444; padding: 1rem;">Failed to fetch results. Check console.</div>`;
1422
  } finally {
1423
  dom.btnQuery.disabled = false;
1424
  dom.btnQuery.innerHTML = "🔍 Query";
@@ -1442,6 +1450,26 @@ if (dom.closeDrawer) {
1442
  });
1443
  }
1444
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1445
  // ============================================================
1446
  // TASK 3.5: ARENA COMPARISON LOGIC
1447
  // ============================================================
@@ -1531,13 +1559,20 @@ if (domArena.btnFight) {
1531
  }),
1532
  });
1533
 
1534
- if (!res.ok)
1535
- throw new Error(
1536
- "Comparison failed. Check if server is running and /api/compare exists.",
1537
- );
 
 
 
 
 
 
1538
 
1539
  const data = await res.json();
1540
 
 
1541
  // Render HyDE box if present
1542
  const hydeText = document.getElementById("arena-hyde-text");
1543
  if (hydeContainer && hydeText) {
@@ -1646,7 +1681,7 @@ if (domReferee.btnCall) {
1646
  domReferee.verdictBox.style.display = "none";
1647
 
1648
  const statuses = [
1649
- "⚖️ Summoning Gemma evaluation referee...",
1650
  "🔍 Blinding model names and metadata...",
1651
  "🧠 Auditing Corner A relevance and clarity...",
1652
  "🧠 Auditing Corner B completeness and truthfulness...",
@@ -1671,12 +1706,19 @@ if (domReferee.btnCall) {
1671
  }),
1672
  });
1673
 
1674
- if (!res.ok)
1675
- throw new Error(
1676
- "Gemma evaluation failed. Check if local Ollama server is running.",
1677
- );
 
 
 
 
 
 
1678
 
1679
  const data = await res.json();
 
1680
  clearInterval(statusInterval);
1681
 
1682
  renderRefereeScorecard(data, labelA, labelB);
@@ -1816,3 +1858,41 @@ function renderScoreRow(label, valA, valB) {
1816
  </div>
1817
  `;
1818
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1296
  });
1297
 
1298
  if (!res.ok) {
1299
+ let errMsg = `HTTP error! status: ${res.status}`;
1300
+ try {
1301
+ const errData = await res.json();
1302
+ if (errData && errData.detail) {
1303
+ errMsg = errData.detail;
1304
+ }
1305
+ } catch (_) {}
1306
+ throw new Error(errMsg);
1307
  }
1308
 
1309
  const data = await res.json();
1310
 
1311
+
1312
  // Parse the query coordinates returned by UMAP
1313
  const targetX = data.query_coords[0];
1314
  const targetY = data.query_coords[1];
 
1426
  // ----------------------------------------------
1427
  } catch (err) {
1428
  console.error("Query failed:", err);
1429
+ dom.queryResultsList.innerHTML = `<div style="color: #ef4444; padding: 1rem;">${escapeHtml(err.message)}</div>`;
1430
  } finally {
1431
  dom.btnQuery.disabled = false;
1432
  dom.btnQuery.innerHTML = "🔍 Query";
 
1450
  });
1451
  }
1452
 
1453
+ // Bind HyDE change warning toasts
1454
+ const queryUseHyde = document.getElementById("query-use-hyde");
1455
+ if (queryUseHyde) {
1456
+ queryUseHyde.addEventListener("change", (e) => {
1457
+ if (e.target.checked) {
1458
+ showToast("HyDE enabled! Query generation via LLM will take a bit longer (around 2-3 seconds).", "info");
1459
+ }
1460
+ });
1461
+ }
1462
+
1463
+ const arenaUseHyde = document.getElementById("arena-use-hyde");
1464
+ if (arenaUseHyde) {
1465
+ arenaUseHyde.addEventListener("change", (e) => {
1466
+ if (e.target.checked) {
1467
+ showToast("HyDE enabled! Comparison query generation via LLM will take a bit longer (around 2-3 seconds).", "info");
1468
+ }
1469
+ });
1470
+ }
1471
+
1472
+
1473
  // ============================================================
1474
  // TASK 3.5: ARENA COMPARISON LOGIC
1475
  // ============================================================
 
1559
  }),
1560
  });
1561
 
1562
+ if (!res.ok) {
1563
+ let errMsg = "Comparison failed. Check if server is running.";
1564
+ try {
1565
+ const errData = await res.json();
1566
+ if (errData && errData.detail) {
1567
+ errMsg = errData.detail;
1568
+ }
1569
+ } catch (_) {}
1570
+ throw new Error(errMsg);
1571
+ }
1572
 
1573
  const data = await res.json();
1574
 
1575
+
1576
  // Render HyDE box if present
1577
  const hydeText = document.getElementById("arena-hyde-text");
1578
  if (hydeContainer && hydeText) {
 
1681
  domReferee.verdictBox.style.display = "none";
1682
 
1683
  const statuses = [
1684
+ "⚖️ Summoning AI evaluation referee...",
1685
  "🔍 Blinding model names and metadata...",
1686
  "🧠 Auditing Corner A relevance and clarity...",
1687
  "🧠 Auditing Corner B completeness and truthfulness...",
 
1706
  }),
1707
  });
1708
 
1709
+ if (!res.ok) {
1710
+ let errMsg = "Evaluation referee failed to respond.";
1711
+ try {
1712
+ const errData = await res.json();
1713
+ if (errData && errData.detail) {
1714
+ errMsg = errData.detail;
1715
+ }
1716
+ } catch (_) {}
1717
+ throw new Error(errMsg);
1718
+ }
1719
 
1720
  const data = await res.json();
1721
+
1722
  clearInterval(statusInterval);
1723
 
1724
  renderRefereeScorecard(data, labelA, labelB);
 
1858
  </div>
1859
  `;
1860
  }
1861
+
1862
+ // --- TOAST NOTIFICATIONS SYSTEM ---
1863
+ function showToast(message, type = "info") {
1864
+ let container = document.querySelector(".toast-container");
1865
+ if (!container) {
1866
+ container = document.createElement("div");
1867
+ container.className = "toast-container";
1868
+ document.body.appendChild(container);
1869
+ }
1870
+
1871
+ const toast = document.createElement("div");
1872
+ toast.className = `toast toast-${type}`;
1873
+
1874
+ let icon = "ℹ️";
1875
+ if (type === "warning") icon = "⚠️";
1876
+ else if (type === "success") icon = "✅";
1877
+ else if (type === "error") icon = "❌";
1878
+ else if (type === "info") icon = "🔮"; // Default to crystal ball for HyDE/LLM notice
1879
+
1880
+ toast.innerHTML = `
1881
+ <span>${icon}</span>
1882
+ <span style="flex: 1;">${message}</span>
1883
+ `;
1884
+
1885
+ container.appendChild(toast);
1886
+
1887
+ // Auto-remove after 4 seconds
1888
+ setTimeout(() => {
1889
+ toast.classList.add("toast-fade-out");
1890
+ setTimeout(() => {
1891
+ toast.remove();
1892
+ if (container.children.length === 0) {
1893
+ container.remove();
1894
+ }
1895
+ }, 300);
1896
+ }, 4000);
1897
+ }
1898
+
frontend/index.html CHANGED
@@ -429,16 +429,17 @@
429
  </div>
430
 
431
  <div class="referee-trigger-box" id="referee-trigger-box">
432
- <p class="referee-prompt-text">Call upon the local Gemma model to analyze, score, and judge both contexts!</p>
433
  <button class="btn-run" id="btn-call-referee" style="margin: 0 auto; display: block; max-width: 250px;">⚖️ CALL THE REFEREE</button>
434
  </div>
435
 
436
  <!-- Loading scanner status -->
437
  <div class="referee-loading-box" id="referee-loading-box" style="display: none;">
438
  <div class="skeleton-loader" style="max-width: 400px; margin: 0 auto 1rem; border-radius: 6px;"></div>
439
- <div class="referee-status-text" id="referee-status-text">Summoning Gemma to review the case...</div>
440
  </div>
441
 
 
442
  <!-- Scorecard Verdict Display -->
443
  <div class="referee-verdict-box" id="referee-verdict-box" style="display: none;"></div>
444
  </div>
 
429
  </div>
430
 
431
  <div class="referee-trigger-box" id="referee-trigger-box">
432
+ <p class="referee-prompt-text">Call upon the AI evaluation referee to analyze, score, and judge both contexts! (Takes 2-3 seconds)</p>
433
  <button class="btn-run" id="btn-call-referee" style="margin: 0 auto; display: block; max-width: 250px;">⚖️ CALL THE REFEREE</button>
434
  </div>
435
 
436
  <!-- Loading scanner status -->
437
  <div class="referee-loading-box" id="referee-loading-box" style="display: none;">
438
  <div class="skeleton-loader" style="max-width: 400px; margin: 0 auto 1rem; border-radius: 6px;"></div>
439
+ <div class="referee-status-text" id="referee-status-text">Summoning AI referee to review the case...</div>
440
  </div>
441
 
442
+
443
  <!-- Scorecard Verdict Display -->
444
  <div class="referee-verdict-box" id="referee-verdict-box" style="display: none;"></div>
445
  </div>
frontend/styles.css CHANGED
@@ -698,6 +698,71 @@ input[type="range"]::-moz-range-thumb {
698
  /* ============================================================
699
  RETRIEVAL X-RAY HIGHLIGHTS (TASK 3.4)
700
  ============================================================ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
701
  /* --- Select Dropdown Styling --- */
702
  .select-input {
703
  padding: 8px 12px;
 
698
  /* ============================================================
699
  RETRIEVAL X-RAY HIGHLIGHTS (TASK 3.4)
700
  ============================================================ */
701
+
702
+ /* --- Premium Toast Notification System --- */
703
+ .toast-container {
704
+ position: fixed;
705
+ bottom: 24px;
706
+ right: 24px;
707
+ display: flex;
708
+ flex-direction: column;
709
+ gap: 12px;
710
+ z-index: 9999;
711
+ pointer-events: none;
712
+ }
713
+
714
+ .toast {
715
+ pointer-events: auto;
716
+ background-color: var(--bg-surface-raised, #1f2937);
717
+ border: 1px solid var(--border-default, #374151);
718
+ color: var(--text-primary, #f3f4f6);
719
+ padding: 12px 18px;
720
+ border-radius: var(--radius-md, 8px);
721
+ box-shadow: var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.3));
722
+ font-family: var(--font-sans, system-ui);
723
+ font-size: 0.85rem;
724
+ display: flex;
725
+ align-items: center;
726
+ gap: var(--space-sm, 8px);
727
+ min-width: 250px;
728
+ max-width: 380px;
729
+ animation: toast-slide-in 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
730
+ transition: all 0.3s ease;
731
+ border-left: 4px solid var(--superman-blue, #3b82f6);
732
+ }
733
+
734
+ .toast.toast-info {
735
+ border-left-color: var(--superman-blue, #3b82f6);
736
+ }
737
+
738
+ .toast.toast-warning {
739
+ border-left-color: var(--warning-color, #f59e0b);
740
+ }
741
+
742
+ .toast.toast-success {
743
+ border-left-color: var(--success-color, #10b981);
744
+ }
745
+
746
+ .toast.toast-error {
747
+ border-left-color: var(--superman-red, #ef4444);
748
+ }
749
+
750
+ .toast.toast-fade-out {
751
+ opacity: 0;
752
+ transform: translateY(10px);
753
+ }
754
+
755
+ @keyframes toast-slide-in {
756
+ from {
757
+ opacity: 0;
758
+ transform: translateY(20px) scale(0.95);
759
+ }
760
+ to {
761
+ opacity: 1;
762
+ transform: translateY(0) scale(1);
763
+ }
764
+ }
765
+
766
  /* --- Select Dropdown Styling --- */
767
  .select-input {
768
  padding: 8px 12px;
pyproject.toml CHANGED
@@ -15,6 +15,7 @@ dependencies = [
15
  "nltk>=3.9.4",
16
  "umap-learn>=0.5.12",
17
  "numpy>=2.4.4",
18
- "ollama>=0.6.2",
19
  "flashrank>=0.2.10",
 
20
  ]
 
 
15
  "nltk>=3.9.4",
16
  "umap-learn>=0.5.12",
17
  "numpy>=2.4.4",
 
18
  "flashrank>=0.2.10",
19
+ "sentence-transformers>=3.0.0",
20
  ]
21
+
uv.lock CHANGED
@@ -292,6 +292,74 @@ wheels = [
292
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
293
  ]
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  [[package]]
296
  name = "durationpy"
297
  version = "0.10"
@@ -577,6 +645,18 @@ wheels = [
577
  { url = "https://files.pythonhosted.org/packages/8a/db/55a262f3606bebcae07cc14095338471ad7c0bbcaa37707e6f0ee49725b7/importlib_resources-7.1.0-py3-none-any.whl", hash = "sha256:1bd7b48b4088eddb2cd16382150bb515af0bd2c70128194392725f82ad2c96a1", size = 37232, upload-time = "2026-04-12T16:36:08.219Z" },
578
  ]
579
 
 
 
 
 
 
 
 
 
 
 
 
 
580
  [[package]]
581
  name = "joblib"
582
  version = "1.5.3"
@@ -758,6 +838,80 @@ wheels = [
758
  { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
759
  ]
760
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
761
  [[package]]
762
  name = "mdurl"
763
  version = "0.1.2"
@@ -865,6 +1019,24 @@ wheels = [
865
  { url = "https://files.pythonhosted.org/packages/a0/0f/59204bf136d1201f8d7884cfbaf7498c5b4674e87a4c693f9bde63741ce1/mmh3-5.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:dfd51b4c56b673dfbc43d7d27ef857dd91124801e2806c69bb45585ce0fa019b", size = 40391, upload-time = "2026-03-05T15:55:56.697Z" },
866
  ]
867
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
868
  [[package]]
869
  name = "nltk"
870
  version = "3.9.4"
@@ -992,25 +1164,164 @@ wheels = [
992
  ]
993
 
994
  [[package]]
995
- name = "oauthlib"
996
- version = "3.3.1"
997
  source = { registry = "https://pypi.org/simple" }
998
- sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" }
 
 
999
  wheels = [
1000
- { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" },
 
1001
  ]
1002
 
1003
  [[package]]
1004
- name = "ollama"
1005
- version = "0.6.2"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1006
  source = { registry = "https://pypi.org/simple" }
1007
  dependencies = [
1008
- { name = "httpx" },
1009
- { name = "pydantic" },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1010
  ]
1011
- sdist = { url = "https://files.pythonhosted.org/packages/fc/72/5f12423b6b39ca8430fbe56f77fcf4ef60f63067c7c4a2e30e200ed9ec16/ollama-0.6.2.tar.gz", hash = "sha256:936d55daa684f474364c098611c933626f8d6c7d67065c5b7ae0c477b508b07f", size = 53145, upload-time = "2026-04-29T21:21:15.018Z" }
 
 
 
 
1012
  wheels = [
1013
- { url = "https://files.pythonhosted.org/packages/c4/ab/d6722beeb2d10f7a3b9ff49375708904fde18f82b5609a0bc4aeb5996a4d/ollama-0.6.2-py3-none-any.whl", hash = "sha256:3ad7daab28e5a973445c36a73882a3ef698c2ebb00e21e308652741577509f7d", size = 15115, upload-time = "2026-04-29T21:21:13.794Z" },
 
 
 
 
 
 
 
 
 
 
1014
  ]
1015
 
1016
  [[package]]
@@ -1643,8 +1954,8 @@ dependencies = [
1643
  { name = "langchain-text-splitters" },
1644
  { name = "nltk" },
1645
  { name = "numpy" },
1646
- { name = "ollama" },
1647
  { name = "pydantic" },
 
1648
  { name = "tiktoken" },
1649
  { name = "umap-learn" },
1650
  { name = "uvicorn", extra = ["standard"] },
@@ -1659,8 +1970,8 @@ requires-dist = [
1659
  { name = "langchain-text-splitters", specifier = ">=1.1.2" },
1660
  { name = "nltk", specifier = ">=3.9.4" },
1661
  { name = "numpy", specifier = ">=2.4.4" },
1662
- { name = "ollama", specifier = ">=0.6.2" },
1663
  { name = "pydantic", specifier = ">=2.0" },
 
1664
  { name = "tiktoken", specifier = ">=0.9.0" },
1665
  { name = "umap-learn", specifier = ">=0.5.12" },
1666
  { name = "uvicorn", extras = ["standard"], specifier = ">=0.34.0" },
@@ -1945,6 +2256,30 @@ wheels = [
1945
  { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" },
1946
  ]
1947
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1948
  [[package]]
1949
  name = "scikit-learn"
1950
  version = "1.8.0"
@@ -2066,6 +2401,34 @@ wheels = [
2066
  { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" },
2067
  ]
2068
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2069
  [[package]]
2070
  name = "shellingham"
2071
  version = "1.5.4"
@@ -2097,6 +2460,18 @@ wheels = [
2097
  { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" },
2098
  ]
2099
 
 
 
 
 
 
 
 
 
 
 
 
 
2100
  [[package]]
2101
  name = "tenacity"
2102
  version = "9.1.4"
@@ -2171,29 +2546,72 @@ wheels = [
2171
 
2172
  [[package]]
2173
  name = "tokenizers"
2174
- version = "0.23.1"
2175
  source = { registry = "https://pypi.org/simple" }
2176
  dependencies = [
2177
  { name = "huggingface-hub" },
2178
  ]
2179
- sdist = { url = "https://files.pythonhosted.org/packages/c1/60/21f715d9faba5f5407ff759472ade058ec4a507ad62bcea47cb847239a73/tokenizers-0.23.1.tar.gz", hash = "sha256:1feeeadf865a7915adc25445dea30e9933e593c31bb96c277cee36de227c8bfa", size = 365748, upload-time = "2026-04-27T14:43:25.606Z" }
2180
  wheels = [
2181
- { url = "https://files.pythonhosted.org/packages/87/39/b87a87d5bb9470610b80a2d31df42fcffeaf35118b8b97952b2aff598cc7/tokenizers-0.23.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e03d6ffcbe0d56ee9c1ccd070e70a13fa750727c0277e138152acbc0252c2224", size = 3146732, upload-time = "2026-04-27T14:43:15.427Z" },
2182
- { url = "https://files.pythonhosted.org/packages/e2/6a/068ed9f6e444c9d7e9d55ce134181325700f3d7f30410721bdc8f848d727/tokenizers-0.23.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0948bbb1ac1d7cdfc9fb6d62c596e3b7550036ad60ecd654a66ad273326324e", size = 3054954, upload-time = "2026-04-27T14:43:13.745Z" },
2183
- { url = "https://files.pythonhosted.org/packages/6c/36/e006edf031154cba92b8416057d92c3abe3635e4c4b0aa0b5b9bb39dde70/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf13402aff9bc533c89cb849ec3b412dc3fbeacc9744840e423d7bf3f7dc0e3", size = 3374081, upload-time = "2026-04-27T14:43:01.241Z" },
2184
- { url = "https://files.pythonhosted.org/packages/a2/ef/7735d226f9c7f874a6bee5e3f27fb25ecabdf207d37b8cf45286d0795893/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f836ca703b89ae07919a309f9651f7a88fd5a33d5f718ba5ad0870ec0256bad6", size = 3247641, upload-time = "2026-04-27T14:43:03.856Z" },
2185
- { url = "https://files.pythonhosted.org/packages/b9/d9/24827036f6e21297bfffda0768e58eb6096a4f411e932964a01707857931/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae848657742035523fdf261773630cb819a26995fcd3d9ecae0c1daf6e5a4959", size = 3585624, upload-time = "2026-04-27T14:43:10.664Z" },
2186
- { url = "https://files.pythonhosted.org/packages/0c/9a/22f3582b3a4f49358293a5206e25317621ee4526bfe9cdaa0f07a12e770e/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53b09e85775d5187941e7bab30e941b4134ab4a7dd8c68e783d231fb7ca27c51", size = 3844062, upload-time = "2026-04-27T14:43:05.643Z" },
2187
- { url = "https://files.pythonhosted.org/packages/7e/65/b8f8814eef95800f20721384136d9a1d22241d50b2874357cb70542c392f/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea5a0ce170074329faaa8ea3f6400ecde604b6678192688533af80980daae71a", size = 3460098, upload-time = "2026-04-27T14:43:08.854Z" },
2188
- { url = "https://files.pythonhosted.org/packages/0d/d5/1353e5f677ec27c2494fb6a6725e82d56c985f53e90ec511369e7e4f02c6/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b405006415ea148a992d093699c66eb01952bf59f4d5727089a98bda45a4", size = 3346235, upload-time = "2026-04-27T14:43:12.377Z" },
2189
- { url = "https://files.pythonhosted.org/packages/71/89/39b6b8fc073fb6d413d0147aa333dc7eff7be65639ac9d19930a0b21bf33/tokenizers-0.23.1-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:56f3a77de629917652f876294dc9fe6bad4a0c43bc229dc72e59bb23a0f4729a", size = 3426398, upload-time = "2026-04-27T14:43:07.264Z" },
2190
- { url = "https://files.pythonhosted.org/packages/0f/80/127c854da64827e5b79264ce524993a90dddcb320e5cd42412c5c02f9e8a/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d10a6d957ef01896dc274e890eee27d41bd0e74ef31e60616f0fc311345184e", size = 9823279, upload-time = "2026-04-27T14:43:17.222Z" },
2191
- { url = "https://files.pythonhosted.org/packages/fe/ba/44c2502feb1a058f096ddfb4e0996ef3225a01a388e1a9b094e91689fe93/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1974288a609c343774f1b897c8b482c791ab17b75ab5c8c2b1737565c1d82288", size = 9644986, upload-time = "2026-04-27T14:43:19.45Z" },
2192
- { url = "https://files.pythonhosted.org/packages/9e/c1/464019a9fb059870bfe4eebb4ba12208f3042035e258bf5e782906bd3847/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:120468fb4c24faf0543c835a4fabafa4deb3f20a035c9b6e83d0b553a97615d4", size = 9976181, upload-time = "2026-04-27T14:43:21.463Z" },
2193
- { url = "https://files.pythonhosted.org/packages/79/94/3ac1432bda31626071e9b6a12709b97ae05131c804b94c8f3ac622c5da32/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3d8f40ea6268047de7046906326abed5134f27d4e8447b23763afe5808c8a96", size = 10113853, upload-time = "2026-04-27T14:43:23.617Z" },
2194
- { url = "https://files.pythonhosted.org/packages/6a/dd/631b21433c771b1382535326f0eca80b9c9cee2e64961dd993bc9ac4669e/tokenizers-0.23.1-cp310-abi3-win32.whl", hash = "sha256:93120a930b919416da7cd10a2f606ac9919cc69cacae7980fa2140e277660948", size = 2536263, upload-time = "2026-04-27T14:43:29.888Z" },
2195
- { url = "https://files.pythonhosted.org/packages/97/c9/2553f72aaf65a2797d4229e37fa7fbe38ffbf3e32912d31bdd78b3323e59/tokenizers-0.23.1-cp310-abi3-win_amd64.whl", hash = "sha256:e7bfaf995c1bdbbd21d13539decb6650967013759318627d85daeb7881af16b7", size = 2798223, upload-time = "2026-04-27T14:43:28.51Z" },
2196
- { url = "https://files.pythonhosted.org/packages/cd/2b/2be299bab55fc595e3d38567edb1a87f86e594842968fa9515a07bdcf422/tokenizers-0.23.1-cp310-abi3-win_arm64.whl", hash = "sha256:a26197957d8e4425dfba746315f3c425ea00cfa8367c5fbc4ec73447893dcea9", size = 2664127, upload-time = "2026-04-27T14:43:26.949Z" },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2197
  ]
2198
 
2199
  [[package]]
@@ -2208,6 +2626,43 @@ wheels = [
2208
  { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" },
2209
  ]
2210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2211
  [[package]]
2212
  name = "typer"
2213
  version = "0.25.1"
 
292
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
293
  ]
294
 
295
+ [[package]]
296
+ name = "cuda-bindings"
297
+ version = "13.3.1"
298
+ source = { registry = "https://pypi.org/simple" }
299
+ dependencies = [
300
+ { name = "cuda-pathfinder" },
301
+ ]
302
+ wheels = [
303
+ { url = "https://files.pythonhosted.org/packages/51/6b/457ca12dad3ee9bfcc9a545cfd6b64b359ba49de40f776f6e028e678f262/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5879712accf6e14bb01aa5e67440eb84998b8d104b509cc7a6dc0b8f656a474", size = 6053539, upload-time = "2026-05-29T23:11:43.19Z" },
304
+ { url = "https://files.pythonhosted.org/packages/95/7a/c5e3c34a409b148f5c0f5a4ea374158f95d488862c1dffedf9aa5c639df9/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04436a9364059c84b8f9636f359eccda1cf814341f5b670c71d80d2f79dbc708", size = 6674166, upload-time = "2026-05-29T23:11:45.478Z" },
305
+ { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" },
306
+ { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" },
307
+ { url = "https://files.pythonhosted.org/packages/cc/6e/2394f8163360f8391f8f1b7e72d300a82724edb81a7b7084c799fbd4c91f/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9efb21c1ee64981e184b9e0ba5eb3179e5ba3d4b51665a6cb52b8ef3d01a7cbf", size = 5920504, upload-time = "2026-05-29T23:11:56.883Z" },
308
+ { url = "https://files.pythonhosted.org/packages/34/c2/ef9b6a63f7dc432712a462c816662e662e00d38caa9b861c8c2588195d03/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2732904099e0a4d4db774a5fc6d91ee95fae065b4d2ecabb4968c5fe2406c9d7", size = 6476660, upload-time = "2026-05-29T23:11:59.188Z" },
309
+ { url = "https://files.pythonhosted.org/packages/b1/81/bff68ce829999c1e4209c761bbf903b1c06ec570416ddb25020864ad5907/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ab2f74ed65bfef4163ba07a8db16f1085e0729291db12a2423aff84ee8278b8", size = 6013639, upload-time = "2026-05-29T23:12:03.509Z" },
310
+ { url = "https://files.pythonhosted.org/packages/d4/e0/c8a1f0c8f9ffdea4f5fe6dbab89b326cef4d85caf489dad39e209da89416/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd4c814d311ec08c981f6dded1dbe7d4b371067ee4f6c14cccec4bde9590f80", size = 6534419, upload-time = "2026-05-29T23:12:05.633Z" },
311
+ { url = "https://files.pythonhosted.org/packages/52/b8/83b1f563925b290f2d11a01a77a84013ba56052fe3653a5bef3ccfbb43d6/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3c772dfff49681541d59630c90f858e173ac926b9c593a2b7123f2a1043cc76", size = 5809771, upload-time = "2026-05-29T23:12:10.422Z" },
312
+ { url = "https://files.pythonhosted.org/packages/12/20/e79b4bfe98f075195afb6343d41c498f9dbd2d161d7021d4d28bceb83581/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36febb7c1079d68a981dbbd8d5a67235b399802b82075c9388624719607e52b9", size = 6358584, upload-time = "2026-05-29T23:12:12.767Z" },
313
+ ]
314
+
315
+ [[package]]
316
+ name = "cuda-pathfinder"
317
+ version = "1.5.5"
318
+ source = { registry = "https://pypi.org/simple" }
319
+ wheels = [
320
+ { url = "https://files.pythonhosted.org/packages/11/c8/26f2e4aae92f11522a96043892ba39a90eac610d5242523aa863212bc1c7/cuda_pathfinder-1.5.5-py3-none-any.whl", hash = "sha256:0228c023f95d1480f143ef5c8922d27a2ab052087a942e81dc289c9eb8f91689", size = 51671, upload-time = "2026-05-27T01:21:25.413Z" },
321
+ ]
322
+
323
+ [[package]]
324
+ name = "cuda-toolkit"
325
+ version = "13.0.2"
326
+ source = { registry = "https://pypi.org/simple" }
327
+ wheels = [
328
+ { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" },
329
+ ]
330
+
331
+ [package.optional-dependencies]
332
+ cudart = [
333
+ { name = "nvidia-cuda-runtime", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
334
+ ]
335
+ cufft = [
336
+ { name = "nvidia-cufft", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
337
+ ]
338
+ cufile = [
339
+ { name = "nvidia-cufile", marker = "sys_platform == 'linux'" },
340
+ ]
341
+ cupti = [
342
+ { name = "nvidia-cuda-cupti", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
343
+ ]
344
+ curand = [
345
+ { name = "nvidia-curand", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
346
+ ]
347
+ cusolver = [
348
+ { name = "nvidia-cusolver", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
349
+ ]
350
+ cusparse = [
351
+ { name = "nvidia-cusparse", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
352
+ ]
353
+ nvjitlink = [
354
+ { name = "nvidia-nvjitlink", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
355
+ ]
356
+ nvrtc = [
357
+ { name = "nvidia-cuda-nvrtc", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
358
+ ]
359
+ nvtx = [
360
+ { name = "nvidia-nvtx", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
361
+ ]
362
+
363
  [[package]]
364
  name = "durationpy"
365
  version = "0.10"
 
645
  { url = "https://files.pythonhosted.org/packages/8a/db/55a262f3606bebcae07cc14095338471ad7c0bbcaa37707e6f0ee49725b7/importlib_resources-7.1.0-py3-none-any.whl", hash = "sha256:1bd7b48b4088eddb2cd16382150bb515af0bd2c70128194392725f82ad2c96a1", size = 37232, upload-time = "2026-04-12T16:36:08.219Z" },
646
  ]
647
 
648
+ [[package]]
649
+ name = "jinja2"
650
+ version = "3.1.6"
651
+ source = { registry = "https://pypi.org/simple" }
652
+ dependencies = [
653
+ { name = "markupsafe" },
654
+ ]
655
+ sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
656
+ wheels = [
657
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
658
+ ]
659
+
660
  [[package]]
661
  name = "joblib"
662
  version = "1.5.3"
 
838
  { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
839
  ]
840
 
841
+ [[package]]
842
+ name = "markupsafe"
843
+ version = "3.0.3"
844
+ source = { registry = "https://pypi.org/simple" }
845
+ sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
846
+ wheels = [
847
+ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" },
848
+ { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" },
849
+ { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" },
850
+ { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" },
851
+ { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" },
852
+ { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" },
853
+ { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" },
854
+ { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" },
855
+ { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" },
856
+ { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" },
857
+ { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" },
858
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
859
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
860
+ { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
861
+ { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
862
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
863
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
864
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
865
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
866
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
867
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
868
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
869
+ { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
870
+ { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
871
+ { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
872
+ { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
873
+ { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
874
+ { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
875
+ { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
876
+ { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
877
+ { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
878
+ { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
879
+ { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
880
+ { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
881
+ { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
882
+ { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
883
+ { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
884
+ { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
885
+ { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
886
+ { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
887
+ { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
888
+ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
889
+ { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
890
+ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
891
+ { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
892
+ { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
893
+ { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
894
+ { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
895
+ { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
896
+ { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
897
+ { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
898
+ { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
899
+ { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
900
+ { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
901
+ { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
902
+ { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
903
+ { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
904
+ { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
905
+ { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
906
+ { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
907
+ { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
908
+ { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
909
+ { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
910
+ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
911
+ { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
912
+ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
913
+ ]
914
+
915
  [[package]]
916
  name = "mdurl"
917
  version = "0.1.2"
 
1019
  { url = "https://files.pythonhosted.org/packages/a0/0f/59204bf136d1201f8d7884cfbaf7498c5b4674e87a4c693f9bde63741ce1/mmh3-5.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:dfd51b4c56b673dfbc43d7d27ef857dd91124801e2806c69bb45585ce0fa019b", size = 40391, upload-time = "2026-03-05T15:55:56.697Z" },
1020
  ]
1021
 
1022
+ [[package]]
1023
+ name = "mpmath"
1024
+ version = "1.3.0"
1025
+ source = { registry = "https://pypi.org/simple" }
1026
+ sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" }
1027
+ wheels = [
1028
+ { 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" },
1029
+ ]
1030
+
1031
+ [[package]]
1032
+ name = "networkx"
1033
+ version = "3.6.1"
1034
+ source = { registry = "https://pypi.org/simple" }
1035
+ sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" }
1036
+ wheels = [
1037
+ { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" },
1038
+ ]
1039
+
1040
  [[package]]
1041
  name = "nltk"
1042
  version = "3.9.4"
 
1164
  ]
1165
 
1166
  [[package]]
1167
+ name = "nvidia-cublas"
1168
+ version = "13.1.1.3"
1169
  source = { registry = "https://pypi.org/simple" }
1170
+ dependencies = [
1171
+ { name = "nvidia-cuda-nvrtc" },
1172
+ ]
1173
  wheels = [
1174
+ { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" },
1175
+ { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" },
1176
  ]
1177
 
1178
  [[package]]
1179
+ name = "nvidia-cuda-cupti"
1180
+ version = "13.0.85"
1181
+ source = { registry = "https://pypi.org/simple" }
1182
+ wheels = [
1183
+ { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" },
1184
+ { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" },
1185
+ ]
1186
+
1187
+ [[package]]
1188
+ name = "nvidia-cuda-nvrtc"
1189
+ version = "13.0.88"
1190
+ source = { registry = "https://pypi.org/simple" }
1191
+ wheels = [
1192
+ { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" },
1193
+ { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" },
1194
+ ]
1195
+
1196
+ [[package]]
1197
+ name = "nvidia-cuda-runtime"
1198
+ version = "13.0.96"
1199
+ source = { registry = "https://pypi.org/simple" }
1200
+ wheels = [
1201
+ { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" },
1202
+ { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" },
1203
+ ]
1204
+
1205
+ [[package]]
1206
+ name = "nvidia-cudnn-cu13"
1207
+ version = "9.20.0.48"
1208
  source = { registry = "https://pypi.org/simple" }
1209
  dependencies = [
1210
+ { name = "nvidia-cublas" },
1211
+ ]
1212
+ wheels = [
1213
+ { url = "https://files.pythonhosted.org/packages/56/c5/83384d846b2fd17c44bd499b36c75a45ed4f095fbbb2252294e89cea5c5c/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1", size = 444574296, upload-time = "2026-03-09T19:28:27.751Z" },
1214
+ { url = "https://files.pythonhosted.org/packages/6e/5e/edb9c0ae051602c3ccaffe424256463636d639e27d7f302dde9975ef9e7a/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304", size = 366173588, upload-time = "2026-03-09T19:29:34.474Z" },
1215
+ ]
1216
+
1217
+ [[package]]
1218
+ name = "nvidia-cufft"
1219
+ version = "12.0.0.61"
1220
+ source = { registry = "https://pypi.org/simple" }
1221
+ dependencies = [
1222
+ { name = "nvidia-nvjitlink" },
1223
+ ]
1224
+ wheels = [
1225
+ { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" },
1226
+ { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" },
1227
+ ]
1228
+
1229
+ [[package]]
1230
+ name = "nvidia-cufile"
1231
+ version = "1.15.1.6"
1232
+ source = { registry = "https://pypi.org/simple" }
1233
+ wheels = [
1234
+ { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" },
1235
+ { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" },
1236
+ ]
1237
+
1238
+ [[package]]
1239
+ name = "nvidia-curand"
1240
+ version = "10.4.0.35"
1241
+ source = { registry = "https://pypi.org/simple" }
1242
+ wheels = [
1243
+ { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" },
1244
+ { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" },
1245
+ ]
1246
+
1247
+ [[package]]
1248
+ name = "nvidia-cusolver"
1249
+ version = "12.0.4.66"
1250
+ source = { registry = "https://pypi.org/simple" }
1251
+ dependencies = [
1252
+ { name = "nvidia-cublas" },
1253
+ { name = "nvidia-cusparse" },
1254
+ { name = "nvidia-nvjitlink" },
1255
+ ]
1256
+ wheels = [
1257
+ { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" },
1258
+ { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" },
1259
+ ]
1260
+
1261
+ [[package]]
1262
+ name = "nvidia-cusparse"
1263
+ version = "12.6.3.3"
1264
+ source = { registry = "https://pypi.org/simple" }
1265
+ dependencies = [
1266
+ { name = "nvidia-nvjitlink" },
1267
+ ]
1268
+ wheels = [
1269
+ { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" },
1270
+ { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" },
1271
+ ]
1272
+
1273
+ [[package]]
1274
+ name = "nvidia-cusparselt-cu13"
1275
+ version = "0.8.1"
1276
+ source = { registry = "https://pypi.org/simple" }
1277
+ wheels = [
1278
+ { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" },
1279
+ { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" },
1280
+ ]
1281
+
1282
+ [[package]]
1283
+ name = "nvidia-nccl-cu13"
1284
+ version = "2.29.7"
1285
+ source = { registry = "https://pypi.org/simple" }
1286
+ wheels = [
1287
+ { url = "https://files.pythonhosted.org/packages/72/0d/daf50d44177ee0cbc7ff0a0c91eb5ff676c82be42f9a970bc7597f440c3a/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:674a12383e3c38a1bcccae7d4f3633b37852230b6047883cb2f4c2d1b36d9bf5", size = 206014712, upload-time = "2026-03-03T05:34:20.843Z" },
1288
+ { url = "https://files.pythonhosted.org/packages/67/f4/58e4e91b6919367c7aafb8e36fce9aad1a3047e536bf7e2fd560927d3a4c/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:edd81538446786ec3b73972543e53bb43bcaf0bfc8ef76cb679fcc390ffe136d", size = 205976000, upload-time = "2026-03-03T05:36:24.472Z" },
1289
+ ]
1290
+
1291
+ [[package]]
1292
+ name = "nvidia-nvjitlink"
1293
+ version = "13.0.88"
1294
+ source = { registry = "https://pypi.org/simple" }
1295
+ wheels = [
1296
+ { url = "https://files.pythonhosted.org/packages/56/7a/123e033aaff487c77107195fa5a2b8686795ca537935a24efae476c41f05/nvidia_nvjitlink-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:13a74f429e23b921c1109976abefacc69835f2f433ebd323d3946e11d804e47b", size = 40713933, upload-time = "2025-09-04T08:35:43.553Z" },
1297
+ { url = "https://files.pythonhosted.org/packages/ab/2c/93c5250e64df4f894f1cbb397c6fd71f79813f9fd79d7cd61de3f97b3c2d/nvidia_nvjitlink-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e931536ccc7d467a98ba1d8b89ff7fa7f1fa3b13f2b0069118cd7f47bff07d0c", size = 38768748, upload-time = "2025-09-04T08:35:20.008Z" },
1298
+ ]
1299
+
1300
+ [[package]]
1301
+ name = "nvidia-nvshmem-cu13"
1302
+ version = "3.4.5"
1303
+ source = { registry = "https://pypi.org/simple" }
1304
+ wheels = [
1305
+ { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" },
1306
+ { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" },
1307
  ]
1308
+
1309
+ [[package]]
1310
+ name = "nvidia-nvtx"
1311
+ version = "13.0.85"
1312
+ source = { registry = "https://pypi.org/simple" }
1313
  wheels = [
1314
+ { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" },
1315
+ { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" },
1316
+ ]
1317
+
1318
+ [[package]]
1319
+ name = "oauthlib"
1320
+ version = "3.3.1"
1321
+ source = { registry = "https://pypi.org/simple" }
1322
+ sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" }
1323
+ wheels = [
1324
+ { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" },
1325
  ]
1326
 
1327
  [[package]]
 
1954
  { name = "langchain-text-splitters" },
1955
  { name = "nltk" },
1956
  { name = "numpy" },
 
1957
  { name = "pydantic" },
1958
+ { name = "sentence-transformers" },
1959
  { name = "tiktoken" },
1960
  { name = "umap-learn" },
1961
  { name = "uvicorn", extra = ["standard"] },
 
1970
  { name = "langchain-text-splitters", specifier = ">=1.1.2" },
1971
  { name = "nltk", specifier = ">=3.9.4" },
1972
  { name = "numpy", specifier = ">=2.4.4" },
 
1973
  { name = "pydantic", specifier = ">=2.0" },
1974
+ { name = "sentence-transformers", specifier = ">=3.0.0" },
1975
  { name = "tiktoken", specifier = ">=0.9.0" },
1976
  { name = "umap-learn", specifier = ">=0.5.12" },
1977
  { name = "uvicorn", extras = ["standard"], specifier = ">=0.34.0" },
 
2256
  { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" },
2257
  ]
2258
 
2259
+ [[package]]
2260
+ name = "safetensors"
2261
+ version = "0.8.0"
2262
+ source = { registry = "https://pypi.org/simple" }
2263
+ sdist = { url = "https://files.pythonhosted.org/packages/45/06/f955dbbb1859e3bd23c8ac6141af5106e7ad5fedec4a3a6e3d60f94b7001/safetensors-0.8.0.tar.gz", hash = "sha256:fabaf3e0f18a6618d9b36560682562157f77c2b71fcffc7b432be2baed9d753d", size = 325846, upload-time = "2026-06-09T07:52:25.563Z" }
2264
+ wheels = [
2265
+ { url = "https://files.pythonhosted.org/packages/39/a0/f718cda65b05407d228f97602cf60dca269c979867aa5beb25410de26cd3/safetensors-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c554f85858e05226d3c2828e32395e677434685d6d94594a41643361c5e837f0", size = 473568, upload-time = "2026-06-09T07:52:18.829Z" },
2266
+ { url = "https://files.pythonhosted.org/packages/f5/b1/fa7c600e7dceae12e9606c7578cbc9ff1e1ed55844883ee5c92205e86226/safetensors-0.8.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c80201d22cbf405b80647a60ada77bba06c8fba2da2743ba1e89cdcc39a81f25", size = 484562, upload-time = "2026-06-09T07:52:17.518Z" },
2267
+ { url = "https://files.pythonhosted.org/packages/09/7d/65a7de0af421317bb36a067241e4235fff194eed60b961ed6d3f59a3fc60/safetensors-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a46e5ff292c356d6991e60942ba7f79817682d3a2cef0702136448cb9c4d235", size = 502844, upload-time = "2026-06-09T07:52:07.624Z" },
2268
+ { url = "https://files.pythonhosted.org/packages/91/4f/3175c9d75634e0e0dda0082794193521035edd7c70a6f212bf33ca06ddf4/safetensors-0.8.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4124502b78f03534117c848f87a39b8f31e577b15eff423bf8bfb95f2a8c30d0", size = 511823, upload-time = "2026-06-09T07:52:09.565Z" },
2269
+ { url = "https://files.pythonhosted.org/packages/20/87/846c289e7aa2299eff406335717cf43ce8777194ece8aad75772e0411615/safetensors-0.8.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bc0a787ba8a35be368ee3574edfa2b1ad389eebd0a72e482ae275490e3f6c98", size = 633461, upload-time = "2026-06-09T07:52:11.128Z" },
2270
+ { url = "https://files.pythonhosted.org/packages/76/22/8d64d9df2c45d5ded401df889d0ad90882804ca172d79ec4f0df8f727fe0/safetensors-0.8.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040070828e36dc8e122178bbbd5830ff9e97920affb84cbe0f46442497bed358", size = 545148, upload-time = "2026-06-09T07:52:13.603Z" },
2271
+ { url = "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774", size = 516040, upload-time = "2026-06-09T07:52:16.29Z" },
2272
+ { url = "https://files.pythonhosted.org/packages/46/fb/cdaed17ceb2948784fd9c36b6fd3e951b608547cea81a48e8ee6f8cfdfcb/safetensors-0.8.0-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:fcdd41ec4628fee5799f807c73c353629130fbd942aa23d83c623dd6c9d52d78", size = 513832, upload-time = "2026-06-09T07:52:12.37Z" },
2273
+ { url = "https://files.pythonhosted.org/packages/0d/49/1e15de264dcc3b77943d2d0c56a95809956883b1c2d6d585c792523f180b/safetensors-0.8.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e9f537aa183a38ace122d27303dcd986b26bd2a7591f9181d7f0c396f4677ca", size = 559930, upload-time = "2026-06-09T07:52:14.743Z" },
2274
+ { url = "https://files.pythonhosted.org/packages/2a/43/bf38443278eab4b1be1fce2931e2b012ad9cb7df52ada751d0aab8f7659a/safetensors-0.8.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87eec7ffed2b809f05a398a8becb7d013f19f7837cd15d9748580d6cf30dbaf4", size = 678670, upload-time = "2026-06-09T07:52:20.032Z" },
2275
+ { url = "https://files.pythonhosted.org/packages/72/e3/68cd3fa5b48488e84add63e04cb12f3bc28ae4638c06d4508c6e88823d0e/safetensors-0.8.0-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:4a95ae2b05d7726d751da4ebf626a2ca782b706e101bd894c95bc2450b1cffcc", size = 786679, upload-time = "2026-06-09T07:52:21.322Z" },
2276
+ { url = "https://files.pythonhosted.org/packages/29/4b/1c19c509d56e01f4fbb3d0a2e597450f6cc04d1d56cf52defb0a62dfd715/safetensors-0.8.0-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae091f16662658bdc019a4ff6cb4c085bb7d725eb5978b183ffd265863b6d2d", size = 765683, upload-time = "2026-06-09T07:52:22.594Z" },
2277
+ { url = "https://files.pythonhosted.org/packages/27/43/41c1621732edd934d868a00d1b891584c892a7b62a9aab82ea5a0a5623ee/safetensors-0.8.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8e080062fcde23be189565e1c3305d16751a218ecf9412c8601e64204eb6f846", size = 722361, upload-time = "2026-06-09T07:52:23.924Z" },
2278
+ { url = "https://files.pythonhosted.org/packages/8e/3f/73ccf82579412b4a71c4ca673f10b5f1f888d7cf5af7fe24f27d30307be4/safetensors-0.8.0-cp310-abi3-win32.whl", hash = "sha256:2ddf52eac562eda224f99acfa7889d02968c1fd59a5b011ae7d8137c37e9c02d", size = 342401, upload-time = "2026-06-09T07:52:28.895Z" },
2279
+ { url = "https://files.pythonhosted.org/packages/1b/6d/3fba214c1e5e0f69991677ec3bc17023f0421776975e1de0c682dca475e2/safetensors-0.8.0-cp310-abi3-win_amd64.whl", hash = "sha256:096ec1a98435df7beb08853bb5aa9081a84f23d0adc67ed1a0a10550f608373f", size = 355540, upload-time = "2026-06-09T07:52:27.832Z" },
2280
+ { url = "https://files.pythonhosted.org/packages/8d/fc/7eedc3510d97878876e32774eebbeb61c43f148a96e915c84229a3e967aa/safetensors-0.8.0-cp310-abi3-win_arm64.whl", hash = "sha256:f7838e5135a406ad3e02efdcb8cf2e5397d368b0154537c4fec682dbc544d452", size = 340500, upload-time = "2026-06-09T07:52:26.745Z" },
2281
+ ]
2282
+
2283
  [[package]]
2284
  name = "scikit-learn"
2285
  version = "1.8.0"
 
2401
  { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" },
2402
  ]
2403
 
2404
+ [[package]]
2405
+ name = "sentence-transformers"
2406
+ version = "5.6.0"
2407
+ source = { registry = "https://pypi.org/simple" }
2408
+ dependencies = [
2409
+ { name = "huggingface-hub" },
2410
+ { name = "numpy" },
2411
+ { name = "scikit-learn" },
2412
+ { name = "scipy" },
2413
+ { name = "torch" },
2414
+ { name = "tqdm" },
2415
+ { name = "transformers" },
2416
+ { name = "typing-extensions" },
2417
+ ]
2418
+ sdist = { url = "https://files.pythonhosted.org/packages/f9/56/d2cb00765a6b15c994a7fccf20f9032f16e8193ca49147cb5155166ad744/sentence_transformers-5.6.0.tar.gz", hash = "sha256:0e7164d051e416c1853ade7c274ff52af3f9da0f4be7f0b83d734c27699e1057", size = 453194, upload-time = "2026-06-16T14:01:56.42Z" }
2419
+ wheels = [
2420
+ { url = "https://files.pythonhosted.org/packages/76/c1/dc1582b79e9a2eb0cddf9559cd9bcdff084f541d6fe881fdd9d98630dba7/sentence_transformers-5.6.0-py3-none-any.whl", hash = "sha256:d2075b5e687a1611005e20ab04a6846994d51adfcf39610aed066af3c0c0b81f", size = 596411, upload-time = "2026-06-16T14:01:55.103Z" },
2421
+ ]
2422
+
2423
+ [[package]]
2424
+ name = "setuptools"
2425
+ version = "81.0.0"
2426
+ source = { registry = "https://pypi.org/simple" }
2427
+ sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" }
2428
+ wheels = [
2429
+ { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" },
2430
+ ]
2431
+
2432
  [[package]]
2433
  name = "shellingham"
2434
  version = "1.5.4"
 
2460
  { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" },
2461
  ]
2462
 
2463
+ [[package]]
2464
+ name = "sympy"
2465
+ version = "1.14.0"
2466
+ source = { registry = "https://pypi.org/simple" }
2467
+ dependencies = [
2468
+ { name = "mpmath" },
2469
+ ]
2470
+ sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" }
2471
+ wheels = [
2472
+ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
2473
+ ]
2474
+
2475
  [[package]]
2476
  name = "tenacity"
2477
  version = "9.1.4"
 
2546
 
2547
  [[package]]
2548
  name = "tokenizers"
2549
+ version = "0.22.2"
2550
  source = { registry = "https://pypi.org/simple" }
2551
  dependencies = [
2552
  { name = "huggingface-hub" },
2553
  ]
2554
+ sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" }
2555
  wheels = [
2556
+ { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" },
2557
+ { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" },
2558
+ { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" },
2559
+ { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" },
2560
+ { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" },
2561
+ { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" },
2562
+ { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" },
2563
+ { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" },
2564
+ { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" },
2565
+ { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" },
2566
+ { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" },
2567
+ { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" },
2568
+ { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" },
2569
+ { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" },
2570
+ { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" },
2571
+ ]
2572
+
2573
+ [[package]]
2574
+ name = "torch"
2575
+ version = "2.12.1"
2576
+ source = { registry = "https://pypi.org/simple" }
2577
+ dependencies = [
2578
+ { name = "cuda-bindings", marker = "sys_platform == 'linux'" },
2579
+ { name = "cuda-toolkit", extra = ["cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" },
2580
+ { name = "filelock" },
2581
+ { name = "fsspec" },
2582
+ { name = "jinja2" },
2583
+ { name = "networkx" },
2584
+ { name = "nvidia-cublas", marker = "sys_platform == 'linux'" },
2585
+ { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" },
2586
+ { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" },
2587
+ { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" },
2588
+ { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux'" },
2589
+ { name = "setuptools" },
2590
+ { name = "sympy" },
2591
+ { name = "triton", marker = "sys_platform == 'linux'" },
2592
+ { name = "typing-extensions" },
2593
+ ]
2594
+ wheels = [
2595
+ { url = "https://files.pythonhosted.org/packages/59/38/7028d3be540f1dcdf41660a2b01d0c51d2cb73915fe370d84e4d277a6d47/torch-2.12.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ef81f503912effea2ce3d9b12a2e3a6ed488943e91271c90c7a829f60baf6aa2", size = 87975425, upload-time = "2026-06-17T21:08:34.094Z" },
2596
+ { url = "https://files.pythonhosted.org/packages/5a/e3/750b3e3548635ceac03ba255daa26dbc7ed66ca3484dc4b4d955ab7f4501/torch-2.12.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:107df6888624bdea41508f9aeb6149d9333c737a5530ceecb56c904e811369ae", size = 426379894, upload-time = "2026-06-17T21:06:55.077Z" },
2597
+ { url = "https://files.pythonhosted.org/packages/dc/ca/ed24783da629ff3e640ba3f70a7639e9045d3d88b93ee6bc47b8a28a1f2c/torch-2.12.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:6e29e7e74d05bda7d955c75e99459f878ebd970ef851b4057edbd3b34a5eb4a3", size = 532169264, upload-time = "2026-06-17T21:08:17.65Z" },
2598
+ { url = "https://files.pythonhosted.org/packages/46/61/c63f0158446f3a98ea672b004d761b848911eba567ea4a624c7db5aadc04/torch-2.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:a513506cfda3c1c78dabeb6574c1597538c0254b3d39af174dde35d8177f4ce3", size = 122953086, upload-time = "2026-06-17T21:08:27.69Z" },
2599
+ { url = "https://files.pythonhosted.org/packages/f0/54/efb7ebca77970012b0cc21687a55d70eb2ba514b2c2b8e18d9fb1222f3be/torch-2.12.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:d2dd0f2c5f7ccbddaf34cade0deaf476808368f902b9cdb7f36a2ab42301bc0e", size = 87991951, upload-time = "2026-06-17T21:07:49.309Z" },
2600
+ { url = "https://files.pythonhosted.org/packages/1e/00/4210d76ca7424981f04033ebe7e48816ab83287a62538747a58825db770c/torch-2.12.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2de4e19b88a481482c6c75291f2d6a52eda3ce51f311b29aa9b68499c830c07c", size = 426382721, upload-time = "2026-06-17T21:06:41.842Z" },
2601
+ { url = "https://files.pythonhosted.org/packages/76/1f/bc9f5a5aa569307076365f25afcebacb22e9c754b1bcfbaaa146627c7fda/torch-2.12.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:649e4ced014ba646f76f8cb9c9726735a6323eb321b7919f942790a923f90921", size = 532261322, upload-time = "2026-06-17T21:06:06.673Z" },
2602
+ { url = "https://files.pythonhosted.org/packages/9e/49/c549461daa008159d006a76a991fbc2f26fa8bac27a4030c858463dcb20f/torch-2.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:e86550597877fb272ddc52db2f85b82cb601ea7bd932576a0340152cae2200b3", size = 122988095, upload-time = "2026-06-17T21:07:44.9Z" },
2603
+ { url = "https://files.pythonhosted.org/packages/ff/4a/0300261818e1560d72cc160ac826005507e8b7ca0a35788b591436d05b4a/torch-2.12.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:c75e93173c700bccd6bfcc4a9d19ce242ab6dacd1f1781483027a16239b9e650", size = 87992358, upload-time = "2026-06-17T21:07:40.299Z" },
2604
+ { url = "https://files.pythonhosted.org/packages/30/a7/874a5ca05e8f159211dca7921060f7057acc1adb26431e119fd150623efc/torch-2.12.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:fcb61ccd20784b62bdd78ec84238a5cfb383b4994902e03bac95505ab360884c", size = 426386134, upload-time = "2026-06-17T21:07:31.481Z" },
2605
+ { url = "https://files.pythonhosted.org/packages/e1/75/20bb8fe9c1ad6538cce8cd0391b51927ae5af0b17ed1eab44b8824465dc1/torch-2.12.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f4afc8083dff08719edbea346644476e3cec0cf40ebe256be0ee5d5b7c7e8c0d", size = 532268019, upload-time = "2026-06-17T21:05:37.925Z" },
2606
+ { url = "https://files.pythonhosted.org/packages/d1/fa/824ddb662af55b2eabc0dbb7b57c7c0b1bcd93693754a2b8509ec4d16490/torch-2.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:f92609e3b3ce72f25e2eb780d043ced2480c1a86c47c852604fc7a9108648386", size = 122987777, upload-time = "2026-06-17T21:07:09.49Z" },
2607
+ { url = "https://files.pythonhosted.org/packages/63/b7/1b49fe7086ea36839cc80abc43174c43d0ab6f676c0891c871c162f44fe3/torch-2.12.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e9b6f7d2dd66ea87a3ae620069d31335d594c06effb1a383bdd21cfe61e44ece", size = 88010025, upload-time = "2026-06-17T21:07:03.934Z" },
2608
+ { url = "https://files.pythonhosted.org/packages/d7/06/5b44063a6545036dcc680d2d303b137d9176cfb2cc1e1863e3ef94abeb52/torch-2.12.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:7973ccd3d2cd35c74449213f7bded199bec6c6247e705cbeda7407af79703d91", size = 426392891, upload-time = "2026-06-17T21:05:52.261Z" },
2609
+ { url = "https://files.pythonhosted.org/packages/f8/dd/c9ce9a4b0eb3c5bb92d9ea56766e2c22559f0b45171149188494edcce80f/torch-2.12.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:c64ac4aac16be5e296dcd912305605804b203333c690bf98c55bc09494ee92ad", size = 532272494, upload-time = "2026-06-17T21:06:22.72Z" },
2610
+ { url = "https://files.pythonhosted.org/packages/21/7c/f3a601fc1b1f663ff269bfe553654e638651939aa6563e8daa7167c33098/torch-2.12.1-cp314-cp314-win_amd64.whl", hash = "sha256:f6dc4caf7eb4adb38a2d9f536b51db56310fdd1254e69a2d96767e1367c892b3", size = 122987254, upload-time = "2026-06-17T21:06:33.199Z" },
2611
+ { url = "https://files.pythonhosted.org/packages/e6/8c/b8087556cf81ddd808dbeb34afb8396d7ae7a1694ab489f08b1a0004e7d0/torch-2.12.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:2afbb2bdaa8a95040e733f05492ddf133c3967c9b7ce0abd218d704b6cab437d", size = 88303173, upload-time = "2026-06-17T21:05:06.603Z" },
2612
+ { url = "https://files.pythonhosted.org/packages/4a/07/fe09d1699fbed2afa10ebc692ff2b99d113f2605b6748cea633989e2789a/torch-2.12.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:97eba061fcb042fed191400b15568990073d67eaacaa6ee9b7ca01dd8b790fe9", size = 426404009, upload-time = "2026-06-17T21:04:57.557Z" },
2613
+ { url = "https://files.pythonhosted.org/packages/2e/f7/0ce4f6c1962c60ded7270e0a9eb560fb615c92b89d332cf9e3dff36d5ecc/torch-2.12.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:3867b861391701012adb2df93360efb88494dca245a185e3bb7624495cfe3f33", size = 532184292, upload-time = "2026-06-17T21:05:17.526Z" },
2614
+ { url = "https://files.pythonhosted.org/packages/70/db/e384c12aba30320ca92aaaf557456cbcb26f04b4df307728bb8f019f5000/torch-2.12.1-cp314-cp314t-win_amd64.whl", hash = "sha256:dd15595f8fc764cffde8c6361a3beb6ef69a028c851b1b3e70e077f615980d4e", size = 123231142, upload-time = "2026-06-17T21:05:27.061Z" },
2615
  ]
2616
 
2617
  [[package]]
 
2626
  { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" },
2627
  ]
2628
 
2629
+ [[package]]
2630
+ name = "transformers"
2631
+ version = "5.12.1"
2632
+ source = { registry = "https://pypi.org/simple" }
2633
+ dependencies = [
2634
+ { name = "huggingface-hub" },
2635
+ { name = "numpy" },
2636
+ { name = "packaging" },
2637
+ { name = "pyyaml" },
2638
+ { name = "regex" },
2639
+ { name = "safetensors" },
2640
+ { name = "tokenizers" },
2641
+ { name = "tqdm" },
2642
+ { name = "typer" },
2643
+ ]
2644
+ sdist = { url = "https://files.pythonhosted.org/packages/aa/7c/8240f612819718100a9346dc28dea6a11370c3ca9c8c6eabadd3dea4ef29/transformers-5.12.1.tar.gz", hash = "sha256:679ee731c8225347889ad4fb3b2c926a62e9da3b7d284e9d12c791da7272466b", size = 8924054, upload-time = "2026-06-15T17:27:50.604Z" }
2645
+ wheels = [
2646
+ { url = "https://files.pythonhosted.org/packages/df/56/bbd60dd8668055803bf8ba55a81f9b8a8b31497f620109a9671d26a2076d/transformers-5.12.1-py3-none-any.whl", hash = "sha256:2a5e109d2021265df7098ffbb738295acaf5ad256f12cbc586db2ea4dcbb1a8a", size = 11150587, upload-time = "2026-06-15T17:27:46.679Z" },
2647
+ ]
2648
+
2649
+ [[package]]
2650
+ name = "triton"
2651
+ version = "3.7.1"
2652
+ source = { registry = "https://pypi.org/simple" }
2653
+ wheels = [
2654
+ { url = "https://files.pythonhosted.org/packages/7b/f9/19d842d06a08559534fa1eaab6ca551b1bcf40f06620bddec1babaa2772d/triton-3.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4a0e1cd4c4a76370ed74a8432a53cea28716827d19e40ffc732233e35ceb3f6", size = 184664887, upload-time = "2026-06-17T20:03:42.913Z" },
2655
+ { url = "https://files.pythonhosted.org/packages/cd/5e/fce69606f7f240297f163e25539906732b199530d486ce67ae319877e821/triton-3.7.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6744957e9fd610a29680ec2346057d0c86948ed3812468670719f391e94b44a5", size = 197701306, upload-time = "2026-06-17T19:53:13.673Z" },
2656
+ { url = "https://files.pythonhosted.org/packages/94/fa/f856e24deb462d5f18bd4b5a746957862ab9b6ee5834bda60605ec348366/triton-3.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9497f2e696ee368862a181a90b2dcc03ca978cc4f602abd67c7d81022a6988e1", size = 184692359, upload-time = "2026-06-17T20:03:48.288Z" },
2657
+ { url = "https://files.pythonhosted.org/packages/c4/6f/fb96d15db6f36d6eae4cafb998c2e0353bf59d7c4ea1662d7497f269134a/triton-3.7.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e40869937a68206ec70d7f25bb7ec6433cb083f9135e1f36dbd318dc449a728", size = 197719725, upload-time = "2026-06-17T19:53:20.419Z" },
2658
+ { url = "https://files.pythonhosted.org/packages/00/42/c5089d4d9327fcd1e862c599cc2927f39418f84dd11a84cb2ccff9d4787a/triton-3.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdbfc09d9ec58bc5e68321525653220de7515c199e7a8097a97c85e62b52cd0a", size = 184694629, upload-time = "2026-06-17T20:03:53.444Z" },
2659
+ { url = "https://files.pythonhosted.org/packages/07/42/2c3ac59253ae8892b6f307875263dd23dc875cdf732d3aea40d6d41fb7cb/triton-3.7.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58c0e131da05134a2a4788ccbcc0c1105cf0f54c8e98f19e34cd465396dc15eb", size = 197729241, upload-time = "2026-06-17T19:53:27.801Z" },
2660
+ { url = "https://files.pythonhosted.org/packages/40/71/e01aa7ad573883ed9456f130226babdec70b005e098c4d6226a6238e761b/triton-3.7.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe4ea396a06171f1f1f58cbd39c70b09294398f7dd7c620939bab54ad6f934fa", size = 184705764, upload-time = "2026-06-17T20:03:59.064Z" },
2661
+ { url = "https://files.pythonhosted.org/packages/a4/09/5683146fda6a2b569deb78ccfd8fbfea8bfe55f726b081c0a6bb18dd6f28/triton-3.7.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2020153b08280415ec0da6607834e79166442147e78e144df06b508c75b186d2", size = 197729537, upload-time = "2026-06-17T19:53:35.516Z" },
2662
+ { url = "https://files.pythonhosted.org/packages/e9/f8/448220c3092019f9fdfab39ec47985968181d67da34b44f6a7f6280a5cbb/triton-3.7.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c58e4c61f0c73b5dba3b5d19b4a7093c32f90dc18b2a7f121a7c16ccd31107b7", size = 184814760, upload-time = "2026-06-17T20:04:04.984Z" },
2663
+ { url = "https://files.pythonhosted.org/packages/f0/ac/229b7d4589d2e5937310e72c6d46e89599d16a4a12b479ffa1499fee8eb8/triton-3.7.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10ba85fa2cca4a2fbdeb36bf1cb082f2c252bda55bf9fccd74f65ec5bc647e68", size = 197824404, upload-time = "2026-06-17T19:53:42.772Z" },
2664
+ ]
2665
+
2666
  [[package]]
2667
  name = "typer"
2668
  version = "0.25.1"