braintrust 0.3.10__tar.gz → 0.3.11__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.
- {braintrust-0.3.10 → braintrust-0.3.11}/PKG-INFO +1 -1
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/test_server_integration.py +4 -5
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/oai.py +1 -1
- braintrust-0.3.11/src/braintrust/version.py +4 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_openai.py +32 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust.egg-info/PKG-INFO +1 -1
- braintrust-0.3.10/src/braintrust/version.py +0 -4
- {braintrust-0.3.10 → braintrust-0.3.11}/README.md +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/setup.cfg +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/setup.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/_generated_types.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/audit.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/aws.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/bt_json.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/__main__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/eval.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/install/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/install/api.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/install/bump_versions.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/install/logs.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/install/redshift.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/install/run_migrations.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/cli/push.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/conftest.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/context.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/contrib/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/contrib/temporal/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/contrib/temporal/test_temporal.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/db_fields.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/auth.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/cors.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/dataset.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/eval_hooks.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/schemas.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/server.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/test_cached_login.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/devserver/test_lru_cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/framework.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/framework2.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/functions/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/functions/constants.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/functions/invoke.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/functions/stream.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/generated_types.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/git_fields.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/gitutil.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/graph_util.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/http_headers.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/id_gen.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/logger.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/merge_row_batch.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/object.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/otel/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/otel/context.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/otel/test_distributed_tracing.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/otel/test_otel_bt_integration.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/parameters.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt_cache/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt_cache/disk_cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt_cache/lru_cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt_cache/prompt_cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt_cache/test_disk_cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt_cache/test_lru_cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/prompt_cache/test_prompt_cache.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/py.typed +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/queue.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/resource_manager.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/score.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/serializable_data_class.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/span_identifier_v1.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/span_identifier_v2.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/span_identifier_v3.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/span_identifier_v4.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/span_types.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_framework.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_framework2.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_helpers.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_id_gen.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_logger.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_otel.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_queue.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_serializable_data_class.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_span_components.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_util.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/test_version.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/util.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/_anthropic_utils.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/agno/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/agno/agent.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/agno/function_call.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/agno/model.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/agno/team.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/agno/utils.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/anthropic.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/claude_agent_sdk/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/claude_agent_sdk/_wrapper.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/claude_agent_sdk/test_wrapper.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/dspy.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/google_genai/__init__.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/langchain.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/litellm.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/openai.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_agno.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_anthropic.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_dspy.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_google_genai.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_litellm.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_pydantic_ai.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/test_utils.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/xact_ids.py +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust.egg-info/SOURCES.txt +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust.egg-info/dependency_links.txt +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust.egg-info/entry_points.txt +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust.egg-info/requires.txt +0 -0
- {braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,6 @@ from pathlib import Path
|
|
|
4
4
|
from typing import Any
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
|
-
|
|
8
7
|
from braintrust.framework import _evals
|
|
9
8
|
from braintrust.test_helpers import has_devserver_installed
|
|
10
9
|
|
|
@@ -28,9 +27,8 @@ def client():
|
|
|
28
27
|
pytest.skip("Devserver dependencies not installed (requires .[cli])")
|
|
29
28
|
|
|
30
29
|
# Import CLI dependencies inside the fixture
|
|
31
|
-
from starlette.testclient import TestClient
|
|
32
|
-
|
|
33
30
|
from braintrust.devserver.server import create_app
|
|
31
|
+
from starlette.testclient import TestClient
|
|
34
32
|
|
|
35
33
|
# Use the real simple_eval.py example
|
|
36
34
|
eval_file = Path(__file__).parent.parent.parent.parent / "examples" / "evals" / "simple_eval.py"
|
|
@@ -39,8 +37,8 @@ def client():
|
|
|
39
37
|
_evals.clear()
|
|
40
38
|
|
|
41
39
|
# Load the eval file to register evaluators (but don't run them)
|
|
42
|
-
spec = __import__(
|
|
43
|
-
module = __import__(
|
|
40
|
+
spec = __import__("importlib.util").util.spec_from_file_location("simple_eval", str(eval_file))
|
|
41
|
+
module = __import__("importlib.util").util.module_from_spec(spec)
|
|
44
42
|
|
|
45
43
|
# Get evaluators from the module without executing Eval()
|
|
46
44
|
# We need to parse the file and extract the Evaluator definition
|
|
@@ -134,6 +132,7 @@ def parse_sse_events(response_text: str) -> list[dict[str, Any]]:
|
|
|
134
132
|
return events
|
|
135
133
|
|
|
136
134
|
|
|
135
|
+
@pytest.mark.skip
|
|
137
136
|
@pytest.mark.vcr
|
|
138
137
|
def test_eval_sse_streaming(client, api_key, org_name):
|
|
139
138
|
"""
|
|
@@ -845,7 +845,7 @@ def _parse_metrics_from_usage(usage: Any) -> Dict[str, Any]:
|
|
|
845
845
|
|
|
846
846
|
|
|
847
847
|
def _is_numeric(v):
|
|
848
|
-
return isinstance(v, (int, float, complex))
|
|
848
|
+
return isinstance(v, (int, float, complex)) and not isinstance(v, bool)
|
|
849
849
|
|
|
850
850
|
|
|
851
851
|
def prettify_params(params: Dict[str, Any]) -> Dict[str, Any]:
|
|
@@ -1690,3 +1690,35 @@ def test_braintrust_tracing_processor_trace_metadata_logging(memory_logger):
|
|
|
1690
1690
|
spans = memory_logger.pop()
|
|
1691
1691
|
root_span = spans[0]
|
|
1692
1692
|
assert root_span["metadata"]["conversation_id"] == "test-12345", "Should log trace metadata"
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
def test_parse_metrics_excludes_booleans():
|
|
1696
|
+
"""Test that boolean fields in usage objects are excluded from metrics.
|
|
1697
|
+
|
|
1698
|
+
Reproduces issue where OpenRouter returns is_byok (a boolean) in the usage
|
|
1699
|
+
object, which caused API validation errors: "Expected number, received boolean".
|
|
1700
|
+
|
|
1701
|
+
In Python, bool is a subclass of int, so isinstance(True, int) returns True.
|
|
1702
|
+
The fix ensures _is_numeric explicitly excludes booleans.
|
|
1703
|
+
"""
|
|
1704
|
+
from braintrust.oai import _parse_metrics_from_usage
|
|
1705
|
+
|
|
1706
|
+
# Simulate OpenRouter's usage object with boolean field
|
|
1707
|
+
usage = {
|
|
1708
|
+
"completion_tokens": 11,
|
|
1709
|
+
"prompt_tokens": 8,
|
|
1710
|
+
"total_tokens": 19,
|
|
1711
|
+
"cost": 0.000104,
|
|
1712
|
+
"is_byok": False, # This boolean should be filtered out
|
|
1713
|
+
}
|
|
1714
|
+
|
|
1715
|
+
metrics = _parse_metrics_from_usage(usage)
|
|
1716
|
+
|
|
1717
|
+
# Numeric fields should be included
|
|
1718
|
+
assert metrics["completion_tokens"] == 11
|
|
1719
|
+
assert metrics["prompt_tokens"] == 8
|
|
1720
|
+
assert metrics["tokens"] == 19 # total_tokens gets renamed
|
|
1721
|
+
assert metrics["cost"] == 0.000104
|
|
1722
|
+
|
|
1723
|
+
# Boolean field should NOT be in metrics (this was the bug)
|
|
1724
|
+
assert "is_byok" not in metrics
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/claude_agent_sdk/__init__.py
RENAMED
|
File without changes
|
{braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/claude_agent_sdk/_wrapper.py
RENAMED
|
File without changes
|
{braintrust-0.3.10 → braintrust-0.3.11}/src/braintrust/wrappers/claude_agent_sdk/test_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|