philocifer commited on
Commit
4029738
·
1 Parent(s): 4c1e615

Added RAGAS evaluation

Browse files
Files changed (9) hide show
  1. README.md +21 -0
  2. app.py +2 -2
  3. data/competitor_store_200.json +0 -0
  4. pyproject.toml +2 -0
  5. rag_agent.py +4 -3
  6. ragas_eval.py +43 -0
  7. sql_agent.py +2 -2
  8. synthetic_data_gen.py +31 -0
  9. uv.lock +170 -3
README.md CHANGED
@@ -35,4 +35,25 @@ Our business devlopment team purchased competitor data from a vendor that specia
35
  When generating semantic content from the structured data, I put a seperator ("="*80) between the store entries, which I used for chunking, making each store a chunk (all are under 1000 tokens). I found this to be effective, particularly with summarization, but is unable to handle query's like "How many stores are in Florida?", which the SQL agent handles with ease.
36
 
37
  For creating store profiles, I used US Census Bureau's API service to get vast array of demographic data. There are many business profiling API providers, but I did not want to incurr those costs for this prototype project. Unfortunately there are many gaps in the free census data, so the resulting profiles are generally not useful... but it shows that this approach does work.
 
 
 
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  When generating semantic content from the structured data, I put a seperator ("="*80) between the store entries, which I used for chunking, making each store a chunk (all are under 1000 tokens). I found this to be effective, particularly with summarization, but is unable to handle query's like "How many stores are in Florida?", which the SQL agent handles with ease.
36
 
37
  For creating store profiles, I used US Census Bureau's API service to get vast array of demographic data. There are many business profiling API providers, but I did not want to incurr those costs for this prototype project. Unfortunately there are many gaps in the free census data, so the resulting profiles are generally not useful... but it shows that this approach does work.
38
+ ### Ene-to-End Prototype
39
+ https://huggingface.co/spaces/philocifer/banner_flip_engine_prototype
40
+ ### Golden Test Dataset
41
 
42
+ | Metric | Score |
43
+ |-----------------------------|---------|
44
+ | Context Recall | 0.7867 |
45
+ | Faithfulness | 0.8726 |
46
+ | Factual Correctness | 0.5185 |
47
+ | Answer Relevancy | 0.9069 |
48
+ | Context Entity Recall | 0.4353 |
49
+ | Noise Sensitivity Relevant | 0.5952 |
50
+
51
+ Strengths:
52
+ 1. High Answer Relevancy (0.9069) - Responses stay focused on user queries
53
+ 2. Strong Faithfulness (0.8726) - Answers remain grounded in provided context
54
+ 3. Good Context Recall (0.7867) - Retrieves most relevant context chunks
55
+
56
+ Weaknesses:
57
+ 1. Low Factual Correctness (0.5185) - Generated answers contain factual errors despite good context
58
+ 2. Poor Entity Recall (0.4353) - Struggles to identify/store key entities (store names, locations)
59
+ 3. Noise Sensitivity (0.5952) - Vulnerable to irrelevant/conflicting information
app.py CHANGED
@@ -7,7 +7,7 @@ from typing import Annotated, TypedDict, List
7
  from langchain_core.messages import HumanMessage
8
  import os
9
  from dotenv import load_dotenv
10
- # from sql_agent import sql_agent_tool
11
  from rag_agent import rag_agent_tool
12
  from profile_agent import profile_agent_tool
13
  from langgraph.graph.message import add_messages
@@ -20,7 +20,7 @@ def load_app():
20
  tivly_tool = TavilySearchResults(max_results=5)
21
 
22
  tool_belt = [
23
- # sql_agent_tool,
24
  rag_agent_tool,
25
  profile_agent_tool,
26
  tivly_tool
 
7
  from langchain_core.messages import HumanMessage
8
  import os
9
  from dotenv import load_dotenv
10
+ from sql_agent import sql_agent_tool
11
  from rag_agent import rag_agent_tool
12
  from profile_agent import profile_agent_tool
13
  from langgraph.graph.message import add_messages
 
20
  tivly_tool = TavilySearchResults(max_results=5)
21
 
22
  tool_belt = [
23
+ sql_agent_tool,
24
  rag_agent_tool,
25
  profile_agent_tool,
26
  tivly_tool
data/competitor_store_200.json ADDED
The diff for this file is too large to render. See raw diff
 
pyproject.toml CHANGED
@@ -21,6 +21,8 @@ dependencies = [
21
  "openai>=1.63.2",
22
  "pandas>=2.2.3",
23
  "python-dotenv>=1.0.1",
 
 
24
  "sentence-transformers>=3.4.1",
25
  "websockets>=15.0",
26
  ]
 
21
  "openai>=1.63.2",
22
  "pandas>=2.2.3",
23
  "python-dotenv>=1.0.1",
24
+ "ragas>=0.2.13",
25
+ "rapidfuzz>=3.12.1",
26
  "sentence-transformers>=3.4.1",
27
  "websockets>=15.0",
28
  ]
rag_agent.py CHANGED
@@ -14,7 +14,10 @@ from tqdm import tqdm
14
 
15
  load_dotenv()
16
 
17
- def load_agent():
 
 
 
18
  loader = TextLoader('data/enhanced_store_data_200.txt')
19
  docs = loader.load()
20
  text_splitter = CharacterTextSplitter(
@@ -25,8 +28,6 @@ def load_agent():
25
  )
26
  split_documents = text_splitter.split_documents(docs)
27
 
28
- embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
29
-
30
  client = QdrantClient(":memory:")
31
  client.create_collection(
32
  collection_name="competitor_stores",
 
14
 
15
  load_dotenv()
16
 
17
+ def load_agent(embeddings=None):
18
+ if embeddings is None:
19
+ embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
20
+
21
  loader = TextLoader('data/enhanced_store_data_200.txt')
22
  docs = loader.load()
23
  text_splitter = CharacterTextSplitter(
 
28
  )
29
  split_documents = text_splitter.split_documents(docs)
30
 
 
 
31
  client = QdrantClient(":memory:")
32
  client.create_collection(
33
  collection_name="competitor_stores",
ragas_eval.py ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from ragas import EvaluationDataset
2
+ from ragas import evaluate
3
+ from ragas.llms import LangchainLLMWrapper
4
+ from langchain_openai import ChatOpenAI
5
+ from dotenv import load_dotenv
6
+ from rag_agent import rag_agent
7
+ from synthetic_data_gen import generate_synthetic_data
8
+ from ragas.metrics import LLMContextRecall, Faithfulness, FactualCorrectness, ResponseRelevancy, ContextEntityRecall, NoiseSensitivity
9
+ from ragas import evaluate, RunConfig
10
+
11
+ load_dotenv()
12
+
13
+ def run_ragas_evaluation(model=None, dataset=None):
14
+ """
15
+ Evaluate the model using RAGAS.
16
+ """
17
+ if model is None:
18
+ model = rag_agent
19
+ if dataset is None:
20
+ dataset = generate_synthetic_data()
21
+
22
+ for test_row in dataset:
23
+ response = model.invoke({"question" : test_row.eval_sample.user_input})
24
+ test_row.eval_sample.response = response["response"]
25
+ test_row.eval_sample.retrieved_contexts = [context.page_content for context in response["context"]]
26
+
27
+ evaluation_dataset = EvaluationDataset.from_pandas(dataset.to_pandas())
28
+ evaluator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))
29
+
30
+ custom_run_config = RunConfig(timeout=360)
31
+
32
+ result = evaluate(
33
+ dataset=evaluation_dataset,
34
+ metrics=[LLMContextRecall(), Faithfulness(), FactualCorrectness(), ResponseRelevancy(), ContextEntityRecall(), NoiseSensitivity()],
35
+ llm=evaluator_llm,
36
+ run_config=custom_run_config
37
+ )
38
+
39
+ return result
40
+
41
+ if __name__ == "__main__":
42
+ result = run_ragas_evaluation()
43
+ print(result)
sql_agent.py CHANGED
@@ -81,7 +81,7 @@ def load_agent():
81
  )
82
 
83
  engine = sa.create_engine(
84
- "sqlite:///competitor_stores.db",
85
  poolclass=sa.pool.SingletonThreadPool
86
  )
87
 
@@ -91,7 +91,7 @@ def load_agent():
91
  # Add deterministic flag for better query optimization
92
  dbapi_connection.create_function("distance", 4, calculate_distance, deterministic=True)
93
 
94
- json_file = 'data/competitor_store_19k.json'
95
  table_name = 'competitor_stores'
96
 
97
  df = pd.read_json(json_file)
 
81
  )
82
 
83
  engine = sa.create_engine(
84
+ "sqlite:///:memory:", # Changed from file-based to in-memory database
85
  poolclass=sa.pool.SingletonThreadPool
86
  )
87
 
 
91
  # Add deterministic flag for better query optimization
92
  dbapi_connection.create_function("distance", 4, calculate_distance, deterministic=True)
93
 
94
+ json_file = 'data/competitor_store_200.json'
95
  table_name = 'competitor_stores'
96
 
97
  df = pd.read_json(json_file)
synthetic_data_gen.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain_community.document_loaders import TextLoader
2
+ from ragas.llms import LangchainLLMWrapper
3
+ from ragas.embeddings import LangchainEmbeddingsWrapper
4
+ from langchain_openai import ChatOpenAI
5
+ from langchain_openai import OpenAIEmbeddings
6
+ from ragas.testset import TestsetGenerator
7
+ from dotenv import load_dotenv
8
+
9
+ load_dotenv()
10
+
11
+ def generate_synthetic_data(testset_size=20):
12
+ """
13
+ Generate synthetic data for RAGAS evaluation.
14
+
15
+ Args:
16
+ test_size (int): Number of synthetic data entries to generate.
17
+ """
18
+ loader = TextLoader('data/enhanced_store_data_200.txt')
19
+ docs = loader.load()
20
+
21
+ generator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))
22
+ generator_embeddings = LangchainEmbeddingsWrapper(OpenAIEmbeddings())
23
+
24
+ generator = TestsetGenerator(llm=generator_llm, embedding_model=generator_embeddings)
25
+ dataset = generator.generate_with_langchain_docs(docs, testset_size=testset_size)
26
+
27
+ return dataset
28
+
29
+ if __name__ == "__main__":
30
+ dataset = generate_synthetic_data()
31
+ print(dataset.to_pandas())
uv.lock CHANGED
@@ -104,6 +104,15 @@ wheels = [
104
  { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
105
  ]
106
 
 
 
 
 
 
 
 
 
 
107
  [[package]]
108
  name = "appnope"
109
  version = "0.1.4"
@@ -164,6 +173,8 @@ dependencies = [
164
  { name = "openai" },
165
  { name = "pandas" },
166
  { name = "python-dotenv" },
 
 
167
  { name = "sentence-transformers" },
168
  { name = "websockets" },
169
  ]
@@ -186,6 +197,8 @@ requires-dist = [
186
  { name = "openai", specifier = ">=1.63.2" },
187
  { name = "pandas", specifier = ">=2.2.3" },
188
  { name = "python-dotenv", specifier = ">=1.0.1" },
 
 
189
  { name = "sentence-transformers", specifier = ">=3.4.1" },
190
  { name = "websockets", specifier = ">=15.0" },
191
  ]
@@ -340,6 +353,31 @@ wheels = [
340
  { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 },
341
  ]
342
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
343
  [[package]]
344
  name = "debugpy"
345
  version = "1.8.12"
@@ -374,6 +412,24 @@ wheels = [
374
  { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 },
375
  ]
376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
377
  [[package]]
378
  name = "distro"
379
  version = "1.9.0"
@@ -450,11 +506,16 @@ wheels = [
450
 
451
  [[package]]
452
  name = "fsspec"
453
- version = "2025.2.0"
454
  source = { registry = "https://pypi.org/simple" }
455
- sdist = { url = "https://files.pythonhosted.org/packages/b5/79/68612ed99700e6413de42895aa725463e821a6b3be75c87fcce1b4af4c70/fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd", size = 292283 }
456
  wheels = [
457
- { url = "https://files.pythonhosted.org/packages/e2/94/758680531a00d06e471ef649e4ec2ed6bf185356a7f9fbfbb7368a40bd49/fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b", size = 184484 },
 
 
 
 
 
458
  ]
459
 
460
  [[package]]
@@ -1138,6 +1199,22 @@ wheels = [
1138
  { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 },
1139
  ]
1140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1141
  [[package]]
1142
  name = "mypy-extensions"
1143
  version = "1.0.0"
@@ -1684,6 +1761,27 @@ wheels = [
1684
  { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
1685
  ]
1686
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1687
  [[package]]
1688
  name = "pycparser"
1689
  version = "2.22"
@@ -1904,6 +2002,52 @@ wheels = [
1904
  { url = "https://files.pythonhosted.org/packages/5f/26/89ebaee5fcbd99bf1c0a627a9447b440118b2d31dea423d074cb0481be5c/qdrant_client-1.13.2-py3-none-any.whl", hash = "sha256:db97e759bd3f8d483a383984ba4c2a158eef56f2188d83df7771591d43de2201", size = 306637 },
1905
  ]
1906
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1907
  [[package]]
1908
  name = "regex"
1909
  version = "2024.11.6"
@@ -2496,6 +2640,29 @@ wheels = [
2496
  { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 },
2497
  ]
2498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2499
  [[package]]
2500
  name = "yarl"
2501
  version = "1.18.3"
 
104
  { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
105
  ]
106
 
107
+ [[package]]
108
+ name = "appdirs"
109
+ version = "1.4.4"
110
+ source = { registry = "https://pypi.org/simple" }
111
+ sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 }
112
+ wheels = [
113
+ { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 },
114
+ ]
115
+
116
  [[package]]
117
  name = "appnope"
118
  version = "0.1.4"
 
173
  { name = "openai" },
174
  { name = "pandas" },
175
  { name = "python-dotenv" },
176
+ { name = "ragas" },
177
+ { name = "rapidfuzz" },
178
  { name = "sentence-transformers" },
179
  { name = "websockets" },
180
  ]
 
197
  { name = "openai", specifier = ">=1.63.2" },
198
  { name = "pandas", specifier = ">=2.2.3" },
199
  { name = "python-dotenv", specifier = ">=1.0.1" },
200
+ { name = "ragas", specifier = ">=0.2.13" },
201
+ { name = "rapidfuzz", specifier = ">=3.12.1" },
202
  { name = "sentence-transformers", specifier = ">=3.4.1" },
203
  { name = "websockets", specifier = ">=15.0" },
204
  ]
 
353
  { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 },
354
  ]
355
 
356
+ [[package]]
357
+ name = "datasets"
358
+ version = "3.3.2"
359
+ source = { registry = "https://pypi.org/simple" }
360
+ dependencies = [
361
+ { name = "aiohttp" },
362
+ { name = "dill" },
363
+ { name = "filelock" },
364
+ { name = "fsspec", extra = ["http"] },
365
+ { name = "huggingface-hub" },
366
+ { name = "multiprocess" },
367
+ { name = "numpy" },
368
+ { name = "packaging" },
369
+ { name = "pandas" },
370
+ { name = "pyarrow" },
371
+ { name = "pyyaml" },
372
+ { name = "requests" },
373
+ { name = "tqdm" },
374
+ { name = "xxhash" },
375
+ ]
376
+ sdist = { url = "https://files.pythonhosted.org/packages/73/0c/dc3d172104e78e68f7a60386664adbf61db5d10c2246b31ddad06c2d1cb3/datasets-3.3.2.tar.gz", hash = "sha256:20901a97da870fb80b407ccc45f034a7ac99accd07da897ed42f11641bdb8c6e", size = 564352 }
377
+ wheels = [
378
+ { url = "https://files.pythonhosted.org/packages/4c/37/22ef7675bef4ffe9577b937ddca2e22791534cbbe11c30714972a91532dc/datasets-3.3.2-py3-none-any.whl", hash = "sha256:fdaf3d5d70242621210b044e9b9b15a56e908bfc3e9d077bcf5605ac390f70bd", size = 485360 },
379
+ ]
380
+
381
  [[package]]
382
  name = "debugpy"
383
  version = "1.8.12"
 
412
  { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 },
413
  ]
414
 
415
+ [[package]]
416
+ name = "dill"
417
+ version = "0.3.8"
418
+ source = { registry = "https://pypi.org/simple" }
419
+ sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847 }
420
+ wheels = [
421
+ { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 },
422
+ ]
423
+
424
+ [[package]]
425
+ name = "diskcache"
426
+ version = "5.6.3"
427
+ source = { registry = "https://pypi.org/simple" }
428
+ sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916 }
429
+ wheels = [
430
+ { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550 },
431
+ ]
432
+
433
  [[package]]
434
  name = "distro"
435
  version = "1.9.0"
 
506
 
507
  [[package]]
508
  name = "fsspec"
509
+ version = "2024.12.0"
510
  source = { registry = "https://pypi.org/simple" }
511
+ sdist = { url = "https://files.pythonhosted.org/packages/ee/11/de70dee31455c546fbc88301971ec03c328f3d1138cfba14263f651e9551/fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", size = 291600 }
512
  wheels = [
513
+ { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862 },
514
+ ]
515
+
516
+ [package.optional-dependencies]
517
+ http = [
518
+ { name = "aiohttp" },
519
  ]
520
 
521
  [[package]]
 
1199
  { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 },
1200
  ]
1201
 
1202
+ [[package]]
1203
+ name = "multiprocess"
1204
+ version = "0.70.16"
1205
+ source = { registry = "https://pypi.org/simple" }
1206
+ dependencies = [
1207
+ { name = "dill" },
1208
+ ]
1209
+ sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603 }
1210
+ wheels = [
1211
+ { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824 },
1212
+ { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519 },
1213
+ { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741 },
1214
+ { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628 },
1215
+ { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351 },
1216
+ ]
1217
+
1218
  [[package]]
1219
  name = "mypy-extensions"
1220
  version = "1.0.0"
 
1761
  { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
1762
  ]
1763
 
1764
+ [[package]]
1765
+ name = "pyarrow"
1766
+ version = "19.0.1"
1767
+ source = { registry = "https://pypi.org/simple" }
1768
+ sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437 }
1769
+ wheels = [
1770
+ { 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 },
1771
+ { 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 },
1772
+ { 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 },
1773
+ { 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 },
1774
+ { 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 },
1775
+ { 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 },
1776
+ { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568 },
1777
+ { 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 },
1778
+ { 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 },
1779
+ { 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 },
1780
+ { 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 },
1781
+ { 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 },
1782
+ { 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 },
1783
+ ]
1784
+
1785
  [[package]]
1786
  name = "pycparser"
1787
  version = "2.22"
 
2002
  { url = "https://files.pythonhosted.org/packages/5f/26/89ebaee5fcbd99bf1c0a627a9447b440118b2d31dea423d074cb0481be5c/qdrant_client-1.13.2-py3-none-any.whl", hash = "sha256:db97e759bd3f8d483a383984ba4c2a158eef56f2188d83df7771591d43de2201", size = 306637 },
2003
  ]
2004
 
2005
+ [[package]]
2006
+ name = "ragas"
2007
+ version = "0.2.13"
2008
+ source = { registry = "https://pypi.org/simple" }
2009
+ dependencies = [
2010
+ { name = "appdirs" },
2011
+ { name = "datasets" },
2012
+ { name = "diskcache" },
2013
+ { name = "langchain" },
2014
+ { name = "langchain-community" },
2015
+ { name = "langchain-core" },
2016
+ { name = "langchain-openai" },
2017
+ { name = "nest-asyncio" },
2018
+ { name = "numpy" },
2019
+ { name = "openai" },
2020
+ { name = "pydantic" },
2021
+ { name = "tiktoken" },
2022
+ ]
2023
+ sdist = { url = "https://files.pythonhosted.org/packages/22/db/74deba37d53752f5e1656e36df878a73bbe0b5750ad73a30906ce286931d/ragas-0.2.13.tar.gz", hash = "sha256:33ebfd8c88465c7c86e639049138e38d3d3117d03eb68c0b2c98065c4608feb5", size = 39916780 }
2024
+ wheels = [
2025
+ { url = "https://files.pythonhosted.org/packages/b6/1f/1087efbd0d0723ef8212aba2dfd035bdbcef6698623b29e6f724ad8cdcf9/ragas-0.2.13-py3-none-any.whl", hash = "sha256:0a9c4014768cb6a1d962f9348ee2ea36732a1edafdf18d884ab020f4fe2d4acc", size = 178261 },
2026
+ ]
2027
+
2028
+ [[package]]
2029
+ name = "rapidfuzz"
2030
+ version = "3.12.1"
2031
+ source = { registry = "https://pypi.org/simple" }
2032
+ sdist = { url = "https://files.pythonhosted.org/packages/c9/df/c300ead8c2962f54ad87872e6372a6836f0181a7f20b433c987bd106bfce/rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb", size = 57907552 }
2033
+ wheels = [
2034
+ { url = "https://files.pythonhosted.org/packages/62/d2/ceebc2446d1f3d3f2cae2597116982e50c2eed9ff2f5a322a51736981405/rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c", size = 1936794 },
2035
+ { url = "https://files.pythonhosted.org/packages/88/38/37f7ea800aa959a4f7a63477fc9ad7f3cd024e46bfadce5d23420af6c7e5/rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf", size = 1424155 },
2036
+ { url = "https://files.pythonhosted.org/packages/3f/14/409d0aa84430451488177fcc5cba8babcdf5a45cee772a2a265b9b5f4c7e/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510", size = 1398013 },
2037
+ { url = "https://files.pythonhosted.org/packages/4b/2c/601e3ad0bbe61e65f99e72c8cefed9713606cf4b297cc4c3876051db7722/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e", size = 5526157 },
2038
+ { url = "https://files.pythonhosted.org/packages/97/ce/deb7b00ce6e06713fc4df81336402b7fa062f2393c8a47401c228ee906c3/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d", size = 1648446 },
2039
+ { url = "https://files.pythonhosted.org/packages/ec/6f/2b8eae1748a022290815999594b438dbc1e072c38c76178ea996920a6253/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af", size = 1676038 },
2040
+ { url = "https://files.pythonhosted.org/packages/b9/6c/5c831197aca7148ed85c86bbe940e66073fea0fa97f30307bb5850ed8858/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d", size = 3114137 },
2041
+ { url = "https://files.pythonhosted.org/packages/fc/f2/d66ac185eeb0ee3fc0fe208dab1e72feece2c883bc0ab2097570a8159a7b/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3", size = 2305754 },
2042
+ { url = "https://files.pythonhosted.org/packages/6c/61/9bf74d7ea9bebc7a1bed707591617bba7901fce414d346a7c5532ef02dbd/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67", size = 6901746 },
2043
+ { url = "https://files.pythonhosted.org/packages/81/73/d8dddf73e168f723ef21272e8abb7d34d9244da395eb90ed5a617f870678/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b", size = 2673947 },
2044
+ { url = "https://files.pythonhosted.org/packages/2e/31/3c473cea7d76af162819a5b84f5e7bdcf53b9e19568fc37cfbdab4f4512a/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a", size = 3233070 },
2045
+ { url = "https://files.pythonhosted.org/packages/c0/b7/73227dcbf8586f0ca4a77be2720311367288e2db142ae00a1404f42e712d/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb", size = 4146828 },
2046
+ { url = "https://files.pythonhosted.org/packages/3a/c8/fea749c662e268d348a77501995b51ac95cdc3624f3f95ba261f30b000ff/rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d", size = 1831797 },
2047
+ { url = "https://files.pythonhosted.org/packages/66/18/11052be5984d9972eb04a52e2931e19e95b2e87731d179f60b79707b7efd/rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b", size = 1610169 },
2048
+ { url = "https://files.pythonhosted.org/packages/db/c1/66427c618f000298edbd24e46dd3dd2d3fa441a602701ba6a260d41dd62b/rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5", size = 863036 },
2049
+ ]
2050
+
2051
  [[package]]
2052
  name = "regex"
2053
  version = "2024.11.6"
 
2640
  { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 },
2641
  ]
2642
 
2643
+ [[package]]
2644
+ name = "xxhash"
2645
+ version = "3.5.0"
2646
+ source = { registry = "https://pypi.org/simple" }
2647
+ sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241 }
2648
+ wheels = [
2649
+ { 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 },
2650
+ { 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 },
2651
+ { 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 },
2652
+ { 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 },
2653
+ { 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 },
2654
+ { 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 },
2655
+ { 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 },
2656
+ { 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 },
2657
+ { 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 },
2658
+ { 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 },
2659
+ { 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 },
2660
+ { 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 },
2661
+ { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172 },
2662
+ { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041 },
2663
+ { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801 },
2664
+ ]
2665
+
2666
  [[package]]
2667
  name = "yarl"
2668
  version = "1.18.3"