shivXy commited on
Commit
63f90fa
·
1 Parent(s): 480bba3

updated ragas

Browse files
Files changed (3) hide show
  1. app.py +55 -8
  2. pyproject.toml +1 -0
  3. uv.lock +223 -0
app.py CHANGED
@@ -10,8 +10,11 @@ from langchain_core.messages import HumanMessage
10
  from langgraph.graph.message import add_messages
11
  from qdrant_client import QdrantClient
12
  from langchain_openai import OpenAIEmbeddings
13
-
14
  import os
 
 
 
 
15
 
16
  load_dotenv()
17
 
@@ -20,7 +23,6 @@ llm = ChatOpenAI(model="gpt-4o-mini")
20
  qd_api_key = os.getenv("QDRANT_CLOUD_API_KEY")
21
 
22
 
23
-
24
  embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
25
 
26
  # ✅ Initialize Qdrant Client
@@ -57,6 +59,47 @@ def search(query_vector, top_k=1) -> list:
57
 
58
  return return_hits
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  def get_document_by_name(doc_name: str) -> str:
61
  """Retrieve the raw HTML content of a document by its name from the `data/` folder."""
62
 
@@ -138,30 +181,34 @@ format_prompt = ChatPromptTemplate.from_template(ot_formatted_prompt)
138
  def research_node(state) -> dict:
139
  question = state["messages"][-1].content
140
 
141
- # ✅ Convert the text question to an embedding using text-embedding-3-small
142
  query_vector = embedding_model.embed_query(question)
143
 
144
  # ✅ Query Qdrant with the vector
145
  relevant_docs = search(query_vector=query_vector, top_k=1)
146
 
147
- if relevant_docs[0]["score"] > 0:
 
 
 
148
  # ✅ Found relevant document → Summarize it
149
- # we will pull our document data from a html file since HF will not let me upload pdfs
150
  document_name = relevant_docs[0]["metadata"].get("document_name", "No source available.")
151
  document_text = get_document_by_name(document_name)
152
- #document_text = relevant_docs[0]["metadata"].get("content", "No content available.")
153
  messages = summary_prompt.format_messages(document=document_text)
154
  response = llm.invoke(messages)
155
 
156
  return {**state, "messages": state["messages"] + [HumanMessage(content=response.content)], "_next": "post_processing"}
157
-
158
  else:
159
- # ✅ No relevant document → Query LLM with full prompt
 
160
  messages = rag_prompt.format_messages(question=question, context="No relevant documents found.")
161
  response = llm.invoke(messages)
162
 
163
  return {**state, "messages": state["messages"] + [HumanMessage(content=response.content)], "_next": "post_processing"}
164
 
 
165
  # **Post-Processing Node: Formats response using `ot_formatted_prompt`**
166
  def post_processing_node(state) -> dict:
167
  response_text = state["messages"][-1].content
 
10
  from langgraph.graph.message import add_messages
11
  from qdrant_client import QdrantClient
12
  from langchain_openai import OpenAIEmbeddings
 
13
  import os
14
+ from ragas import evaluate
15
+ from ragas.metrics import answer_relevancy
16
+ from langchain_core.documents import Document
17
+
18
 
19
  load_dotenv()
20
 
 
23
  qd_api_key = os.getenv("QDRANT_CLOUD_API_KEY")
24
 
25
 
 
26
  embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
27
 
28
  # ✅ Initialize Qdrant Client
 
59
 
60
  return return_hits
61
 
62
+ def evaluate_retrieved_docs(question: str, retrieved_docs: list):
63
+ """Evaluate the retrieved documents using RAGAS metrics."""
64
+
65
+ # ✅ Extract document content from metadata
66
+ ragas_docs = [
67
+ Document(page_content=hit["metadata"].get("content", ""))
68
+ for hit in retrieved_docs
69
+ if "content" in hit["metadata"] and hit["metadata"]["content"]
70
+ ]
71
+
72
+ # 🚨 Debugging Output
73
+ print("🔍 Debug: RAGAS Docs Format:", ragas_docs)
74
+
75
+ if not ragas_docs:
76
+ print("⚠️ No relevant documents to evaluate.")
77
+ return 0 # Return low score if no documents found
78
+
79
+ # ✅ Construct required input
80
+ queries = [question]
81
+ contexts = [[doc.page_content for doc in ragas_docs]]
82
+
83
+ print("✅ Debug: Queries ->", queries)
84
+ print("✅ Debug: Contexts ->", contexts)
85
+
86
+ # ✅ Run evaluation
87
+ scores = evaluate(
88
+ queries=queries,
89
+ contexts=contexts,
90
+ metrics=[answer_relevancy]
91
+ )
92
+
93
+ print("📊 Debug: Raw Scores Output ->", scores)
94
+
95
+ relevance_score = scores.iloc[0]["answer_relevancy"]
96
+ print(f"📊 RAGAS Answer Relevancy Score: {relevance_score}")
97
+
98
+ return relevance_score
99
+
100
+
101
+
102
+
103
  def get_document_by_name(doc_name: str) -> str:
104
  """Retrieve the raw HTML content of a document by its name from the `data/` folder."""
105
 
 
181
  def research_node(state) -> dict:
182
  question = state["messages"][-1].content
183
 
184
+ # ✅ Convert the text question to an embedding using OpenAI Embeddings
185
  query_vector = embedding_model.embed_query(question)
186
 
187
  # ✅ Query Qdrant with the vector
188
  relevant_docs = search(query_vector=query_vector, top_k=1)
189
 
190
+ # Evaluate retrieved documents using RAGAS
191
+ relevance_score = evaluate_retrieved_docs(question, relevant_docs)
192
+
193
+ if relevance_score > 0.5: # Threshold for good retrieval quality
194
  # ✅ Found relevant document → Summarize it
 
195
  document_name = relevant_docs[0]["metadata"].get("document_name", "No source available.")
196
  document_text = get_document_by_name(document_name)
197
+
198
  messages = summary_prompt.format_messages(document=document_text)
199
  response = llm.invoke(messages)
200
 
201
  return {**state, "messages": state["messages"] + [HumanMessage(content=response.content)], "_next": "post_processing"}
202
+
203
  else:
204
+ # ✅ No relevant document or low RAGAS score → Query LLM directly
205
+ print("⚠️ RAGAS score too low, defaulting to LLM.")
206
  messages = rag_prompt.format_messages(question=question, context="No relevant documents found.")
207
  response = llm.invoke(messages)
208
 
209
  return {**state, "messages": state["messages"] + [HumanMessage(content=response.content)], "_next": "post_processing"}
210
 
211
+
212
  # **Post-Processing Node: Formats response using `ot_formatted_prompt`**
213
  def post_processing_node(state) -> dict:
214
  response_text = state["messages"][-1].content
pyproject.toml CHANGED
@@ -13,6 +13,7 @@ dependencies = [
13
  "langgraph>=0.2.74",
14
  "nltk>=3.9.1",
15
  "qdrant-client>=1.13.2",
 
16
  "unstructured>=0.14.8",
17
  "websockets>=15.0",
18
  ]
 
13
  "langgraph>=0.2.74",
14
  "nltk>=3.9.1",
15
  "qdrant-client>=1.13.2",
16
+ "ragas>=0.2.13",
17
  "unstructured>=0.14.8",
18
  "websockets>=15.0",
19
  ]
uv.lock CHANGED
@@ -86,6 +86,15 @@ wheels = [
86
  { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
87
  ]
88
 
 
 
 
 
 
 
 
 
 
89
  [[package]]
90
  name = "asyncer"
91
  version = "0.0.7"
@@ -311,6 +320,31 @@ wheels = [
311
  { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 },
312
  ]
313
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
314
  [[package]]
315
  name = "deepdiff"
316
  version = "8.2.0"
@@ -335,6 +369,24 @@ wheels = [
335
  { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 },
336
  ]
337
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338
  [[package]]
339
  name = "distro"
340
  version = "1.9.0"
@@ -367,6 +419,15 @@ wheels = [
367
  { url = "https://files.pythonhosted.org/packages/8f/7d/2d6ce181d7a5f51dedb8c06206cbf0ec026a99bf145edd309f9e17c3282f/fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf", size = 94814 },
368
  ]
369
 
 
 
 
 
 
 
 
 
 
370
  [[package]]
371
  name = "filetype"
372
  version = "1.2.0"
@@ -400,6 +461,20 @@ wheels = [
400
  { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 },
401
  ]
402
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
  [[package]]
404
  name = "googleapis-common-protos"
405
  version = "1.68.0"
@@ -548,6 +623,24 @@ wheels = [
548
  { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 },
549
  ]
550
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
551
  [[package]]
552
  name = "hyperframe"
553
  version = "6.1.0"
@@ -910,6 +1003,22 @@ wheels = [
910
  { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 },
911
  ]
912
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
913
  [[package]]
914
  name = "mypy-extensions"
915
  version = "1.0.0"
@@ -1161,6 +1270,7 @@ dependencies = [
1161
  { name = "langgraph" },
1162
  { name = "nltk" },
1163
  { name = "qdrant-client" },
 
1164
  { name = "unstructured" },
1165
  { name = "websockets" },
1166
  ]
@@ -1175,6 +1285,7 @@ requires-dist = [
1175
  { name = "langgraph", specifier = ">=0.2.74" },
1176
  { name = "nltk", specifier = ">=3.9.1" },
1177
  { name = "qdrant-client", specifier = ">=1.13.2" },
 
1178
  { name = "unstructured", specifier = ">=0.14.8" },
1179
  { name = "websockets", specifier = ">=15.0" },
1180
  ]
@@ -1188,6 +1299,33 @@ wheels = [
1188
  { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
1189
  ]
1190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1191
  [[package]]
1192
  name = "portalocker"
1193
  version = "2.10.1"
@@ -1255,6 +1393,27 @@ wheels = [
1255
  { url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 },
1256
  ]
1257
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1258
  [[package]]
1259
  name = "pycparser"
1260
  version = "2.22"
@@ -1407,6 +1566,15 @@ wheels = [
1407
  { url = "https://files.pythonhosted.org/packages/8a/a3/c69806f30dd81df5a99d592e7db4c930c3a9b098555aa97b0eb866b20b11/python_socketio-5.12.1-py3-none-any.whl", hash = "sha256:24a0ea7cfff0e021eb28c68edbf7914ee4111bdf030b95e4d250c4dc9af7a386", size = 76947 },
1408
  ]
1409
 
 
 
 
 
 
 
 
 
 
1410
  [[package]]
1411
  name = "pywin32"
1412
  version = "308"
@@ -1452,6 +1620,29 @@ wheels = [
1452
  { url = "https://files.pythonhosted.org/packages/5f/26/89ebaee5fcbd99bf1c0a627a9447b440118b2d31dea423d074cb0481be5c/qdrant_client-1.13.2-py3-none-any.whl", hash = "sha256:db97e759bd3f8d483a383984ba4c2a158eef56f2188d83df7771591d43de2201", size = 306637 },
1453
  ]
1454
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1455
  [[package]]
1456
  name = "rapidfuzz"
1457
  version = "3.12.1"
@@ -1701,6 +1892,15 @@ wheels = [
1701
  { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 },
1702
  ]
1703
 
 
 
 
 
 
 
 
 
 
1704
  [[package]]
1705
  name = "unstructured"
1706
  version = "0.14.8"
@@ -1886,6 +2086,29 @@ wheels = [
1886
  { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 },
1887
  ]
1888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1889
  [[package]]
1890
  name = "yarl"
1891
  version = "1.18.3"
 
86
  { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
87
  ]
88
 
89
+ [[package]]
90
+ name = "appdirs"
91
+ version = "1.4.4"
92
+ source = { registry = "https://pypi.org/simple" }
93
+ sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 }
94
+ wheels = [
95
+ { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 },
96
+ ]
97
+
98
  [[package]]
99
  name = "asyncer"
100
  version = "0.0.7"
 
320
  { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 },
321
  ]
322
 
323
+ [[package]]
324
+ name = "datasets"
325
+ version = "3.3.2"
326
+ source = { registry = "https://pypi.org/simple" }
327
+ dependencies = [
328
+ { name = "aiohttp" },
329
+ { name = "dill" },
330
+ { name = "filelock" },
331
+ { name = "fsspec", extra = ["http"] },
332
+ { name = "huggingface-hub" },
333
+ { name = "multiprocess" },
334
+ { name = "numpy" },
335
+ { name = "packaging" },
336
+ { name = "pandas" },
337
+ { name = "pyarrow" },
338
+ { name = "pyyaml" },
339
+ { name = "requests" },
340
+ { name = "tqdm" },
341
+ { name = "xxhash" },
342
+ ]
343
+ sdist = { url = "https://files.pythonhosted.org/packages/73/0c/dc3d172104e78e68f7a60386664adbf61db5d10c2246b31ddad06c2d1cb3/datasets-3.3.2.tar.gz", hash = "sha256:20901a97da870fb80b407ccc45f034a7ac99accd07da897ed42f11641bdb8c6e", size = 564352 }
344
+ wheels = [
345
+ { url = "https://files.pythonhosted.org/packages/4c/37/22ef7675bef4ffe9577b937ddca2e22791534cbbe11c30714972a91532dc/datasets-3.3.2-py3-none-any.whl", hash = "sha256:fdaf3d5d70242621210b044e9b9b15a56e908bfc3e9d077bcf5605ac390f70bd", size = 485360 },
346
+ ]
347
+
348
  [[package]]
349
  name = "deepdiff"
350
  version = "8.2.0"
 
369
  { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 },
370
  ]
371
 
372
+ [[package]]
373
+ name = "dill"
374
+ version = "0.3.8"
375
+ source = { registry = "https://pypi.org/simple" }
376
+ sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847 }
377
+ wheels = [
378
+ { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 },
379
+ ]
380
+
381
+ [[package]]
382
+ name = "diskcache"
383
+ version = "5.6.3"
384
+ source = { registry = "https://pypi.org/simple" }
385
+ sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916 }
386
+ wheels = [
387
+ { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550 },
388
+ ]
389
+
390
  [[package]]
391
  name = "distro"
392
  version = "1.9.0"
 
419
  { url = "https://files.pythonhosted.org/packages/8f/7d/2d6ce181d7a5f51dedb8c06206cbf0ec026a99bf145edd309f9e17c3282f/fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf", size = 94814 },
420
  ]
421
 
422
+ [[package]]
423
+ name = "filelock"
424
+ version = "3.17.0"
425
+ source = { registry = "https://pypi.org/simple" }
426
+ sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 }
427
+ wheels = [
428
+ { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 },
429
+ ]
430
+
431
  [[package]]
432
  name = "filetype"
433
  version = "1.2.0"
 
461
  { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 },
462
  ]
463
 
464
+ [[package]]
465
+ name = "fsspec"
466
+ version = "2024.12.0"
467
+ source = { registry = "https://pypi.org/simple" }
468
+ sdist = { url = "https://files.pythonhosted.org/packages/ee/11/de70dee31455c546fbc88301971ec03c328f3d1138cfba14263f651e9551/fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", size = 291600 }
469
+ wheels = [
470
+ { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862 },
471
+ ]
472
+
473
+ [package.optional-dependencies]
474
+ http = [
475
+ { name = "aiohttp" },
476
+ ]
477
+
478
  [[package]]
479
  name = "googleapis-common-protos"
480
  version = "1.68.0"
 
623
  { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 },
624
  ]
625
 
626
+ [[package]]
627
+ name = "huggingface-hub"
628
+ version = "0.29.1"
629
+ source = { registry = "https://pypi.org/simple" }
630
+ dependencies = [
631
+ { name = "filelock" },
632
+ { name = "fsspec" },
633
+ { name = "packaging" },
634
+ { name = "pyyaml" },
635
+ { name = "requests" },
636
+ { name = "tqdm" },
637
+ { name = "typing-extensions" },
638
+ ]
639
+ sdist = { url = "https://files.pythonhosted.org/packages/22/37/797d6476f13e5ef6af5fc48a5d641d32b39c37e166ccf40c3714c5854a85/huggingface_hub-0.29.1.tar.gz", hash = "sha256:9524eae42077b8ff4fc459ceb7a514eca1c1232b775276b009709fe2a084f250", size = 389776 }
640
+ wheels = [
641
+ { url = "https://files.pythonhosted.org/packages/ae/05/75b90de9093de0aadafc868bb2fa7c57651fd8f45384adf39bd77f63980d/huggingface_hub-0.29.1-py3-none-any.whl", hash = "sha256:352f69caf16566c7b6de84b54a822f6238e17ddd8ae3da4f8f2272aea5b198d5", size = 468049 },
642
+ ]
643
+
644
  [[package]]
645
  name = "hyperframe"
646
  version = "6.1.0"
 
1003
  { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 },
1004
  ]
1005
 
1006
+ [[package]]
1007
+ name = "multiprocess"
1008
+ version = "0.70.16"
1009
+ source = { registry = "https://pypi.org/simple" }
1010
+ dependencies = [
1011
+ { name = "dill" },
1012
+ ]
1013
+ sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603 }
1014
+ wheels = [
1015
+ { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824 },
1016
+ { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519 },
1017
+ { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741 },
1018
+ { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628 },
1019
+ { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351 },
1020
+ ]
1021
+
1022
  [[package]]
1023
  name = "mypy-extensions"
1024
  version = "1.0.0"
 
1270
  { name = "langgraph" },
1271
  { name = "nltk" },
1272
  { name = "qdrant-client" },
1273
+ { name = "ragas" },
1274
  { name = "unstructured" },
1275
  { name = "websockets" },
1276
  ]
 
1285
  { name = "langgraph", specifier = ">=0.2.74" },
1286
  { name = "nltk", specifier = ">=3.9.1" },
1287
  { name = "qdrant-client", specifier = ">=1.13.2" },
1288
+ { name = "ragas", specifier = ">=0.2.13" },
1289
  { name = "unstructured", specifier = ">=0.14.8" },
1290
  { name = "websockets", specifier = ">=15.0" },
1291
  ]
 
1299
  { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
1300
  ]
1301
 
1302
+ [[package]]
1303
+ name = "pandas"
1304
+ version = "2.2.3"
1305
+ source = { registry = "https://pypi.org/simple" }
1306
+ dependencies = [
1307
+ { name = "numpy" },
1308
+ { name = "python-dateutil" },
1309
+ { name = "pytz" },
1310
+ { name = "tzdata" },
1311
+ ]
1312
+ sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 }
1313
+ wheels = [
1314
+ { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 },
1315
+ { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 },
1316
+ { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 },
1317
+ { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 },
1318
+ { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 },
1319
+ { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 },
1320
+ { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 },
1321
+ { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 },
1322
+ { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 },
1323
+ { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 },
1324
+ { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 },
1325
+ { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 },
1326
+ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
1327
+ ]
1328
+
1329
  [[package]]
1330
  name = "portalocker"
1331
  version = "2.10.1"
 
1393
  { url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 },
1394
  ]
1395
 
1396
+ [[package]]
1397
+ name = "pyarrow"
1398
+ version = "19.0.1"
1399
+ source = { registry = "https://pypi.org/simple" }
1400
+ sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437 }
1401
+ wheels = [
1402
+ { url = "https://files.pythonhosted.org/packages/2b/8d/275c58d4b00781bd36579501a259eacc5c6dfb369be4ddeb672ceb551d2d/pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", size = 30653552 },
1403
+ { url = "https://files.pythonhosted.org/packages/a0/9e/e6aca5cc4ef0c7aec5f8db93feb0bde08dbad8c56b9014216205d271101b/pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", size = 32103413 },
1404
+ { url = "https://files.pythonhosted.org/packages/6a/fa/a7033f66e5d4f1308c7eb0dfcd2ccd70f881724eb6fd1776657fdf65458f/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", size = 41134869 },
1405
+ { url = "https://files.pythonhosted.org/packages/2d/92/34d2569be8e7abdc9d145c98dc410db0071ac579b92ebc30da35f500d630/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", size = 42192626 },
1406
+ { url = "https://files.pythonhosted.org/packages/0a/1f/80c617b1084fc833804dc3309aa9d8daacd46f9ec8d736df733f15aebe2c/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", size = 40496708 },
1407
+ { url = "https://files.pythonhosted.org/packages/e6/90/83698fcecf939a611c8d9a78e38e7fed7792dcc4317e29e72cf8135526fb/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", size = 42075728 },
1408
+ { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568 },
1409
+ { url = "https://files.pythonhosted.org/packages/3f/72/135088d995a759d4d916ec4824cb19e066585b4909ebad4ab196177aa825/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", size = 30702371 },
1410
+ { url = "https://files.pythonhosted.org/packages/2e/01/00beeebd33d6bac701f20816a29d2018eba463616bbc07397fdf99ac4ce3/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", size = 32116046 },
1411
+ { url = "https://files.pythonhosted.org/packages/1f/c9/23b1ea718dfe967cbd986d16cf2a31fe59d015874258baae16d7ea0ccabc/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", size = 41091183 },
1412
+ { url = "https://files.pythonhosted.org/packages/3a/d4/b4a3aa781a2c715520aa8ab4fe2e7fa49d33a1d4e71c8fc6ab7b5de7a3f8/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", size = 42171896 },
1413
+ { url = "https://files.pythonhosted.org/packages/23/1b/716d4cd5a3cbc387c6e6745d2704c4b46654ba2668260d25c402626c5ddb/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", size = 40464851 },
1414
+ { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744 },
1415
+ ]
1416
+
1417
  [[package]]
1418
  name = "pycparser"
1419
  version = "2.22"
 
1566
  { url = "https://files.pythonhosted.org/packages/8a/a3/c69806f30dd81df5a99d592e7db4c930c3a9b098555aa97b0eb866b20b11/python_socketio-5.12.1-py3-none-any.whl", hash = "sha256:24a0ea7cfff0e021eb28c68edbf7914ee4111bdf030b95e4d250c4dc9af7a386", size = 76947 },
1567
  ]
1568
 
1569
+ [[package]]
1570
+ name = "pytz"
1571
+ version = "2025.1"
1572
+ source = { registry = "https://pypi.org/simple" }
1573
+ sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617 }
1574
+ wheels = [
1575
+ { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 },
1576
+ ]
1577
+
1578
  [[package]]
1579
  name = "pywin32"
1580
  version = "308"
 
1620
  { url = "https://files.pythonhosted.org/packages/5f/26/89ebaee5fcbd99bf1c0a627a9447b440118b2d31dea423d074cb0481be5c/qdrant_client-1.13.2-py3-none-any.whl", hash = "sha256:db97e759bd3f8d483a383984ba4c2a158eef56f2188d83df7771591d43de2201", size = 306637 },
1621
  ]
1622
 
1623
+ [[package]]
1624
+ name = "ragas"
1625
+ version = "0.2.13"
1626
+ source = { registry = "https://pypi.org/simple" }
1627
+ dependencies = [
1628
+ { name = "appdirs" },
1629
+ { name = "datasets" },
1630
+ { name = "diskcache" },
1631
+ { name = "langchain" },
1632
+ { name = "langchain-community" },
1633
+ { name = "langchain-core" },
1634
+ { name = "langchain-openai" },
1635
+ { name = "nest-asyncio" },
1636
+ { name = "numpy" },
1637
+ { name = "openai" },
1638
+ { name = "pydantic" },
1639
+ { name = "tiktoken" },
1640
+ ]
1641
+ sdist = { url = "https://files.pythonhosted.org/packages/22/db/74deba37d53752f5e1656e36df878a73bbe0b5750ad73a30906ce286931d/ragas-0.2.13.tar.gz", hash = "sha256:33ebfd8c88465c7c86e639049138e38d3d3117d03eb68c0b2c98065c4608feb5", size = 39916780 }
1642
+ wheels = [
1643
+ { url = "https://files.pythonhosted.org/packages/b6/1f/1087efbd0d0723ef8212aba2dfd035bdbcef6698623b29e6f724ad8cdcf9/ragas-0.2.13-py3-none-any.whl", hash = "sha256:0a9c4014768cb6a1d962f9348ee2ea36732a1edafdf18d884ab020f4fe2d4acc", size = 178261 },
1644
+ ]
1645
+
1646
  [[package]]
1647
  name = "rapidfuzz"
1648
  version = "3.12.1"
 
1892
  { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 },
1893
  ]
1894
 
1895
+ [[package]]
1896
+ name = "tzdata"
1897
+ version = "2025.1"
1898
+ source = { registry = "https://pypi.org/simple" }
1899
+ sdist = { url = "https://files.pythonhosted.org/packages/43/0f/fa4723f22942480be4ca9527bbde8d43f6c3f2fe8412f00e7f5f6746bc8b/tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694", size = 194950 }
1900
+ wheels = [
1901
+ { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 },
1902
+ ]
1903
+
1904
  [[package]]
1905
  name = "unstructured"
1906
  version = "0.14.8"
 
2086
  { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 },
2087
  ]
2088
 
2089
+ [[package]]
2090
+ name = "xxhash"
2091
+ version = "3.5.0"
2092
+ source = { registry = "https://pypi.org/simple" }
2093
+ sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241 }
2094
+ wheels = [
2095
+ { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795 },
2096
+ { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792 },
2097
+ { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950 },
2098
+ { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980 },
2099
+ { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324 },
2100
+ { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370 },
2101
+ { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911 },
2102
+ { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352 },
2103
+ { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410 },
2104
+ { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322 },
2105
+ { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725 },
2106
+ { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070 },
2107
+ { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172 },
2108
+ { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041 },
2109
+ { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801 },
2110
+ ]
2111
+
2112
  [[package]]
2113
  name = "yarl"
2114
  version = "1.18.3"