deepeval 3.7.8__py3-none-any.whl → 3.7.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
deepeval/_version.py CHANGED
@@ -1 +1 @@
1
- __version__: str = "3.7.8"
1
+ __version__: str = "3.7.9"
@@ -279,8 +279,11 @@ class DROP(DeepEvalBaseBenchmark):
279
279
  prediction = predictions[i]
280
280
  golden = goldens[i]
281
281
  # Define Metric
282
- score = self.scorer.quasi_exact_match_score(
283
- golden.expected_output, prediction
282
+ expected_output = DROPTemplate.parse_str_to_list(
283
+ golden.expected_output, DELIMITER
284
+ )
285
+ score = self.scorer.quasi_contains_score(
286
+ expected_output, prediction
284
287
  )
285
288
  res.append({"prediction": prediction, "score": score})
286
289
 
@@ -224,10 +224,12 @@ class MMLU(DeepEvalBaseBenchmark):
224
224
  responses: List[MultipleChoiceSchema] = model.batch_generate(
225
225
  prompts=prompts, schemas=[MultipleChoiceSchema for i in prompts]
226
226
  )
227
- if isinstance(responses, (tuple, list)):
228
- predictions = [res[0].answer for res in responses]
229
- else:
230
- predictions = [res.answer for res in responses]
227
+ if not isinstance(responses, list):
228
+ raise TypeError(
229
+ "batch_generate must return List[MultipleChoiceSchema]"
230
+ )
231
+
232
+ predictions = [res.answer for res in responses]
231
233
  except TypeError:
232
234
  prompts = [
233
235
  prompt
deepeval/cli/utils.py CHANGED
@@ -52,10 +52,10 @@ USE_EMBED_KEYS = [
52
52
 
53
53
  def render_login_message():
54
54
  print(
55
- "🥳 Welcome to [rgb(106,0,255)]Confident AI[/rgb(106,0,255)], the DeepEval cloud platform 🏡❤️"
55
+ "🥳 Welcome to [rgb(106,0,255)]Confident AI[/rgb(106,0,255)], the evals cloud platform 🏡❤️"
56
56
  )
57
57
  print("")
58
- print(pyfiglet.Figlet(font="big_money-ne").renderText("DeepEval Cloud"))
58
+ print(pyfiglet.Figlet(font="big_money-ne").renderText("Confident AI"))
59
59
 
60
60
 
61
61
  def upload_and_open_link(_span: Span):
@@ -22,7 +22,7 @@ from deepeval.models.llms.constants import GEMINI_MODELS_DATA
22
22
  if TYPE_CHECKING:
23
23
  from google.genai import Client
24
24
 
25
- default_gemini_model = "gemini-1.5-pro"
25
+ default_gemini_model = "gemini-2.5-pro"
26
26
 
27
27
  # consistent retry rules
28
28
  retry_gemini = create_retry_decorator(PS.GOOGLE)
@@ -371,25 +371,6 @@ class GeminiModel(DeepEvalBaseLLM):
371
371
  client_kwargs = self._client_kwargs(**self.kwargs)
372
372
 
373
373
  if self.should_use_vertexai():
374
- service_account_key_json = require_secret_api_key(
375
- self.service_account_key,
376
- provider_label="Google Gemini",
377
- env_var_name="GOOGLE_SERVICE_ACCOUNT_KEY",
378
- param_hint="`service_account_key` to GeminiModel(...)",
379
- )
380
-
381
- try:
382
- service_account_key = json.loads(service_account_key_json)
383
- except Exception as e:
384
- raise DeepEvalError(
385
- "GOOGLE_SERVICE_ACCOUNT_KEY must be valid JSON for a Google service account."
386
- ) from e
387
-
388
- if not isinstance(service_account_key, dict):
389
- raise DeepEvalError(
390
- "GOOGLE_SERVICE_ACCOUNT_KEY must decode to a JSON object."
391
- )
392
-
393
374
  if not self.project or not self.location:
394
375
  raise DeepEvalError(
395
376
  "When using Vertex AI API, both project and location are required. "
@@ -397,17 +378,34 @@ class GeminiModel(DeepEvalBaseLLM):
397
378
  "GOOGLE_CLOUD_LOCATION in your DeepEval configuration."
398
379
  )
399
380
 
400
- oauth2 = self._require_oauth2()
401
- credentials = (
402
- oauth2.service_account.Credentials.from_service_account_info(
381
+ # if no service account key is provided, allow the SDK
382
+ # to resolve Application Default Credentials automatically.
383
+ credentials = None
384
+ if self.service_account_key is not None:
385
+ service_account_key_json = require_secret_api_key(
386
+ self.service_account_key,
387
+ provider_label="Google Gemini",
388
+ env_var_name="GOOGLE_SERVICE_ACCOUNT_KEY",
389
+ param_hint="`service_account_key` to GeminiModel(...)",
390
+ )
391
+
392
+ try:
393
+ service_account_key = json.loads(service_account_key_json)
394
+ except Exception as e:
395
+ raise DeepEvalError(
396
+ "GOOGLE_SERVICE_ACCOUNT_KEY must be valid JSON for a Google service account."
397
+ ) from e
398
+
399
+ if not isinstance(service_account_key, dict):
400
+ raise DeepEvalError(
401
+ "GOOGLE_SERVICE_ACCOUNT_KEY must decode to a JSON object."
402
+ )
403
+
404
+ oauth2 = self._require_oauth2()
405
+ credentials = oauth2.service_account.Credentials.from_service_account_info(
403
406
  service_account_key,
404
- scopes=[
405
- "https://www.googleapis.com/auth/cloud-platform",
406
- ],
407
+ scopes=["https://www.googleapis.com/auth/cloud-platform"],
407
408
  )
408
- if service_account_key
409
- else None
410
- )
411
409
 
412
410
  client = self._module.Client(
413
411
  vertexai=True,
@@ -1383,53 +1383,99 @@ class Synthesizer:
1383
1383
  # Prepare data for the DataFrame
1384
1384
  data = []
1385
1385
 
1386
- for golden in self.synthetic_goldens:
1387
- # Extract basic fields
1388
- input_text = golden.input
1389
- expected_output = golden.expected_output
1390
- context = golden.context
1391
- actual_output = golden.actual_output
1392
- retrieval_context = golden.retrieval_context
1393
- metadata = golden.additional_metadata
1394
- source_file = golden.source_file
1395
-
1396
- # Calculate num_context and context_length
1397
- if context is not None:
1398
- num_context = len(context)
1399
- context_length = sum(len(c) for c in context)
1400
- else:
1401
- num_context = None
1402
- context_length = None
1403
-
1404
- # Handle metadata
1405
- if metadata is not None:
1406
- evolutions = metadata.get("evolutions", None)
1407
- synthetic_input_quality = metadata.get(
1408
- "synthetic_input_quality", None
1409
- )
1410
- context_quality = metadata.get("context_quality", None)
1411
- else:
1412
- evolutions = None
1413
- synthetic_input_quality = None
1414
- context_quality = None
1415
-
1416
- # Prepare a row for the DataFrame
1417
- row = {
1418
- "input": input_text,
1419
- "actual_output": actual_output,
1420
- "expected_output": expected_output,
1421
- "context": context,
1422
- "retrieval_context": retrieval_context,
1423
- "n_chunks_per_context": num_context,
1424
- "context_length": context_length,
1425
- "evolutions": evolutions,
1426
- "context_quality": context_quality,
1427
- "synthetic_input_quality": synthetic_input_quality,
1428
- "source_file": source_file,
1429
- }
1430
-
1431
- # Append the row to the data list
1432
- data.append(row)
1386
+ if (
1387
+ self.synthetic_goldens is not None
1388
+ and len(self.synthetic_goldens) > 0
1389
+ ):
1390
+ for golden in self.synthetic_goldens:
1391
+ # Extract basic fields
1392
+ input_text = golden.input
1393
+ expected_output = golden.expected_output
1394
+ context = golden.context
1395
+ actual_output = golden.actual_output
1396
+ retrieval_context = golden.retrieval_context
1397
+ metadata = golden.additional_metadata
1398
+ source_file = golden.source_file
1399
+
1400
+ # Calculate num_context and context_length
1401
+ if context is not None:
1402
+ num_context = len(context)
1403
+ context_length = sum(len(c) for c in context)
1404
+ else:
1405
+ num_context = None
1406
+ context_length = None
1407
+
1408
+ # Handle metadata
1409
+ if metadata is not None:
1410
+ evolutions = metadata.get("evolutions", None)
1411
+ synthetic_input_quality = metadata.get(
1412
+ "synthetic_input_quality", None
1413
+ )
1414
+ context_quality = metadata.get("context_quality", None)
1415
+ else:
1416
+ evolutions = None
1417
+ synthetic_input_quality = None
1418
+ context_quality = None
1419
+
1420
+ # Prepare a row for the DataFrame
1421
+ row = {
1422
+ "input": input_text,
1423
+ "actual_output": actual_output,
1424
+ "expected_output": expected_output,
1425
+ "context": context,
1426
+ "retrieval_context": retrieval_context,
1427
+ "n_chunks_per_context": num_context,
1428
+ "context_length": context_length,
1429
+ "evolutions": evolutions,
1430
+ "context_quality": context_quality,
1431
+ "synthetic_input_quality": synthetic_input_quality,
1432
+ "source_file": source_file,
1433
+ }
1434
+
1435
+ # Append the row to the data list
1436
+ data.append(row)
1437
+ else:
1438
+ for golden in self.synthetic_conversational_goldens:
1439
+ # Extract basic fields
1440
+ scenario = golden.scenario
1441
+ expected_outcome = golden.expected_outcome
1442
+ context = golden.context
1443
+ metadata = golden.additional_metadata
1444
+
1445
+ # Calculate num_context and context_length
1446
+ if context is not None:
1447
+ num_context = len(context)
1448
+ context_length = sum(len(c) for c in context)
1449
+ else:
1450
+ num_context = None
1451
+ context_length = None
1452
+
1453
+ # Handle metadata
1454
+ if metadata is not None:
1455
+ evolutions = metadata.get("evolutions", None)
1456
+ synthetic_scenario_quality = metadata.get(
1457
+ "synthetic_scenario_quality", None
1458
+ )
1459
+ source_files = metadata.get("source_files", None)
1460
+ else:
1461
+ evolutions = None
1462
+ synthetic_scenario_quality = None
1463
+ source_files = None
1464
+
1465
+ # Prepare a row for the DataFrame
1466
+ row = {
1467
+ "scenario": scenario,
1468
+ "expected_outcome": expected_outcome,
1469
+ "context": context,
1470
+ "n_chunks_per_context": num_context,
1471
+ "context_length": context_length,
1472
+ "evolutions": evolutions,
1473
+ "synthetic_scenario_quality": synthetic_scenario_quality,
1474
+ "source_files": source_files,
1475
+ }
1476
+
1477
+ # Append the row to the data list
1478
+ data.append(row)
1433
1479
 
1434
1480
  # Create the pandas DataFrame
1435
1481
  df = pd.DataFrame(data)
@@ -1479,7 +1525,10 @@ class Synthesizer:
1479
1525
  "parameter."
1480
1526
  )
1481
1527
 
1482
- if len(self.synthetic_goldens) == 0:
1528
+ if (
1529
+ len(self.synthetic_goldens) == 0
1530
+ and len(self.synthetic_conversational_goldens) == 0
1531
+ ):
1483
1532
  raise ValueError(
1484
1533
  "No synthetic goldens found. Please generate goldens before saving goldens."
1485
1534
  )
@@ -1494,52 +1543,111 @@ class Synthesizer:
1494
1543
  full_file_path = os.path.join(directory, new_filename)
1495
1544
  if file_type == "json":
1496
1545
  with open(full_file_path, "w", encoding="utf-8") as file:
1497
- json_data = [
1498
- {
1499
- "input": golden.input,
1500
- "actual_output": golden.actual_output,
1501
- "expected_output": golden.expected_output,
1502
- "context": golden.context,
1503
- "source_file": golden.source_file,
1504
- }
1505
- for golden in self.synthetic_goldens
1506
- ]
1546
+ if (
1547
+ self.synthetic_goldens is not None
1548
+ and len(self.synthetic_goldens) > 0
1549
+ ):
1550
+ json_data = [
1551
+ {
1552
+ "input": golden.input,
1553
+ "actual_output": golden.actual_output,
1554
+ "expected_output": golden.expected_output,
1555
+ "context": golden.context,
1556
+ "source_file": golden.source_file,
1557
+ }
1558
+ for golden in self.synthetic_goldens
1559
+ ]
1560
+ else:
1561
+ json_data = [
1562
+ {
1563
+ "scenario": golden.scenario,
1564
+ "expected_outcome": golden.expected_outcome,
1565
+ "context": golden.context,
1566
+ "source_files": golden.additional_metadata.get(
1567
+ "source_files", None
1568
+ ),
1569
+ }
1570
+ for golden in self.synthetic_conversational_goldens
1571
+ ]
1507
1572
  json.dump(json_data, file, indent=4, ensure_ascii=False)
1508
1573
  elif file_type == "csv":
1509
1574
  with open(
1510
1575
  full_file_path, "w", newline="", encoding="utf-8"
1511
1576
  ) as file:
1512
1577
  writer = csv.writer(file)
1513
- writer.writerow(
1514
- [
1515
- "input",
1516
- "actual_output",
1517
- "expected_output",
1518
- "context",
1519
- "source_file",
1520
- ]
1521
- )
1522
- for golden in self.synthetic_goldens:
1578
+ if (
1579
+ self.synthetic_goldens is not None
1580
+ and len(self.synthetic_goldens) > 0
1581
+ ):
1582
+ writer.writerow(
1583
+ [
1584
+ "input",
1585
+ "actual_output",
1586
+ "expected_output",
1587
+ "context",
1588
+ "source_file",
1589
+ ]
1590
+ )
1591
+ for golden in self.synthetic_goldens:
1592
+ writer.writerow(
1593
+ [
1594
+ golden.input,
1595
+ golden.actual_output,
1596
+ golden.expected_output,
1597
+ "|".join(golden.context),
1598
+ golden.source_file,
1599
+ ]
1600
+ )
1601
+ else:
1523
1602
  writer.writerow(
1524
1603
  [
1525
- golden.input,
1526
- golden.actual_output,
1527
- golden.expected_output,
1528
- "|".join(golden.context),
1529
- golden.source_file,
1604
+ "scenario",
1605
+ "expected_outcome",
1606
+ "context",
1607
+ "source_files",
1530
1608
  ]
1531
1609
  )
1610
+ for golden in self.synthetic_conversational_goldens:
1611
+ writer.writerow(
1612
+ [
1613
+ golden.scenario,
1614
+ golden.expected_outcome,
1615
+ "|".join(golden.context),
1616
+ golden.additional_metadata.get(
1617
+ "source_files", None
1618
+ ),
1619
+ ]
1620
+ )
1532
1621
  elif file_type == "jsonl":
1533
1622
  with open(full_file_path, "w", encoding="utf-8") as file:
1534
- for golden in self.synthetic_goldens:
1535
- record = {
1536
- "input": golden.input,
1537
- "actual_output": golden.actual_output,
1538
- "expected_output": golden.expected_output,
1539
- "context": golden.context,
1540
- "source_file": golden.source_file,
1541
- }
1542
- file.write(json.dumps(record, ensure_ascii=False) + "\n")
1623
+ if (
1624
+ self.synthetic_goldens is not None
1625
+ and len(self.synthetic_goldens) > 0
1626
+ ):
1627
+ for golden in self.synthetic_goldens:
1628
+ record = {
1629
+ "input": golden.input,
1630
+ "actual_output": golden.actual_output,
1631
+ "expected_output": golden.expected_output,
1632
+ "context": golden.context,
1633
+ "source_file": golden.source_file,
1634
+ }
1635
+ file.write(
1636
+ json.dumps(record, ensure_ascii=False) + "\n"
1637
+ )
1638
+ else:
1639
+ for golden in self.synthetic_conversational_goldens:
1640
+ record = {
1641
+ "scenario": golden.scenario,
1642
+ "expected_outcome": golden.expected_outcome,
1643
+ "context": golden.context,
1644
+ "source_files": golden.additional_metadata.get(
1645
+ "source_files", None
1646
+ ),
1647
+ }
1648
+ file.write(
1649
+ json.dumps(record, ensure_ascii=False) + "\n"
1650
+ )
1543
1651
  if not quiet:
1544
1652
  print(f"Synthetic goldens saved at {full_file_path}!")
1545
1653
 
deepeval/utils.py CHANGED
@@ -739,14 +739,29 @@ def update_pbar(
739
739
  if progress is None or pbar_id is None:
740
740
  return
741
741
  # Get amount to advance
742
- current_task = next(t for t in progress.tasks if t.id == pbar_id)
742
+ current_task = next((t for t in progress.tasks if t.id == pbar_id), None)
743
+ if current_task is None:
744
+ return
745
+
743
746
  if advance_to_end:
744
- advance = current_task.remaining
747
+ remaining = current_task.remaining
748
+ if remaining is not None:
749
+ advance = remaining
750
+
745
751
  # Advance
746
- progress.update(pbar_id, advance=advance, total=total)
747
- # Remove if finished
748
- if current_task.finished and remove:
749
- progress.remove_task(pbar_id)
752
+ try:
753
+ progress.update(pbar_id, advance=advance, total=total)
754
+ except KeyError:
755
+ # progress task may be removed concurrently via callbacks which can race with teardown.
756
+ return
757
+
758
+ # Remove if finished and refetch before remove to avoid acting on a stale object
759
+ updated_task = next((t for t in progress.tasks if t.id == pbar_id), None)
760
+ if updated_task is not None and updated_task.finished and remove:
761
+ try:
762
+ progress.remove_task(pbar_id)
763
+ except KeyError:
764
+ pass
750
765
 
751
766
 
752
767
  def add_pbar(progress: Optional[Progress], description: str, total: int = 1):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepeval
3
- Version: 3.7.8
3
+ Version: 3.7.9
4
4
  Summary: The LLM Evaluation Framework
5
5
  Home-page: https://github.com/confident-ai/deepeval
6
6
  License: Apache-2.0
@@ -115,7 +115,7 @@ Whether your LLM applications are AI agents, RAG pipelines, or chatbots, impleme
115
115
 
116
116
  # 🔥 Metrics and Features
117
117
 
118
- > 🥳 You can now share DeepEval's test results on the cloud directly on [Confident AI](https://confident-ai.com?utm_source=GitHub)'s infrastructure
118
+ > 🥳 You can now share DeepEval's test results on the cloud directly on [Confident AI](https://confident-ai.com?utm_source=GitHub)
119
119
 
120
120
  - Supports both end-to-end and component-level LLM evaluation.
121
121
  - Large variety of ready-to-use LLM evaluation metrics (all with explanations) powered by **ANY** LLM of your choice, statistical methods, or NLP models that runs **locally on your machine**:
@@ -158,7 +158,7 @@ Whether your LLM applications are AI agents, RAG pipelines, or chatbots, impleme
158
158
  - TruthfulQA
159
159
  - HumanEval
160
160
  - GSM8K
161
- - [100% integrated with Confident AI](https://confident-ai.com?utm_source=GitHub) for the full evaluation lifecycle:
161
+ - [100% integrated with Confident AI](https://confident-ai.com?utm_source=GitHub) for the full evaluation & observability lifecycle:
162
162
  - Curate/annotate evaluation datasets on the cloud
163
163
  - Benchmark LLM app using dataset, and compare with previous iterations to experiment which models/prompts works best
164
164
  - Fine-tune metrics for custom results
@@ -167,7 +167,7 @@ Whether your LLM applications are AI agents, RAG pipelines, or chatbots, impleme
167
167
  - Repeat until perfection
168
168
 
169
169
  > [!NOTE]
170
- > Confident AI is the DeepEval platform. Create an account [here.](https://app.confident-ai.com?utm_source=GitHub)
170
+ > DeepEval is available on Confident AI, an LLM evals platform for AI observability and quality. Create an account [here.](https://app.confident-ai.com?utm_source=GitHub)
171
171
 
172
172
  <br />
173
173
 
@@ -394,7 +394,7 @@ cp .env.example .env.local
394
394
 
395
395
  # DeepEval With Confident AI
396
396
 
397
- DeepEval's cloud platform, [Confident AI](https://confident-ai.com?utm_source=Github), allows you to:
397
+ DeepEval is available on [Confident AI](https://confident-ai.com?utm_source=Github), an evals & observability platform that allows you to:
398
398
 
399
399
  1. Curate/annotate evaluation datasets on the cloud
400
400
  2. Benchmark LLM app using dataset, and compare with previous iterations to experiment which models/prompts works best
@@ -1,5 +1,5 @@
1
1
  deepeval/__init__.py,sha256=tle4lT4FONApg3OeztGPEdrpGMEGLWajyGTu7bEd3s0,2976
2
- deepeval/_version.py,sha256=6yo6b2iIyXO63FAYhFCVk8i3he3CS68LFE8qtXaj7_A,27
2
+ deepeval/_version.py,sha256=IMF0EWAx17dGyvmjU00hlHiW4v1x9vnbFJs_IXEQ3gI,27
3
3
  deepeval/annotation/__init__.py,sha256=ZFhUVNNuH_YgQSZJ-m5E9iUb9TkAkEV33a6ouMDZ8EI,111
4
4
  deepeval/annotation/annotation.py,sha256=3j3-syeJepAcEj3u3e4T_BeRDzNr7yXGDIoNQGMKpwQ,2298
5
5
  deepeval/annotation/api.py,sha256=EYN33ACVzVxsFleRYm60KB4Exvff3rPJKt1VBuuX970,2147
@@ -81,7 +81,7 @@ deepeval/benchmarks/bool_q/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
81
81
  deepeval/benchmarks/bool_q/bool_q.py,sha256=wJM4-wSybT8EwgDJVB4p3QYXGNzLD3tdrpGE1cNEz_E,5507
82
82
  deepeval/benchmarks/bool_q/template.py,sha256=pgNj4RR6-4VJDDySwnKt-MpghBCjVlZ7fPKY6PltllQ,4055
83
83
  deepeval/benchmarks/drop/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- deepeval/benchmarks/drop/drop.py,sha256=IL-6L9lfavclKYYVlmJji8dxGqeN2-oSpYGo6szE_DM,13341
84
+ deepeval/benchmarks/drop/drop.py,sha256=7rs8eqhgPHYmRxx9uv0-iA9Oz4gI14QqXP1ckMtfaNk,13457
85
85
  deepeval/benchmarks/drop/task.py,sha256=RV7DEXF192IOsY-yIVdlGb_y-A_sS5APPn8PGOPn5yU,17950
86
86
  deepeval/benchmarks/drop/template.py,sha256=1P0mx_71Bxr9juIA8nGpVRIrP8NSoDILkIicjWvqE94,1376
87
87
  deepeval/benchmarks/equity_med_qa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -114,7 +114,7 @@ deepeval/benchmarks/math_qa/math_qa.py,sha256=_eP-yocJom9r91qmAUBbIH4hrWazEHLV2l
114
114
  deepeval/benchmarks/math_qa/task.py,sha256=3q_jlK5kIl5Zs0mQwuzxyvmPP6ncLZwszn7gtl1GfZs,192
115
115
  deepeval/benchmarks/math_qa/template.py,sha256=pC3PB2GGU5TQ81I7E76RJh0xlu7xiF6d4SK3T_Nksh8,4468
116
116
  deepeval/benchmarks/mmlu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
- deepeval/benchmarks/mmlu/mmlu.py,sha256=flg3tb052DVo7wnfAHkW9n07tEEhHrkT2C0d5-UMBoQ,11431
117
+ deepeval/benchmarks/mmlu/mmlu.py,sha256=hwB7w3W7ugs2n67s51pVaTUxO9HVS0-ugKwV7zqgV6M,11465
118
118
  deepeval/benchmarks/mmlu/task.py,sha256=HnhnuD4Xjur9GlrBtswaR7ZPouGx4NTgbcFZu_oIzXw,2580
119
119
  deepeval/benchmarks/mmlu/template.py,sha256=MsdcrZWVkyZpEw--Kj6W7vjOJgig-ABiz9B3WtZz1MQ,1303
120
120
  deepeval/benchmarks/modes/__init__.py,sha256=IGhZp0-nmvVsZWBnTuBvKhdGiy4TJZShFSjYAeBZdbo,135
@@ -140,7 +140,7 @@ deepeval/cli/main.py,sha256=gni8-N6YX3zmEgkgr6eWE2_Vkb9fv2kLYJK3herJaTc,94957
140
140
  deepeval/cli/server.py,sha256=cOm9xiYcPYB9GDeFQw9-Iawf9bNfOqftZs7q7mO_P7I,1979
141
141
  deepeval/cli/test.py,sha256=aoBPMfk0HTvOqb2xdvMykkx_s4SHst7lEnoUiSXo1lU,5483
142
142
  deepeval/cli/types.py,sha256=_7KdthstHNc-JKCWrfpDQCf_j8h9PMxh0qJCHmVXJr0,310
143
- deepeval/cli/utils.py,sha256=bwSqgUug8JXyvI-jYnLAJPcaQgOkahaQLe_hVxFUoPo,10654
143
+ deepeval/cli/utils.py,sha256=3fgH5WPTTe7Cz_QOLCHyflXB81kmFaSxXHJ2tnxvFLw,10649
144
144
  deepeval/confident/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
145
145
  deepeval/confident/api.py,sha256=1eFM4umeBbyxNRNcKZqqp0g9rxklBfseHdbu7YDNx-g,8735
146
146
  deepeval/confident/types.py,sha256=9bgePDaU31yY7JGwCLZcc7pev9VGtNDZLbjsVpCLVdc,574
@@ -405,7 +405,7 @@ deepeval/models/llms/anthropic_model.py,sha256=08_nGK5EoGpf_F0I6JkhrEAswDc9DjLQq
405
405
  deepeval/models/llms/azure_model.py,sha256=Nc_LgA8rEhkldvdhccNojERaviaBg6jyfBVL9bGdKek,16673
406
406
  deepeval/models/llms/constants.py,sha256=0qnrd1bC46BdTAaf4Ja9WkTFYNysf6idsn-6s0Z5BtA,71143
407
407
  deepeval/models/llms/deepseek_model.py,sha256=OzEs0hnSixqICurVFo6T5GBAUeDrnWOlooEyJrgi5zE,8565
408
- deepeval/models/llms/gemini_model.py,sha256=YCTHlIIUHpgcr9y9iA0XEK0cYYScZZ_Gk2dMCQR6BcY,15401
408
+ deepeval/models/llms/gemini_model.py,sha256=h01bJnLBnc1xaqoVSBOL-PwllCsHRkA88bp21BA0Mws,15552
409
409
  deepeval/models/llms/grok_model.py,sha256=zGU1WzKADrgap5NQJTDb6BY4SZNNJqAZ6phnK_HFJqw,10703
410
410
  deepeval/models/llms/kimi_model.py,sha256=n5w2MeeKSMS7HvSpiDSQueZ2EQSv3c6pDb-C-ASHGwE,10441
411
411
  deepeval/models/llms/litellm_model.py,sha256=lWfJvzWia7XCrLiRTNF0fUQXYOalsLV1y3Tq03loDP4,16533
@@ -478,7 +478,7 @@ deepeval/synthesizer/chunking/context_generator.py,sha256=ucwa-7BcPSHHf4Tu31dfyJ
478
478
  deepeval/synthesizer/chunking/doc_chunker.py,sha256=DvJmbA_NnZBGCZgxKQsxlIC29kca_d7J-Dxq9SyfzX0,10612
479
479
  deepeval/synthesizer/config.py,sha256=rg9HzN5w_82tpzBALgt__NkAcmh0vDEoORJpjsRLWMY,2207
480
480
  deepeval/synthesizer/schema.py,sha256=TFCIvXeL0TOKqfjMm2qgR4hFcvvFaPEZdQ1xTnRJqPs,1294
481
- deepeval/synthesizer/synthesizer.py,sha256=x3h32erDunKjkrs3l-MCUxYeiwG-EyQh2XQLUnTeG8Y,110451
481
+ deepeval/synthesizer/synthesizer.py,sha256=rElOS4gtfaY_xzOaYXknlgAzQ3o5TtIGYfO8X3qV9y8,115244
482
482
  deepeval/synthesizer/templates/__init__.py,sha256=9UhfJFwPEdLWmxJz3ksNJps-jGYJFJnJP1U-x7j0By4,319
483
483
  deepeval/synthesizer/templates/template.py,sha256=ri3dX2gzxNmL8qlkl47HD8kecmqMBF5mE-mraZvf1xU,65008
484
484
  deepeval/synthesizer/templates/template_extraction.py,sha256=jmvr8AOOUzDgsHYIOsq-NaxlRQ5GygK16TTRGxBXDyM,3508
@@ -518,9 +518,9 @@ deepeval/tracing/trace_test_manager.py,sha256=wt4y7EWTRc4Bw938-UFFtXHkdFFOrnx6Ja
518
518
  deepeval/tracing/tracing.py,sha256=VCvFrPdBPSu1tL6xGswgOcCGBk-bU25wrcWAKD_8Uf0,46465
519
519
  deepeval/tracing/types.py,sha256=WhnxefUc5I8jcAOBQ-tsZ8_zVZfGqSvCWHD5XUN6Ggw,6040
520
520
  deepeval/tracing/utils.py,sha256=mdvhYAxDNsdnusaEXJd-c-_O2Jn6S3xSuzRvLO1Jz4U,5684
521
- deepeval/utils.py,sha256=_DTCUD-nAC8mVgyYf4sPBpguq8Da9G62Fgvi9AR82K8,26765
522
- deepeval-3.7.8.dist-info/LICENSE.md,sha256=0ATkuLv6QgsJTBODUHC5Rak_PArA6gv2t7inJzNTP38,11352
523
- deepeval-3.7.8.dist-info/METADATA,sha256=nnOtZFHQ4RyGnxbQhyOqoevBsAnKgtiKMiauPtYelkA,18662
524
- deepeval-3.7.8.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
525
- deepeval-3.7.8.dist-info/entry_points.txt,sha256=NoismUQfwLOojSGZmBrdcpwfaoFRAzUhBvZD3UwOKog,95
526
- deepeval-3.7.8.dist-info/RECORD,,
521
+ deepeval/utils.py,sha256=Wsu95g6t1wdttxWIESVwuUxbml7C-9ZTsV7qHCQI3Xg,27259
522
+ deepeval-3.7.9.dist-info/LICENSE.md,sha256=0ATkuLv6QgsJTBODUHC5Rak_PArA6gv2t7inJzNTP38,11352
523
+ deepeval-3.7.9.dist-info/METADATA,sha256=KnhwryGSEXENiHndjsgpc2f9v0ALbkufYyD-6kzKg6s,18754
524
+ deepeval-3.7.9.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
525
+ deepeval-3.7.9.dist-info/entry_points.txt,sha256=NoismUQfwLOojSGZmBrdcpwfaoFRAzUhBvZD3UwOKog,95
526
+ deepeval-3.7.9.dist-info/RECORD,,