braintrust 0.3.13__tar.gz → 0.3.14__tar.gz

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.
Files changed (123) hide show
  1. {braintrust-0.3.13 → braintrust-0.3.14}/PKG-INFO +1 -1
  2. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/gitutil.py +4 -0
  3. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/logger.py +1 -1
  4. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/score.py +1 -0
  5. braintrust-0.3.14/src/braintrust/test_score.py +157 -0
  6. braintrust-0.3.14/src/braintrust/version.py +4 -0
  7. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust.egg-info/PKG-INFO +1 -1
  8. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust.egg-info/SOURCES.txt +1 -0
  9. braintrust-0.3.13/src/braintrust/version.py +0 -4
  10. {braintrust-0.3.13 → braintrust-0.3.14}/README.md +0 -0
  11. {braintrust-0.3.13 → braintrust-0.3.14}/setup.cfg +0 -0
  12. {braintrust-0.3.13 → braintrust-0.3.14}/setup.py +0 -0
  13. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/__init__.py +0 -0
  14. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/_generated_types.py +0 -0
  15. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/audit.py +0 -0
  16. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/aws.py +0 -0
  17. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/bt_json.py +0 -0
  18. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/__init__.py +0 -0
  19. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/__main__.py +0 -0
  20. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/eval.py +0 -0
  21. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/install/__init__.py +0 -0
  22. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/install/api.py +0 -0
  23. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/install/bump_versions.py +0 -0
  24. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/install/logs.py +0 -0
  25. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/install/redshift.py +0 -0
  26. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/install/run_migrations.py +0 -0
  27. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/cli/push.py +0 -0
  28. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/conftest.py +0 -0
  29. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/context.py +0 -0
  30. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/contrib/__init__.py +0 -0
  31. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/contrib/temporal/__init__.py +0 -0
  32. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/contrib/temporal/test_temporal.py +0 -0
  33. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/db_fields.py +0 -0
  34. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/__init__.py +0 -0
  35. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/auth.py +0 -0
  36. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/cache.py +0 -0
  37. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/cors.py +0 -0
  38. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/dataset.py +0 -0
  39. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/eval_hooks.py +0 -0
  40. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/schemas.py +0 -0
  41. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/server.py +0 -0
  42. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/test_cached_login.py +0 -0
  43. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/test_lru_cache.py +0 -0
  44. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/devserver/test_server_integration.py +0 -0
  45. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/framework.py +0 -0
  46. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/framework2.py +0 -0
  47. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/functions/__init__.py +0 -0
  48. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/functions/constants.py +0 -0
  49. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/functions/invoke.py +0 -0
  50. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/functions/stream.py +0 -0
  51. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/generated_types.py +0 -0
  52. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/git_fields.py +0 -0
  53. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/graph_util.py +0 -0
  54. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/http_headers.py +0 -0
  55. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/id_gen.py +0 -0
  56. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/merge_row_batch.py +0 -0
  57. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/oai.py +0 -0
  58. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/object.py +0 -0
  59. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/otel/__init__.py +0 -0
  60. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/otel/context.py +0 -0
  61. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/otel/test_distributed_tracing.py +0 -0
  62. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/otel/test_otel_bt_integration.py +0 -0
  63. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/parameters.py +0 -0
  64. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt.py +0 -0
  65. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt_cache/__init__.py +0 -0
  66. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt_cache/disk_cache.py +0 -0
  67. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt_cache/lru_cache.py +0 -0
  68. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt_cache/prompt_cache.py +0 -0
  69. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt_cache/test_disk_cache.py +0 -0
  70. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt_cache/test_lru_cache.py +0 -0
  71. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/prompt_cache/test_prompt_cache.py +0 -0
  72. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/py.typed +0 -0
  73. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/queue.py +0 -0
  74. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/resource_manager.py +0 -0
  75. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/serializable_data_class.py +0 -0
  76. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/span_identifier_v1.py +0 -0
  77. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/span_identifier_v2.py +0 -0
  78. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/span_identifier_v3.py +0 -0
  79. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/span_identifier_v4.py +0 -0
  80. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/span_types.py +0 -0
  81. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_framework.py +0 -0
  82. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_framework2.py +0 -0
  83. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_helpers.py +0 -0
  84. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_id_gen.py +0 -0
  85. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_logger.py +0 -0
  86. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_otel.py +0 -0
  87. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_queue.py +0 -0
  88. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_serializable_data_class.py +0 -0
  89. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_span_components.py +0 -0
  90. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_util.py +0 -0
  91. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/test_version.py +0 -0
  92. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/util.py +0 -0
  93. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/__init__.py +0 -0
  94. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/_anthropic_utils.py +0 -0
  95. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/agno/__init__.py +0 -0
  96. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/agno/agent.py +0 -0
  97. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/agno/function_call.py +0 -0
  98. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/agno/model.py +0 -0
  99. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/agno/team.py +0 -0
  100. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/agno/utils.py +0 -0
  101. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/anthropic.py +0 -0
  102. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/claude_agent_sdk/__init__.py +0 -0
  103. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/claude_agent_sdk/_wrapper.py +0 -0
  104. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/claude_agent_sdk/test_wrapper.py +0 -0
  105. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/dspy.py +0 -0
  106. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/google_genai/__init__.py +0 -0
  107. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/langchain.py +0 -0
  108. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/litellm.py +0 -0
  109. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/openai.py +0 -0
  110. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_agno.py +0 -0
  111. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_anthropic.py +0 -0
  112. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_dspy.py +0 -0
  113. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_google_genai.py +0 -0
  114. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_litellm.py +0 -0
  115. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_openai.py +0 -0
  116. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_openrouter.py +0 -0
  117. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_pydantic_ai.py +0 -0
  118. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/wrappers/test_utils.py +0 -0
  119. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust/xact_ids.py +0 -0
  120. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust.egg-info/dependency_links.txt +0 -0
  121. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust.egg-info/entry_points.txt +0 -0
  122. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust.egg-info/requires.txt +0 -0
  123. {braintrust-0.3.13 → braintrust-0.3.14}/src/braintrust.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braintrust
3
- Version: 0.3.13
3
+ Version: 0.3.14
4
4
  Summary: SDK for integrating Braintrust
5
5
  Home-page: https://www.braintrust.dev
6
6
  Author: Braintrust
@@ -88,8 +88,12 @@ def get_past_n_ancestors(n=1000, remote=None):
88
88
  if ancestor_output is None:
89
89
  return
90
90
  ancestor = repo.commit(ancestor_output)
91
+ count = 0
91
92
  for _ in range(n):
93
+ if count >= n:
94
+ break
92
95
  yield ancestor.hexsha
96
+ count += 1
93
97
  try:
94
98
  if ancestor.parents:
95
99
  ancestor = ancestor.parents[0]
@@ -1104,7 +1104,7 @@ class _HTTPBackgroundLogger:
1104
1104
  _HTTPBackgroundLogger._write_payload_to_dir(payload_dir=self.all_publish_payloads_dir, payload=dataStr)
1105
1105
  for i in range(self.num_tries):
1106
1106
  start_time = time.time()
1107
- resp = conn.post("/logs3", data=dataStr)
1107
+ resp = conn.post("/logs3", data=dataStr.encode("utf-8"))
1108
1108
  if resp.ok:
1109
1109
  return
1110
1110
  resp_errmsg = f"{resp.status_code}: {resp.text}"
@@ -34,6 +34,7 @@ class Score(SerializableDataClass):
34
34
 
35
35
  def as_dict(self):
36
36
  return {
37
+ "name": self.name,
37
38
  "score": self.score,
38
39
  "metadata": self.metadata,
39
40
  }
@@ -0,0 +1,157 @@
1
+ import json
2
+ import unittest
3
+
4
+ from .score import Score
5
+
6
+
7
+ class TestScore(unittest.TestCase):
8
+ def test_as_dict_includes_all_required_fields(self):
9
+ """Test that as_dict() includes name, score, and metadata fields."""
10
+ score = Score(name="test_scorer", score=0.85, metadata={"key": "value"})
11
+ result = score.as_dict()
12
+
13
+ self.assertIn("name", result)
14
+ self.assertIn("score", result)
15
+ self.assertIn("metadata", result)
16
+
17
+ self.assertEqual(result["name"], "test_scorer")
18
+ self.assertEqual(result["score"], 0.85)
19
+ self.assertEqual(result["metadata"], {"key": "value"})
20
+
21
+ def test_as_dict_with_null_score(self):
22
+ """Test that as_dict() works correctly with null score."""
23
+ score = Score(name="null_scorer", score=None, metadata={})
24
+ result = score.as_dict()
25
+
26
+ self.assertEqual(result["name"], "null_scorer")
27
+ self.assertIsNone(result["score"])
28
+ self.assertEqual(result["metadata"], {})
29
+
30
+ def test_as_dict_with_empty_metadata(self):
31
+ """Test that as_dict() works correctly with empty metadata."""
32
+ score = Score(name="empty_metadata_scorer", score=1.0)
33
+ result = score.as_dict()
34
+
35
+ self.assertEqual(result["name"], "empty_metadata_scorer")
36
+ self.assertEqual(result["score"], 1.0)
37
+ self.assertEqual(result["metadata"], {})
38
+
39
+ def test_as_dict_with_complex_metadata(self):
40
+ """Test that as_dict() works correctly with complex nested metadata."""
41
+ complex_metadata = {
42
+ "reason": "Test reason",
43
+ "details": {"nested": {"deeply": "value"}},
44
+ "list": [1, 2, 3],
45
+ "bool": True,
46
+ }
47
+ score = Score(name="complex_scorer", score=0.5, metadata=complex_metadata)
48
+ result = score.as_dict()
49
+
50
+ self.assertEqual(result["name"], "complex_scorer")
51
+ self.assertEqual(result["score"], 0.5)
52
+ self.assertEqual(result["metadata"], complex_metadata)
53
+
54
+ def test_as_json_serialization(self):
55
+ """Test that as_json() produces valid JSON string."""
56
+ score = Score(name="json_scorer", score=0.75, metadata={"test": "data"})
57
+ json_str = score.as_json()
58
+
59
+ # Should be valid JSON
60
+ parsed = json.loads(json_str)
61
+
62
+ self.assertEqual(parsed["name"], "json_scorer")
63
+ self.assertEqual(parsed["score"], 0.75)
64
+ self.assertEqual(parsed["metadata"], {"test": "data"})
65
+
66
+ def test_from_dict_round_trip(self):
67
+ """Test that Score can be serialized to dict and deserialized back."""
68
+ original = Score(
69
+ name="round_trip_scorer", score=0.95, metadata={"info": "test"}
70
+ )
71
+
72
+ # Serialize to dict
73
+ as_dict = original.as_dict()
74
+
75
+ # Deserialize from dict
76
+ restored = Score.from_dict(as_dict)
77
+
78
+ self.assertEqual(restored.name, original.name)
79
+ self.assertEqual(restored.score, original.score)
80
+ self.assertEqual(restored.metadata, original.metadata)
81
+
82
+ def test_array_of_scores_serialization(self):
83
+ """Test that arrays of Score objects can be serialized correctly."""
84
+ scores = [
85
+ Score(name="score_1", score=0.8, metadata={"index": 1}),
86
+ Score(name="score_2", score=0.6, metadata={"index": 2}),
87
+ Score(name="score_3", score=None, metadata={}),
88
+ ]
89
+
90
+ # Serialize each score
91
+ serialized = [s.as_dict() for s in scores]
92
+
93
+ # Check that all scores have required fields
94
+ for i, s_dict in enumerate(serialized):
95
+ self.assertIn("name", s_dict)
96
+ self.assertIn("score", s_dict)
97
+ self.assertIn("metadata", s_dict)
98
+ self.assertEqual(s_dict["name"], f"score_{i + 1}")
99
+
100
+ # Check specific values
101
+ self.assertEqual(serialized[0]["score"], 0.8)
102
+ self.assertEqual(serialized[1]["score"], 0.6)
103
+ self.assertIsNone(serialized[2]["score"])
104
+
105
+ def test_array_of_scores_json_serialization(self):
106
+ """Test that arrays of Score objects can be JSON serialized."""
107
+ scores = [
108
+ Score(name="json_score_1", score=0.9),
109
+ Score(name="json_score_2", score=0.7),
110
+ ]
111
+
112
+ # Serialize to JSON
113
+ serialized = [s.as_dict() for s in scores]
114
+ json_str = json.dumps(serialized)
115
+
116
+ # Parse back
117
+ parsed = json.loads(json_str)
118
+
119
+ self.assertEqual(len(parsed), 2)
120
+ self.assertEqual(parsed[0]["name"], "json_score_1")
121
+ self.assertEqual(parsed[0]["score"], 0.9)
122
+ self.assertEqual(parsed[1]["name"], "json_score_2")
123
+ self.assertEqual(parsed[1]["score"], 0.7)
124
+
125
+ def test_score_validation_enforces_bounds(self):
126
+ """Test that Score validates score values are between 0 and 1."""
127
+ # Valid scores
128
+ Score(name="valid_0", score=0.0)
129
+ Score(name="valid_1", score=1.0)
130
+ Score(name="valid_mid", score=0.5)
131
+ Score(name="valid_null", score=None)
132
+
133
+ # Invalid scores
134
+ with self.assertRaises(ValueError):
135
+ Score(name="invalid_negative", score=-0.1)
136
+
137
+ with self.assertRaises(ValueError):
138
+ Score(name="invalid_over_one", score=1.1)
139
+
140
+ def test_score_does_not_include_deprecated_error_field(self):
141
+ """Test that as_dict() does not include the deprecated error field."""
142
+ score = Score(name="test_scorer", score=0.5)
143
+ result = score.as_dict()
144
+
145
+ # The error field should not be in the serialized output
146
+ self.assertNotIn("error", result)
147
+
148
+ # Even if error was set (though deprecated), it shouldn't be in as_dict
149
+ score_with_error = Score(name="error_scorer", score=0.5)
150
+ score_with_error.error = Exception("test") # Set after construction
151
+ result_with_error = score_with_error.as_dict()
152
+
153
+ self.assertNotIn("error", result_with_error)
154
+
155
+
156
+ if __name__ == "__main__":
157
+ unittest.main()
@@ -0,0 +1,4 @@
1
+ VERSION = "0.3.14"
2
+
3
+ # this will be templated during the build
4
+ GIT_COMMIT = "dbbc1894ef31143816e5913676301261bc44aa4c"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braintrust
3
- Version: 0.3.13
3
+ Version: 0.3.14
4
4
  Summary: SDK for integrating Braintrust
5
5
  Home-page: https://www.braintrust.dev
6
6
  Author: Braintrust
@@ -39,6 +39,7 @@ src/braintrust/test_id_gen.py
39
39
  src/braintrust/test_logger.py
40
40
  src/braintrust/test_otel.py
41
41
  src/braintrust/test_queue.py
42
+ src/braintrust/test_score.py
42
43
  src/braintrust/test_serializable_data_class.py
43
44
  src/braintrust/test_span_components.py
44
45
  src/braintrust/test_util.py
@@ -1,4 +0,0 @@
1
- VERSION = "0.3.13"
2
-
3
- # this will be templated during the build
4
- GIT_COMMIT = "cef88a007fa60f4cd873f1d891a54ce5e173f3aa"
File without changes
File without changes
File without changes