braintrust 0.5.3__py3-none-any.whl → 0.5.4__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.
@@ -194,6 +194,10 @@ class BatchedFacetDataFacet(TypedDict):
194
194
  """
195
195
  The model to use for facet extraction
196
196
  """
197
+ embedding_model: NotRequired[str | None]
198
+ """
199
+ The embedding model to use for vectorizing facet results.
200
+ """
197
201
  no_match_pattern: NotRequired[str | None]
198
202
  """
199
203
  Regex pattern to identify outputs that do not match the facet. If the output matches, the facet will be saved as 'no_match'
@@ -740,9 +744,32 @@ class FunctionDataFunctionData2(TypedDict):
740
744
  endpoint: str
741
745
  eval_name: str
742
746
  parameters: Mapping[str, Any]
747
+ parameters_version: NotRequired[str | None]
748
+ """
749
+ The version (transaction ID) of the parameters being used
750
+ """
751
+
752
+
753
+ class FunctionDataFunctionData4Schema(TypedDict):
754
+ type: Literal['object']
755
+ properties: Mapping[str, Mapping[str, Any]]
756
+ required: NotRequired[Sequence[str] | None]
757
+ additionalProperties: NotRequired[bool | None]
758
+
759
+
760
+ class FunctionDataFunctionData4(TypedDict):
761
+ type: Literal['parameters']
762
+ data: Mapping[str, Any]
763
+ """
764
+ The parameters data
765
+ """
766
+ __schema: FunctionDataFunctionData4Schema
767
+ """
768
+ JSON Schema format for parameters
769
+ """
743
770
 
744
771
 
745
- FunctionFormat: TypeAlias = Literal['llm', 'code', 'global', 'graph']
772
+ FunctionFormat: TypeAlias = Literal['llm', 'code', 'global', 'graph', 'topic_map']
746
773
 
747
774
 
748
775
  class FunctionIdFunctionId(TypedDict):
@@ -807,7 +834,7 @@ FunctionIdRef: TypeAlias = Mapping[str, Any]
807
834
 
808
835
 
809
836
  FunctionObjectType: TypeAlias = Literal[
810
- 'prompt', 'tool', 'scorer', 'task', 'workflow', 'custom_view', 'preprocessor', 'facet', 'classifier'
837
+ 'prompt', 'tool', 'scorer', 'task', 'workflow', 'custom_view', 'preprocessor', 'facet', 'classifier', 'parameters'
811
838
  ]
812
839
 
813
840
 
@@ -815,7 +842,7 @@ FunctionOutputType: TypeAlias = Literal['completion', 'score', 'facet', 'classif
815
842
 
816
843
 
817
844
  FunctionTypeEnum: TypeAlias = Literal[
818
- 'llm', 'scorer', 'task', 'tool', 'custom_view', 'preprocessor', 'facet', 'classifier', 'tag'
845
+ 'llm', 'scorer', 'task', 'tool', 'custom_view', 'preprocessor', 'facet', 'classifier', 'tag', 'parameters'
819
846
  ]
820
847
  """
821
848
  The type of global function. Defaults to 'scorer'.
@@ -823,7 +850,7 @@ The type of global function. Defaults to 'scorer'.
823
850
 
824
851
 
825
852
  FunctionTypeEnumNullish: TypeAlias = Literal[
826
- 'llm', 'scorer', 'task', 'tool', 'custom_view', 'preprocessor', 'facet', 'classifier', 'tag'
853
+ 'llm', 'scorer', 'task', 'tool', 'custom_view', 'preprocessor', 'facet', 'classifier', 'tag', 'parameters'
827
854
  ]
828
855
 
829
856
 
@@ -2236,6 +2263,64 @@ class ToolFunctionDefinition(TypedDict):
2236
2263
  function: ToolFunctionDefinitionFunction
2237
2264
 
2238
2265
 
2266
+ class TopicMapReportSettings(TypedDict):
2267
+ algorithm: Literal['hdbscan', 'kmeans', 'hierarchical']
2268
+ dimension_reduction: Literal['umap', 'pca', 'none']
2269
+ vector_field: str
2270
+ embedding_model: str
2271
+ n_clusters: NotRequired[int | None]
2272
+ umap_dimensions: NotRequired[int | None]
2273
+ min_cluster_size: NotRequired[int | None]
2274
+ min_samples: NotRequired[int | None]
2275
+
2276
+
2277
+ class TopicMapReportQuerySettings(TypedDict):
2278
+ hierarchy_threshold: NotRequired[int | None]
2279
+ auto_naming: NotRequired[bool | None]
2280
+ skip_cache: NotRequired[bool | None]
2281
+ viz_mode: NotRequired[Literal['bar', 'scatter'] | None]
2282
+ naming_model: NotRequired[str | None]
2283
+
2284
+
2285
+ class TopicMapReportClusterSample(TypedDict):
2286
+ id: str
2287
+ text: str
2288
+ root_span_id: str
2289
+ span_id: str
2290
+
2291
+
2292
+ class TopicMapReportCluster(TypedDict):
2293
+ cluster_id: float
2294
+ parent_cluster_id: NotRequired[float | None]
2295
+ topic_id: str
2296
+ count: float
2297
+ sample_texts: Sequence[str]
2298
+ samples: Sequence[TopicMapReportClusterSample]
2299
+ name: NotRequired[str | None]
2300
+ description: NotRequired[str | None]
2301
+ keywords: NotRequired[Sequence[str] | None]
2302
+ centroid: NotRequired[Sequence[float] | None]
2303
+ parent_id: NotRequired[float | None]
2304
+ is_leaf: NotRequired[bool | None]
2305
+ depth: NotRequired[float | None]
2306
+
2307
+
2308
+ class TopicMapReportEmbeddingPoint(TypedDict):
2309
+ x: float
2310
+ y: float
2311
+ cluster: float
2312
+ text: NotRequired[str | None]
2313
+
2314
+
2315
+ class TopicMapReport(TypedDict):
2316
+ version: Literal[1]
2317
+ created_at: NotRequired[str | None]
2318
+ settings: TopicMapReportSettings
2319
+ query_settings: TopicMapReportQuerySettings
2320
+ clusters: Sequence[TopicMapReportCluster]
2321
+ embedding_points: NotRequired[Sequence[TopicMapReportEmbeddingPoint] | None]
2322
+
2323
+
2239
2324
  class TraceScope(TypedDict):
2240
2325
  type: Literal['trace']
2241
2326
  idle_seconds: NotRequired[float | None]
@@ -2500,12 +2585,6 @@ class PreprocessorPreprocessor4(PreprocessorPreprocessor1, PreprocessorPreproces
2500
2585
  Preprocessor: TypeAlias = PreprocessorPreprocessor3 | PreprocessorPreprocessor4
2501
2586
 
2502
2587
 
2503
- class BatchedFacetData(TypedDict):
2504
- type: Literal['batched_facet']
2505
- preprocessor: NotRequired[Preprocessor | None]
2506
- facets: Sequence[BatchedFacetDataFacet]
2507
-
2508
-
2509
2588
  ChatCompletionContentPart: TypeAlias = (
2510
2589
  ChatCompletionContentPartTextWithTitle
2511
2590
  | ChatCompletionContentPartImageWithTitle
@@ -2761,6 +2840,10 @@ class FacetData(TypedDict):
2761
2840
  """
2762
2841
  The model to use for facet extraction
2763
2842
  """
2843
+ embedding_model: NotRequired[str | None]
2844
+ """
2845
+ The embedding model to use for vectorizing facet results.
2846
+ """
2764
2847
  no_match_pattern: NotRequired[str | None]
2765
2848
  """
2766
2849
  Regex pattern to identify outputs that do not match the facet. If the output matches, the facet will be saved as 'no_match'
@@ -3044,11 +3127,54 @@ class SpanAttributes(TypedDict):
3044
3127
  type: NotRequired[SpanType | None]
3045
3128
 
3046
3129
 
3130
+ class TopicMapData(TypedDict):
3131
+ type: Literal['topic_map']
3132
+ source_facet: str
3133
+ """
3134
+ The facet field name to use as input for classification
3135
+ """
3136
+ embedding_model: str
3137
+ """
3138
+ The embedding model to use for embedding facet values
3139
+ """
3140
+ bundle_key: str
3141
+ """
3142
+ Key of the topic map bundle in code_bundles bucket
3143
+ """
3144
+ distance_threshold: NotRequired[float | None]
3145
+ """
3146
+ Maximum distance to nearest centroid. If exceeded, returns no_match.
3147
+ """
3148
+ report: NotRequired[TopicMapReport | None]
3149
+
3150
+
3047
3151
  class ViewData(TypedDict):
3048
3152
  search: NotRequired[ViewDataSearch | None]
3049
3153
  custom_charts: NotRequired[Any | None]
3050
3154
 
3051
3155
 
3156
+ class BatchedFacetDataTopicMaps(TypedDict):
3157
+ function_name: str
3158
+ """
3159
+ The name of the topic map function
3160
+ """
3161
+ topic_map_id: NotRequired[str | None]
3162
+ """
3163
+ The id of the topic map function
3164
+ """
3165
+ topic_map_data: TopicMapData
3166
+
3167
+
3168
+ class BatchedFacetData(TypedDict):
3169
+ type: Literal['batched_facet']
3170
+ preprocessor: NotRequired[Preprocessor | None]
3171
+ facets: Sequence[BatchedFacetDataFacet]
3172
+ topic_maps: NotRequired[Mapping[str, BatchedFacetDataTopicMaps] | None]
3173
+ """
3174
+ Topic maps that depend on facets in this batch, keyed by source facet name
3175
+ """
3176
+
3177
+
3052
3178
  class ExperimentEvent(TypedDict):
3053
3179
  id: str
3054
3180
  """
@@ -3376,6 +3502,7 @@ class View(TypedDict):
3376
3502
  'datasets',
3377
3503
  'dataset',
3378
3504
  'prompts',
3505
+ 'parameters',
3379
3506
  'tools',
3380
3507
  'scorers',
3381
3508
  'classifiers',
@@ -3617,6 +3744,8 @@ FunctionData: TypeAlias = (
3617
3744
  | FunctionDataFunctionData3
3618
3745
  | FacetData
3619
3746
  | BatchedFacetData
3747
+ | FunctionDataFunctionData4
3748
+ | TopicMapData
3620
3749
  )
3621
3750
 
3622
3751
 
@@ -1,4 +1,4 @@
1
- """Auto-generated file (internal git SHA 7178200dd3c7869f27b677260303cda0b798bf42) -- do not modify"""
1
+ """Auto-generated file (internal git SHA 2822255bed426d5442adc880a8f71b8a378de3d4) -- do not modify"""
2
2
 
3
3
  from ._generated_types import (
4
4
  Acl,
@@ -101,6 +101,8 @@ from ._generated_types import (
101
101
  SSEProgressEventData,
102
102
  StreamingMode,
103
103
  ToolFunctionDefinition,
104
+ TopicMapData,
105
+ TopicMapReport,
104
106
  TraceScope,
105
107
  TriggeredFunctionState,
106
108
  UploadStatus,
@@ -212,6 +214,8 @@ __all__ = [
212
214
  "SpanType",
213
215
  "StreamingMode",
214
216
  "ToolFunctionDefinition",
217
+ "TopicMapData",
218
+ "TopicMapReport",
215
219
  "TraceScope",
216
220
  "TriggeredFunctionState",
217
221
  "UploadStatus",
braintrust/oai.py CHANGED
@@ -312,16 +312,25 @@ class ChatCompletionWrapper:
312
312
 
313
313
  # pylint: disable=unsubscriptable-object
314
314
  if not tool_calls or (tool_delta.get("id") and tool_calls[-1]["id"] != tool_delta.get("id")):
315
+ function_arg = tool_delta.get("function", {})
315
316
  tool_calls = (tool_calls or []) + [
316
317
  {
317
- "id": delta["tool_calls"][0]["id"],
318
- "type": delta["tool_calls"][0]["type"],
319
- "function": delta["tool_calls"][0]["function"],
318
+ "id": tool_delta.get("id"),
319
+ "type": tool_delta.get("type"),
320
+ "function": {
321
+ "name": function_arg.get("name"),
322
+ "arguments": function_arg.get("arguments") or "",
323
+ },
320
324
  }
321
325
  ]
322
326
  else:
323
327
  # pylint: disable=unsubscriptable-object
324
- tool_calls[-1]["function"]["arguments"] += delta["tool_calls"][0]["function"]["arguments"]
328
+ # append to existing tool call
329
+ function_arg = tool_delta.get("function", {})
330
+ args = function_arg.get("arguments") or ""
331
+ if isinstance(args, str):
332
+ # pylint: disable=unsubscriptable-object
333
+ tool_calls[-1]["function"]["arguments"] += args
325
334
 
326
335
  return {
327
336
  "metrics": metrics,
braintrust/version.py CHANGED
@@ -1,4 +1,4 @@
1
- VERSION = "0.5.3"
1
+ VERSION = "0.5.4"
2
2
 
3
3
  # this will be templated during the build
4
- GIT_COMMIT = "ce261c13723e8985e61819f6df56298f863155d0"
4
+ GIT_COMMIT = "449f6eeddd54f73d88e185fcf499087d3e61fbe6"
@@ -5,6 +5,7 @@ import braintrust
5
5
  import openai
6
6
  import pytest
7
7
  from braintrust import logger, wrap_openai
8
+ from braintrust.oai import ChatCompletionWrapper
8
9
  from braintrust.test_helpers import assert_dict_matches, init_test_logger
9
10
  from braintrust.wrappers.test_utils import assert_metrics_are_valid, run_in_subprocess, verify_autoinstrument_script
10
11
  from openai import AsyncOpenAI
@@ -377,7 +378,6 @@ def test_openai_responses_sparse_indices(memory_logger):
377
378
  # No spans should be generated from this unit test
378
379
  assert not memory_logger.pop()
379
380
 
380
-
381
381
  @pytest.mark.vcr
382
382
  def test_openai_embeddings(memory_logger):
383
383
  assert not memory_logger.pop()
@@ -1933,3 +1933,102 @@ class TestAutoInstrumentOpenAI:
1933
1933
  def test_auto_instrument_openai(self):
1934
1934
  """Test auto_instrument patches OpenAI, creates spans, and uninstrument works."""
1935
1935
  verify_autoinstrument_script("test_auto_openai.py")
1936
+
1937
+ class TestZAICompatibleOpenAI:
1938
+ """Tests for validating some ZAI compatibility with OpenAI wrapper."""
1939
+
1940
+ def test_chat_completion_streaming_none_arguments(self, memory_logger):
1941
+ """Test that ChatCompletionWrapper handles None arguments in tool calls (e.g., GLM-4.6 behavior)."""
1942
+ assert not memory_logger.pop()
1943
+
1944
+ # Simulate streaming results with None arguments in tool calls
1945
+ # This mimics the behavior of GLM-4.6 which returns {'arguments': None, 'name': 'weather'}
1946
+ all_results = [
1947
+ # First chunk: initial tool call with None arguments
1948
+ {
1949
+ "choices": [
1950
+ {
1951
+ "delta": {
1952
+ "role": "assistant",
1953
+ "tool_calls": [
1954
+ {
1955
+ "id": "call_123",
1956
+ "type": "function",
1957
+ "function": {
1958
+ "name": "get_weather",
1959
+ "arguments": None, # GLM-4.6 returns None here
1960
+ },
1961
+ }
1962
+ ],
1963
+ },
1964
+ "finish_reason": None,
1965
+ }
1966
+ ],
1967
+ },
1968
+ # Second chunk: subsequent tool call arguments (also None)
1969
+ {
1970
+ "choices": [
1971
+ {
1972
+ "delta": {
1973
+ "tool_calls": [
1974
+ {
1975
+ "function": {
1976
+ "arguments": None, # Subsequent chunks can also have None
1977
+ }
1978
+ }
1979
+ ],
1980
+ },
1981
+ "finish_reason": None,
1982
+ }
1983
+ ],
1984
+ },
1985
+ # Third chunk: actual arguments
1986
+ {
1987
+ "choices": [
1988
+ {
1989
+ "delta": {
1990
+ "tool_calls": [
1991
+ {
1992
+ "function": {
1993
+ "arguments": '{"city": "New York"}',
1994
+ }
1995
+ }
1996
+ ],
1997
+ },
1998
+ "finish_reason": None,
1999
+ }
2000
+ ],
2001
+ },
2002
+ # Final chunk
2003
+ {
2004
+ "choices": [
2005
+ {
2006
+ "delta": {},
2007
+ "finish_reason": "tool_calls",
2008
+ }
2009
+ ],
2010
+ },
2011
+ ]
2012
+
2013
+ # Process the results
2014
+ wrapper = ChatCompletionWrapper(None, None)
2015
+ result = wrapper._postprocess_streaming_results(all_results)
2016
+
2017
+ # Verify the output was built correctly
2018
+ assert "output" in result
2019
+ assert len(result["output"]) == 1
2020
+ message = result["output"][0]["message"]
2021
+ assert message["role"] == "assistant"
2022
+ assert message["tool_calls"] is not None
2023
+ assert len(message["tool_calls"]) == 1
2024
+
2025
+ # Verify the tool call was assembled correctly despite None arguments
2026
+ tool_call = message["tool_calls"][0]
2027
+ assert tool_call["id"] == "call_123"
2028
+ assert tool_call["type"] == "function"
2029
+ assert tool_call["function"]["name"] == "get_weather"
2030
+ # The arguments should be the concatenation: "" + "" + '{"city": "New York"}'
2031
+ assert tool_call["function"]["arguments"] == '{"city": "New York"}'
2032
+
2033
+ # No spans should be generated from this unit test
2034
+ assert not memory_logger.pop()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braintrust
3
- Version: 0.5.3
3
+ Version: 0.5.4
4
4
  Summary: SDK for integrating Braintrust
5
5
  Home-page: https://www.braintrust.dev
6
6
  Author: Braintrust
@@ -1,5 +1,5 @@
1
1
  braintrust/__init__.py,sha256=DU4gzkV0R3nsWxp2da7iQS1MM_T9xHkrKSQE6nAnZbE,2627
2
- braintrust/_generated_types.py,sha256=1gNbTwsy7LEBdLW-uYqzQ2v78ToAFX0PSmeE_NOJC18,101153
2
+ braintrust/_generated_types.py,sha256=d1z6xRHPc0iqifiaoCh7YwDQNSxKZAhM2KYmG0Fyrvk,104819
3
3
  braintrust/audit.py,sha256=3GQKzuTcFquYdrJtABM-k3xMlOIqgVkfG6UyeQ8_028,461
4
4
  braintrust/auto.py,sha256=wf4Jb7hYoGS0Agpx-YjUYEW7wwwUpyAJDp-l3A-y6c0,4792
5
5
  braintrust/aws.py,sha256=OBz_SRyopgpCDSNvETLypzGwTXk-bNLn-Eisevnjfwo,377
@@ -9,14 +9,14 @@ braintrust/context.py,sha256=bOo1Li29lUsi2DOOllIDar0oRuQNbkLNzJ7cYq5JTbo,4126
9
9
  braintrust/db_fields.py,sha256=AX-K5t7KqO-xHHOfVRv8bn1ww7gZd3RNIFfANkZ2W0U,709
10
10
  braintrust/framework.py,sha256=KoXFKCprfeEHq-AqjarENcmHHcTuvr4PScWtMbIQ6zg,62635
11
11
  braintrust/framework2.py,sha256=o0igz4vXbmn0jHJPhDYvx14rFnI3ntV8H6VJfyJYRtM,16542
12
- braintrust/generated_types.py,sha256=MUpi5l9XIW0bGqnYqa9DE7XbxDYsBI82ANyTVHz9DVg,5047
12
+ braintrust/generated_types.py,sha256=WExtraVBQZMS5DcCVSQl_k66p6VUY7cK7u1SSQhc_to,5127
13
13
  braintrust/git_fields.py,sha256=au5ayyuvt7y_ojE9LC98ypTZd3RgFdjhRc8eFxcjnto,1434
14
14
  braintrust/gitutil.py,sha256=RsW7cawJMgaAaTw6WeB1sShyfflkPb7yH2x7yuRv10c,5642
15
15
  braintrust/http_headers.py,sha256=9ZsDcsAKG04SGowsgchZktD6rG_oSTKWa8QyGUPA4xE,154
16
16
  braintrust/id_gen.py,sha256=4UWLWRhksf76IkYi4cKACSaQ3yNgausrMRlhiurhy74,1590
17
17
  braintrust/logger.py,sha256=ofx0_8ywVk_iyyqOH-6kCgRaYmm_sO7guVJ5hW2ISNg,217467
18
18
  braintrust/merge_row_batch.py,sha256=mCutumLDOpH8ArP_4K5swP93mve7gmgfAnQdkdjUZ5E,6271
19
- braintrust/oai.py,sha256=K7NLw7-3U7TJCyBVeoOwpy_UOmGlpaXXJcHZgW-rzHM,37746
19
+ braintrust/oai.py,sha256=ispeHAeykwF3VmGMnaVKZRn7Q80DMtpM7nitFrtybRQ,38193
20
20
  braintrust/object.py,sha256=vYLyYWncsqLD00zffZUJwGTSkcJF9IIXmgIzrx3Np5c,632
21
21
  braintrust/parameters.py,sha256=sQWfw18QXdPSnMHsF7aRrPmP7Zx6HEz9vaTUXWreudg,5911
22
22
  braintrust/prompt.py,sha256=pLzhXoBp7ebxNraZADflR4YQMW5Ycjmt5ucK80P4_h0,1875
@@ -51,7 +51,7 @@ braintrust/test_util.py,sha256=SuSKTmvNyaR9Rbgf2TYCUWxJpZHoA2BMx6n4nQfV_pM,8221
51
51
  braintrust/test_version.py,sha256=hk5JKjEFbNJ_ONc1VEkqHquflzre34RpFhCEYLTK8iA,1051
52
52
  braintrust/trace.py,sha256=PHxfaHApGP_MPMIndZw7atIa2iwKPETUoG-TbF2dv6A,13767
53
53
  braintrust/util.py,sha256=S-qMBNsT36r_3pJ4LNKZ-vvHRlJwy8Wy7M7NAdfNOug,8919
54
- braintrust/version.py,sha256=u7mu2r_lw0F22zAYs8OHbW11HrkdIhoAK-RbDs2uQdA,117
54
+ braintrust/version.py,sha256=9Ag0YVXSTg_ksT5pb04Gdog87NeKSiNXtmslh5ZQyhQ,117
55
55
  braintrust/xact_ids.py,sha256=bdyp88HjlyIkglgLSqYlCYscdSH6EWVyE14sR90Xl1s,658
56
56
  braintrust/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
57
  braintrust/cli/__main__.py,sha256=wCBKHGVmn3IT_yMXk5qfDwyI2SV2gf1tLr0NTxm9T8k,1519
@@ -109,7 +109,7 @@ braintrust/wrappers/test_google_genai.py,sha256=BKkPfLFk2JG1UNJ3mFKzv5OjioWqo7EQ
109
109
  braintrust/wrappers/test_langsmith_wrapper.py,sha256=wEbPNy4o7VVvcuHcsCJ-sy2EATvBxhUXTYFBQNkKCjs,10449
110
110
  braintrust/wrappers/test_litellm.py,sha256=MKukVH-C-Mwc0-cVJZhkLdXwiXupXHc8EiWYKq0X8V0,23620
111
111
  braintrust/wrappers/test_oai_attachments.py,sha256=_EtNXjQxPgqXmj6UYMZn9GF4GDZf8m_1_TrwiEk7HWQ,11100
112
- braintrust/wrappers/test_openai.py,sha256=pC-5zO2CbeG1wmQ5IvbCQ5vXic5sZgTCTW7347QwbwI,69474
112
+ braintrust/wrappers/test_openai.py,sha256=dBphKJT2-xSnK4mJ_xbKLFPBfpHzK07TmHxPTQ8ZQDg,73355
113
113
  braintrust/wrappers/test_openrouter.py,sha256=8HUfILPugOMqcvttpq76KQrynFb0xZpazvta7TTSF6A,3849
114
114
  braintrust/wrappers/test_pydantic_ai_integration.py,sha256=xUSkiY5HUI-Z9G_etjyX7rGlOjBEdEY9CwVHyWM3xEE,104460
115
115
  braintrust/wrappers/test_pydantic_ai_wrap_openai.py,sha256=OO5NrbothkMr4v2sZ-EZLH7-yLj3k6TfdLG4uzXAsQk,5090
@@ -125,8 +125,8 @@ braintrust/wrappers/claude_agent_sdk/__init__.py,sha256=4FUE59ii39jVfhMAfkOcU-TJ
125
125
  braintrust/wrappers/claude_agent_sdk/_wrapper.py,sha256=UNZBcgTu7X71zvJKy6e-QQFuz9j8kRS6Kd1VOh3OOXA,17755
126
126
  braintrust/wrappers/claude_agent_sdk/test_wrapper.py,sha256=RmSzTfDC3tkepEbc9S_KYFITsjGVyllYE1fF9roSqBk,10779
127
127
  braintrust/wrappers/google_genai/__init__.py,sha256=C7MzKUr17CEcIbP0kg9L9IjN-6suE3NQ-oSYAjXdR_g,15832
128
- braintrust-0.5.3.dist-info/METADATA,sha256=snLiF8lw3wJkTkmgZnbthtfApgwnFb7eKFNARCWK0mM,3753
129
- braintrust-0.5.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
130
- braintrust-0.5.3.dist-info/entry_points.txt,sha256=Zpc0_09g5xm8as5jHqqFq7fhwO0xHSNct_TrEMONS7Q,60
131
- braintrust-0.5.3.dist-info/top_level.txt,sha256=hw1-y-UFMf60RzAr8x_eM7SThbIuWfQsQIbVvqSF83A,11
132
- braintrust-0.5.3.dist-info/RECORD,,
128
+ braintrust-0.5.4.dist-info/METADATA,sha256=Z3DmXXIkkIpZ5XQ7I6ECeVg5G3SW29onbNWyoLlvOZM,3753
129
+ braintrust-0.5.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
130
+ braintrust-0.5.4.dist-info/entry_points.txt,sha256=Zpc0_09g5xm8as5jHqqFq7fhwO0xHSNct_TrEMONS7Q,60
131
+ braintrust-0.5.4.dist-info/top_level.txt,sha256=hw1-y-UFMf60RzAr8x_eM7SThbIuWfQsQIbVvqSF83A,11
132
+ braintrust-0.5.4.dist-info/RECORD,,