From c046232e270ae8be1fcb6777aa0a4d5a44af8241 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 19:50:23 +0000 Subject: [PATCH 01/11] test: prune redundant provider tests (openai, openrouter, litellm, mistral, cohere, huggingface_hub, instructor) Co-Authored-By: Claude Opus 5.5 --- .../test_patch_litellm_aresponses.py | 38 --- .../test_patch_litellm_responses.py | 32 --- ...ere_integration_setup_patches_v2_chat.yaml | 152 ---------- ...ere_integration_setup_patches_v2_chat.yaml | 79 ------ .../integrations/cohere/test_cohere.py | 48 ---- .../huggingface_hub/test_huggingface_hub.py | 92 +----- ...test_parent_span_type_is_task_not_llm.yaml | 18 -- ...test_instructor_openai_single_success.yaml | 18 -- ...test_parent_span_type_is_task_not_llm.yaml | 109 -------- .../instructor/test_instructor.py | 62 +---- .../1.74.0/test_patch_litellm_aresponses.yaml | 98 ------- .../1.74.0/test_patch_litellm_responses.yaml | 98 ------- .../latest/test_patch_litellm_aresponses.yaml | 101 ------- .../latest/test_patch_litellm_responses.yaml | 101 ------- .../integrations/litellm/test_litellm.py | 50 ---- ...stral_integration_setup_creates_spans.yaml | 156 ----------- ...stral_integration_setup_creates_spans.yaml | 75 ----- .../integrations/mistral/test_mistral.py | 183 ++---------- ...onSetupSpans.test_setup_creates_spans.yaml | 108 -------- ...sync_http2_preserves_stream_interface.yaml | 262 ------------------ .../test_openai_client_async_comparison.yaml | 214 -------------- .../1.71.0/test_openai_client_comparison.yaml | 214 -------------- ...penai_responses_metadata_preservation.yaml | 233 ---------------- ...openai_unwrapped_client_no_conversion.yaml | 115 -------- ...test_openrouter_chat_completion_async.yaml | 74 ----- ...onSetupSpans.test_setup_creates_spans.yaml | 108 -------- ...sync_http2_preserves_stream_interface.yaml | 262 ------------------ .../test_openai_client_async_comparison.yaml | 214 -------------- .../1.77.0/test_openai_client_comparison.yaml | 214 -------------- ...penai_responses_metadata_preservation.yaml | 233 ---------------- ...openai_unwrapped_client_no_conversion.yaml | 115 -------- ...test_openrouter_chat_completion_async.yaml | 74 ----- ...onSetupSpans.test_setup_creates_spans.yaml | 108 -------- ...sync_http2_preserves_stream_interface.yaml | 262 ------------------ .../test_openai_client_async_comparison.yaml | 214 -------------- .../1.92.0/test_openai_client_comparison.yaml | 214 -------------- ...penai_responses_metadata_preservation.yaml | 232 ---------------- ...openai_unwrapped_client_no_conversion.yaml | 115 -------- ...test_openrouter_chat_completion_async.yaml | 74 ----- ...onSetupSpans.test_setup_creates_spans.yaml | 102 ------- ...sync_http2_preserves_stream_interface.yaml | 250 ----------------- .../test_openai_client_async_comparison.yaml | 202 -------------- .../latest/test_openai_client_comparison.yaml | 202 -------------- ...penai_responses_metadata_preservation.yaml | 239 ---------------- ...openai_unwrapped_client_no_conversion.yaml | 109 -------- ...test_openrouter_chat_completion_async.yaml | 74 ----- .../openai/test_oai_attachments.py | 34 --- .../integrations/openai/test_openai.py | 160 +---------- .../integrations/openai/test_openai_http2.py | 56 +--- .../openai/test_openai_openrouter_gateway.py | 31 --- ...outer_integration_setup_creates_spans.yaml | 52 ---- ...outer_integration_setup_creates_spans.yaml | 55 ---- .../openrouter/test_openrouter.py | 33 --- 53 files changed, 25 insertions(+), 6743 deletions(-) delete mode 100644 py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_aresponses.py delete mode 100644 py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_responses.py delete mode 100644 py/src/braintrust/integrations/cohere/cassettes/5.0.0/test_cohere_integration_setup_patches_v2_chat.yaml delete mode 100644 py/src/braintrust/integrations/cohere/cassettes/latest/test_cohere_integration_setup_patches_v2_chat.yaml delete mode 100644 py/src/braintrust/integrations/instructor/cassettes/1.11.0/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml delete mode 100644 py/src/braintrust/integrations/instructor/cassettes/1.11.0/test_instructor_openai_single_success.yaml delete mode 100644 py/src/braintrust/integrations/instructor/cassettes/latest/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml delete mode 100644 py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_aresponses.yaml delete mode 100644 py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_responses.yaml delete mode 100644 py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_aresponses.yaml delete mode 100644 py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_responses.yaml delete mode 100644 py/src/braintrust/integrations/mistral/cassettes/1.12.4/test_mistral_integration_setup_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/mistral/cassettes/latest/test_mistral_integration_setup_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.71.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_async_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_responses_metadata_preservation.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_unwrapped_client_no_conversion.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openrouter_chat_completion_async.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.77.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_async_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_responses_metadata_preservation.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_unwrapped_client_no_conversion.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openrouter_chat_completion_async.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.92.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_async_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_responses_metadata_preservation.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_unwrapped_client_no_conversion.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openrouter_chat_completion_async.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/latest/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/latest/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_async_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_comparison.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/latest/test_openai_responses_metadata_preservation.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/latest/test_openai_unwrapped_client_no_conversion.yaml delete mode 100644 py/src/braintrust/integrations/openai/cassettes/latest/test_openrouter_chat_completion_async.yaml delete mode 100644 py/src/braintrust/integrations/openrouter/cassettes/0.6.0/test_openrouter_integration_setup_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/openrouter/cassettes/latest/test_openrouter_integration_setup_creates_spans.yaml diff --git a/py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_aresponses.py b/py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_aresponses.py deleted file mode 100644 index 496f25ecb..000000000 --- a/py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_aresponses.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Test that patch_litellm() patches aresponses.""" - -import asyncio - -import litellm -from braintrust.integrations.litellm import patch_litellm -from braintrust.integrations.test_utils import autoinstrument_test_context - - -patch_litellm() - - -async def main(): - with autoinstrument_test_context("test_patch_litellm_aresponses", integration="litellm") as memory_logger: - response = await litellm.aresponses( - model="gpt-4o-mini", - input="What's 12 + 12?", - instructions="Just the number please", - ) - assert response - assert response.output - assert len(response.output) > 0 - content = response.output[0].content[0].text - assert "24" in content or "twenty-four" in content.lower() - - spans = memory_logger.pop() - assert len(spans) == 1, f"Expected 1 span, got {len(spans)}" - span = spans[0] - assert span["metrics"] - for key, value in span["metrics"].items(): - assert isinstance(value, (int, float)) and not isinstance(value, bool) - assert span["metadata"]["model"] == "gpt-4o-mini" - assert span["metadata"]["provider"] == "openai" - assert "What's 12 + 12?" in str(span["input"]) - - -asyncio.run(main()) -print("SUCCESS") diff --git a/py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_responses.py b/py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_responses.py deleted file mode 100644 index 37ef2ce08..000000000 --- a/py/src/braintrust/integrations/auto_test_scripts/test_patch_litellm_responses.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Test that patch_litellm() patches responses.""" - -import litellm -from braintrust.integrations.litellm import patch_litellm -from braintrust.integrations.test_utils import autoinstrument_test_context - - -patch_litellm() - -with autoinstrument_test_context("test_patch_litellm_responses", integration="litellm") as memory_logger: - response = litellm.responses( - model="gpt-4o-mini", - input="What's 12 + 12?", - instructions="Just the number please", - ) - assert response - assert response.output - assert len(response.output) > 0 - content = response.output[0].content[0].text - assert "24" in content or "twenty-four" in content.lower() - - spans = memory_logger.pop() - assert len(spans) == 1, f"Expected 1 span, got {len(spans)}" - span = spans[0] - assert span["metrics"] - for key, value in span["metrics"].items(): - assert isinstance(value, (int, float)) and not isinstance(value, bool) - assert span["metadata"]["model"] == "gpt-4o-mini" - assert span["metadata"]["provider"] == "openai" - assert "What's 12 + 12?" in str(span["input"]) - -print("SUCCESS") diff --git a/py/src/braintrust/integrations/cohere/cassettes/5.0.0/test_cohere_integration_setup_patches_v2_chat.yaml b/py/src/braintrust/integrations/cohere/cassettes/5.0.0/test_cohere_integration_setup_patches_v2_chat.yaml deleted file mode 100644 index cd8a3d872..000000000 --- a/py/src/braintrust/integrations/cohere/cassettes/5.0.0/test_cohere_integration_setup_patches_v2_chat.yaml +++ /dev/null @@ -1,152 +0,0 @@ -interactions: -- request: - body: '{"message":"Say hi in one word.","model":"command-a-03-2025","max_tokens":10,"stream":false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '92' - Host: - - api.cohere.ai - User-Agent: - - cohere/5.0.0 - X-Fern-Language: - - Python - X-Fern-Platform: - - darwin/25.2.0 - X-Fern-Runtime: - - python/3.14.3 - X-Fern-SDK-Name: - - cohere - X-Fern-SDK-Version: - - 6.1.0 - content-type: - - application/json - method: POST - uri: https://api.cohere.ai/v1/chat - response: - body: - string: '{"response_id":"c5a7c7f7-9008-494a-b98f-0a4ba7884028","text":"Hi!","generation_id":"f65b695b-32c1-4bce-8181-301bad8e8629","chat_history":[{"role":"USER","message":"Say - hi in one word."},{"role":"CHATBOT","message":"Hi!"}],"finish_reason":"COMPLETE","meta":{"api_version":{"version":"1"},"billed_units":{"input_tokens":6,"output_tokens":2},"tokens":{"input_tokens":501,"output_tokens":4},"cached_tokens":0}}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Transfer-Encoding: - - chunked - Via: - - 1.1 google - access-control-expose-headers: - - X-Debug-Trace-ID - cache-control: - - no-cache, no-store, no-transform, must-revalidate, private, max-age=0 - content-length: - - '406' - content-type: - - application/json - date: - - Thu, 16 Apr 2026 22:25:12 GMT - expires: - - Thu, 01 Jan 1970 00:00:00 GMT - num_chars: - - '2597' - num_tokens: - - '8' - pragma: - - no-cache - server: - - envoy - vary: - - Origin,Accept-Encoding - x-accel-expires: - - '0' - x-debug-trace-id: - - 86e32c7996b5cfbbb75c0d2092031db2 - x-endpoint-monthly-call-limit: - - '1000' - x-envoy-upstream-service-time: - - '211' - x-trial-endpoint-call-limit: - - '20' - x-trial-endpoint-call-remaining: - - '18' - status: - code: 200 - message: OK -- request: - body: '{"message":"Say hi in one word.","stream":false,"model":"command-a-03-2025","max_tokens":10}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '92' - Content-Type: - - application/json - Host: - - api.cohere.ai - User-Agent: - - python-httpx/0.28.1 - X-Fern-Language: - - Python - X-Fern-SDK-Name: - - cohere - X-Fern-SDK-Version: - - 5.0.0 - method: POST - uri: https://api.cohere.ai/v1/chat - response: - body: - string: '{"response_id":"5ab426ed-af10-4917-82c0-497d04252b80","text":"Hi!","generation_id":"5fe89b4a-7caf-471d-82b6-eac97e42f1a4","chat_history":[{"role":"USER","message":"Say - hi in one word."},{"role":"CHATBOT","message":"Hi!"}],"finish_reason":"COMPLETE","meta":{"api_version":{"version":"1"},"billed_units":{"input_tokens":6,"output_tokens":2},"tokens":{"input_tokens":501,"output_tokens":4},"cached_tokens":0}}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Transfer-Encoding: - - chunked - Via: - - 1.1 google - access-control-expose-headers: - - X-Debug-Trace-ID - cache-control: - - no-cache, no-store, no-transform, must-revalidate, private, max-age=0 - content-length: - - '406' - content-type: - - application/json - date: - - Thu, 16 Apr 2026 23:21:13 GMT - expires: - - Thu, 01 Jan 1970 00:00:00 GMT - num_chars: - - '2597' - num_tokens: - - '8' - pragma: - - no-cache - server: - - envoy - vary: - - Origin,Accept-Encoding - x-accel-expires: - - '0' - x-debug-trace-id: - - 2295b5229a92a6530d9161661e60c326 - x-endpoint-monthly-call-limit: - - '1000' - x-envoy-upstream-service-time: - - '214' - x-trial-endpoint-call-limit: - - '20' - x-trial-endpoint-call-remaining: - - '16' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/cohere/cassettes/latest/test_cohere_integration_setup_patches_v2_chat.yaml b/py/src/braintrust/integrations/cohere/cassettes/latest/test_cohere_integration_setup_patches_v2_chat.yaml deleted file mode 100644 index 1d4ab5109..000000000 --- a/py/src/braintrust/integrations/cohere/cassettes/latest/test_cohere_integration_setup_patches_v2_chat.yaml +++ /dev/null @@ -1,79 +0,0 @@ -interactions: -- request: - body: '{"model":"command-a-03-2025","messages":[{"role":"user","content":"Say - hi in one word."}],"max_tokens":10,"stream":false}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '121' - content-type: - - application/json - host: - - api.cohere.com - user-agent: - - cohere/7.1.0 - x-fern-language: - - Python - x-fern-platform: - - darwin/25.6.0 - x-fern-runtime: - - python/3.14.3 - x-fern-sdk-name: - - cohere - x-fern-sdk-version: - - 7.1.0 - method: POST - uri: https://api.cohere.com/v2/chat - response: - body: - string: '{"id":"2cc9a617-99a7-4a72-9f7c-99d14ddcbbff","message":{"role":"assistant","content":[{"type":"text","text":"Hi!"}]},"finish_reason":"COMPLETE","usage":{"billed_units":{"input_tokens":6,"output_tokens":2},"tokens":{"input_tokens":501,"output_tokens":5},"cached_tokens":448}}' - headers: - access-control-expose-headers: - - X-Debug-Trace-ID - alt-svc: - - h3=":443"; ma=2592000 - cache-control: - - no-cache, no-store, no-transform, must-revalidate, private, max-age=0 - content-length: - - '274' - content-type: - - application/json - date: - - Mon, 31 Aug 2026 15:26:17 GMT - expires: - - Thu, 01 Jan 1970 00:00:00 GMT - num_chars: - - '2597' - num_tokens: - - '8' - pragma: - - no-cache - server: - - envoy - transfer-encoding: - - chunked - vary: - - Origin,Accept-Encoding - via: - - 1.1 google - x-accel-expires: - - '0' - x-debug-trace-id: - - bcea6256362e1195c2d5ef3c74ee71f8 - x-endpoint-monthly-call-limit: - - '1000' - x-envoy-upstream-service-time: - - '105' - x-trial-endpoint-call-limit: - - '20' - x-trial-endpoint-call-remaining: - - '10' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/cohere/test_cohere.py b/py/src/braintrust/integrations/cohere/test_cohere.py index 0a99b639a..25cc88c02 100644 --- a/py/src/braintrust/integrations/cohere/test_cohere.py +++ b/py/src/braintrust/integrations/cohere/test_cohere.py @@ -189,17 +189,6 @@ def test_wrap_cohere_is_idempotent(): assert getattr(client, "__braintrust_cohere_traced__", False) is True -def test_cohere_integration_available_patchers_ids(): - ids = CohereIntegration.available_patchers() - assert set(ids) == { - "cohere.chat.all", - "cohere.chat_stream.all", - "cohere.embed.all", - "cohere.rerank.all", - "cohere.audio.transcriptions.all", - } - - def test_audio_transcriptions_patchers_target_sdk_surface(): """The audio transcription patchers must point at the Cohere SDK classes. @@ -669,43 +658,6 @@ async def _run(): assert span["metrics"].get("prompt_tokens", 0) > 0 -@pytest.mark.vcr -def test_cohere_integration_setup_patches_v2_chat(memory_logger, clean_cohere_methods): - """CohereIntegration.setup() patches the global Cohere classes. - - Verifies setup is idempotent and that un-wrapped client instances - created after setup() emit spans automatically. - """ - assert not memory_logger.pop() - - assert CohereIntegration.setup() is True - # Second call is a no-op but still reports success. - assert CohereIntegration.setup() is True - - use_v2 = _supports_client("ClientV2", "chat") - client = _v2_client(require_methods=("chat",)) if use_v2 else _v1_client() # NOT manually wrapped - if use_v2: - response = client.chat( - model=CHAT_MODEL, - messages=[{"role": "user", "content": "Say hi in one word."}], - max_tokens=10, - ) - assert response.message.role == "assistant" - else: - response = client.chat( - model=CHAT_MODEL, - message="Say hi in one word.", - max_tokens=10, - ) - assert isinstance(response.text, str) - - spans = memory_logger.pop() - assert len(spans) == 1 - assert spans[0]["span_attributes"]["name"] == "cohere.chat" - assert spans[0]["metadata"]["provider"] == "cohere" - assert spans[0]["metadata"]["model"] == CHAT_MODEL - - @pytest.mark.vcr def test_wrap_cohere_audio_transcription_sync(memory_logger): pytest.importorskip("cohere.audio.transcriptions.client") diff --git a/py/src/braintrust/integrations/huggingface_hub/test_huggingface_hub.py b/py/src/braintrust/integrations/huggingface_hub/test_huggingface_hub.py index b1ae4985c..af57ff36b 100644 --- a/py/src/braintrust/integrations/huggingface_hub/test_huggingface_hub.py +++ b/py/src/braintrust/integrations/huggingface_hub/test_huggingface_hub.py @@ -1,13 +1,12 @@ """Tests for the HuggingFace Hub integration.""" import asyncio -import inspect import os import time import pytest from braintrust import logger, start_span -from braintrust.integrations.huggingface_hub import HuggingFaceHubIntegration, wrap_huggingface_hub +from braintrust.integrations.huggingface_hub import wrap_huggingface_hub from braintrust.integrations.huggingface_hub.patchers import ( AsyncChatCompletionPatcher, AsyncFeatureExtractionPatcher, @@ -67,57 +66,6 @@ def memory_logger(): yield bgl -@pytest.fixture -def clean_hf_methods(): - """Snapshot and restore patched methods on the HuggingFace inference clients. - - Integration setup mutates global class state; tests that exercise - ``setup()`` must not leak wrappers into other tests. - """ - targets = [ - (_SyncInferenceClient, "chat_completion"), - (_SyncInferenceClient, "text_generation"), - (_SyncInferenceClient, "feature_extraction"), - (_SyncInferenceClient, "sentence_similarity"), - (_AsyncInferenceClient, "chat_completion"), - (_AsyncInferenceClient, "text_generation"), - (_AsyncInferenceClient, "feature_extraction"), - (_AsyncInferenceClient, "sentence_similarity"), - ] - originals = [(cls, attr, inspect.getattr_static(cls, attr)) for cls, attr in targets] - marker_attrs = { - patcher.patch_marker_attr() - for patcher in ( - ChatCompletionPatcher, - AsyncChatCompletionPatcher, - TextGenerationPatcher, - AsyncTextGenerationPatcher, - FeatureExtractionPatcher, - AsyncFeatureExtractionPatcher, - SentenceSimilarityPatcher, - AsyncSentenceSimilarityPatcher, - ) - } - - try: - yield - finally: - for cls, attr, original in originals: - setattr(cls, attr, original) - for cls, _, original in originals: - for marker in marker_attrs: - if hasattr(cls, marker): - try: - delattr(cls, marker) - except AttributeError: - pass - if hasattr(original, marker): - try: - delattr(original, marker) - except AttributeError: - pass - - def _sync_client(*, model: str = CHAT_MODEL, provider: str = CHAT_PROVIDER) -> InferenceClient: return InferenceClient(model=model, provider=provider, token=HF_TOKEN) @@ -131,26 +79,6 @@ def _async_client(*, model: str = CHAT_MODEL, provider: str = CHAT_PROVIDER) -> # --------------------------------------------------------------------------- -def test_integration_available_patcher_ids(): - ids = HuggingFaceHubIntegration.available_patchers() - assert set(ids) == { - "huggingface_hub.chat_completion.all", - "huggingface_hub.text_generation.all", - "huggingface_hub.feature_extraction.all", - "huggingface_hub.sentence_similarity.all", - } - - -def test_integration_pins_min_version_floor(): - """The integration must declare a min_version so the matrix floor is enforced. - - The 0.32.0 floor is the earliest release that exposes both the stable - multi-provider ``InferenceClient(provider=...)`` surface and the - ``provider="auto"`` routing mode the integration relies on. - """ - assert HuggingFaceHubIntegration.min_version == "0.32.0" - - def test_patchers_target_real_sdk_surfaces(): """Each patcher must point at an attribute that actually exists on the SDK. @@ -198,24 +126,6 @@ def test_wrap_huggingface_hub_is_idempotent(): assert getattr(client, "__braintrust_huggingface_hub_traced__", False) is True -def test_setup_is_idempotent(clean_hf_methods): - """Repeated ``setup()`` calls must not pile wrappers on top of each other.""" - assert HuggingFaceHubIntegration.setup() is True - assert HuggingFaceHubIntegration.setup() is True - - -def test_chat_dot_completions_dot_create_alias_dispatches_to_chat_completion(): - """The OpenAI-compatible ``client.chat.completions.create`` alias must - resolve to ``InferenceClient.chat_completion`` so that patching the latter - transparently covers the former. This is a structural assertion that - does not require network access. - """ - client = _sync_client() - # Bound method equality compares both ``__func__`` and ``__self__``, so - # this single assertion is what guarantees a single patch covers both. - assert client.chat.completions.create == client.chat_completion - - # --------------------------------------------------------------------------- # VCR-backed integration tests # diff --git a/py/src/braintrust/integrations/instructor/cassettes/1.11.0/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml b/py/src/braintrust/integrations/instructor/cassettes/1.11.0/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml deleted file mode 100644 index 7a009af63..000000000 --- a/py/src/braintrust/integrations/instructor/cassettes/1.11.0/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml +++ /dev/null @@ -1,18 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Extract Grace, age 45."}],"model":"gpt-4o-mini","tool_choice":{"type":"function","function":{"name":"Person"}},"tools":[{"type":"function","function":{"name":"Person","description":"Correctly extracted `Person` with all the required parameters with correct types","parameters":{"properties":{"name":{"description":"The person''s name","title":"Name","type":"string"},"age":{"description":"The person''s age","title":"Age","type":"integer"}},"required":["age","name"],"type":"object"}}}]}' - headers: {} - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-instructor-grace","object":"chat.completion","created":1779735568,"model":"gpt-4o-mini-2024-07-18","choices":[{"index":0,"message":{"role":"assistant","content":null,"tool_calls":[{"id":"call_grace","type":"function","function":{"name":"Person","arguments":"{\"name\":\"Grace\",\"age\":45}"}}],"refusal":null,"annotations":[]},"finish_reason":"tool_calls"}],"usage":{"prompt_tokens":80,"completion_tokens":12,"total_tokens":92,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"service_tier":"default","system_fingerprint":"fp_test"}' - headers: - content-type: - - application/json - x-request-id: - - req_instructor_grace - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/instructor/cassettes/1.11.0/test_instructor_openai_single_success.yaml b/py/src/braintrust/integrations/instructor/cassettes/1.11.0/test_instructor_openai_single_success.yaml deleted file mode 100644 index 7a009af63..000000000 --- a/py/src/braintrust/integrations/instructor/cassettes/1.11.0/test_instructor_openai_single_success.yaml +++ /dev/null @@ -1,18 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Extract Grace, age 45."}],"model":"gpt-4o-mini","tool_choice":{"type":"function","function":{"name":"Person"}},"tools":[{"type":"function","function":{"name":"Person","description":"Correctly extracted `Person` with all the required parameters with correct types","parameters":{"properties":{"name":{"description":"The person''s name","title":"Name","type":"string"},"age":{"description":"The person''s age","title":"Age","type":"integer"}},"required":["age","name"],"type":"object"}}}]}' - headers: {} - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-instructor-grace","object":"chat.completion","created":1779735568,"model":"gpt-4o-mini-2024-07-18","choices":[{"index":0,"message":{"role":"assistant","content":null,"tool_calls":[{"id":"call_grace","type":"function","function":{"name":"Person","arguments":"{\"name\":\"Grace\",\"age\":45}"}}],"refusal":null,"annotations":[]},"finish_reason":"tool_calls"}],"usage":{"prompt_tokens":80,"completion_tokens":12,"total_tokens":92,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"service_tier":"default","system_fingerprint":"fp_test"}' - headers: - content-type: - - application/json - x-request-id: - - req_instructor_grace - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/instructor/cassettes/latest/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml b/py/src/braintrust/integrations/instructor/cassettes/latest/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml deleted file mode 100644 index d0b4084bb..000000000 --- a/py/src/braintrust/integrations/instructor/cassettes/latest/TestInstructorParentIsNotLLM.test_parent_span_type_is_task_not_llm.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Extract Grace, age 45."}],"model":"gpt-4o-mini","tool_choice":{"type":"function","function":{"name":"Person"}},"tools":[{"type":"function","function":{"name":"Person","description":"Correctly - extracted `Person` with all the required parameters with correct types","parameters":{"properties":{"name":{"description":"The - person''s name","title":"Name","type":"string"},"age":{"description":"The person''s - age","title":"Age","type":"integer"}},"required":["age","name"],"type":"object"}}}]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '524' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.13.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.13.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EO1AA8QmR7UyESxMxzLxhPQUeELwZ\",\n \"object\": - \"chat.completion\",\n \"created\": 1789393050,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n - \ \"id\": \"call_8jI8fQGn6tycXy2ZGgMCfx8e\",\n \"type\": - \"function\",\n \"function\": {\n \"name\": \"Person\",\n - \ \"arguments\": \"{\\\"name\\\":\\\"Grace\\\",\\\"age\\\":45}\"\n - \ }\n }\n ],\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 85,\n \"completion_tokens\": - 9,\n \"total_tokens\": 94,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_7621869b31\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3afc9626e5cac48-YYZ - connection: - - keep-alive - content-length: - - '1083' - content-type: - - application/json - date: - - Mon, 14 Sep 2026 13:37:30 GMT - openai-processing-ms: - - '494' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_5fc28f4eeb60403b99f7e2d879c86d7a - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/instructor/test_instructor.py b/py/src/braintrust/integrations/instructor/test_instructor.py index 27c359a3a..89ef740bd 100644 --- a/py/src/braintrust/integrations/instructor/test_instructor.py +++ b/py/src/braintrust/integrations/instructor/test_instructor.py @@ -21,7 +21,7 @@ import openai import pytest from braintrust.span_types import SpanTypeAttribute -from braintrust.test_helpers import find_span_by_name, find_spans_by_type, init_test_logger, memory_logger +from braintrust.test_helpers import find_spans_by_type, init_test_logger, memory_logger from pydantic import BaseModel, Field @@ -77,24 +77,6 @@ def setup_logger(): InstructorIntegration.setup() -class TestInstructorIntegrationExists: - """Static checks the Instructor integration is registered.""" - - def test_integration_class_exported(self): - from braintrust.integrations import InstructorIntegration # noqa: F401 - - def test_wrap_instructor_exported(self): - from braintrust import wrap_instructor # noqa: F401 - - def test_auto_instrument_has_instructor_kwarg(self): - import braintrust - - argcount = braintrust.auto_instrument.__code__.co_argcount - kwonly = braintrust.auto_instrument.__code__.co_kwonlyargcount - params = braintrust.auto_instrument.__code__.co_varnames[: argcount + kwonly] - assert "instructor" in params - - class TestInstructorOpenAISpans: """End-to-end: real instructor.from_openai against a VCR cassette.""" @@ -207,27 +189,6 @@ def test_instructor_openai_retries_then_succeeds(self, setup_logger, memory_logg assert k not in parent_metrics -class TestInstructorPatcherIdempotence: - """Calling setup or wrap_instructor twice must not stack wrappers.""" - - def test_setup_is_idempotent(self): - from braintrust.integrations import InstructorIntegration - - assert InstructorIntegration.setup() is True - # second call should not raise and should report success - assert InstructorIntegration.setup() is True - - # Calling create twice in a row still works (sanity). - from braintrust import wrap_openai - - init_test_logger(PROJECT_NAME) - client = wrap_openai(_make_openai_client()) - patched = instructor.from_openai(client, mode=instructor.Mode.TOOLS) - # We're not making a real call here; just confirming patch did not - # destroy the bound method surface. - assert callable(patched.chat.completions.create) - - class TestInstructorAutoInstrumentSubprocess: """auto_instrument() must instrument Instructor in a fresh subprocess too.""" @@ -235,24 +196,3 @@ def test_subprocess_auto_instrument_instructor(self): from braintrust.integrations.test_utils import verify_autoinstrument_script verify_autoinstrument_script("test_auto_instructor.py", timeout=30) - - -class TestInstructorParentIsNotLLM: - """Span-type invariant: Instructor parent is never typed as `llm`.""" - - @pytest.mark.vcr("test_instructor_openai_single_success.yaml") - def test_parent_span_type_is_task_not_llm(self, setup_logger, memory_logger): - from braintrust import wrap_openai - - client = wrap_openai(_make_openai_client()) - patched = instructor.from_openai(client, mode=instructor.Mode.TOOLS) - patched.chat.completions.create( - model="gpt-4o-mini", - response_model=Person, - max_retries=3, - messages=[{"role": "user", "content": "Extract Grace, age 45."}], - ) - spans = _all_spans(memory_logger) - parent = find_span_by_name(spans, "instructor.create") - assert parent["span_attributes"]["type"] == SpanTypeAttribute.TASK.value - assert parent["span_attributes"]["type"] != SpanTypeAttribute.LLM.value diff --git a/py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_aresponses.yaml b/py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_aresponses.yaml deleted file mode 100644 index e9d155453..000000000 --- a/py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_aresponses.yaml +++ /dev/null @@ -1,98 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-4o-mini", "input": "What''s 12 + 12?", "instructions": "Just - the number please"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '94' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - litellm/1.80.11 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_026bca77278090c400695da9f2336c8197a28a89d2eeea3847\"\ - ,\n \"object\": \"response\",\n \"created_at\": 1767746034,\n \"status\"\ - : \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\"\ - : \"developer\"\n },\n \"completed_at\": 1767746036,\n \"error\": null,\n\ - \ \"incomplete_details\": null,\n \"instructions\": \"Just the number please\"\ - ,\n \"max_output_tokens\": null,\n \"max_tool_calls\": null,\n \"model\"\ - : \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n \"id\": \"msg_026bca77278090c400695da9f40c608197ab0013c567aa9cff\"\ - ,\n \"type\": \"message\",\n \"status\": \"completed\",\n \"\ - content\": [\n {\n \"type\": \"output_text\",\n \"\ - annotations\": [],\n \"logprobs\": [],\n \"text\": \"24\"\ - \n }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\"\ - : true,\n \"previous_response_id\": null,\n \"prompt_cache_key\": null,\n\ - \ \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\":\ - \ null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"\ - service_tier\": \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n\ - \ \"text\": {\n \"format\": {\n \"type\": \"text\"\n },\n \"\ - verbosity\": \"medium\"\n },\n \"tool_choice\": \"auto\",\n \"tools\":\ - \ [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": \"disabled\"\ - ,\n \"usage\": {\n \"input_tokens\": 22,\n \"input_tokens_details\"\ - : {\n \"cached_tokens\": 0\n },\n \"output_tokens\": 2,\n \"\ - output_tokens_details\": {\n \"reasoning_tokens\": 0\n },\n \"\ - total_tokens\": 24\n },\n \"user\": null,\n \"metadata\": {}\n}" - headers: - CF-RAY: - - 9b9f5dc6cc8f88dc-PDX - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 07 Jan 2026 00:33:56 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=_y7fCdc9uilcXWWehABBb.Mld5QbTO5KpPG2Z8vNrVk-1767746036-1.0.1.1-SVJnu7TvCHcIGFk47ciU4dkHSA5T2btNr1nGsKdQHCN4ddCrnwJk5s1oZgJKwllLU42AQ86e6IWnerYag8EoUlFmM8hBMTFImeYCLKwAHW4; - path=/; expires=Wed, 07-Jan-26 01:03:56 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=tf9PFl6ALaHHYzNa_b0aZF9a3TVLXWEeHcFjWXTQvvc-1767746036217-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - user-bkcsfvrp2vh67rqzpgtsbnle - openai-processing-ms: - - '1992' - openai-project: - - proj_IG1Ou5SIiy81s3W66WZ5dtN6 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1995' - x-ratelimit-limit-requests: - - '5000' - x-ratelimit-limit-tokens: - - '4000000' - x-ratelimit-remaining-requests: - - '4999' - x-ratelimit-remaining-tokens: - - '3999959' - x-ratelimit-reset-requests: - - 12ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_4d0d66110b8b40c8bbffdaa0446e1ba2 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_responses.yaml b/py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_responses.yaml deleted file mode 100644 index 3d82f70e0..000000000 --- a/py/src/braintrust/integrations/litellm/cassettes/1.74.0/test_patch_litellm_responses.yaml +++ /dev/null @@ -1,98 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-4o-mini", "input": "What''s 12 + 12?", "instructions": "Just - the number please"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '94' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - litellm/1.80.11 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0c1d868d4b13f47b00695da9f0716c8195aa610e236b2467e4\"\ - ,\n \"object\": \"response\",\n \"created_at\": 1767746032,\n \"status\"\ - : \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\"\ - : \"developer\"\n },\n \"completed_at\": 1767746033,\n \"error\": null,\n\ - \ \"incomplete_details\": null,\n \"instructions\": \"Just the number please\"\ - ,\n \"max_output_tokens\": null,\n \"max_tool_calls\": null,\n \"model\"\ - : \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n \"id\": \"msg_0c1d868d4b13f47b00695da9f15e50819583c61441cd08b841\"\ - ,\n \"type\": \"message\",\n \"status\": \"completed\",\n \"\ - content\": [\n {\n \"type\": \"output_text\",\n \"\ - annotations\": [],\n \"logprobs\": [],\n \"text\": \"24\"\ - \n }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\"\ - : true,\n \"previous_response_id\": null,\n \"prompt_cache_key\": null,\n\ - \ \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\":\ - \ null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"\ - service_tier\": \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n\ - \ \"text\": {\n \"format\": {\n \"type\": \"text\"\n },\n \"\ - verbosity\": \"medium\"\n },\n \"tool_choice\": \"auto\",\n \"tools\":\ - \ [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": \"disabled\"\ - ,\n \"usage\": {\n \"input_tokens\": 22,\n \"input_tokens_details\"\ - : {\n \"cached_tokens\": 0\n },\n \"output_tokens\": 2,\n \"\ - output_tokens_details\": {\n \"reasoning_tokens\": 0\n },\n \"\ - total_tokens\": 24\n },\n \"user\": null,\n \"metadata\": {}\n}" - headers: - CF-RAY: - - 9b9f5dbabdb9121f-PDX - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 07 Jan 2026 00:33:53 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=gzLtdrnV2HbuCKHt_I10NyUVXM.pTd0qboetSCQmg8Q-1767746033-1.0.1.1-wJ7_10.60MJUt53.SqOAx9RxVaTenNI_42WRp5n2mCHtM5URbzqzuY2hNWmUfRmtXegKRWGZ0cd.KPa2MV6IOuapltXXsNLnaqUIpxl3zEU; - path=/; expires=Wed, 07-Jan-26 01:03:53 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=H.FSS.Wxa0H38XUwRHp4Gtf36NbqyBKQwH7NV1dCs8o-1767746033539-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - user-bkcsfvrp2vh67rqzpgtsbnle - openai-processing-ms: - - '1065' - openai-project: - - proj_IG1Ou5SIiy81s3W66WZ5dtN6 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1068' - x-ratelimit-limit-requests: - - '5000' - x-ratelimit-limit-tokens: - - '4000000' - x-ratelimit-remaining-requests: - - '4999' - x-ratelimit-remaining-tokens: - - '3999959' - x-ratelimit-reset-requests: - - 12ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_4f3f01e7d8094ab08cb403645a06c542 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_aresponses.yaml b/py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_aresponses.yaml deleted file mode 100644 index bb7190de3..000000000 --- a/py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_aresponses.yaml +++ /dev/null @@ -1,101 +0,0 @@ -interactions: -- request: - body: '{"model":"gpt-4o-mini","input":"What''s 12 + 12?","instructions":"Just - the number please"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '89' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - litellm/1.102.0 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0ee7198328b734ba006ab294b7a2d887d29d838e591505c1e0\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088375,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088376,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - \"Just the number please\",\n \"max_output_tokens\": null,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n - \ \"output\": [\n {\n \"id\": \"msg_0ee7198328b734ba006ab294b8225487d2962e399642e1467e\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"24\"\n }\n - \ ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": \"in_memory\",\n \"reasoning\": {\n - \ \"context\": null,\n \"effort\": null,\n \"summary\": null\n },\n - \ \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": - true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": - \"text\"\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": - \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n \"input_tokens\": - 0,\n \"input_tokens_details\": {\n \"image_tokens\": 0,\n \"text_tokens\": - 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 22,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 2,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 24\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - Access-Control-Expose-Headers: - - X-Request-ID - - CF-Ray - - CF-Ray - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - a3f2191b2d727539-EWR - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 22 Sep 2026 14:46:16 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '1991' - openai-processing-ms: - - '799' - openai-version: - - '2020-10-01' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999960' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_303c17b2d0c346c9ad1961bd4362c670 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_responses.yaml b/py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_responses.yaml deleted file mode 100644 index e6dd54b6a..000000000 --- a/py/src/braintrust/integrations/litellm/cassettes/latest/test_patch_litellm_responses.yaml +++ /dev/null @@ -1,101 +0,0 @@ -interactions: -- request: - body: '{"model":"gpt-4o-mini","input":"What''s 12 + 12?","instructions":"Just - the number please"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '89' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - litellm/1.102.0 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_09a0ec4dfee6da2d006ab294b3c9b487d2a42db28cbdbd154b\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088371,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088372,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - \"Just the number please\",\n \"max_output_tokens\": null,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n - \ \"output\": [\n {\n \"id\": \"msg_09a0ec4dfee6da2d006ab294b4d45887d28f0e8f675004a5aa\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"24\"\n }\n - \ ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": \"in_memory\",\n \"reasoning\": {\n - \ \"context\": null,\n \"effort\": null,\n \"summary\": null\n },\n - \ \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": - true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": - \"text\"\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": - \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n \"input_tokens\": - 0,\n \"input_tokens_details\": {\n \"image_tokens\": 0,\n \"text_tokens\": - 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 22,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 2,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 24\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21901fd09425d-EWR - connection: - - keep-alive - content-length: - - '1991' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:13 GMT - openai-processing-ms: - - '1356' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999960' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_7f70c8634cf04c2b88be7306ecc6f2e2 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/litellm/test_litellm.py b/py/src/braintrust/integrations/litellm/test_litellm.py index 12ce1afea..ce6fd9218 100644 --- a/py/src/braintrust/integrations/litellm/test_litellm.py +++ b/py/src/braintrust/integrations/litellm/test_litellm.py @@ -642,16 +642,6 @@ async def test_litellm_async_streaming_with_break(memory_logger): assert metrics["time_to_first_token"] >= 0 -def test_patch_litellm_responses(): - """Test that patch_litellm() patches responses (subprocess to avoid global state pollution).""" - verify_autoinstrument_script("test_patch_litellm_responses.py") - - -def test_patch_litellm_aresponses(): - """Test that patch_litellm() patches aresponses (subprocess to avoid global state pollution).""" - verify_autoinstrument_script("test_patch_litellm_aresponses.py") - - def test_litellm_is_numeric_excludes_booleans(): """Reproduce issue #1357: _is_numeric should exclude booleans. @@ -668,30 +658,6 @@ def test_litellm_is_numeric_excludes_booleans(): assert not is_numeric(False) -def test_litellm_parse_metrics_excludes_booleans(): - """Reproduce issue #1357: _parse_metrics_from_usage should not include boolean fields. - - When OpenRouter returns usage data with `is_byok: true`, the metrics parser - should filter it out rather than passing it through to the API. - """ - from braintrust.integrations.litellm.tracing import _parse_metrics_from_usage - - usage = { - "prompt_tokens": 10, - "completion_tokens": 20, - "total_tokens": 30, - "is_byok": True, - } - metrics = _parse_metrics_from_usage(usage) - - assert "prompt_tokens" in metrics - assert "completion_tokens" in metrics - assert "tokens" in metrics - assert "is_byok" not in metrics - for key, value in metrics.items(): - assert not isinstance(value, bool) - - @pytest.mark.vcr def test_litellm_openrouter_no_booleans_in_metrics(memory_logger): """Reproduce issue #1357: OpenRouter returns is_byok boolean in usage. @@ -814,22 +780,6 @@ def test_litellm_parse_rerank_metrics_from_meta(): assert metrics2 == {"search_units": 1} -def test_litellm_extract_rerank_output_drops_document(): - from braintrust.integrations.litellm.tracing import _extract_rerank_output - - response = { - "results": [ - {"index": 0, "relevance_score": 0.9, "document": {"text": "private"}}, - {"index": 1, "relevance_score": 0.1, "document": {"text": "also private"}}, - ] - } - out = _extract_rerank_output(response) - assert out == [ - {"index": 0, "relevance_score": 0.9}, - {"index": 1, "relevance_score": 0.1}, - ] - - class TestAutoInstrumentLiteLLM: """Tests for auto_instrument() with LiteLLM.""" diff --git a/py/src/braintrust/integrations/mistral/cassettes/1.12.4/test_mistral_integration_setup_creates_spans.yaml b/py/src/braintrust/integrations/mistral/cassettes/1.12.4/test_mistral_integration_setup_creates_spans.yaml deleted file mode 100644 index 844a4fb60..000000000 --- a/py/src/braintrust/integrations/mistral/cassettes/1.12.4/test_mistral_integration_setup_creates_spans.yaml +++ /dev/null @@ -1,156 +0,0 @@ -interactions: -- request: - body: '{"model":"mistral-small-latest","messages":[{"content":"What is 2+2? Reply - with just the number.","role":"user"}],"max_tokens":10,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '145' - Host: - - api.mistral.ai - content-type: - - application/json - user-agent: - - mistral-client-python/1.12.4 - method: POST - uri: https://api.mistral.ai/v1/chat/completions - response: - body: - string: '{"id":"cfca3ec9b4d9406aa3d4edd7c6dd3e02","created":1775090565,"model":"mistral-small-latest","usage":{"prompt_tokens":28,"total_tokens":30,"completion_tokens":2,"prompt_tokens_details":{"cached_tokens":0}},"object":"chat.completion","choices":[{"index":0,"finish_reason":"stop","message":{"role":"assistant","tool_calls":null,"content":"4"}}]}' - headers: - CF-RAY: - - 9e5bcba42f4af337-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 02 Apr 2026 00:42:46 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=15552000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '343' - mistral-correlation-id: - - 019d4ba4-82de-7d54-b8db-36eadad0d6fb - set-cookie: - - __cf_bm=LZgwv7VkE_uahQNBcsoAHDympjTRdYshtpiktxKSZUI-1775090565.7901893-1.0.1.1-WlnWQpklMhQAJkPSitfyvrMNeCfzJKpmIzUjs2T5nF.szt.W4_zuzgtFvNmOVbft08at8DXTWjsy5N5xQp3U4Ld1_miC9TnDJdXzgv0dALELidawrG5vM_X_ZDZDqRKm; - HttpOnly; Secure; Path=/; Domain=mistral.ai; Expires=Thu, 02 Apr 2026 01:12:46 - GMT - - _cfuvid=iORpbZB2m.YumIunOW4.E2_K7fN_HKJtzYXjVULh0KE-1775090565.7901893-1.0.1.1-W3KSrmaSr.tgkkvkXF_jmOsW6IGGBpEk0utFIwEVm20; - HttpOnly; SameSite=None; Secure; Path=/; Domain=mistral.ai - x-envoy-upstream-service-time: - - '187' - x-kong-proxy-latency: - - '9' - x-kong-request-id: - - 019d4ba4-82de-7d54-b8db-36eadad0d6fb - x-kong-upstream-latency: - - '188' - x-ratelimit-limit-req-minute: - - '60' - x-ratelimit-limit-tokens-minute: - - '375000' - x-ratelimit-remaining-req-minute: - - '55' - x-ratelimit-remaining-tokens-minute: - - '374879' - x-ratelimit-tokens-query-cost: - - '30' - status: - code: 200 - message: OK -- request: - body: '{"model":"mistral-small-latest","messages":[{"content":"What is 2+2? Reply - with just the number.","role":"user"}],"max_tokens":10,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '145' - Host: - - api.mistral.ai - content-type: - - application/json - user-agent: - - mistral-client-python/1.12.4 - method: POST - uri: https://api.mistral.ai/v1/chat/completions - response: - body: - string: '{"id":"fc4f405716c9495f9f69c71a70c0315a","created":1775101277,"model":"mistral-small-latest","usage":{"prompt_tokens":28,"total_tokens":30,"completion_tokens":2,"prompt_tokens_details":{"cached_tokens":0}},"object":"chat.completion","choices":[{"index":0,"finish_reason":"stop","message":{"role":"assistant","tool_calls":null,"content":"4"}}]}' - headers: - CF-RAY: - - 9e5cd1284d73ec72-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 02 Apr 2026 03:41:17 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=15552000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '343' - mistral-correlation-id: - - 019d4c47-f568-70ba-82e9-1dd031ca2281 - set-cookie: - - __cf_bm=pJa5CFWeZmlNSxBwIZzCulbNsq77ciOi_tKoiaEoRFg-1775101277.4821184-1.0.1.1-4bsLhPMRrcfApvStpsoTV.fkBBREwW1.NrLSds4Ht4DIkkbAO1CP0_8nM06ljygtPHX3cvBUKsF.GkSqejx.hfLnkbxx7_z1ouMEXFcgzrZh8hZjwGCT.whBO.vHN1a9; - HttpOnly; Secure; Path=/; Domain=mistral.ai; Expires=Thu, 02 Apr 2026 04:11:17 - GMT - - _cfuvid=cHleL7rWUZfTZ4B_COwe08XH7.4AE12NcSwOkHQM5qA-1775101277.4821184-1.0.1.1-IAavRWhHK0RAaUXKL8lRC4IPxJt.pRQt9NmnEtYNagM; - HttpOnly; SameSite=None; Secure; Path=/; Domain=mistral.ai - x-envoy-upstream-service-time: - - '251' - x-kong-proxy-latency: - - '10' - x-kong-request-id: - - 019d4c47-f568-70ba-82e9-1dd031ca2281 - x-kong-upstream-latency: - - '252' - x-ratelimit-limit-req-minute: - - '60' - x-ratelimit-limit-tokens-minute: - - '375000' - x-ratelimit-remaining-req-minute: - - '51' - x-ratelimit-remaining-tokens-minute: - - '374879' - x-ratelimit-tokens-query-cost: - - '30' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/mistral/cassettes/latest/test_mistral_integration_setup_creates_spans.yaml b/py/src/braintrust/integrations/mistral/cassettes/latest/test_mistral_integration_setup_creates_spans.yaml deleted file mode 100644 index 952875f64..000000000 --- a/py/src/braintrust/integrations/mistral/cassettes/latest/test_mistral_integration_setup_creates_spans.yaml +++ /dev/null @@ -1,75 +0,0 @@ -interactions: -- request: - body: '{"model":"mistral-small-latest","messages":[{"content":"What is 2+2? Reply - with just the number.","role":"user"}],"max_tokens":10,"stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '145' - content-type: - - application/json - host: - - api.mistral.ai - user-agent: - - mistral-client-python/2.9.0 - method: POST - uri: https://api.mistral.ai/v1/chat/completions - response: - body: - string: '{"id":"647a58950ded49fa9762cb152f37bf01","created":1785860178,"model":"mistral-small-latest","usage":{"prompt_tokens":28,"total_tokens":30,"completion_tokens":2,"prompt_tokens_details":{"cached_tokens":0},"service_tier":"standard"},"object":"chat.completion","choices":[{"index":0,"finish_reason":"stop","message":{"role":"assistant","tool_calls":null,"content":"4"}}]}' - headers: - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a25edda34cc51341-YYZ - connection: - - keep-alive - content-length: - - '369' - content-type: - - application/json - date: - - Tue, 04 Aug 2026 16:16:19 GMT - mistral-correlation-id: - - 019fcd8f-c24f-7d77-a9d4-7f33d2a96321 - server: - - cloudflare - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-envoy-upstream-service-time: - - '433' - x-kong-proxy-latency: - - '13' - x-kong-request-id: - - 019fcd8f-c24f-7d77-a9d4-7f33d2a96321 - x-kong-upstream-latency: - - '435' - x-max-retry-attempts-reached: - - 'false' - x-ratelimit-limit-req-minute: - - '50' - x-ratelimit-limit-tokens-minute: - - '50000' - x-ratelimit-remaining-req-minute: - - '45' - x-ratelimit-remaining-tokens-minute: - - '49489' - x-ratelimit-tokens-query-cost: - - '30' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/mistral/test_mistral.py b/py/src/braintrust/integrations/mistral/test_mistral.py index 298fffc4f..ba5e27930 100644 --- a/py/src/braintrust/integrations/mistral/test_mistral.py +++ b/py/src/braintrust/integrations/mistral/test_mistral.py @@ -138,6 +138,20 @@ def _assert_conversation_span(span, expected_input, start, end, *, expected_cont assert_metrics_are_valid(span["metrics"], start, end) +def _core_method_refs(): + refs = {} + for cls, methods in ( + (Chat, ("complete", "complete_async", "stream", "stream_async")), + (Embeddings, ("create", "create_async")), + (Fim, ("complete", "complete_async", "stream", "stream_async")), + (Agents, ("complete", "complete_async", "stream", "stream_async")), + (Ocr, ("process", "process_async")), + ): + for method in methods: + refs[(cls, method)] = inspect.getattr_static(cls, method) + return refs + + def _audio_method_refs(): refs = {} for cls, methods in ( @@ -1091,147 +1105,17 @@ def test_mistral_integration_setup_instruments_beta_conversations(memory_logger, ) -@pytest.mark.vcr -def test_mistral_integration_setup_creates_spans(memory_logger, monkeypatch): - assert not memory_logger.pop() - - original_complete = inspect.getattr_static(Chat, "complete") - original_complete_async = inspect.getattr_static(Chat, "complete_async") - original_stream = inspect.getattr_static(Chat, "stream") - original_stream_async = inspect.getattr_static(Chat, "stream_async") - original_embeddings_create = inspect.getattr_static(Embeddings, "create") - original_embeddings_create_async = inspect.getattr_static(Embeddings, "create_async") - original_fim_complete = inspect.getattr_static(Fim, "complete") - original_fim_complete_async = inspect.getattr_static(Fim, "complete_async") - original_fim_stream = inspect.getattr_static(Fim, "stream") - original_fim_stream_async = inspect.getattr_static(Fim, "stream_async") - original_agents_complete = inspect.getattr_static(Agents, "complete") - original_agents_complete_async = inspect.getattr_static(Agents, "complete_async") - original_agents_stream = inspect.getattr_static(Agents, "stream") - original_agents_stream_async = inspect.getattr_static(Agents, "stream_async") - original_ocr_process = inspect.getattr_static(Ocr, "process") - original_ocr_process_async = inspect.getattr_static(Ocr, "process_async") - original_audio_methods = _audio_method_refs() - - assert MistralIntegration.setup() - client = _get_client() - start = time.time() - response = client.chat.complete( - model=CHAT_MODEL, - messages=[{"role": "user", "content": "What is 2+2? Reply with just the number."}], - max_tokens=10, - ) - end = time.time() - - monkeypatch.setattr(Chat, "complete", original_complete) - monkeypatch.setattr(Chat, "complete_async", original_complete_async) - monkeypatch.setattr(Chat, "stream", original_stream) - monkeypatch.setattr(Chat, "stream_async", original_stream_async) - monkeypatch.setattr(Embeddings, "create", original_embeddings_create) - monkeypatch.setattr(Embeddings, "create_async", original_embeddings_create_async) - monkeypatch.setattr(Fim, "complete", original_fim_complete) - monkeypatch.setattr(Fim, "complete_async", original_fim_complete_async) - monkeypatch.setattr(Fim, "stream", original_fim_stream) - monkeypatch.setattr(Fim, "stream_async", original_fim_stream_async) - monkeypatch.setattr(Agents, "complete", original_agents_complete) - monkeypatch.setattr(Agents, "complete_async", original_agents_complete_async) - monkeypatch.setattr(Agents, "stream", original_agents_stream) - monkeypatch.setattr(Agents, "stream_async", original_agents_stream_async) - monkeypatch.setattr(Ocr, "process", original_ocr_process) - monkeypatch.setattr(Ocr, "process_async", original_ocr_process_async) - _restore_method_refs(monkeypatch, original_audio_methods) - - assert "4" in str(response.choices[0].message.content) - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["provider"] == "mistral" - assert span["metadata"]["model"] == CHAT_MODEL - assert "4" in str(span["output"]) - assert_metrics_are_valid(span["metrics"], start, end) - - def test_mistral_integration_setup_is_idempotent(monkeypatch): - first_complete = inspect.getattr_static(Chat, "complete") - first_complete_async = inspect.getattr_static(Chat, "complete_async") - first_stream = inspect.getattr_static(Chat, "stream") - first_stream_async = inspect.getattr_static(Chat, "stream_async") - first_embeddings_create = inspect.getattr_static(Embeddings, "create") - first_embeddings_create_async = inspect.getattr_static(Embeddings, "create_async") - first_fim_complete = inspect.getattr_static(Fim, "complete") - first_fim_complete_async = inspect.getattr_static(Fim, "complete_async") - first_fim_stream = inspect.getattr_static(Fim, "stream") - first_fim_stream_async = inspect.getattr_static(Fim, "stream_async") - first_agents_complete = inspect.getattr_static(Agents, "complete") - first_agents_complete_async = inspect.getattr_static(Agents, "complete_async") - first_agents_stream = inspect.getattr_static(Agents, "stream") - first_agents_stream_async = inspect.getattr_static(Agents, "stream_async") - first_ocr_process = inspect.getattr_static(Ocr, "process") - first_ocr_process_async = inspect.getattr_static(Ocr, "process_async") - first_conversation_methods = _conversation_method_refs() - first_audio_methods = _audio_method_refs() + first_methods = {**_core_method_refs(), **_conversation_method_refs(), **_audio_method_refs()} assert MistralIntegration.setup() - patched_complete = inspect.getattr_static(Chat, "complete") - patched_complete_async = inspect.getattr_static(Chat, "complete_async") - patched_stream = inspect.getattr_static(Chat, "stream") - patched_stream_async = inspect.getattr_static(Chat, "stream_async") - patched_embeddings_create = inspect.getattr_static(Embeddings, "create") - patched_embeddings_create_async = inspect.getattr_static(Embeddings, "create_async") - patched_fim_complete = inspect.getattr_static(Fim, "complete") - patched_fim_complete_async = inspect.getattr_static(Fim, "complete_async") - patched_fim_stream = inspect.getattr_static(Fim, "stream") - patched_fim_stream_async = inspect.getattr_static(Fim, "stream_async") - patched_agents_complete = inspect.getattr_static(Agents, "complete") - patched_agents_complete_async = inspect.getattr_static(Agents, "complete_async") - patched_agents_stream = inspect.getattr_static(Agents, "stream") - patched_agents_stream_async = inspect.getattr_static(Agents, "stream_async") - patched_ocr_process = inspect.getattr_static(Ocr, "process") - patched_ocr_process_async = inspect.getattr_static(Ocr, "process_async") - patched_conversation_methods = _conversation_method_refs() - patched_audio_methods = _audio_method_refs() + patched_methods = {**_core_method_refs(), **_conversation_method_refs(), **_audio_method_refs()} assert MistralIntegration.setup() - assert inspect.getattr_static(Chat, "complete") is patched_complete - assert inspect.getattr_static(Chat, "complete_async") is patched_complete_async - assert inspect.getattr_static(Chat, "stream") is patched_stream - assert inspect.getattr_static(Chat, "stream_async") is patched_stream_async - assert inspect.getattr_static(Embeddings, "create") is patched_embeddings_create - assert inspect.getattr_static(Embeddings, "create_async") is patched_embeddings_create_async - assert inspect.getattr_static(Fim, "complete") is patched_fim_complete - assert inspect.getattr_static(Fim, "complete_async") is patched_fim_complete_async - assert inspect.getattr_static(Fim, "stream") is patched_fim_stream - assert inspect.getattr_static(Fim, "stream_async") is patched_fim_stream_async - assert inspect.getattr_static(Agents, "complete") is patched_agents_complete - assert inspect.getattr_static(Agents, "complete_async") is patched_agents_complete_async - assert inspect.getattr_static(Agents, "stream") is patched_agents_stream - assert inspect.getattr_static(Agents, "stream_async") is patched_agents_stream_async - assert inspect.getattr_static(Ocr, "process") is patched_ocr_process - assert inspect.getattr_static(Ocr, "process_async") is patched_ocr_process_async - for key, method in patched_conversation_methods.items(): - assert inspect.getattr_static(*key) is method - for key, method in patched_audio_methods.items(): - assert inspect.getattr_static(*key) is method - - monkeypatch.setattr(Chat, "complete", first_complete) - monkeypatch.setattr(Chat, "complete_async", first_complete_async) - monkeypatch.setattr(Chat, "stream", first_stream) - monkeypatch.setattr(Chat, "stream_async", first_stream_async) - monkeypatch.setattr(Embeddings, "create", first_embeddings_create) - monkeypatch.setattr(Embeddings, "create_async", first_embeddings_create_async) - monkeypatch.setattr(Fim, "complete", first_fim_complete) - monkeypatch.setattr(Fim, "complete_async", first_fim_complete_async) - monkeypatch.setattr(Fim, "stream", first_fim_stream) - monkeypatch.setattr(Fim, "stream_async", first_fim_stream_async) - monkeypatch.setattr(Agents, "complete", first_agents_complete) - monkeypatch.setattr(Agents, "complete_async", first_agents_complete_async) - monkeypatch.setattr(Agents, "stream", first_agents_stream) - monkeypatch.setattr(Agents, "stream_async", first_agents_stream_async) - monkeypatch.setattr(Ocr, "process", first_ocr_process) - monkeypatch.setattr(Ocr, "process_async", first_ocr_process_async) - _restore_method_refs(monkeypatch, first_conversation_methods) - _restore_method_refs(monkeypatch, first_audio_methods) + for key, method in patched_methods.items(): + assert inspect.getattr_static(*key) is method, key + + _restore_method_refs(monkeypatch, first_methods) def test_chat_complete_wrapper_logs_errors(memory_logger): @@ -1299,33 +1183,6 @@ def test_normalize_mistral_multimodal_value_converts_image_url_data_uri_to_attac assert sanitized["image_url"]["url"].reference["content_type"] == "image/png" -def test_normalize_mistral_multimodal_value_converts_image_url_string_data_uri_to_attachment(): - sanitized = _normalize_mistral_multimodal_value( - { - "type": "image_url", - "image_url": "data:image/png;base64,aGVsbG8=", - } - ) - - assert isinstance(sanitized["image_url"]["url"], Attachment) - assert sanitized["image_url"]["url"].reference["content_type"] == "image/png" - - -def test_normalize_mistral_multimodal_value_converts_document_url_data_uri_to_attachment(): - sanitized = _normalize_mistral_multimodal_value( - { - "type": "document_url", - "document_url": TEST_PDF_DATA_URL, - "document_name": "test.pdf", - } - ) - - assert sanitized["type"] == "file" - assert isinstance(sanitized["file"]["file_data"], Attachment) - assert sanitized["file"]["file_data"].reference["content_type"] == "application/pdf" - assert sanitized["file"]["filename"] == "test.pdf" - - def test_normalize_mistral_multimodal_value_converts_large_base64_input_audio_to_attachment(): sanitized = _normalize_mistral_multimodal_value( { diff --git a/py/src/braintrust/integrations/openai/cassettes/1.71.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml b/py/src/braintrust/integrations/openai/cassettes/1.71.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml deleted file mode 100644 index a1a04b1b8..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.71.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi"}],"model":"gpt-4o-mini"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '71' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3ROvZPUOg3S8vgoRVDLyrgesY3M\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293766,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Hi! How can I assist you today?\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 9,\n \"completion_tokens\": 9,\n \"total_tokens\": 18,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece8aa7e8277769-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:06 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '836' - openai-organization: - - braintrust-data - openai-processing-ms: - - '387' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=YHRFt8HzWb0LQy12I8VUYG9__Z2Z0pRBW_lSl9eUDAs-1776293766.389142-1.0.1.1-HvMta.sq8MiJZbgYuboguXJjQsG9igN6VB2zIU6IhMnED6pjRxYCF3e75ID_c5yXTnIKoknsjVoQQ9SMA26nDEVv1746_YcY8lwIA0L4WdFa1.d3HVyJgwe0yEX4tVmx; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:06 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_680c043cd4d14860affc93017b829d3d - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml b/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml deleted file mode 100644 index d7f99ca24..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml +++ /dev/null @@ -1,262 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zfiorT4w9"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zvQBljdYW"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vpbjJPaZO"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"88YlS0wOxk"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6DUiQ0LoO"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5G4L"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"p7AUU603uI"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MJsBnmafS"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qxNqanvSIZ"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"DXubw"} - - - data: {"id":"chatcmpl-DV3Rf7HBKB6XdTeYFOLLgAUn7CrQI","object":"chat.completion.chunk","created":1776293783,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_2f65f9541c","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"nyYM2FIv3M8"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ece8b0d2da0dc46-YYZ - content-type: - - text/event-stream; charset=utf-8 - date: - - Wed, 15 Apr 2026 22:56:23 GMT - openai-organization: - - braintrust-data - openai-processing-ms: - - '1104' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - server: - - cloudflare - set-cookie: - - __cf_bm=GQ1oAnDGQLr_bcFc6WHXbc4m4_AMeQy6aQeZdvJwuhY-1776293782.5824835-1.0.1.1-rdpY5voCBbseudSd1yWPi5xc3UJJuA8Bl66WPAEdTTVfr9dlb5EOaC585i7GcItJItz1FMCsuh8FgYByzM3fIeiooJ7lVNLudOMgIYBip5t90KnMgdfZYgLYXaWcaZoN; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:23 GMT - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_1ff23eafec2944538bb78e1ad5c46b0a - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Ozs9cuN7e"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9lIaV1T3t"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3I2OGqLnW"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"y07eecvLDp"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sqeVc4K6e"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"K89f"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mUVwBr1fSl"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4ntYXo9Wh"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MPzvPyt8iq"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"67jx2"} - - - data: {"id":"chatcmpl-DV3RgF04XP0YtQqkm7BJNfH5Mw2Rm","object":"chat.completion.chunk","created":1776293784,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"schcsf0uMtz"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ece8b15cf08a3f1-YYZ - content-type: - - text/event-stream; charset=utf-8 - date: - - Wed, 15 Apr 2026 22:56:24 GMT - openai-organization: - - braintrust-data - openai-processing-ms: - - '161' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - server: - - cloudflare - set-cookie: - - __cf_bm=2LsrlY2HvQ9xHUTIcRnPuMIKZCISaXEvO.0UlpqLR9k-1776293783.9682875-1.0.1.1-B3tV.Wrzer_J8.ZBTRhPTgWKWzEv_P9NxpdsLgLMqQCg2iTU1QholcmNmm7oYRjXRYlDLLntleG77KCjvz1MbwGnenpgXsr4VuXF3Pcbk970Hd_qP5fQFTexiK94MNff; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:24 GMT - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e8a522dbcea94dbe8d4b9d5d1b830a0c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_async_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_async_comparison.yaml deleted file mode 100644 index 2ec5219a8..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_async_comparison.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3Q8D4TSWmegA8h4RMAzJ59aImYx\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293688,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88c11e918ea1-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:48 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '321' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=31_OV4SwWczRbs01OH9UC4xP1sMrEuSTg5RETMt_gRI-1776293688.4917455-1.0.1.1-fYqU_qLLppgsTgErbc3MlRFRIag622SJJAo8EGMFZSODWTdLhnTmzHlEpdzcmeHwpsDk.FzfQGvGTw24fFI.Zy_NADNOkEjjkyHGZo6yGW03C1FXSWKGmwKcsCOZ1HJZ; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:48 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a8225b752b6d4850aba57c5c1e2b32e7 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3Q9aTfcQIqUgWK2EQSyRuN99ByP\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293689,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88c449efdf5a-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:49 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '324' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=DBblCkhP3itPmsSEkass2GHNvT6BFJyC_5TGSw4EZJw-1776293689.0094142-1.0.1.1-8RtOA2tsoa.1cAYVdqPnTYs701KkXJnP5byrKxQK4.7iWb5IkdH5Nh0QyyBea7kMj_9.ixvBqKXCoLY8YNh9.eKym1T2gE6BhD0Cem3tRN7qkCoapoC2stsNonFPf9t0; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:49 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_1a5e0594d8b947da9775e90ce21d43ce - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_comparison.yaml deleted file mode 100644 index 0c5cc97e0..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_client_comparison.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3PyDC0t2Z02j038MlOnp3RD8XHD\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293678,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_2f65f9541c\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88840f1c64a6-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '340' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=cboWzylv4_qPy8E2JbsSDewvCe5PjET.pwIQDqbMYZU-1776293678.7291055-1.0.1.1-T7HGGZl4kl7RdO2_voToJi8exDPIuAV8EGT_ns7_5d4.S_DDh9608efctX4_vFoN_HO2xnN6eBtY3Acn1RFhc0hsOcgVi95zIlnLeYXed26JFUx3xZcGpkm1JLN9RPIZ; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:39 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_81dc40f6949f4eeca0cc9d64501bdaa0 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3PzCFiJKEaHUg61RFNzq161dUkH\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293679,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece8887ddde90e5-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '541' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=ez3S8TXg0qezyT9pl4xSSESZZIMqJaLnQebLl3HzrZA-1776293679.3399668-1.0.1.1-j4coE2ljmSOJTFclzzfDMSj0Hr.iASQ_R1XzqKrTgBuHhKca_gY6xwSNSfH8l43.9dLP1hyCTpdaM4U_cL3Gl8ao47zrRlt2D3w2gD1Ioc6MrPcCNaxiykJz45_WDjj9; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:39 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_515f8a827326459ea4d0ecf66472e9d0 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_responses_metadata_preservation.yaml b/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_responses_metadata_preservation.yaml deleted file mode 100644 index 1a3c4339e..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_responses_metadata_preservation.yaml +++ /dev/null @@ -1,233 +0,0 @@ -interactions: -- request: - body: '{"input":"What is 10 + 10?","model":"gpt-4o-mini","instructions":"Respond - with just the number"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '96' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_04625fff6a79ac200069e01727b16c819594a27748cc5b22c1\",\n - \ \"object\": \"response\",\n \"created_at\": 1776293671,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1776293671,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - \"Respond with just the number\",\n \"max_output_tokens\": null,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n - \ \"id\": \"msg_04625fff6a79ac200069e01727f3a481959cc4c877807b524a\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"20\"\n }\n - \ ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"text\"\n },\n \"verbosity\": \"medium\"\n - \ },\n \"tool_choice\": \"auto\",\n \"tools\": [],\n \"top_logprobs\": - 0,\n \"top_p\": 1.0,\n \"truncation\": \"disabled\",\n \"usage\": {\n \"input_tokens\": - 24,\n \"input_tokens_details\": {\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 2,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 26\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - CF-RAY: - - 9ece8857c87f37a1-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:32 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '1555' - openai-organization: - - braintrust-data - openai-processing-ms: - - '399' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=YtyeSG.q7Epu49niCrpi.s6GZrvf0D3ylDLlfgZQJyE-1776293671.6502535-1.0.1.1-Cqk8JNW.EWuOSDIDBqIVWAkxgpSPPgdyJSQkNloA5v4jwlGlg5BlTueI123wDmz.8iRdtiZF_CAVVdICercYBcUjSADq6LP2t752koJ_FjRTs0rej3aMkzxLOOvw0UFA; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:32 GMT - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999957' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_37e5dfd1bdda42ffb6a74fae66216cb4 - status: - code: 200 - message: OK -- request: - body: '{"input":"What is 15 + 15?","model":"gpt-4o-mini","text":{"format":{"type":"json_schema","strict":true,"name":"SimpleAnswer","schema":{"properties":{"value":{"title":"Value","type":"integer"}},"required":["value"],"title":"SimpleAnswer","type":"object","additionalProperties":false}}}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '285' - Content-Type: - - application/json - Cookie: - - __cf_bm=YtyeSG.q7Epu49niCrpi.s6GZrvf0D3ylDLlfgZQJyE-1776293671.6502535-1.0.1.1-Cqk8JNW.EWuOSDIDBqIVWAkxgpSPPgdyJSQkNloA5v4jwlGlg5BlTueI123wDmz.8iRdtiZF_CAVVdICercYBcUjSADq6LP2t752koJ_FjRTs0rej3aMkzxLOOvw0UFA - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0747cac0e43feff30069e017283ec4819686bee1a974eef2e2\",\n - \ \"object\": \"response\",\n \"created_at\": 1776293672,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1776293672,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": null,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n \"id\": \"msg_0747cac0e43feff30069e0172887a48196bb3ac91f48b50779\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"{\\\"value\\\":30}\"\n - \ }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"json_schema\",\n \"description\": - null,\n \"name\": \"SimpleAnswer\",\n \"schema\": {\n \"properties\": - {\n \"value\": {\n \"title\": \"Value\",\n \"type\": - \"integer\"\n }\n },\n \"required\": [\n \"value\"\n - \ ],\n \"title\": \"SimpleAnswer\",\n \"type\": \"object\",\n - \ \"additionalProperties\": false\n },\n \"strict\": true\n - \ },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": \"auto\",\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 47,\n \"input_tokens_details\": - {\n \"cached_tokens\": 0\n },\n \"output_tokens\": 6,\n \"output_tokens_details\": - {\n \"reasoning_tokens\": 0\n },\n \"total_tokens\": 53\n },\n - \ \"user\": null,\n \"metadata\": {}\n}" - headers: - CF-RAY: - - 9ece885b4dfda1e6-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:32 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '1930' - openai-organization: - - braintrust-data - openai-processing-ms: - - '442' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999932' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_cc047d7695214e378595a214f3ee2720 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_unwrapped_client_no_conversion.yaml b/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_unwrapped_client_no_conversion.yaml deleted file mode 100644 index ae20969c1..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openai_unwrapped_client_no_conversion.yaml +++ /dev/null @@ -1,115 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"type":"text","text":"What color - is this image?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=="}}]}],"model":"gpt-4o-mini"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '277' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3RUsBIZ4ubJPGNdq26fSECh22BR\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293772,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The image is a solid shade of red.\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 8513,\n \"completion_tokens\": 9,\n \"total_tokens\": 8522,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_4debc47fe0\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece8aca7fa5cca0-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '844' - openai-organization: - - braintrust-data - openai-processing-ms: - - '622' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=xQAoR0g2AMQnJXIU0ShqpnX4mk5e87nBszlofbabXUk-1776293771.9171581-1.0.1.1-zKuG1jf97ldyLxbgOOEdMOdUTxL4Tz_F4IalS_CsYVel42ncuoXPDUMkRQsiab8rchcI5yFeZupGycpBm.H5HJx7LVKnzTO5lKBeA33TQv7T.q3msyMytIGO2L6XeGH2; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:12 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-input-images: - - '50000' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-input-images: - - '49999' - x-ratelimit-remaining-requests: - - '29998' - x-ratelimit-remaining-tokens: - - '149999227' - x-ratelimit-reset-input-images: - - 1ms - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_155e7436b855430bbd9cf4fe7dc17489 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openrouter_chat_completion_async.yaml b/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openrouter_chat_completion_async.yaml deleted file mode 100644 index 15564c401..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.71.0/test_openrouter_chat_completion_async.yaml +++ /dev/null @@ -1,74 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 3+3? Reply with just the - number."}],"model":"openai/gpt-4o-mini","max_tokens":10}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '128' - Content-Type: - - application/json - Host: - - openrouter.ai - User-Agent: - - AsyncOpenAI/Python 1.71.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.71.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://openrouter.ai/api/v1/chat/completions - response: - body: - string: "\n \n{\"id\":\"gen-1776293774-EbezH0fjP0mxDQucbtkw\",\"object\":\"chat.completion\",\"created\":1776293774,\"model\":\"openai/gpt-4o-mini\",\"provider\":\"OpenAI\",\"system_fingerprint\":\"fp_3d695acdac\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"6\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":20,\"completion_tokens\":1,\"total_tokens\":21,\"cost\":0.0000036,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000036,\"upstream_inference_prompt_cost\":0.000003,\"upstream_inference_completions_cost\":6e-7},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" - headers: - Access-Control-Allow-Origin: - - '*' - CF-RAY: - - 9ece8ad7993febb6-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:14 GMT - Permissions-Policy: - - payment=(self "https://checkout.stripe.com" "https://connect-js.stripe.com" - "https://js.stripe.com" "https://*.js.stripe.com" "https://hooks.stripe.com") - Referrer-Policy: - - no-referrer, strict-origin-when-cross-origin - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - X-Generation-Id: - - gen-1776293774-EbezH0fjP0mxDQucbtkw - access-control-expose-headers: - - X-Generation-Id,cf-ray - content-length: - - '785' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.77.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml b/py/src/braintrust/integrations/openai/cassettes/1.77.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml deleted file mode 100644 index 39c45cb94..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.77.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi"}],"model":"gpt-4o-mini"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '71' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3Ri9sRRUp3j8LkR95kmmPOyUKjQ\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293786,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Hi! How can I assist you today?\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 9,\n \"completion_tokens\": 9,\n \"total_tokens\": 18,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece8b21d9f34c9b-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:26 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '836' - openai-organization: - - braintrust-data - openai-processing-ms: - - '254' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=kzi94SFH5rgShkbUz0kkABipCeooM3HEdw..9AuBh30-1776293785.8992436-1.0.1.1-4Vm0wAMrLsZTKh2XeqMeOtnUF3JKtN034OoM1mBJqat.0KvEfwbnJxJdvgdNLoaXoq_ZcSn65m_Upf6qJA1fDyaa6q91T5fldaCDLTwmuTHQ_wF9dH4uD5Y2y8.X9Jju; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:26 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f7f7aa79185c457fa21a4b8463911269 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml b/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml deleted file mode 100644 index 9d7b4d3c2..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml +++ /dev/null @@ -1,262 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"S8K0Fiufb"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NEiENDCXJ"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sv9HCz4w6"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Nek74Ttcd4"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8b07tDthE"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EWBR"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kbEUDw5EU2"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0HV2mtRvv"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CbfDJq0nHl"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"r9mO1"} - - - data: {"id":"chatcmpl-DV3RySAEkba8bfzFz7hPWQ5ii2oCF","object":"chat.completion.chunk","created":1776293802,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_4181e24c46","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"hckPyAakGto"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ece8b8a298eab99-YYZ - content-type: - - text/event-stream; charset=utf-8 - date: - - Wed, 15 Apr 2026 22:56:42 GMT - openai-organization: - - braintrust-data - openai-processing-ms: - - '212' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - server: - - cloudflare - set-cookie: - - __cf_bm=b8Giuh6LVutslkRiXA7jjyeVm5Wtc04MHsipbGbsBIQ-1776293802.5865324-1.0.1.1-SRQzc6uAdhGc9fvSSiRraNZ1cAH3jH6Z7u3gNB0BSYOzeapX.jQsLNqy5d.3.u9uNS0JXT9BIwdaJmRsoME1AnuXJxZOMI3murSde4zZKUlCgP54c20C_7l5B9_CPVCr; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:42 GMT - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_04212d4e2c1f405398cce445e0b9980b - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UIr5uSSPo"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3EwmCMR5P"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aN9BG1dQF"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SZDF5FxjMI"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4nIk7PwjJ"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YehB"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Gn8spJjzrW"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3xkCebbb4"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"afkjHHf0TU"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"X3ukv"} - - - data: {"id":"chatcmpl-DV3RzqS0qxLIWs7heA9ujzHJUtRMk","object":"chat.completion.chunk","created":1776293803,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"3fsjOX8DceZ"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ece8b8d7d3de403-YYZ - content-type: - - text/event-stream; charset=utf-8 - date: - - Wed, 15 Apr 2026 22:56:43 GMT - openai-organization: - - braintrust-data - openai-processing-ms: - - '144' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - server: - - cloudflare - set-cookie: - - __cf_bm=0Ub4Oi0NLpZ7TOtEjvYcfBkFOsTzC6l0b6zN827ZPB8-1776293803.114265-1.0.1.1-Paq4OfTYtrduS390jd039MDCx6d8UBXA8wifokrJt6oX5fidzBIBQ6p8vpfRzvEa42h.dE0m4ZV53EM2JuXecoYXhW2KnHpRQwiYc5b_PTFu5eJMaqMxYUtqCKS7bCko; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:43 GMT - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_5d66e6578c184902a8773b1d1afc5949 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_async_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_async_comparison.yaml deleted file mode 100644 index edc38c5b6..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_async_comparison.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3QCupug2iTIlSiSlfuuQWlarUdy\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293692,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88da5b19c4c7-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:52 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '281' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=B339V6qn2WumSUtDcd6lJTQPgLAtyzGQ7kOaLHPgQ9I-1776293692.5324438-1.0.1.1-JZP7qcED1tF38lvfG_8N9IxQqmqd9AUclorcH3OHWNu0tipbNpySbWYqsSwkm_pJoq26JU0wprIZI7quKs8HuQdkmGNmgVaupVJlZkURazfcRxj2m8VeGH9KfDX8G0ci; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:52 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_053fafda5a204ce390cac5ebcdbbb5b1 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3QDZ13CfjGBZoYgRT4tsd9GrnqM\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293693,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88dd09f6a23a-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:53 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '256' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=u4l5d5LJ.Yl7uRjUhNrrJnC8SpUGgQUBH.zPvG_SIds-1776293692.963374-1.0.1.1-ZPfeGgzmu0ptZrG2eQfMSAwacb3KtyKKP.hTI0e8i0qfDEs.hl0tVA3EtXLSYsBPhGhTo2kGdKAfamueiCHrIJwASAxFwvP.jTJobhBc7ws7d1XWGuwmuvZFWc_njxE_; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:53 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0dddb44af94b40229ee4aa10b1b2d6aa - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_comparison.yaml deleted file mode 100644 index b46dd4e68..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_client_comparison.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3Q3Y7ANnaxaAMBcgZ0UsIlAl4vU\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293683,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece889ebffb130e-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:43 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '281' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=_sLpCW5Bpd5kipXyCvinHaQoizi_GsEEByrWniyoIJA-1776293682.992623-1.0.1.1-gIlOr9Ki0ain_bc321k1ZY4SOBAldAJYghrYXARU8UDovO_GH_LEgqzUl3sNV6EeD06xTQpaFX72Bo.92.MU_o0tMqsqLySYuadjxOE881TJT_Mzt6oxP_RqWxGTHw2t; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:43 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_424039d9bfcf41eca4eb27defc2d51bd - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3Q3uVpyJWOvCIIUVaGZegivCqzz\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293683,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88a1afea711c-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:43 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '295' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=YCJfCOZkmVjBjgsEWeLAy9xKipkdleCddzQfdttSvBk-1776293683.467242-1.0.1.1-CW0Au25BVvsB4ijAqafz9SP57nxxTj3g29oDM.hDlHD.BsicAPVxxobkJpFmyd18e32fK5QHAGSunny0vrNWW5wyw7kJa0QtI__scGiyjEPWkXwj6og5wb492c8Q1VsX; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:43 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_4686d01ecaaf4131afeedfd9b8c97501 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_responses_metadata_preservation.yaml b/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_responses_metadata_preservation.yaml deleted file mode 100644 index a6d6b890f..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_responses_metadata_preservation.yaml +++ /dev/null @@ -1,233 +0,0 @@ -interactions: -- request: - body: '{"input":"What is 10 + 10?","model":"gpt-4o-mini","instructions":"Respond - with just the number"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '96' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_02b279237bf78eb60069e0172a3b9c8192a3d5de6c56bcaa50\",\n - \ \"object\": \"response\",\n \"created_at\": 1776293674,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1776293674,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - \"Respond with just the number\",\n \"max_output_tokens\": null,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n - \ \"id\": \"msg_02b279237bf78eb60069e0172a8de8819294c4f924c3608e04\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"20\"\n }\n - \ ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"text\"\n },\n \"verbosity\": \"medium\"\n - \ },\n \"tool_choice\": \"auto\",\n \"tools\": [],\n \"top_logprobs\": - 0,\n \"top_p\": 1.0,\n \"truncation\": \"disabled\",\n \"usage\": {\n \"input_tokens\": - 24,\n \"input_tokens_details\": {\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 2,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 26\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - CF-RAY: - - 9ece8867ab86aae0-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:34 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '1555' - openai-organization: - - braintrust-data - openai-processing-ms: - - '454' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=lx0.KcjRj5YZ7VgEKmaWhyqNo5Xet.CSCcfl9Em3Fe0-1776293674.1875775-1.0.1.1-8Xy_1YF4kyMOtBcruigMYYxanVPMvGs18Vdtw.9N2RJ.cxfWZksJUC1ulDTWyi3W8BwFp_KQnGdjHqFLeCBrZmpHnidMuRlTjoFcq1uufo79Z_ZV7FNeGoqmyxaROIs4; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:34 GMT - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999957' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_15ceb03f65834db4ae1019fe3a44261b - status: - code: 200 - message: OK -- request: - body: '{"input":"What is 15 + 15?","model":"gpt-4o-mini","text":{"format":{"type":"json_schema","strict":true,"name":"SimpleAnswer","schema":{"properties":{"value":{"title":"Value","type":"integer"}},"required":["value"],"title":"SimpleAnswer","type":"object","additionalProperties":false}}}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '285' - Content-Type: - - application/json - Cookie: - - __cf_bm=lx0.KcjRj5YZ7VgEKmaWhyqNo5Xet.CSCcfl9Em3Fe0-1776293674.1875775-1.0.1.1-8Xy_1YF4kyMOtBcruigMYYxanVPMvGs18Vdtw.9N2RJ.cxfWZksJUC1ulDTWyi3W8BwFp_KQnGdjHqFLeCBrZmpHnidMuRlTjoFcq1uufo79Z_ZV7FNeGoqmyxaROIs4 - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0e5b05d672c5b69b0069e0172ad0a081969f22125bec9e65d9\",\n - \ \"object\": \"response\",\n \"created_at\": 1776293674,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1776293675,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": null,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n \"id\": \"msg_0e5b05d672c5b69b0069e0172b18988196b882ef1db2417b9d\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"{\\\"value\\\":30}\"\n - \ }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"json_schema\",\n \"description\": - null,\n \"name\": \"SimpleAnswer\",\n \"schema\": {\n \"properties\": - {\n \"value\": {\n \"title\": \"Value\",\n \"type\": - \"integer\"\n }\n },\n \"required\": [\n \"value\"\n - \ ],\n \"title\": \"SimpleAnswer\",\n \"type\": \"object\",\n - \ \"additionalProperties\": false\n },\n \"strict\": true\n - \ },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": \"auto\",\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 47,\n \"input_tokens_details\": - {\n \"cached_tokens\": 0\n },\n \"output_tokens\": 6,\n \"output_tokens_details\": - {\n \"reasoning_tokens\": 0\n },\n \"total_tokens\": 53\n },\n - \ \"user\": null,\n \"metadata\": {}\n}" - headers: - CF-RAY: - - 9ece886b4f98ebc0-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:35 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '1930' - openai-organization: - - braintrust-data - openai-processing-ms: - - '441' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999932' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_721eb9fa7ae042c1b516041c91ce71f2 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_unwrapped_client_no_conversion.yaml b/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_unwrapped_client_no_conversion.yaml deleted file mode 100644 index 6f46c599b..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openai_unwrapped_client_no_conversion.yaml +++ /dev/null @@ -1,115 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"type":"text","text":"What color - is this image?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=="}}]}],"model":"gpt-4o-mini"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '277' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3Rn3ZyXH2Fqs7VmrJRQZdSAdDwo\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293791,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The image is red.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 8513,\n \"completion_tokens\": 5,\n \"total_tokens\": 8518,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_4debc47fe0\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece8b41dfecac9c-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:31 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '827' - openai-organization: - - braintrust-data - openai-processing-ms: - - '725' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=DAvyJcrmYbqA3pfvKhHil00OJR0FtYF7j9FvxtbTScQ-1776293791.015698-1.0.1.1-FlOkh58leElc3iHTtfMiTLl9eMyxAtz4T8u0.VN.1q4Mytje3DVJL6n6Aiy0G327Hndu72ch_6aX0Ag9ScB.6jFecIi5tEVLe7WrgIMUSnt4.wJCYi0vfLDI1j85WQgH; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:31 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-input-images: - - '50000' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-input-images: - - '49999' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999225' - x-ratelimit-reset-input-images: - - 1ms - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_19b2d6d145af440a9d1c67b0c788f545 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openrouter_chat_completion_async.yaml b/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openrouter_chat_completion_async.yaml deleted file mode 100644 index 6731e8e92..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.77.0/test_openrouter_chat_completion_async.yaml +++ /dev/null @@ -1,74 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 3+3? Reply with just the - number."}],"model":"openai/gpt-4o-mini","max_tokens":10}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '128' - Content-Type: - - application/json - Host: - - openrouter.ai - User-Agent: - - AsyncOpenAI/Python 1.77.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.77.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://openrouter.ai/api/v1/chat/completions - response: - body: - string: "\n \n\n \n{\"id\":\"gen-1776293793-449C8pe66k75AFLAlddv\",\"object\":\"chat.completion\",\"created\":1776293793,\"model\":\"openai/gpt-4o-mini\",\"provider\":\"Azure\",\"system_fingerprint\":\"fp_eb37e061ec\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"6\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":20,\"completion_tokens\":2,\"total_tokens\":22,\"cost\":0.0000042,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000042,\"upstream_inference_prompt_cost\":0.000003,\"upstream_inference_completions_cost\":0.0000012},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" - headers: - Access-Control-Allow-Origin: - - '*' - CF-RAY: - - 9ece8b50bd64ac63-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:34 GMT - Permissions-Policy: - - payment=(self "https://checkout.stripe.com" "https://connect-js.stripe.com" - "https://js.stripe.com" "https://*.js.stripe.com" "https://hooks.stripe.com") - Referrer-Policy: - - no-referrer, strict-origin-when-cross-origin - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - X-Generation-Id: - - gen-1776293793-449C8pe66k75AFLAlddv - access-control-expose-headers: - - X-Generation-Id,cf-ray - content-length: - - '800' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.92.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml b/py/src/braintrust/integrations/openai/cassettes/1.92.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml deleted file mode 100644 index a1ca1a9a1..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.92.0/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi"}],"model":"gpt-4o-mini"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '71' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3S6OKP0hkqsxqV8RlicEgmfPS8f\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293810,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Hi there! How can I assist you today?\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 9,\n \"completion_tokens\": 10,\n \"total_tokens\": 19,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece8bbbcc5dec6f-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:50 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '843' - openai-organization: - - braintrust-data - openai-processing-ms: - - '285' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=tdRvfpZvneRtDtSuUj8ZNpeZunmXKT23rUi.4e7GdrE-1776293810.5275388-1.0.1.1-HVOclLl0TPcu8w0THfGfD8hkseZRrsEJWga4MSeGPo2okGlAwnCMTg4DiWe8SvkzSBVR6_5hNGotUPUUoZgDXT5Q5xBt6eguKtJP_ftxi.Efoj6kivkmNZ.d86muZG1n; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:50 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999997' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a111b8a6a97a4357a7123146e8d55dca - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml b/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml deleted file mode 100644 index d3fc7613d..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml +++ /dev/null @@ -1,262 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2jiepubWy"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WEzRSNReT"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ckItVSLVw"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3tzlVaO3ev"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uJeV1NRbb"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oqRd"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eAm1b2f3Q7"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"erjQVsF4H"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"K1dr7K2LsH"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"WaYMj"} - - - data: {"id":"chatcmpl-DV3SNZ42MovkXy2C1v3Lzb7TzudfG","object":"chat.completion.chunk","created":1776293827,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"JLcNZqFMwSp"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ece8c274893ebbd-YYZ - content-type: - - text/event-stream; charset=utf-8 - date: - - Wed, 15 Apr 2026 22:57:07 GMT - openai-organization: - - braintrust-data - openai-processing-ms: - - '183' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - server: - - cloudflare - set-cookie: - - __cf_bm=0vJWeLaoHtZlUDKdBt73FMkQ.bRoRxa8a.H9viicEUc-1776293827.723177-1.0.1.1-qjIrx3FSzJCj.wY6b3sabOV7QJTL20.oO7gkLyCqD__myVnL3TCiCcfW2Ldqedt3FOtAaoIFdl76pUmOsEmwkkxnqG0aW8I.C_twvGLOjX38m27NO0wSn5jf192z_a_9; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:27:07 GMT - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_b398c1dea37c480ba66497a5a3a24236 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"V6PmCGw9G"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"b5zK7MfDt"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gTihVMWpU"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pSPkbYYxSz"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"icheUrQpx"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aEtt"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"B0R4b0VeOR"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uOHkQF3oV"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YpDYNYt6wC"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"yefab"} - - - data: {"id":"chatcmpl-DV3SOT6mEzMPcU4Qy3baht9Sioq5t","object":"chat.completion.chunk","created":1776293828,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_fe7a5277a8","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"qcsAsyQpNa4"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ece8c2a29bc36fe-YYZ - content-type: - - text/event-stream; charset=utf-8 - date: - - Wed, 15 Apr 2026 22:57:08 GMT - openai-organization: - - braintrust-data - openai-processing-ms: - - '169' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - server: - - cloudflare - set-cookie: - - __cf_bm=C1z0pPfg3jmIRMUMz0LMdPf6jFH_Mzcyh749wEiRUCA-1776293828.1826518-1.0.1.1-b_JAp4ol1iYWr1uTnWzNC2IBc3_9r4pEQyu6o.I8WRxvuXZQn9MOfQf72S7JOv946zREs0SXV2N6YpaN0jdSjXPCw046GrnRd7ITFU1XWVkxEy7HicOVvbd4UwZm4Vle; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:27:08 GMT - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_7da554a05a4849639a7757e3fdd49c2d - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_async_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_async_comparison.yaml deleted file mode 100644 index d96688ed4..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_async_comparison.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3QZcLLvcD2k1hirpIggRvSJOeOb\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293715,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_a64aa7d0ff\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece89677f36abca-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:55:15 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '283' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=c.PmIH8AqYh_sCmiJEqP5oqrwSM5gB3srLVJmHTTthc-1776293715.1128755-1.0.1.1-wzasuqi8WqLso5P5kaVVAR5sYBeryboRHaf9SFpXfuj3qIzqa0_LA_88ymt1d.HEZyKGUm8T5p7YAYpst_x6vyj.1AwDbtN.ujBSVUGP9qw695Dj19SUwZBj1p_wgQ2O; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:25:15 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_3f45b7e7d18841729b8c2d710181c7a7 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3QZSxwQnv3weKQCcZBpI3kXAIwd\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293715,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece896a2c1f713b-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:55:15 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '336' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=s6iixrtNpdreiQLpehjf35xygn8nAROrAZQkxyAPBpk-1776293715.5412939-1.0.1.1-IahCGw0zKp93YoOvT3B5KBO3v0wq4i77qrfxeHSUE3dVZkfyE4XYEaEZ0MCGD7dAU5R_AL1OM3Ew5qvibFPq8DlYhVX2dguVyQo.s9jrP7gwLXzNgGF.G_U7eYdMN0a7; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:25:15 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_7417b74029494e7bb3ad7b335863bd74 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_comparison.yaml deleted file mode 100644 index e831fdc60..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_client_comparison.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3QHhxqTbEuOtoJUkhESwWlLSUE8\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293697,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_a64aa7d0ff\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88fa3bdcc85f-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:58 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '396' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=v43FyhgWqtWFAv9Kl57abat8dAORi4ABzVywF1Vs4T4-1776293697.639411-1.0.1.1-SJcL9ZbmHl9s1c5KnVpyU05wxg0_L.iZr.JDCTa3rihY4DW2l8Tc4ixtCwypMTVXLOz9xUGVZDlZTfEZibW4wKAr.gNkJhAFN5XErj8wqdFd6EbKFL2ATRHFzosmYBvQ; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:58 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_8e5434b090034bd9ad630e84aae89bd1 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3QIU6FRsZG0UpMMeCcQDxQd7t2Q\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293698,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_fe7a5277a8\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece88fdaad8a392-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:58 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '824' - openai-organization: - - braintrust-data - openai-processing-ms: - - '310' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=TrdJi8eOFCqeL0oBHuelSPiga6.f0KIDHWiFuPhP3YY-1776293698.1910367-1.0.1.1-oFCX6nQ3V_qkV1dsi3exEHp9Va3FvQNO.s3_npKoFb3MKK8Ed1wnU7bigh_uB_AYMiSTNV4wnDhnIeCiIceOqQDOeGHvbRSWEitJTqzQTMzsiLLkah4GNZJ1r66PQ6EM; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:58 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_d4637a939de94c9393255a2e2f5ab3d4 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_responses_metadata_preservation.yaml b/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_responses_metadata_preservation.yaml deleted file mode 100644 index c745adeaa..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_responses_metadata_preservation.yaml +++ /dev/null @@ -1,232 +0,0 @@ -interactions: -- request: - body: '{"input":"What is 10 + 10?","instructions":"Respond with just the number","model":"gpt-4o-mini"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '96' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0a5d6b58b65f84b00069e017399160819cbbca9a45ff69f313\",\n - \ \"object\": \"response\",\n \"created_at\": 1776293689,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1776293689,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - \"Respond with just the number\",\n \"max_output_tokens\": null,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n - \ \"id\": \"msg_0a5d6b58b65f84b00069e01739ccc4819c908b88805c30eb52\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"20\"\n }\n - \ ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"text\"\n },\n \"verbosity\": \"medium\"\n - \ },\n \"tool_choice\": \"auto\",\n \"tools\": [],\n \"top_logprobs\": - 0,\n \"top_p\": 1.0,\n \"truncation\": \"disabled\",\n \"usage\": {\n \"input_tokens\": - 24,\n \"input_tokens_details\": {\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 2,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 26\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - CF-RAY: - - 9ece88c77cd4cca0-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:49 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '1555' - openai-organization: - - braintrust-data - openai-processing-ms: - - '348' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=ja9Tk54YtbnRxLapUOwr7idlZXNWncG1C0cljKEoGaE-1776293689.5160344-1.0.1.1-hUb2cQ_oRtipWF1Dp276_7kq_JBXmN2vvoxCqgpacw5ZGFRNUfWzv1KobTJdXqNvDn3GSvAECPd7IRtQyIHmcJ24P5OALbYqbBN8WAxQYtbqFtoqG44G6rffnaOIRDcw; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:24:49 GMT - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999955' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_8f279ef3e6d44baa9dd05aed4c5bb558 - status: - code: 200 - message: OK -- request: - body: '{"input":"What is 15 + 15?","model":"gpt-4o-mini","text":{"format":{"type":"json_schema","strict":true,"name":"SimpleAnswer","schema":{"properties":{"value":{"title":"Value","type":"integer"}},"required":["value"],"title":"SimpleAnswer","type":"object","additionalProperties":false}}}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '285' - Content-Type: - - application/json - Cookie: - - __cf_bm=ja9Tk54YtbnRxLapUOwr7idlZXNWncG1C0cljKEoGaE-1776293689.5160344-1.0.1.1-hUb2cQ_oRtipWF1Dp276_7kq_JBXmN2vvoxCqgpacw5ZGFRNUfWzv1KobTJdXqNvDn3GSvAECPd7IRtQyIHmcJ24P5OALbYqbBN8WAxQYtbqFtoqG44G6rffnaOIRDcw - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0ac2a5f88276649f0069e0173a10f08194a45574e18dfbcd2a\",\n - \ \"object\": \"response\",\n \"created_at\": 1776293690,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1776293690,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": null,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n \"id\": \"msg_0ac2a5f88276649f0069e0173a8e748194ac558fae2001034d\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"{\\\"value\\\":30}\"\n - \ }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": null,\n \"reasoning\": {\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"json_schema\",\n \"description\": - null,\n \"name\": \"SimpleAnswer\",\n \"schema\": {\n \"properties\": - {\n \"value\": {\n \"title\": \"Value\",\n \"type\": - \"integer\"\n }\n },\n \"required\": [\n \"value\"\n - \ ],\n \"title\": \"SimpleAnswer\",\n \"type\": \"object\",\n - \ \"additionalProperties\": false\n },\n \"strict\": true\n - \ },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": \"auto\",\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 47,\n \"input_tokens_details\": - {\n \"cached_tokens\": 0\n },\n \"output_tokens\": 6,\n \"output_tokens_details\": - {\n \"reasoning_tokens\": 0\n },\n \"total_tokens\": 53\n },\n - \ \"user\": null,\n \"metadata\": {}\n}" - headers: - CF-RAY: - - 9ece88caa94c90e5-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:54:50 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '1930' - openai-organization: - - braintrust-data - openai-processing-ms: - - '680' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999932' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a203cf2b5c45410e870eba17f8debd11 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_unwrapped_client_no_conversion.yaml b/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_unwrapped_client_no_conversion.yaml deleted file mode 100644 index e502d32f7..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openai_unwrapped_client_no_conversion.yaml +++ /dev/null @@ -1,115 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"type":"text","text":"What color - is this image?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=="}}]}],"model":"gpt-4o-mini"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '277' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - OpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - 'false' - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DV3SCIOYuOr97pGnxjO0dRaiewMb7\",\n \"object\": - \"chat.completion\",\n \"created\": 1776293816,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The color of the image is red.\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 8513,\n \"completion_tokens\": 8,\n \"total_tokens\": 8521,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_4debc47fe0\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9ece8be29c6cab2d-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:57 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '840' - openai-organization: - - braintrust-data - openai-processing-ms: - - '696' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=i.znahOzJwur1CifANveQiWUb..S4wXK1z2FNthfzWA-1776293816.7400415-1.0.1.1-dA295eb2RMAhRlTEFHNNVjXybki1q6q_S7PJU_c_828xajDs67wTmdcVbditylruJ3OImmsu0QGUeWKbJHCc4F1p8j5uH7VE4RPBupbI80xiPc6MQ1XqST5tDEHJA0CX; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Wed, 15 Apr 2026 - 23:26:57 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-input-images: - - '50000' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-input-images: - - '49999' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999227' - x-ratelimit-reset-input-images: - - 1ms - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_29982d2e377348cf9ad1bbc1b88a509f - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openrouter_chat_completion_async.yaml b/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openrouter_chat_completion_async.yaml deleted file mode 100644 index 722409e6a..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/1.92.0/test_openrouter_chat_completion_async.yaml +++ /dev/null @@ -1,74 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 3+3? Reply with just the - number."}],"model":"openai/gpt-4o-mini","max_tokens":10}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '128' - Content-Type: - - application/json - Host: - - openrouter.ai - User-Agent: - - AsyncOpenAI/Python 1.92.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 1.92.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://openrouter.ai/api/v1/chat/completions - response: - body: - string: "\n \n{\"id\":\"gen-1776293819-OpububnFO0AGIlqGhkD8\",\"object\":\"chat.completion\",\"created\":1776293819,\"model\":\"openai/gpt-4o-mini\",\"provider\":\"OpenAI\",\"system_fingerprint\":\"fp_3d695acdac\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"6\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":20,\"completion_tokens\":1,\"total_tokens\":21,\"cost\":0.0000036,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000036,\"upstream_inference_prompt_cost\":0.000003,\"upstream_inference_completions_cost\":6e-7},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" - headers: - Access-Control-Allow-Origin: - - '*' - CF-RAY: - - 9ece8bf29dd4ebb4-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 15 Apr 2026 22:56:59 GMT - Permissions-Policy: - - payment=(self "https://checkout.stripe.com" "https://connect-js.stripe.com" - "https://js.stripe.com" "https://*.js.stripe.com" "https://hooks.stripe.com") - Referrer-Policy: - - no-referrer, strict-origin-when-cross-origin - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - X-Generation-Id: - - gen-1776293819-OpububnFO0AGIlqGhkD8 - access-control-expose-headers: - - X-Generation-Id,cf-ray - content-length: - - '785' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/latest/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml b/py/src/braintrust/integrations/openai/cassettes/latest/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml deleted file mode 100644 index 956043ec1..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/latest/TestOpenAIIntegrationSetupSpans.test_setup_creates_spans.yaml +++ /dev/null @@ -1,102 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi"}],"model":"gpt-4o-mini"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '71' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EQw66cM1pn29HpAcMrfxpv6VJqw6T\",\n \"object\": - \"chat.completion\",\n \"created\": 1790088562,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Hello! How can I assist you today?\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 9,\n \"completion_tokens\": 9,\n \"total_tokens\": 18,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_2fed836403\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21da8cd8e2fef-EWR - connection: - - keep-alive - content-length: - - '839' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:49:22 GMT - openai-processing-ms: - - '460' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999997' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_148878a943764555935b300b4c3ef356 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml b/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml deleted file mode 100644 index 97a8eabbb..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_chat_streaming_sync_http2_preserves_stream_interface.yaml +++ /dev/null @@ -1,250 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '134' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5Qzfuj4aW"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"m2TtHACCl"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3DFDtufsK"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XxC5ZeZ2z9"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PxyGT99op"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DddP"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e4qCII98si"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uRdqwBJAs"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gzLdgjMq3b"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"eH11z"} - - - data: {"id":"chatcmpl-EQw6NAayF6GB74rJZ6Guz3nsOUl5V","object":"chat.completion.chunk","created":1790088579,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"MWLDpb3gDNh"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21e170c5f6a4f-EWR - content-type: - - text/event-stream; charset=utf-8 - date: - - Tue, 22 Sep 2026 14:49:40 GMT - openai-processing-ms: - - '494' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_576517bd4f7c40fbaa1528514906ed05 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '134' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0DhsVFPG6"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"K0IaCYVU1"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vlrlpWSKJ"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"K5WSwuJ8q6"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"12"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZfQT3sYY4"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yGYp"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tSm4pH7tKX"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"24"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"icLhlaf9i"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CSJacH9R7m"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"JpnkB"} - - - data: {"id":"chatcmpl-EQw6PtAtaLdikFwqcwxEQJkj1gKfL","object":"chat.completion.chunk","created":1790088581,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_253a61362d","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"GFfDGENRAex"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21e1d5fefc2ef-EWR - content-type: - - text/event-stream; charset=utf-8 - date: - - Tue, 22 Sep 2026 14:49:41 GMT - openai-processing-ms: - - '600' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_c27e3fc7182e4741b0594dd33b223ec8 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_async_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_async_comparison.yaml deleted file mode 100644 index 4ecfdddf5..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_async_comparison.yaml +++ /dev/null @@ -1,202 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '106' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - AsyncOpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EQw3MfwMBfcaDykJFik4bQe2an54W\",\n \"object\": - \"chat.completion\",\n \"created\": 1790088392,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_253a61362d\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21980cbe3727a-EWR - connection: - - keep-alive - content-length: - - '824' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:32 GMT - openai-processing-ms: - - '660' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_7dfda65a5160439e880563a0853165e4 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '106' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - AsyncOpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EQw3MiRU7n4jHouDZWZVLG0jKySuC\",\n \"object\": - \"chat.completion\",\n \"created\": 1790088392,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_253a61362d\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21985da85440b-EWR - connection: - - keep-alive - content-length: - - '824' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:33 GMT - openai-processing-ms: - - '748' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_c49eee4e7afa4f2bbf92c76b81cff9d6 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_comparison.yaml b/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_comparison.yaml deleted file mode 100644 index 695a5de20..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_client_comparison.yaml +++ /dev/null @@ -1,202 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '106' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EQw37bu1dTwGxwzF0lFwaWgqd40lA\",\n \"object\": - \"chat.completion\",\n \"created\": 1790088377,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_253a61362d\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f219228dfd811f-EWR - connection: - - keep-alive - content-length: - - '824' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:17 GMT - openai-processing-ms: - - '1097' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_3eb850c4d2be41f59f55e2c0600c8e52 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s 12 + 12?"}],"model":"gpt-4o-mini","seed":42,"temperature":0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '106' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EQw38w1Hr3k2QlENs1V5RbmJ3wUzD\",\n \"object\": - \"chat.completion\",\n \"created\": 1790088378,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"12 + 12 equals 24.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 14,\n \"completion_tokens\": 8,\n \"total_tokens\": 22,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_253a61362d\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f2192abe4921eb-EWR - connection: - - keep-alive - content-length: - - '824' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:19 GMT - openai-processing-ms: - - '906' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_79dfc5285f4d4b8382a904939e53568b - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_responses_metadata_preservation.yaml b/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_responses_metadata_preservation.yaml deleted file mode 100644 index 062ed4eb9..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_responses_metadata_preservation.yaml +++ /dev/null @@ -1,239 +0,0 @@ -interactions: -- request: - body: '{"input":"What is 10 + 10?","instructions":"Respond with just the number","model":"gpt-4o-mini"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '96' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_098217ebe409014d006ab294759b2487d29ba3aed36f962991\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088309,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088310,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - \"Respond with just the number\",\n \"max_output_tokens\": null,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n - \ \"output\": [\n {\n \"id\": \"msg_098217ebe409014d006ab29476453887d2ad6b2476e6bf0531\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"20\"\n }\n - \ ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": \"in_memory\",\n \"reasoning\": {\n - \ \"context\": null,\n \"effort\": null,\n \"summary\": null\n },\n - \ \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": - true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": - \"text\"\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": - \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n \"input_tokens\": - 0,\n \"input_tokens_details\": {\n \"image_tokens\": 0,\n \"text_tokens\": - 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 24,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 2,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 26\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f2177e6f3180d0-EWR - connection: - - keep-alive - content-length: - - '1997' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:45:10 GMT - openai-processing-ms: - - '881' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999957' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0a41eacef11945b699a13f33f3a3d96f - status: - code: 200 - message: OK -- request: - body: '{"input":"What is 15 + 15?","model":"gpt-4o-mini","text":{"format":{"type":"json_schema","strict":true,"name":"SimpleAnswer","schema":{"properties":{"value":{"title":"Value","type":"integer"}},"required":["value"],"title":"SimpleAnswer","type":"object","additionalProperties":false}}}}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '285' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_022342f3d4ecefa2006ab2947699e887d28c20ad5b46f2709c\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088310,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088311,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": null,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n \"output\": [\n {\n - \ \"id\": \"msg_022342f3d4ecefa2006ab29477157887d290db1778c2dc3261\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"{\\\"value\\\":30}\"\n - \ }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": \"in_memory\",\n \"reasoning\": {\n - \ \"context\": null,\n \"effort\": null,\n \"summary\": null\n },\n - \ \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": - true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": - \"json_schema\",\n \"description\": null,\n \"name\": \"SimpleAnswer\",\n - \ \"schema\": {\n \"properties\": {\n \"value\": {\n \"title\": - \"Value\",\n \"type\": \"integer\"\n }\n },\n \"required\": - [\n \"value\"\n ],\n \"title\": \"SimpleAnswer\",\n - \ \"type\": \"object\",\n \"additionalProperties\": false\n },\n - \ \"strict\": true\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": - \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n \"input_tokens\": - 0,\n \"input_tokens_details\": {\n \"image_tokens\": 0,\n \"text_tokens\": - 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 47,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 6,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 53\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21784cea980d0-EWR - connection: - - keep-alive - content-length: - - '2372' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:45:11 GMT - openai-processing-ms: - - '988' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999932' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_867f63d5300c48008b0a1235638334c2 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_unwrapped_client_no_conversion.yaml b/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_unwrapped_client_no_conversion.yaml deleted file mode 100644 index 4833004b4..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/latest/test_openai_unwrapped_client_no_conversion.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"type":"text","text":"What color - is this image?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=="}}]}],"model":"gpt-4o-mini"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '277' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EQw6DyQIlb2B9AVUlqrjoBV949UMY\",\n \"object\": - \"chat.completion\",\n \"created\": 1790088569,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The image is red.\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 8513,\n \"completion_tokens\": 5,\n \"total_tokens\": 8518,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 2944,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b99562ea4c\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21dd8dbf23788-EWR - connection: - - keep-alive - content-length: - - '830' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:49:30 GMT - openai-processing-ms: - - '535' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-input-images: - - '50000' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-input-images: - - '49999' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999225' - x-ratelimit-reset-input-images: - - 1ms - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_c5c2223fc8f049b0883c4d75426af62a - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/cassettes/latest/test_openrouter_chat_completion_async.yaml b/py/src/braintrust/integrations/openai/cassettes/latest/test_openrouter_chat_completion_async.yaml deleted file mode 100644 index 62f226f8d..000000000 --- a/py/src/braintrust/integrations/openai/cassettes/latest/test_openrouter_chat_completion_async.yaml +++ /dev/null @@ -1,74 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 3+3? Reply with just the - number."}],"model":"openai/gpt-4o-mini","max_tokens":10}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '128' - content-type: - - application/json - host: - - openrouter.ai - user-agent: - - AsyncOpenAI/Python 3.16.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.16.2 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://openrouter.ai/api/v1/chat/completions - response: - body: - string: "\n \n{\"id\":\"gen-1790088572-SKXct3CwaNVCGnJe99Fj\",\"object\":\"chat.completion\",\"created\":1790088572,\"model\":\"openai/gpt-4o-mini\",\"provider\":\"OpenAI\",\"system_fingerprint\":\"fp_2e30314e0f\",\"service_tier\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"6\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":20,\"completion_tokens\":1,\"total_tokens\":21,\"cost\":0.0000036,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000036,\"upstream_inference_prompt_cost\":0.000003,\"upstream_inference_completions_cost\":6e-7},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" - headers: - access-control-allow-origin: - - '*' - access-control-expose-headers: - - X-Generation-Id,X-Provider-Name,request-id,cf-ray - cf-ray: - - a3f21de9cf310d00-EWR - connection: - - keep-alive - content-length: - - '805' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:49:32 GMT - permissions-policy: - - payment=(self "https://checkout.stripe.com" "https://connect-js.stripe.com" - "https://js.stripe.com" "https://*.js.stripe.com" "https://hooks.stripe.com") - referrer-policy: - - no-referrer, strict-origin-when-cross-origin - server: - - cloudflare - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-generation-id: - - gen-1790088572-SKXct3CwaNVCGnJe99Fj - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openai/test_oai_attachments.py b/py/src/braintrust/integrations/openai/test_oai_attachments.py index 5418ed920..852602250 100644 --- a/py/src/braintrust/integrations/openai/test_oai_attachments.py +++ b/py/src/braintrust/integrations/openai/test_oai_attachments.py @@ -154,37 +154,3 @@ def test_openai_pdf_data_url_converts_to_attachment(memory_logger): # Should use the provided filename, not a generic one assert file_data_value.reference["filename"] == "test.pdf" assert file_data_value.reference["key"] - - -@pytest.mark.vcr -def test_openai_unwrapped_client_no_conversion(memory_logger): - """Test that unwrapped clients don't process attachments and don't generate spans.""" - assert not memory_logger.pop() - - # Create a simple image data URL - base64_image = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==" - data_url = f"data:image/png;base64,{base64_image}" - - # Use unwrapped client - client = openai.OpenAI() - - response = client.chat.completions.create( - model=TEST_MODEL, - messages=[ - { - "role": "user", - "content": [ - {"type": "text", "text": "What color is this image?"}, - {"type": "image_url", "image_url": {"url": data_url}}, - ], - } - ], - ) - - # Verify we got a successful response - assert response - assert response.choices - assert response.choices[0].message.content - - # No spans should be generated with unwrapped client - assert not memory_logger.pop() diff --git a/py/src/braintrust/integrations/openai/test_openai.py b/py/src/braintrust/integrations/openai/test_openai.py index a6215c218..d54b48d36 100644 --- a/py/src/braintrust/integrations/openai/test_openai.py +++ b/py/src/braintrust/integrations/openai/test_openai.py @@ -183,10 +183,12 @@ def test_openai_responses_metrics(memory_logger): assert span metrics = span["metrics"] assert_metrics_are_valid(metrics, start, end) + assert "time_to_first_token" in metrics assert 0 <= metrics.get("prompt_cached_tokens", 0) assert 0 <= metrics.get("completion_reasoning_tokens", 0) assert TEST_MODEL in span["metadata"]["model"] assert span["metadata"]["provider"] == "openai" + assert span["metadata"]["instructions"] == "Just the number please" assert TEST_PROMPT in str(span["input"]) assert len(span["output"]) > 0 span_output_text = span["output"][0]["content"][0]["text"] @@ -237,86 +239,6 @@ class NumberAnswer(BaseModel): assert span["output"][0]["content"][0]["parsed"]["reasoning"] == parse_response.output_parsed.reasoning -@pytest.mark.vcr -def test_openai_responses_metadata_preservation(memory_logger): - """Test that additional metadata fields in responses are preserved.""" - assert not memory_logger.pop() - - client = wrap_openai(openai.OpenAI()) - - # Test with responses.create - the response object has various metadata fields - start = time.time() - response = client.responses.create( - model=TEST_MODEL, - input="What is 10 + 10?", - instructions="Respond with just the number", - ) - end = time.time() - - assert response - assert response.output - - # Check that the response has metadata fields like id, created_at, object, etc. - assert hasattr(response, "id") - assert hasattr(response, "created_at") - assert hasattr(response, "object") - assert hasattr(response, "model") - - # Verify spans capture metadata - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - - # Check that span metadata includes the parameters - assert TEST_MODEL in span["metadata"]["model"] # Model name may include version date - assert span["metadata"]["provider"] == "openai" - assert span["metadata"]["instructions"] == "Respond with just the number" - - # Check that response metadata is preserved (non-output, non-usage fields) - # The metadata should be in span["metadata"] after our changes - assert "metadata" in span - if "id" in span.get("metadata", {}): - # Response metadata like id, created, object should be preserved - assert span["metadata"]["id"] == response.id - - # Verify metrics are properly extracted - metrics = span["metrics"] - assert_metrics_are_valid(metrics, start, end) - assert "time_to_first_token" in metrics - - # Test with responses.parse to ensure metadata is preserved there too - class SimpleAnswer(BaseModel): - value: int - - start = time.time() - parse_response = client.responses.parse( - model=TEST_MODEL, - input="What is 15 + 15?", - text_format=SimpleAnswer, - ) - end = time.time() - - assert parse_response - assert parse_response.output_parsed - assert parse_response.output_parsed.value == 30 - - # Verify metadata preservation in parse response - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - - # Check parameters are in metadata - assert TEST_MODEL in span["metadata"]["model"] # Model name may include version date - assert span["metadata"]["provider"] == "openai" - - # Verify the structured output is captured - assert span["output"][0]["content"][0]["parsed"]["value"] == 30 - - # Check metrics - metrics = span["metrics"] - assert_metrics_are_valid(metrics, start, end) - - @pytest.mark.vcr def test_openai_chat_completion_inline_moderation_metadata(memory_logger): if not _supports_inline_moderation(): @@ -908,31 +830,6 @@ def test_openai_chat_with_system_prompt(memory_logger): assert inputs[1]["content"] == TEST_PROMPT -@pytest.mark.vcr -def test_openai_client_comparison(memory_logger): - """Test that wrapped and unwrapped clients produce the same output.""" - assert not memory_logger.pop() - - # Get regular and wrapped clients - clients = [(openai.OpenAI(), False), (wrap_openai(openai.OpenAI()), True)] - - for client, is_wrapped in clients: - response = client.chat.completions.create( - model=TEST_MODEL, messages=[{"role": "user", "content": TEST_PROMPT}], temperature=0, seed=42 - ) - - # Both should have data - assert response.choices[0].message.content - - if not is_wrapped: - assert not memory_logger.pop() - continue - - # Verify spans were created with wrapped client - spans = memory_logger.pop() - assert len(spans) == 1 - - @pytest.mark.vcr def test_openai_client_error(memory_logger): assert not memory_logger.pop() @@ -1313,38 +1210,6 @@ async def test_openai_chat_async_with_system_prompt(memory_logger): assert inputs[1]["content"] == TEST_PROMPT -@pytest.mark.asyncio -@pytest.mark.vcr -async def test_openai_client_async_comparison(memory_logger): - """Test that wrapped and unwrapped async clients produce the same output.""" - assert not memory_logger.pop() - - # Get regular and wrapped clients - regular_client = AsyncOpenAI() - wrapped_client = wrap_openai(AsyncOpenAI()) - - # Test with regular client - normal_response = await regular_client.chat.completions.create( - model=TEST_MODEL, messages=[{"role": "user", "content": TEST_PROMPT}], temperature=0, seed=42 - ) - - # No spans should be created for unwrapped client - assert not memory_logger.pop() - - # Test with wrapped client - wrapped_response = await wrapped_client.chat.completions.create( - model=TEST_MODEL, messages=[{"role": "user", "content": TEST_PROMPT}], temperature=0, seed=42 - ) - - # Both should have data - assert normal_response.choices[0].message.content - assert wrapped_response.choices[0].message.content - - # Verify spans were created with wrapped client - spans = memory_logger.pop() - assert len(spans) == 1 - - @pytest.mark.asyncio @pytest.mark.vcr async def test_openai_client_async_error(memory_logger): @@ -2819,27 +2684,6 @@ async def test_setup_preserves_async_audio_speech_streaming_response(self, memor assert chunks assert not memory_logger.pop() - @pytest.mark.vcr - def test_setup_creates_spans(self, memory_logger): - """OpenAIIntegration.setup() should create spans when making API calls.""" - assert not memory_logger.pop() - - OpenAIIntegration.setup() - client = openai.OpenAI() - response = client.chat.completions.create( - model="gpt-4o-mini", - messages=[{"role": "user", "content": "Say hi"}], - ) - assert response.choices[0].message.content - - # Verify span was created - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["provider"] == "openai" - assert "gpt-4o-mini" in span["metadata"]["model"] - assert span["input"] - @pytest.mark.vcr def test_setup_stream_helper_creates_spans(self, memory_logger): """OpenAIIntegration.setup() should trace chat.completions.stream().""" diff --git a/py/src/braintrust/integrations/openai/test_openai_http2.py b/py/src/braintrust/integrations/openai/test_openai_http2.py index cd070d5a9..a478ebc40 100644 --- a/py/src/braintrust/integrations/openai/test_openai_http2.py +++ b/py/src/braintrust/integrations/openai/test_openai_http2.py @@ -21,61 +21,6 @@ def memory_logger(): yield bgl -@pytest.mark.vcr -def test_openai_chat_streaming_sync_http2_preserves_stream_interface(memory_logger): - assert not memory_logger.pop() - - unwrapped_client = openai.OpenAI(http_client=httpx.Client(http2=True)) - wrapped_client = wrap_openai(openai.OpenAI(http_client=httpx.Client(http2=True))) - clients = [(unwrapped_client, False), (wrapped_client, True)] - - try: - for client, wrapped in clients: - start = time.time() - - stream = client.chat.completions.create( - model=TEST_MODEL, - messages=[{"role": "user", "content": TEST_PROMPT}], - stream=True, - stream_options={"include_usage": True}, - ) - - assert hasattr(stream, "response") - assert hasattr(stream, "_iterator") - - chunks = [] - for chunk in stream: - chunks.append(chunk) - end = time.time() - - assert chunks - assert len(chunks) > 1 - - content = "" - for chunk in chunks: - if chunk.choices and chunk.choices[0].delta.content: - content += chunk.choices[0].delta.content - - assert "24" in content or "twenty-four" in content.lower() - - if not wrapped: - assert not memory_logger.pop() - continue - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - metrics = span["metrics"] - assert_metrics_are_valid(metrics, start, end) - assert TEST_MODEL in span["metadata"]["model"] - assert span["metadata"]["provider"] == "openai" - assert TEST_PROMPT in str(span["input"]) - assert "24" in str(span["output"]) or "twenty-four" in str(span["output"]).lower() - finally: - unwrapped_client.close() - wrapped_client.close() - - @pytest.mark.vcr def test_openai_chat_streaming_sync_http2_context_manager_preserves_wrapper(memory_logger): assert not memory_logger.pop() @@ -119,6 +64,7 @@ def test_openai_chat_streaming_sync_http2_context_manager_preserves_wrapper(memo assert TEST_MODEL in span["metadata"]["model"] assert span["metadata"]["provider"] == "openai" assert TEST_PROMPT in str(span["input"]) + assert "24" in str(span["output"]) or "twenty-four" in str(span["output"]).lower() finally: client.close() diff --git a/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py b/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py index 41436b6f8..ca31e1a02 100644 --- a/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py +++ b/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py @@ -71,37 +71,6 @@ def test_openrouter_chat_completion_sync(memory_logger): assert not isinstance(value, bool), f"Metric {key} should not be a boolean" -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_openrouter_chat_completion_async(memory_logger): - """Test that wrap_openai works with OpenRouter's async client.""" - assert not memory_logger.pop() - - client = wrap_openai(_get_async_client()) - - start = time.time() - response = await client.chat.completions.create( - model=TEST_MODEL, - messages=[{"role": "user", "content": "What is 3+3? Reply with just the number."}], - max_tokens=10, - ) - end = time.time() - - assert response - assert response.choices[0].message.content - assert "6" in response.choices[0].message.content - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - - metrics = span["metrics"] - assert_metrics_are_valid(metrics, start, end) - - for key, value in metrics.items(): - assert not isinstance(value, bool), f"Metric {key} should not be a boolean" - - @pytest.mark.vcr def test_openrouter_streaming_sync(memory_logger): """Test that wrap_openai works with OpenRouter's streaming responses.""" diff --git a/py/src/braintrust/integrations/openrouter/cassettes/0.6.0/test_openrouter_integration_setup_creates_spans.yaml b/py/src/braintrust/integrations/openrouter/cassettes/0.6.0/test_openrouter_integration_setup_creates_spans.yaml deleted file mode 100644 index c615bc367..000000000 --- a/py/src/braintrust/integrations/openrouter/cassettes/0.6.0/test_openrouter_integration_setup_creates_spans.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Reply with just the - number."}],"model":"openai/gpt-4o-mini","max_tokens":10.0,"stream":false,"temperature":1.0,"top_p":1.0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '175' - Host: - - openrouter.ai - content-type: - - application/json - user-agent: - - speakeasy-sdk/python 0.7.11 2.768.0 1.0.0 openrouter - method: POST - uri: https://openrouter.ai/api/v1/chat/completions - response: - body: - string: "\n \n{\"id\":\"gen-1774558315-QxPl7aBABQW8bOKxzdxL\",\"object\":\"chat.completion\",\"created\":1774558315,\"model\":\"openai/gpt-4o-mini\",\"provider\":\"OpenAI\",\"system_fingerprint\":\"fp_f85b8886b6\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"4\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":20,\"completion_tokens\":1,\"total_tokens\":21,\"cost\":0.0000036,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000036,\"upstream_inference_prompt_cost\":0.000003,\"upstream_inference_completions_cost\":6e-7},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" - headers: - Access-Control-Allow-Origin: - - '*' - CF-RAY: - - 9e2909425a3b053a-SJC - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 26 Mar 2026 20:51:56 GMT - Permissions-Policy: - - payment=(self "https://checkout.stripe.com" "https://connect-js.stripe.com" - "https://js.stripe.com" "https://*.js.stripe.com" "https://hooks.stripe.com") - Referrer-Policy: - - no-referrer, strict-origin-when-cross-origin - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - content-length: - - '785' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openrouter/cassettes/latest/test_openrouter_integration_setup_creates_spans.yaml b/py/src/braintrust/integrations/openrouter/cassettes/latest/test_openrouter_integration_setup_creates_spans.yaml deleted file mode 100644 index 9ff9bcfe6..000000000 --- a/py/src/braintrust/integrations/openrouter/cassettes/latest/test_openrouter_integration_setup_creates_spans.yaml +++ /dev/null @@ -1,55 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"content":"What is 2+2? Reply with just the number.","role":"user"}],"max_tokens":10,"model":"openai/gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '143' - content-type: - - application/json - host: - - openrouter.ai - user-agent: - - speakeasy-sdk/python 1.2.10 2.914.0 1.0.0 openrouter - method: POST - uri: https://openrouter.ai/api/v1/chat/completions - response: - body: - string: "\n \n{\"id\":\"gen-1790088319-rw9SDKD2u44M89dU0wsU\",\"object\":\"chat.completion\",\"created\":1790088319,\"model\":\"openai/gpt-4o-mini\",\"provider\":\"OpenAI\",\"system_fingerprint\":\"fp_0c03eba41c\",\"service_tier\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"4\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":20,\"completion_tokens\":1,\"total_tokens\":21,\"cost\":0.0000036,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000036,\"upstream_inference_prompt_cost\":0.000003,\"upstream_inference_completions_cost\":6e-7},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" - headers: - access-control-allow-origin: - - '*' - access-control-expose-headers: - - X-Generation-Id,X-Provider-Name,request-id,cf-ray - cf-ray: - - a3f217bfd87d3356-EWR - connection: - - keep-alive - content-length: - - '805' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:45:20 GMT - permissions-policy: - - payment=(self "https://checkout.stripe.com" "https://connect-js.stripe.com" - "https://js.stripe.com" "https://*.js.stripe.com" "https://hooks.stripe.com") - referrer-policy: - - no-referrer, strict-origin-when-cross-origin - server: - - cloudflare - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-generation-id: - - gen-1790088319-rw9SDKD2u44M89dU0wsU - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/openrouter/test_openrouter.py b/py/src/braintrust/integrations/openrouter/test_openrouter.py index fa1ec892c..54f1f88ea 100644 --- a/py/src/braintrust/integrations/openrouter/test_openrouter.py +++ b/py/src/braintrust/integrations/openrouter/test_openrouter.py @@ -219,39 +219,6 @@ async def test_wrap_openrouter_responses_send_async_stream(memory_logger): assert_metrics_are_valid(span["metrics"], start, end) -@pytest.mark.vcr -def test_openrouter_integration_setup_creates_spans(memory_logger, monkeypatch): - assert not memory_logger.pop() - - original_send = inspect.getattr_static(Chat, "send") - original_generate = inspect.getattr_static(Embeddings, "generate") - original_responses_send = inspect.getattr_static(Responses, "send") - - assert OpenRouterIntegration.setup() - client = _get_client() - start = time.time() - response = client.chat.send( - model=CHAT_MODEL, - messages=[{"role": "user", "content": "What is 2+2? Reply with just the number."}], - max_tokens=10, - ) - end = time.time() - - monkeypatch.setattr(Chat, "send", original_send) - monkeypatch.setattr(Embeddings, "generate", original_generate) - monkeypatch.setattr(Responses, "send", original_responses_send) - - assert "4" in response.choices[0].message.content - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["provider"] == "openai" - assert span["metadata"]["model"] == "gpt-4o-mini" - assert "4" in span["output"][0]["message"]["content"] - assert_metrics_are_valid(span["metrics"], start, end) - - def test_openrouter_integration_setup_is_idempotent(monkeypatch): first_send = inspect.getattr_static(Chat, "send") first_generate = inspect.getattr_static(Embeddings, "generate") From 65b922a83f625041a0b188c1ebb2e76adc1bb72e Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 19:57:17 +0000 Subject: [PATCH 02/11] test: prune redundant anthropic, bedrock and claude-agent-sdk tests Co-Authored-By: Claude Opus 5.5 --- .../test_anthropic_messages_create_async.yaml | 107 ---- ...pic_messages_create_async_stream_true.yaml | 137 ----- .../test_anthropic_messages_create_async.yaml | 107 ---- ...pic_messages_create_async_stream_true.yaml | 144 ------ .../integrations/anthropic/test_anthropic.py | 250 +-------- ...drock_converse_auto_wraps_new_clients.yaml | 36 -- ...drock_converse_auto_wraps_new_clients.yaml | 36 -- .../bedrock_runtime/test_bedrock_runtime.py | 25 +- .../claude_agent_sdk/test_claude_agent_sdk.py | 478 +++--------------- 9 files changed, 92 insertions(+), 1228 deletions(-) delete mode 100644 py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async.yaml delete mode 100644 py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async_stream_true.yaml delete mode 100644 py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async.yaml delete mode 100644 py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async_stream_true.yaml delete mode 100644 py/src/braintrust/integrations/bedrock_runtime/cassettes/1.34.116/test_setup_bedrock_converse_auto_wraps_new_clients.yaml delete mode 100644 py/src/braintrust/integrations/bedrock_runtime/cassettes/latest/test_setup_bedrock_converse_auto_wraps_new_clients.yaml diff --git a/py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async.yaml b/py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async.yaml deleted file mode 100644 index c25643be0..000000000 --- a/py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: - - request: - body: - '{"max_tokens":100,"messages":[{"role":"user","content":"what is 6+1?, just - return the number"}],"model":"claude-3-haiku-20240307"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - anthropic-version: - - "2023-06-01" - connection: - - keep-alive - content-length: - - "130" - content-type: - - application/json - host: - - api.anthropic.com - user-agent: - - AsyncAnthropic/Python 0.52.1 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 0.52.1 - x-stainless-read-timeout: - - "600" - x-stainless-retry-count: - - "0" - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.13.3 - x-stainless-timeout: - - "600" - method: POST - uri: https://api.anthropic.com/v1/messages - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//ZI9RS8QwEIT/yzyn0OuplTwKouiLiOCDSAjJchevt6nZjXiW/nfp4YHi - 08J8M8POhBRhsZeNa1ePV28X5frp5vn+Iekd3XaRv/oDDPQw0uIiEb8hGJQ8LIIXSaKeFQb7HGmA - RRh8jdSsm61Pu9p0bXfWrtseBiGzEivsy3RqVPpcssdj0WN+NRDNoyvkJTMsiKPTWhg/QOi9EgeC - 5ToMBvX4kZ2QeKzqNO+IBXZ1aRB82JILhbymzO6voT3xQj7+Z7nqb+XcQKh8pEBOExVYLLOjLxHz - /A0AAP//AwAb9FnuRAEAAA== - headers: - CF-RAY: - - 9472c8992b3941cf-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 29 May 2025 03:07:48 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Robots-Tag: - - none - anthropic-organization-id: - - 27796668-7351-40ac-acc4-024aee8995a5 - anthropic-ratelimit-input-tokens-limit: - - "8000000" - anthropic-ratelimit-input-tokens-remaining: - - "8000000" - anthropic-ratelimit-input-tokens-reset: - - "2025-05-29T03:07:48Z" - anthropic-ratelimit-output-tokens-limit: - - "1500000" - anthropic-ratelimit-output-tokens-remaining: - - "1500000" - anthropic-ratelimit-output-tokens-reset: - - "2025-05-29T03:07:48Z" - anthropic-ratelimit-requests-limit: - - "10000" - anthropic-ratelimit-requests-remaining: - - "9999" - anthropic-ratelimit-requests-reset: - - "2025-05-29T03:07:48Z" - anthropic-ratelimit-tokens-limit: - - "9500000" - anthropic-ratelimit-tokens-remaining: - - "9500000" - anthropic-ratelimit-tokens-reset: - - "2025-05-29T03:07:48Z" - cf-cache-status: - - DYNAMIC - request-id: - - req_011CPb5r4YP1DCcYkkUYE4am - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - via: - - 1.1 google - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async_stream_true.yaml b/py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async_stream_true.yaml deleted file mode 100644 index 02a1aec3e..000000000 --- a/py/src/braintrust/integrations/anthropic/cassettes/0.48.0/test_anthropic_messages_create_async_stream_true.yaml +++ /dev/null @@ -1,137 +0,0 @@ -interactions: - - request: - body: - '{"max_tokens":100,"messages":[{"role":"user","content":"what is 6+1?, just - return the number"}],"model":"claude-3-haiku-20240307","stream":true}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - anthropic-version: - - "2023-06-01" - connection: - - keep-alive - content-length: - - "144" - content-type: - - application/json - host: - - api.anthropic.com - user-agent: - - AsyncAnthropic/Python 0.52.1 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 0.52.1 - x-stainless-read-timeout: - - "600" - x-stainless-retry-count: - - "0" - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.13.3 - x-stainless-timeout: - - NOT_GIVEN - method: POST - uri: https://api.anthropic.com/v1/messages - response: - body: - string: 'event: message_start - - data: {"type":"message_start","message":{"id":"msg_01MWFaVNqKdU45YCBTgbHDLj","type":"message","role":"assistant","model":"claude-3-haiku-20240307","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":18,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":2,"service_tier":"standard"}} } - - - event: content_block_start - - data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } - - - event: ping - - data: {"type": "ping"} - - - event: content_block_delta - - data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"7"} } - - - event: content_block_stop - - data: {"type":"content_block_stop","index":0 } - - - event: message_delta - - data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens":5} } - - - event: message_stop - - data: {"type":"message_stop" } - - - ' - headers: - CF-RAY: - - 9472c89bd9c932e8-EWR - Cache-Control: - - no-cache - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Thu, 29 May 2025 03:07:48 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Robots-Tag: - - none - anthropic-organization-id: - - 27796668-7351-40ac-acc4-024aee8995a5 - anthropic-ratelimit-input-tokens-limit: - - "8000000" - anthropic-ratelimit-input-tokens-remaining: - - "8000000" - anthropic-ratelimit-input-tokens-reset: - - "2025-05-29T03:07:48Z" - anthropic-ratelimit-output-tokens-limit: - - "1500000" - anthropic-ratelimit-output-tokens-remaining: - - "1500000" - anthropic-ratelimit-output-tokens-reset: - - "2025-05-29T03:07:48Z" - anthropic-ratelimit-requests-limit: - - "10000" - anthropic-ratelimit-requests-remaining: - - "9999" - anthropic-ratelimit-requests-reset: - - "2025-05-29T03:07:48Z" - anthropic-ratelimit-tokens-limit: - - "9500000" - anthropic-ratelimit-tokens-remaining: - - "9500000" - anthropic-ratelimit-tokens-reset: - - "2025-05-29T03:07:48Z" - cf-cache-status: - - DYNAMIC - request-id: - - req_011CPb5r6N2HCkaPWJii33N1 - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - via: - - 1.1 google - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async.yaml b/py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async.yaml deleted file mode 100644 index f81564016..000000000 --- a/py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"max_tokens":100,"messages":[{"role":"user","content":"what is 6+1?, just - return the number"}],"model":"claude-haiku-4-5-20251001"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - anthropic-version: - - '2023-06-01' - connection: - - keep-alive - content-length: - - '132' - content-type: - - application/json - host: - - api.anthropic.com - user-agent: - - AsyncAnthropic/Python 1.7.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.7.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - x-stainless-timeout: - - '600' - method: POST - uri: https://api.anthropic.com/v1/messages - response: - body: - string: '{"model":"claude-haiku-4-5-20251001","id":"msg_011CfJf9srzQ4cX6u4zFXoDJ","type":"message","role":"assistant","content":[{"type":"text","text":"7"}],"container":null,"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":18,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"not_available"}}' - headers: - anthropic-organization-id: - - 27796668-7351-40ac-acc4-024aee8995a5 - anthropic-ratelimit-input-tokens-limit: - - '10000000' - anthropic-ratelimit-input-tokens-remaining: - - '10000000' - anthropic-ratelimit-input-tokens-reset: - - '2026-09-22T14:45:51Z' - anthropic-ratelimit-output-tokens-limit: - - '2000000' - anthropic-ratelimit-output-tokens-remaining: - - '2000000' - anthropic-ratelimit-output-tokens-reset: - - '2026-09-22T14:45:51Z' - anthropic-ratelimit-requests-limit: - - '20000' - anthropic-ratelimit-requests-remaining: - - '19999' - anthropic-ratelimit-requests-reset: - - '2026-09-22T14:45:51Z' - anthropic-ratelimit-tokens-limit: - - '12000000' - anthropic-ratelimit-tokens-remaining: - - '12000000' - anthropic-ratelimit-tokens-reset: - - '2026-09-22T14:45:51Z' - anthropic-workspace-id: - - wrkspc_018bFG1FgNVWqx5pthtdGTzS - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f218815d00c745-EWR - connection: - - keep-alive - content-length: - - '474' - content-security-policy: - - default-src 'none'; frame-ancestors 'none' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:45:51 GMT - request-id: - - req_011CfJf9sa8SEVTjQeK851MZ - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - traceresponse: - - 00-08791f6e74af22b6c260c764a01a17c1-804c43a2f18a4058-01 - transfer-encoding: - - chunked - vary: - - Accept-Encoding - x-robots-tag: - - none - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async_stream_true.yaml b/py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async_stream_true.yaml deleted file mode 100644 index c557b5eb8..000000000 --- a/py/src/braintrust/integrations/anthropic/cassettes/latest/test_anthropic_messages_create_async_stream_true.yaml +++ /dev/null @@ -1,144 +0,0 @@ -interactions: -- request: - body: '{"max_tokens":100,"messages":[{"role":"user","content":"what is 6+1?, just - return the number"}],"model":"claude-haiku-4-5-20251001","stream":true}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - anthropic-version: - - '2023-06-01' - connection: - - keep-alive - content-length: - - '146' - content-type: - - application/json - host: - - api.anthropic.com - user-agent: - - AsyncAnthropic/Python 1.7.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.7.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - x-stainless-timeout: - - NOT_GIVEN - method: POST - uri: https://api.anthropic.com/v1/messages - response: - body: - string: 'event: message_start - - data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CfJf9v8BNufQ5eH9P8Kch","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":18,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"}} } - - - event: content_block_start - - data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } - - - event: ping - - data: {"type": "ping"} - - - event: content_block_delta - - data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"7"} } - - - event: content_block_stop - - data: {"type":"content_block_stop","index":0 } - - - event: message_delta - - data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":18,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":5} } - - - event: message_stop - - data: {"type":"message_stop" } - - - ' - headers: - anthropic-organization-id: - - 27796668-7351-40ac-acc4-024aee8995a5 - anthropic-ratelimit-input-tokens-limit: - - '10000000' - anthropic-ratelimit-input-tokens-remaining: - - '10000000' - anthropic-ratelimit-input-tokens-reset: - - '2026-09-22T14:45:51Z' - anthropic-ratelimit-output-tokens-limit: - - '2000000' - anthropic-ratelimit-output-tokens-remaining: - - '2000000' - anthropic-ratelimit-output-tokens-reset: - - '2026-09-22T14:45:51Z' - anthropic-ratelimit-requests-limit: - - '20000' - anthropic-ratelimit-requests-remaining: - - '19999' - anthropic-ratelimit-requests-reset: - - '2026-09-22T14:45:51Z' - anthropic-ratelimit-tokens-limit: - - '12000000' - anthropic-ratelimit-tokens-remaining: - - '12000000' - anthropic-ratelimit-tokens-reset: - - '2026-09-22T14:45:51Z' - anthropic-workspace-id: - - wrkspc_018bFG1FgNVWqx5pthtdGTzS - cache-control: - - no-cache - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f218849a731f8d-EWR - connection: - - keep-alive - content-length: - - '1179' - content-security-policy: - - default-src 'none'; frame-ancestors 'none' - content-type: - - text/event-stream; charset=utf-8 - date: - - Tue, 22 Sep 2026 14:45:51 GMT - request-id: - - req_011CfJf9uqZHLmzZS8iBZTUY - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - traceresponse: - - 00-319434bfd90c10399645bed81cc16392-f6555232a577e843-01 - transfer-encoding: - - chunked - vary: - - Accept-Encoding - x-robots-tag: - - none - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/anthropic/test_anthropic.py b/py/src/braintrust/integrations/anthropic/test_anthropic.py index 84627109f..dd0a4fbe2 100644 --- a/py/src/braintrust/integrations/anthropic/test_anthropic.py +++ b/py/src/braintrust/integrations/anthropic/test_anthropic.py @@ -16,8 +16,6 @@ from braintrust.integrations.anthropic._utils import _try_to_dict, extract_anthropic_usage from braintrust.integrations.anthropic.tracing import ( TracedMessageStream, - _get_input_from_kwargs, - _get_metadata_from_kwargs, _log_message_to_span, ) from braintrust.integrations.test_utils import verify_autoinstrument_script @@ -183,106 +181,6 @@ def memory_logger(): yield bgl -def test_get_input_from_kwargs_converts_multimodal_base64_blocks_to_attachments(): - kwargs = { - "messages": [ - { - "role": "user", - "content": [ - {"type": "text", "text": "Describe these files."}, - { - "type": "image", - "source": { - "type": "base64", - "media_type": "image/png", - "data": PNG_BASE64, - }, - }, - { - "type": "document", - "source": { - "type": "base64", - "media_type": "application/pdf", - "data": PDF_BASE64, - }, - }, - ], - } - ] - } - - processed_input = _get_input_from_kwargs(kwargs) - - content = processed_input[0]["content"] - image_block = content[1] - document_block = content[2] - - assert image_block["type"] == "image" - assert image_block["source"] == {"type": "base64", "media_type": "image/png"} - assert isinstance(image_block["image_url"]["url"], Attachment) - assert image_block["image_url"]["url"].reference["content_type"] == "image/png" - assert image_block["image_url"]["url"].reference["filename"] == "image.png" - - assert document_block["type"] == "document" - assert document_block["source"] == {"type": "base64", "media_type": "application/pdf"} - assert document_block["file"]["filename"] == "document.pdf" - assert isinstance(document_block["file"]["file_data"], Attachment) - assert document_block["file"]["file_data"].reference["content_type"] == "application/pdf" - assert document_block["file"]["file_data"].reference["filename"] == "document.pdf" - - serialized = str(processed_input) - assert PNG_BASE64 not in serialized - assert PDF_BASE64 not in serialized - - -def test_get_metadata_from_kwargs_includes_structured_output_params(): - metadata = _get_metadata_from_kwargs( - { - "model": MODEL, - "output_config": { - "format": { - "type": "json_schema", - "schema": STRUCTURED_OUTPUT_SCHEMA, - } - }, - "output_format": { - "type": "json_schema", - "schema": STRUCTURED_OUTPUT_SCHEMA, - }, - } - ) - - assert metadata == { - "provider": "anthropic", - "model": MODEL, - "output_config": { - "format": { - "type": "json_schema", - "schema": STRUCTURED_OUTPUT_SCHEMA, - } - }, - "output_format": { - "type": "json_schema", - "schema": STRUCTURED_OUTPUT_SCHEMA, - }, - } - - -def test_get_metadata_from_kwargs_includes_compaction_and_context_management(): - metadata = _get_metadata_from_kwargs( - { - "compaction": [{"type": "enabled"}], - "context_management": {"edits": [{"type": "clear_tool_uses_20250919"}]}, - } - ) - - assert metadata == { - "provider": "anthropic", - "compaction": [{"type": "enabled"}], - "context_management": {"edits": [{"type": "clear_tool_uses_20250919"}]}, - } - - def test_log_message_to_span_includes_stop_reason_and_stop_sequence(): span = unittest.mock.MagicMock() message = SimpleNamespace( @@ -514,53 +412,32 @@ def test_anthropic_beta_messages_create_captures_fallback_credit_usage(memory_lo @pytest.mark.vcr(match_on=["method", "scheme", "host", "port", "path"]) -def test_anthropic_messages_create_prompt_cache_5m_metrics(memory_logger): - if os.environ.get("BRAINTRUST_TEST_PACKAGE_VERSION") != "latest": - pytest.skip("Prompt cache TTL breakdown requires the latest Anthropic SDK cassette") - - client = wrap_anthropic(_get_client()) - response = client.messages.create( - model=LATEST_MODEL, - max_tokens=16, - system=[ - { - "type": "text", - "text": PROMPT_CACHE_TEST_TEXT, - "cache_control": {"type": "ephemeral", "ttl": "5m"}, - } - ], - messages=[{"role": "user", "content": "What is the capital of France?"}], - ) - - span = find_span_by_name(memory_logger.pop(), "anthropic.messages.create") - assert span["output"]["role"] == response.role - assert "prompt_cache_creation_tokens" not in span["metrics"] - assert ( - span["metrics"]["prompt_cache_creation_5m_tokens"] == response.usage.cache_creation.ephemeral_5m_input_tokens - ) - assert ( - span["metrics"]["prompt_cache_creation_1h_tokens"] == response.usage.cache_creation.ephemeral_1h_input_tokens - ) - - -@pytest.mark.vcr(match_on=["method", "scheme", "host", "port", "path"]) -def test_anthropic_messages_create_prompt_cache_1h_metrics(memory_logger): +@pytest.mark.parametrize( + "ttl,vcr_cassette_name", + [ + ("5m", "test_anthropic_messages_create_prompt_cache_5m_metrics"), + ("1h", "test_anthropic_messages_create_prompt_cache_1h_metrics"), + ], + ids=["5m", "1h"], +) +def test_anthropic_messages_create_prompt_cache_metrics(memory_logger, ttl, vcr_cassette_name): if os.environ.get("BRAINTRUST_TEST_PACKAGE_VERSION") != "latest": pytest.skip("Prompt cache TTL breakdown requires the latest Anthropic SDK cassette") client = wrap_anthropic(_get_client()) + extra_kwargs = {"extra_headers": {"anthropic-beta": "extended-cache-ttl-2025-04-11"}} if ttl == "1h" else {} response = client.messages.create( model=LATEST_MODEL, max_tokens=16, - extra_headers={"anthropic-beta": "extended-cache-ttl-2025-04-11"}, system=[ { "type": "text", "text": PROMPT_CACHE_TEST_TEXT, - "cache_control": {"type": "ephemeral", "ttl": "1h"}, + "cache_control": {"type": "ephemeral", "ttl": ttl}, } ], messages=[{"role": "user", "content": "What is the capital of France?"}], + **extra_kwargs, ) span = find_span_by_name(memory_logger.pop(), "anthropic.messages.create") @@ -1044,58 +921,6 @@ def _with_messages_stream(): assert inputs_by_role["user"] == q[0]["content"] -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_anthropic_messages_create_async(memory_logger): - assert not memory_logger.pop() - - params = { - "model": MODEL, - "max_tokens": 100, - "messages": [{"role": "user", "content": "what is 6+1?, just return the number"}], - } - - client = wrap_anthropic(anthropic.AsyncAnthropic()) - msg = await client.messages.create(**params) - assert "7" in msg.content[0].text - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == MODEL - assert span["metadata"]["max_tokens"] == 100 - assert span["input"] == params["messages"] - assert span["output"]["role"] == "assistant" - assert "7" in span["output"]["content"][0]["text"] - - -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_anthropic_messages_create_async_stream_true(memory_logger): - assert not memory_logger.pop() - - params = { - "model": MODEL, - "max_tokens": 100, - "messages": [{"role": "user", "content": "what is 6+1?, just return the number"}], - "stream": True, - } - - client = wrap_anthropic(anthropic.AsyncAnthropic()) - stream = await client.messages.create(**params) - async for event in stream: - pass - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == MODEL - assert span["metadata"]["max_tokens"] == 100 - assert span["input"] == params["messages"] - assert span["output"]["role"] == "assistant" - assert "7" in span["output"]["content"][0]["text"] - - @pytest.mark.vcr @pytest.mark.asyncio async def test_anthropic_messages_streaming_async(memory_logger): @@ -2055,54 +1880,3 @@ async def test_async_beta_batches_create_produces_span(self, memory_logger): assert span["metadata"]["model"] == MODEL assert span["input"] == [{"custom_id": "req-1"}, {"custom_id": "req-2"}] assert span["output"]["id"] == result.id - - -class TestBetaBatchesResultsSpans: - """Tests verifying that beta.messages.batches.results() produces correct spans. - - Mocked because the batch results API requires a completed batch, and batches - can take up to 24 hours to finish processing. - """ - - def test_sync_beta_batches_results_produces_span(self, memory_logger): - assert not memory_logger.pop() - - client = wrap_anthropic(_get_client()) - mock_decoder = unittest.mock.MagicMock() - with unittest.mock.patch( - "anthropic.resources.beta.messages.batches.Batches.results", - return_value=mock_decoder, - ): - result = client.beta.messages.batches.results("msgbatch_beta123") - - assert result is mock_decoder - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["span_attributes"]["name"] == "anthropic.messages.batches.results" - assert span["span_attributes"]["type"] == "task" - assert span["metadata"]["provider"] == "anthropic" - assert span["input"]["message_batch_id"] == "msgbatch_beta123" - assert span["output"]["type"] == "jsonl_stream" - - @pytest.mark.asyncio - async def test_async_beta_batches_results_produces_span(self, memory_logger): - assert not memory_logger.pop() - - client = wrap_anthropic(_get_async_client()) - mock_decoder = unittest.mock.MagicMock() - with unittest.mock.patch( - "anthropic.resources.beta.messages.batches.AsyncBatches.results", - return_value=mock_decoder, - ): - result = await client.beta.messages.batches.results(message_batch_id="msgbatch_beta456") - - assert result is mock_decoder - - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["span_attributes"]["name"] == "anthropic.messages.batches.results" - assert span["metadata"]["provider"] == "anthropic" - assert span["input"]["message_batch_id"] == "msgbatch_beta456" diff --git a/py/src/braintrust/integrations/bedrock_runtime/cassettes/1.34.116/test_setup_bedrock_converse_auto_wraps_new_clients.yaml b/py/src/braintrust/integrations/bedrock_runtime/cassettes/1.34.116/test_setup_bedrock_converse_auto_wraps_new_clients.yaml deleted file mode 100644 index 90443562b..000000000 --- a/py/src/braintrust/integrations/bedrock_runtime/cassettes/1.34.116/test_setup_bedrock_converse_auto_wraps_new_clients.yaml +++ /dev/null @@ -1,36 +0,0 @@ -interactions: -- request: - body: '{"system": [{"text": "You answer with concise lowercase text."}], "messages": - [{"role": "user", "content": [{"text": "Say hello in one word."}]}], "inferenceConfig": - {"maxTokens": 20, "temperature": 0, "topP": 0.9, "stopSequences": ["STOP"]}}' - headers: - Content-Length: - - '242' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - !!binary | - Qm90bzMvMS40My4yOSBtZC9Cb3RvY29yZSMxLjQzLjI5IHVhLzIuMSBvcy9tYWNvcyMyNS41LjAg - bWQvYXJjaCNhcm02NCBsYW5nL3B5dGhvbiMzLjE0LjMgbWQvcHlpbXBsI0NQeXRob24gbS9iLDMs - WixEIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjQzLjI5 - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.amazon.nova-lite-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":613},"output":{"message":{"content":[{"text":"hi"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":13,"outputTokens":2,"serverToolUsage":{},"totalTokens":15}}' - headers: - Connection: - - keep-alive - Content-Length: - - '203' - Content-Type: - - application/json - Date: - - Mon, 15 Jun 2026 20:24:01 GMT - x-amzn-RequestId: - - 7c3bdcc8-1124-46b5-982e-3ced2d1a5371 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/bedrock_runtime/cassettes/latest/test_setup_bedrock_converse_auto_wraps_new_clients.yaml b/py/src/braintrust/integrations/bedrock_runtime/cassettes/latest/test_setup_bedrock_converse_auto_wraps_new_clients.yaml deleted file mode 100644 index 90443562b..000000000 --- a/py/src/braintrust/integrations/bedrock_runtime/cassettes/latest/test_setup_bedrock_converse_auto_wraps_new_clients.yaml +++ /dev/null @@ -1,36 +0,0 @@ -interactions: -- request: - body: '{"system": [{"text": "You answer with concise lowercase text."}], "messages": - [{"role": "user", "content": [{"text": "Say hello in one word."}]}], "inferenceConfig": - {"maxTokens": 20, "temperature": 0, "topP": 0.9, "stopSequences": ["STOP"]}}' - headers: - Content-Length: - - '242' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - !!binary | - Qm90bzMvMS40My4yOSBtZC9Cb3RvY29yZSMxLjQzLjI5IHVhLzIuMSBvcy9tYWNvcyMyNS41LjAg - bWQvYXJjaCNhcm02NCBsYW5nL3B5dGhvbiMzLjE0LjMgbWQvcHlpbXBsI0NQeXRob24gbS9iLDMs - WixEIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjQzLjI5 - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.amazon.nova-lite-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":613},"output":{"message":{"content":[{"text":"hi"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":13,"outputTokens":2,"serverToolUsage":{},"totalTokens":15}}' - headers: - Connection: - - keep-alive - Content-Length: - - '203' - Content-Type: - - application/json - Date: - - Mon, 15 Jun 2026 20:24:01 GMT - x-amzn-RequestId: - - 7c3bdcc8-1124-46b5-982e-3ced2d1a5371 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/bedrock_runtime/test_bedrock_runtime.py b/py/src/braintrust/integrations/bedrock_runtime/test_bedrock_runtime.py index ee873f6b9..cfa227f2c 100644 --- a/py/src/braintrust/integrations/bedrock_runtime/test_bedrock_runtime.py +++ b/py/src/braintrust/integrations/bedrock_runtime/test_bedrock_runtime.py @@ -8,7 +8,7 @@ import pytest from braintrust import Attachment, logger -from braintrust.integrations.bedrock_runtime import BedrockRuntimeIntegration, setup_bedrock, wrap_bedrock +from braintrust.integrations.bedrock_runtime import setup_bedrock, wrap_bedrock from braintrust.integrations.bedrock_runtime.patchers import ( BedrockClientCreatorPatcher, BedrockRuntimeClientMethodsPatcher, @@ -131,12 +131,6 @@ def _assert_converse_span(span, *, name: str, start: float, end: float, model_id # --------------------------------------------------------------------------- -def test_integration_metadata_and_min_version(): - assert BedrockRuntimeIntegration.name == "bedrock_runtime" - assert BedrockRuntimeIntegration.min_version == "1.34.116" - assert BedrockRuntimeIntegration.available_patchers() == ("bedrock_runtime.client_creator",) - - def test_wrap_bedrock_returns_non_bedrock_clients_unchanged(): client = _s3_client() @@ -186,23 +180,6 @@ def test_wrap_bedrock_converse(memory_logger): assert spans[0]["metadata"]["endpoint"] == "converse" -@pytest.mark.vcr -def test_setup_bedrock_converse_auto_wraps_new_clients(memory_logger, clean_client_creator): - assert setup_bedrock() is True - assert not memory_logger.pop() - - client = _bedrock_client() - start = time.time() - response = client.converse(**_converse_kwargs()) - end = time.time() - - assert response["output"]["message"]["role"] == "assistant" - - spans = memory_logger.pop() - assert len(spans) == 1 - _assert_converse_span(spans[0], name="bedrock.converse", start=start, end=end) - - @pytest.mark.vcr def test_wrap_bedrock_converse_stream(memory_logger): assert not memory_logger.pop() diff --git a/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py b/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py index 768954acf..cad671cb6 100644 --- a/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py +++ b/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py @@ -40,7 +40,6 @@ _parse_tool_name, _serialize_content_blocks, _serialize_system_message, - _serialize_tool_result_output, _thread_local, ) from braintrust.integrations.test_utils import verify_autoinstrument_script @@ -663,31 +662,27 @@ async def __anext__(self): @pytest.mark.skipif(not CLAUDE_SDK_AVAILABLE, reason="Claude Agent SDK not installed") @pytest.mark.asyncio @pytest.mark.parametrize( - "cassette_name,input_factory,expected_contents", + "input_factory,expected_contents", [ pytest.param( - "test_query_async_iterable_asyncgen_single", lambda: (msg async for msg in _single_message_generator()), ["What is 2 + 2?"], id="asyncgen_single", ), pytest.param( - "test_query_async_iterable_asyncgen_multi", lambda: (msg async for msg in _multi_message_generator()), ["Part 1", "Part 2"], id="asyncgen_multi", ), pytest.param( - "test_query_async_iterable_custom_async_iterable", lambda: CustomAsyncIterable([_make_message("Custom 1"), _make_message("Custom 2")]), ["Custom 1", "Custom 2"], id="custom_async_iterable", ), ], ) -async def test_query_async_iterable(memory_logger, cassette_name, input_factory, expected_contents): +async def test_query_async_iterable(memory_logger, input_factory, expected_contents): """Test that async iterable inputs are captured as structured lists.""" - del cassette_name assert not memory_logger.pop() wrapped_client_class = _create_client_wrapper_class(FakeClaudeSDKClient) @@ -1273,15 +1268,8 @@ async def test_delegated_subagent_llm_and_tool_spans_nest_under_task_span(memory ) ] ), - TaskStartedMessage( - subtype="task_started", - data={"subtype": "task_started", "task_id": "task-subagent"}, - task_id="task-subagent", - description="Inspect release notes", - uuid="msg-start", - session_id="session-123", - tool_use_id="call-agent", - task_type="local_agent", + _task_started( + "task-subagent", description="Inspect release notes", uuid="msg-start", tool_use_id="call-agent" ), AssistantMessage( content=[ @@ -1295,15 +1283,10 @@ async def test_delegated_subagent_llm_and_tool_spans_nest_under_task_span(memory UserMessage( content=[ToolResultBlock(tool_use_id="call-read", content=[TextBlock("version = 2026.03.11")])], ), - TaskNotificationMessage( - subtype="task_notification", - data={"subtype": "task_notification", "task_id": "task-subagent"}, - task_id="task-subagent", - status="completed", - output_file="", + _task_done( + "task-subagent", summary="Inspection complete", uuid="msg-done", - session_id="session-123", tool_use_id="call-agent", usage={"total_tokens": 42, "tool_uses": 1, "duration_ms": 250}, ), @@ -1355,15 +1338,8 @@ async def test_multiple_subagent_orchestration_keeps_outer_agent_tool_calls_outs ), ] ), - TaskStartedMessage( - subtype="task_started", - data={"subtype": "task_started", "task_id": "task-alpha"}, - task_id="task-alpha", - description="Read alpha release notes", - uuid="msg-alpha-start", - session_id="session-123", - tool_use_id="call-alpha", - task_type="local_agent", + _task_started( + "task-alpha", description="Read alpha release notes", uuid="msg-alpha-start", tool_use_id="call-alpha" ), AssistantMessage( content=[ @@ -1374,30 +1350,18 @@ async def test_multiple_subagent_orchestration_keeps_outer_agent_tool_calls_outs ) ] ), - TaskStartedMessage( - subtype="task_started", - data={"subtype": "task_started", "task_id": "task-beta"}, - task_id="task-beta", - description="Read beta release notes", - uuid="msg-beta-start", - session_id="session-123", - tool_use_id="call-beta", - task_type="local_agent", + _task_started( + "task-beta", description="Read beta release notes", uuid="msg-beta-start", tool_use_id="call-beta" ), AssistantMessage( content=[ToolUseBlock(id="read-alpha", name="Read", input={"file_path": "/tmp/release_notes_alpha.md"})], parent_tool_use_id="call-alpha", ), UserMessage(content=[ToolResultBlock(tool_use_id="read-alpha", content=[TextBlock("alpha result")])]), - TaskNotificationMessage( - subtype="task_notification", - data={"subtype": "task_notification", "task_id": "task-alpha"}, - task_id="task-alpha", - status="completed", - output_file="", + _task_done( + "task-alpha", summary="Alpha complete", uuid="msg-alpha-done", - session_id="session-123", tool_use_id="call-alpha", usage={"total_tokens": 11, "tool_uses": 1, "duration_ms": 250}, ), @@ -1406,15 +1370,10 @@ async def test_multiple_subagent_orchestration_keeps_outer_agent_tool_calls_outs parent_tool_use_id="call-beta", ), UserMessage(content=[ToolResultBlock(tool_use_id="read-beta", content=[TextBlock("beta result")])]), - TaskNotificationMessage( - subtype="task_notification", - data={"subtype": "task_notification", "task_id": "task-beta"}, - task_id="task-beta", - status="completed", - output_file="", + _task_done( + "task-beta", summary="Beta complete", uuid="msg-beta-done", - session_id="session-123", tool_use_id="call-beta", usage={"total_tokens": 12, "tool_uses": 1, "duration_ms": 300}, ), @@ -1507,48 +1466,24 @@ async def test_relay_user_messages_between_parallel_agent_calls_do_not_split_llm # SDK relays the beta subagent prompt as a UserMessage (no ToolResultBlock) UserMessage(content=[TextBlock("You must use Bash and Read on release_notes_beta.md...")]), # Task lifecycle events - TaskStartedMessage( - subtype="task_started", - data={"subtype": "task_started", "task_id": "task-alpha"}, - task_id="task-alpha", - description="Read alpha release notes", - uuid="msg-alpha-start", - session_id="session-123", - tool_use_id="call-alpha", - task_type="local_agent", + _task_started( + "task-alpha", description="Read alpha release notes", uuid="msg-alpha-start", tool_use_id="call-alpha" ), - TaskStartedMessage( - subtype="task_started", - data={"subtype": "task_started", "task_id": "task-beta"}, - task_id="task-beta", - description="Read beta release notes", - uuid="msg-beta-start", - session_id="session-123", - tool_use_id="call-beta", - task_type="local_agent", + _task_started( + "task-beta", description="Read beta release notes", uuid="msg-beta-start", tool_use_id="call-beta" ), # Subagent completions - TaskNotificationMessage( - subtype="task_notification", - data={"subtype": "task_notification", "task_id": "task-alpha"}, - task_id="task-alpha", - status="completed", - output_file="", + _task_done( + "task-alpha", summary="Alpha complete", uuid="msg-alpha-done", - session_id="session-123", tool_use_id="call-alpha", usage={"total_tokens": 11, "tool_uses": 1, "duration_ms": 250}, ), - TaskNotificationMessage( - subtype="task_notification", - data={"subtype": "task_notification", "task_id": "task-beta"}, - task_id="task-beta", - status="completed", - output_file="", + _task_done( + "task-beta", summary="Beta complete", uuid="msg-beta-done", - session_id="session-123", tool_use_id="call-beta", usage={"total_tokens": 12, "tool_uses": 1, "duration_ms": 300}, ), @@ -1632,15 +1567,8 @@ async def test_agent_tool_spans_encapsulate_child_task_spans(memory_logger): ] ), # SDK emits TaskStarted immediately after Agent ToolUse (real ordering) - TaskStartedMessage( - subtype="task_started", - data={"subtype": "task_started", "task_id": "task-alpha"}, - task_id="task-alpha", - description="Read alpha release notes", - uuid="msg-alpha-start", - session_id="session-123", - tool_use_id="call-alpha", - task_type="local_agent", + _task_started( + "task-alpha", description="Read alpha release notes", uuid="msg-alpha-start", tool_use_id="call-alpha" ), # SDK relays the alpha subagent prompt (no ToolResultBlock) UserMessage(content=[TextBlock("Read alpha release notes...")]), @@ -1655,40 +1583,23 @@ async def test_agent_tool_spans_encapsulate_child_task_spans(memory_logger): ] ), # SDK emits TaskStarted immediately after Agent ToolUse (real ordering) - TaskStartedMessage( - subtype="task_started", - data={"subtype": "task_started", "task_id": "task-beta"}, - task_id="task-beta", - description="Read beta release notes", - uuid="msg-beta-start", - session_id="session-123", - tool_use_id="call-beta", - task_type="local_agent", + _task_started( + "task-beta", description="Read beta release notes", uuid="msg-beta-start", tool_use_id="call-beta" ), # SDK relays the beta subagent prompt (no ToolResultBlock) UserMessage(content=[TextBlock("Read beta release notes...")]), # Both tasks complete - TaskNotificationMessage( - subtype="task_notification", - data={"subtype": "task_notification", "task_id": "task-alpha"}, - task_id="task-alpha", - status="completed", - output_file="", + _task_done( + "task-alpha", summary="Alpha complete", uuid="msg-alpha-done", - session_id="session-123", tool_use_id="call-alpha", usage={"total_tokens": 11, "tool_uses": 1, "duration_ms": 250}, ), - TaskNotificationMessage( - subtype="task_notification", - data={"subtype": "task_notification", "task_id": "task-beta"}, - task_id="task-beta", - status="completed", - output_file="", + _task_done( + "task-beta", summary="Beta complete", uuid="msg-beta-done", - session_id="session-123", tool_use_id="call-beta", usage={"total_tokens": 12, "tool_uses": 1, "duration_ms": 300}, ), @@ -1815,6 +1726,34 @@ class TaskNotificationMessage: usage: dict[str, Any] | None = None +def _task_started(task_id, *, description, uuid, tool_use_id=None, task_type="local_agent"): + return TaskStartedMessage( + subtype="task_started", + data={"subtype": "task_started", "task_id": task_id}, + task_id=task_id, + description=description, + uuid=uuid, + session_id="session-123", + tool_use_id=tool_use_id, + task_type=task_type, + ) + + +def _task_done(task_id, *, summary, uuid, tool_use_id=None, usage=None, status="completed", output_file=""): + return TaskNotificationMessage( + subtype="task_notification", + data={"subtype": "task_notification", "task_id": task_id}, + task_id=task_id, + status=status, + output_file=output_file, + summary=summary, + uuid=uuid, + session_id="session-123", + tool_use_id=tool_use_id, + usage=usage, + ) + + class ResultMessage: def __init__( self, @@ -1901,47 +1840,34 @@ def _clear_tool_span_tracker() -> None: @pytest.mark.asyncio -async def test_receive_response_suppresses_unexpected_cancelled_error_empty_stream(memory_logger): - """CancelledError on an empty stream is suppressed without error.""" +@pytest.mark.parametrize( + "messages", + [ + # No messages: CancelledError fires immediately on iteration. + pytest.param([], id="empty_stream"), + # CancelledError at stream close after a complete response. + pytest.param( + [AssistantMessage(content=[TextBlock("The answer is 42.")]), ResultMessage()], id="after_messages" + ), + # CancelledError between messages, before the ResultMessage arrives. + pytest.param([AssistantMessage(content=[TextBlock("Partial answer.")])], id="mid_stream"), + ], +) +async def test_receive_response_suppresses_unexpected_cancelled_error(memory_logger, messages): + """CancelledError from the transport is suppressed; messages yielded before it are kept and logged.""" assert not memory_logger.pop() wrapped_client_class = _create_client_wrapper_class(FakeCancelledClaudeSDKClient) client = wrapped_client_class() - # No messages — CancelledError fires immediately on iteration. + client._WrappedClaudeSDKClient__client.messages = messages # type: ignore[attr-defined] await client.query("Delegate this task.") received = [] async for message in client.receive_response(): received.append(message) - assert received == [] - - spans = memory_logger.pop() - task_spans = find_spans_by_type(spans, SpanTypeAttribute.TASK) - assert len(task_spans) == 1 - assert task_spans[0]["span_attributes"]["name"] == "Claude Agent" - assert task_spans[0].get("error") is None - - -@pytest.mark.asyncio -async def test_receive_response_suppresses_cancelled_error_after_messages(memory_logger): - """CancelledError after real messages still logs output and doesn't propagate.""" - assert not memory_logger.pop() - - wrapped_client_class = _create_client_wrapper_class(FakeCancelledClaudeSDKClient) - client = wrapped_client_class() - client._WrappedClaudeSDKClient__client.messages = [ # type: ignore[attr-defined] - AssistantMessage(content=[TextBlock("The answer is 42.")]), - ResultMessage(), - ] - - await client.query("What is the meaning of life?") - received = [] - async for message in client.receive_response(): - received.append(message) - # All messages yielded before the CancelledError should be received. - assert len(received) == 2 + assert received == messages spans = memory_logger.pop() task_spans = find_spans_by_type(spans, SpanTypeAttribute.TASK) @@ -1949,50 +1875,10 @@ async def test_receive_response_suppresses_cancelled_error_after_messages(memory task_span = task_spans[0] assert task_span["span_attributes"]["name"] == "Claude Agent" assert task_span.get("error") is None - # Output should still be logged despite the CancelledError at stream close. - assert task_span.get("output") is not None - assert task_span["output"]["role"] == "assistant" - - llm_spans = find_spans_by_type(spans, SpanTypeAttribute.LLM) - assert len(llm_spans) == 1 - - -class FakeCancelledMidStreamClaudeSDKClient(FakeClaudeSDKClient): - """CancelledError fires *between* messages, simulating cancellation mid-stream.""" - - async def receive_response(self): - yield self.messages[0] - raise asyncio.CancelledError - - -@pytest.mark.asyncio -async def test_receive_response_suppresses_cancelled_error_mid_stream(memory_logger): - """CancelledError between messages still yields partial results and logs output.""" - assert not memory_logger.pop() - - wrapped_client_class = _create_client_wrapper_class(FakeCancelledMidStreamClaudeSDKClient) - client = wrapped_client_class() - client._WrappedClaudeSDKClient__client.messages = [ # type: ignore[attr-defined] - AssistantMessage(content=[TextBlock("Partial answer.")]), - # Second message never arrives — CancelledError fires instead. - AssistantMessage(content=[TextBlock("This should not be received.")]), - ] - - await client.query("Tell me something.") - received = [] - async for message in client.receive_response(): - received.append(message) - - # Only the first message should be received. - assert len(received) == 1 - - spans = memory_logger.pop() - task_spans = find_spans_by_type(spans, SpanTypeAttribute.TASK) - assert len(task_spans) == 1 - task_span = task_spans[0] - assert task_span.get("error") is None - assert task_span.get("output") is not None - assert task_span["output"]["role"] == "assistant" + if messages: + # Output should still be logged despite the CancelledError. + assert task_span["output"]["role"] == "assistant" + assert len(find_spans_by_type(spans, SpanTypeAttribute.LLM)) == 1 @pytest.mark.asyncio @@ -2205,18 +2091,6 @@ async def calculator_handler(args): assert tool_span["output"] == {"content": [{"type": "text", "text": "42"}]} -def test_serialize_tool_result_output_flattens_text_blocks_and_errors(): - tool_result = ToolResultBlock( - tool_use_id="call-err", - content=[TextBlock("Division by zero")], - is_error=True, - ) - - output = _serialize_tool_result_output(tool_result) - - assert output == {"content": "Division by zero", "is_error": True} - - @pytest.mark.parametrize( "message,expected", [ @@ -2296,20 +2170,6 @@ def test_serialize_system_message_extracts_known_fields(message, expected): assert _serialize_system_message(message) == expected -def test_extract_anthropic_usage_normalizes_claude_result_message_usage(): - metrics, metadata = extract_anthropic_usage( - ResultMessage(input_tokens=5, output_tokens=3, cache_creation_input_tokens=2).usage - ) - - assert metrics == { - "prompt_tokens": 7.0, - "completion_tokens": 3.0, - "prompt_cache_creation_tokens": 2.0, - "tokens": 10.0, - } - assert metadata == {} - - def test_aggregate_model_usage_includes_all_agents_and_ignores_invalid_fields(): usage = _aggregate_model_usage( { @@ -2920,73 +2780,6 @@ async def test_concurrent_subagents_produce_parallel_llm_spans_with_correct_pare assert tool_span["metrics"]["end"] <= parent_llm["metrics"]["end"], "Tool extends past parent LLM" -@pytest.mark.skipif(not CLAUDE_SDK_AVAILABLE, reason="Claude Agent SDK not installed") -@pytest.mark.asyncio -async def test_interleaved_subagent_tool_spans_preserve_output(memory_logger, tmp_path): - """Delegated Bash and Read tool spans should retain their outputs when two subagents run in parallel.""" - assert not memory_logger.pop() - - workspace = tmp_path / "interleaved_subagent_workspace" - workspace.mkdir() - (workspace / "alpha.txt").write_text("alpha_file_contents\n", encoding="utf-8") - (workspace / "beta.txt").write_text("beta_file_contents\n", encoding="utf-8") - - with _patched_claude_sdk(wrap_client=True): - options = claude_agent_sdk.ClaudeAgentOptions( - model=TEST_MODEL, - cwd=workspace, - permission_mode="bypassPermissions", - max_turns=12, - allowed_tools=["Task", "Bash", "Read"], - ) - transport = make_cassette_transport( - cassette_name=_sdk_cassette_name("test_interleaved_subagent_tool_output_preserved", min_version="0.1.11"), - prompt="", - options=options, - ) - - async with claude_agent_sdk.ClaudeSDKClient(options=options, transport=transport) as client: - await client.query( - "Launch two bundled general-purpose subagents for two independent tasks. " - "Start both Agent tool calls before waiting on either result if the tool API allows it. " - "The first delegated subagent must use Bash to run `echo alpha-bash-output` and then use Read on alpha.txt. " - "The second delegated subagent must use Bash to run `echo beta-bash-output` and then use Read on beta.txt. " - "Each delegated subagent must return only its file contents after both tool calls complete. " - "After both delegated agents finish, reply with exactly two lines in order alpha then beta. " - "Do not ask clarifying questions. Do not answer directly without using both subagents." - ) - async for message in client.receive_response(): - if type(message).__name__ == "ResultMessage": - break - - spans = memory_logger.pop() - task_spans = find_spans_by_type(spans, SpanTypeAttribute.TASK) - tool_spans = find_spans_by_type(spans, SpanTypeAttribute.TOOL) - - find_span_by_name(task_spans, "Claude Agent") - - if not _sdk_version_at_least("0.1.11"): - return - - subagent_spans = [span for span in task_spans if span["span_attributes"]["name"] != "Claude Agent"] - assert len(subagent_spans) >= 2, f"Expected at least 2 delegated task spans, got {len(subagent_spans)}" - - bash_spans = [tool_span for tool_span in tool_spans if tool_span["span_attributes"]["name"] == "Bash"] - read_spans = [tool_span for tool_span in tool_spans if tool_span["span_attributes"]["name"] == "Read"] - assert len(bash_spans) >= 2, f"Expected at least 2 Bash spans, got {len(bash_spans)}" - assert len(read_spans) >= 2, f"Expected at least 2 Read spans, got {len(read_spans)}" - - bash_outputs = [tool_span["output"]["content"] for tool_span in bash_spans if tool_span.get("output") is not None] - read_outputs = [tool_span["output"]["content"] for tool_span in read_spans if tool_span.get("output") is not None] - - assert len(bash_outputs) >= 2, "Expected Bash outputs from both delegated subagents" - assert len(read_outputs) >= 2, "Expected Read outputs from both delegated subagents" - assert any("alpha-bash-output" in output for output in bash_outputs) - assert any("beta-bash-output" in output for output in bash_outputs) - assert any("alpha_file_contents" in output for output in read_outputs) - assert any("beta_file_contents" in output for output in read_outputs) - - @pytest.mark.skipif(not CLAUDE_SDK_AVAILABLE, reason="Claude Agent SDK not installed") @pytest.mark.asyncio async def test_interleaved_subagent_tool_spans_parent_to_correct_llm(memory_logger, tmp_path): @@ -3078,58 +2871,6 @@ def delegated_parent_ids(tool_span: dict[str, Any]) -> tuple[str, str]: assert alpha_read_llm_id != beta_read_llm_id, "Different subagents should not share the same parent LLM span" -@pytest.mark.asyncio -async def test_concurrent_subagent_tool_output_not_silently_dropped(memory_logger): - """cleanup() scoped to a different subagent must not end tool spans from - the first subagent. When only_parent_tool_use_id targets beta's context, - alpha's Bash tool span must survive so its ToolResultBlock is recorded. - """ - assert not memory_logger.pop() - - tracker = ToolSpanTracker() - - with start_span(name="Claude Agent", type=SpanTypeAttribute.TASK) as task_span: - # Alpha's LLM span and Bash tool span (parent_tool_use_id="call-alpha") - llm_span = start_span( - name="anthropic.messages.create", - type=SpanTypeAttribute.LLM, - parent=task_span.export(), - ) - tracker.start_tool_spans( - AssistantMessage( - content=[ToolUseBlock(id="bash-1", name="Bash", input={"command": "echo hello"})], - parent_tool_use_id="call-alpha", - ), - llm_span.export(), - ) - - assert tracker.has_active_spans, "Tool span should be active after start_tool_spans" - - # Cleanup triggered by beta's AssistantMessage — scoped to beta's context - tracker.cleanup_context("call-beta") - - # Alpha's tool span should still be active - assert tracker.has_active_spans, "cleanup_context('call-beta') should not end alpha's tool span" - - # Alpha's ToolResultBlock arrives and should be recorded - tracker.finish_tool_spans( - UserMessage(content=[ToolResultBlock(tool_use_id="bash-1", content=[TextBlock("hello")])]) - ) - llm_span.end() - - spans = memory_logger.pop() - bash_span = find_span_by_name( - [s for s in spans if s.get("span_attributes", {}).get("type") == SpanTypeAttribute.TOOL], - "Bash", - ) - - assert bash_span.get("output") is not None, ( - "Tool result was silently dropped. cleanup() scoped to a different subagent " - "should not have ended this tool span." - ) - assert bash_span["output"]["content"] == "hello" - - def test_tool_span_tracker_cleanup_preserves_cross_subagent_spans(memory_logger): """cleanup(only_parent_tool_use_id=...) should not end tool spans that belong to a different subagent context. @@ -3288,67 +3029,6 @@ async def echo_handler(args): ) -def test_dispatch_queue_assigns_identical_tool_spans_in_fifo_order(memory_logger): - """ToolSpanTracker.acquire_span_for_handler() should use the dispatch queue - to assign identical (same name + same input) tool spans in FIFO order, - preventing span swaps between sibling subagents. - """ - assert not memory_logger.pop() - - tracker = ToolSpanTracker() - shared_input = {"cmd": "echo hi"} - - with start_span(name="Claude Agent", type=SpanTypeAttribute.TASK) as task_span: - llm_alpha = start_span( - name="anthropic.messages.create", - type=SpanTypeAttribute.LLM, - parent=task_span.export(), - ) - tracker.start_tool_spans( - AssistantMessage( - content=[ToolUseBlock(id="bash-A", name="Bash", input=shared_input)], - parent_tool_use_id="call-alpha", - ), - llm_alpha.export(), - ) - - llm_beta = start_span( - name="anthropic.messages.create", - type=SpanTypeAttribute.LLM, - parent=task_span.export(), - ) - tracker.start_tool_spans( - AssistantMessage( - content=[ToolUseBlock(id="bash-B", name="Bash", input=shared_input)], - parent_tool_use_id="call-beta", - ), - llm_beta.export(), - ) - - # First acquire should return alpha's span (FIFO) - first = tracker.acquire_span_for_handler("Bash", shared_input) - assert first is not None - assert first.tool_use_id == "bash-A", ( - f"First acquire should return alpha's span (bash-A), got {first.tool_use_id}" - ) - - # Second acquire should return beta's span - second = tracker.acquire_span_for_handler("Bash", shared_input) - assert second is not None - assert second.tool_use_id == "bash-B", ( - f"Second acquire should return beta's span (bash-B), got {second.tool_use_id}" - ) - - # Cleanup - first.release() - second.release() - tracker.cleanup_all() - llm_alpha.end() - llm_beta.end() - - memory_logger.pop() # consume spans - - def test_context_tracker_preserves_bash_output_when_next_tool_use_arrives_before_result(memory_logger): """Regression for claude-agent-sdk 0.1.61 interleaved subagent event stream. From 119ec9fddbe84d94061407838d8a0ea3d5389d5e Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 19:58:08 +0000 Subject: [PATCH 03/11] test: prune redundant temporal, livekit, cursor, pipecat, langsmith and util tests Co-Authored-By: Claude Opus 5.5 --- ...acterize_no_downstream_provider_spans.yaml | 197 -- ...acterize_no_downstream_provider_spans.yaml | 201 -- .../cursor_sdk/test_cursor_sdk.py | 31 +- ..._livekit_agents_openai_e2e_voice_turn.yaml | 2563 ----------------- ..._livekit_agents_openai_e2e_voice_turn.yaml | 2301 --------------- .../livekit_agents/test_livekit_agents.py | 12 - ...st_auto_instrument_pipecat_subprocess.yaml | 2 - ...d_wrap_pipeline_worker_are_idempotent.yaml | 2 - .../integrations/pipecat/test_pipecat.py | 47 +- .../integrations/temporal/test_temporal.py | 119 - py/src/braintrust/integrations/test_utils.py | 53 +- .../wrappers/test_langsmith_wrapper.py | 93 - 12 files changed, 43 insertions(+), 5578 deletions(-) delete mode 100644 py/src/braintrust/integrations/cursor_sdk/cassettes/1.0.25/test_characterize_no_downstream_provider_spans.yaml delete mode 100644 py/src/braintrust/integrations/cursor_sdk/cassettes/latest/test_characterize_no_downstream_provider_spans.yaml delete mode 100644 py/src/braintrust/integrations/livekit_agents/cassettes/1.3.1/test_setup_livekit_agents_openai_e2e_voice_turn.yaml delete mode 100644 py/src/braintrust/integrations/livekit_agents/cassettes/latest/test_setup_livekit_agents_openai_e2e_voice_turn.yaml delete mode 100644 py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_auto_instrument_pipecat_subprocess.yaml delete mode 100644 py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_setup_and_wrap_pipeline_worker_are_idempotent.yaml diff --git a/py/src/braintrust/integrations/cursor_sdk/cassettes/1.0.25/test_characterize_no_downstream_provider_spans.yaml b/py/src/braintrust/integrations/cursor_sdk/cassettes/1.0.25/test_characterize_no_downstream_provider_spans.yaml deleted file mode 100644 index 078b092cf..000000000 --- a/py/src/braintrust/integrations/cursor_sdk/cassettes/1.0.25/test_characterize_no_downstream_provider_spans.yaml +++ /dev/null @@ -1,197 +0,0 @@ -interactions: -- request: - body: '{"options": {"model": {"id": "composer-2.5"}, "apiKey": "", "local": - {"cwd": ""}}}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '277' - content-type: - - application/json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkAgentService/CreateAgent - response: - body: - string: '{"agentId":"agent-ea5fe131-ecbc-4096-8d61-449eb3e2c30c","model":{"id":"composer-2.5"}}' - headers: - connection: - - keep-alive - content-length: - - '86' - content-type: - - application/json - date: - - Wed, 05 Aug 2026 20:28:22 GMT - keep-alive: - - timeout=5 - status: - code: 200 - message: OK -- request: - body: !!binary | - AAAAAKt7ImFnZW50SWQiOiAiYWdlbnQtZWE1ZmUxMzEtZWNiYy00MDk2LThkNjEtNDQ5ZWIzZTJj - MzBjIiwgIm1lc3NhZ2UiOiB7InRleHQiOiAiUmVwbHkgd2l0aCBleGFjdGx5OiBjdXJzb3IgY2hh - cmFjdGVyaXphdGlvbiBjb21wbGV0ZSJ9LCAib3B0aW9ucyI6IHsiYXBpS2V5IjogIjxSRURBQ1RF - RD4ifX0= - headers: - accept: - - application/connect+json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '235' - content-type: - - application/connect+json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkAgentService/Send - response: - body: - string: !!binary | - AAAAAMh7InNka01lc3NhZ2UiOnsidHlwZSI6InN0YXR1cyIsIm1lc3NhZ2UiOnsidHlwZSI6InN0 - YXR1cyIsImFnZW50X2lkIjoiYWdlbnQtZWE1ZmUxMzEtZWNiYy00MDk2LThkNjEtNDQ5ZWIzZTJj - MzBjIiwicnVuX2lkIjoicnVuLWUzNTBjYmViLWJkNzctNDVhNC05ZTE0LThiYWM4MWMzYWFhNCIs - InN0YXR1cyI6IlJVTk5JTkcifX0sIm9mZnNldCI6IjEifQAAAADaeyJzZGtNZXNzYWdlIjp7InR5 - cGUiOiJ0aGlua2luZyIsIm1lc3NhZ2UiOnsidHlwZSI6InRoaW5raW5nIiwiYWdlbnRfaWQiOiJh - Z2VudC1lYTVmZTEzMS1lY2JjLTQwOTYtOGQ2MS00NDllYjNlMmMzMGMiLCJydW5faWQiOiJydW4t - ZTM1MGNiZWItYmQ3Ny00NWE0LTllMTQtOGJhYzgxYzNhYWE0IiwidGV4dCI6IlByZXBhcmluZyB0 - byByZXBseSB3aXRoIn19LCJvZmZzZXQiOiIyIn0AAAAA5nsic2RrTWVzc2FnZSI6eyJ0eXBlIjoi - dGhpbmtpbmciLCJtZXNzYWdlIjp7InR5cGUiOiJ0aGlua2luZyIsImFnZW50X2lkIjoiYWdlbnQt - ZWE1ZmUxMzEtZWNiYy00MDk2LThkNjEtNDQ5ZWIzZTJjMzBjIiwicnVuX2lkIjoicnVuLWUzNTBj - YmViLWJkNzctNDVhNC05ZTE0LThiYWM4MWMzYWFhNCIsInRleHQiOiIgZXhhY3RseTogXCJjdXJz - b3IgY2hhcmFjdGVyaXphdGlvbiJ9fSwib2Zmc2V0IjoiMyJ9AAAAAM57InNka01lc3NhZ2UiOnsi - dHlwZSI6InRoaW5raW5nIiwibWVzc2FnZSI6eyJ0eXBlIjoidGhpbmtpbmciLCJhZ2VudF9pZCI6 - ImFnZW50LWVhNWZlMTMxLWVjYmMtNDA5Ni04ZDYxLTQ0OWViM2UyYzMwYyIsInJ1bl9pZCI6InJ1 - bi1lMzUwY2JlYi1iZDc3LTQ1YTQtOWUxNC04YmFjODFjM2FhYTQiLCJ0ZXh0IjoiIGNvbXBsZXRl - XCIifX0sIm9mZnNldCI6IjQifQAAAADceyJzZGtNZXNzYWdlIjp7InR5cGUiOiJ0aGlua2luZyIs - Im1lc3NhZ2UiOnsidHlwZSI6InRoaW5raW5nIiwiYWdlbnRfaWQiOiJhZ2VudC1lYTVmZTEzMS1l - Y2JjLTQwOTYtOGQ2MS00NDllYjNlMmMzMGMiLCJydW5faWQiOiJydW4tZTM1MGNiZWItYmQ3Ny00 - NWE0LTllMTQtOGJhYzgxYzNhYWE0IiwidGV4dCI6IiIsInRoaW5raW5nX2R1cmF0aW9uX21zIjox - fX0sIm9mZnNldCI6IjUifQAAAAEgeyJzZGtNZXNzYWdlIjp7InR5cGUiOiJhc3Npc3RhbnQiLCJt - ZXNzYWdlIjp7InR5cGUiOiJhc3Npc3RhbnQiLCJhZ2VudF9pZCI6ImFnZW50LWVhNWZlMTMxLWVj - YmMtNDA5Ni04ZDYxLTQ0OWViM2UyYzMwYyIsInJ1bl9pZCI6InJ1bi1lMzUwY2JlYi1iZDc3LTQ1 - YTQtOWUxNC04YmFjODFjM2FhYTQiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250 - ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJjdXJzb3IgY2hhcmFjdGVyaXphdGlvbiBjb21w - bGV0ZSJ9XX19fSwib2Zmc2V0IjoiNiJ9AAAAASN7InNka01lc3NhZ2UiOnsidHlwZSI6InVzYWdl - IiwibWVzc2FnZSI6eyJ0eXBlIjoidXNhZ2UiLCJhZ2VudF9pZCI6ImFnZW50LWVhNWZlMTMxLWVj - YmMtNDA5Ni04ZDYxLTQ0OWViM2UyYzMwYyIsInJ1bl9pZCI6InJ1bi1lMzUwY2JlYi1iZDc3LTQ1 - YTQtOWUxNC04YmFjODFjM2FhYTQiLCJ1c2FnZSI6eyJpbnB1dFRva2VucyI6MTEzNzcsIm91dHB1 - dFRva2VucyI6MzgsImNhY2hlUmVhZFRva2VucyI6ODQxNiwiY2FjaGVXcml0ZVRva2VucyI6MCwi - dG90YWxUb2tlbnMiOjE5ODMxfX19LCJvZmZzZXQiOiI3In0AAAAAyXsic2RrTWVzc2FnZSI6eyJ0 - eXBlIjoic3RhdHVzIiwibWVzc2FnZSI6eyJ0eXBlIjoic3RhdHVzIiwiYWdlbnRfaWQiOiJhZ2Vu - dC1lYTVmZTEzMS1lY2JjLTQwOTYtOGQ2MS00NDllYjNlMmMzMGMiLCJydW5faWQiOiJydW4tZTM1 - MGNiZWItYmQ3Ny00NWE0LTllMTQtOGJhYzgxYzNhYWE0Iiwic3RhdHVzIjoiRklOSVNIRUQifX0s - Im9mZnNldCI6IjgifQAAAAIyeyJyZXN1bHQiOnsiYWdlbnRJZCI6ImFnZW50LWVhNWZlMTMxLWVj - YmMtNDA5Ni04ZDYxLTQ0OWViM2UyYzMwYyIsInJ1bklkIjoicnVuLWUzNTBjYmViLWJkNzctNDVh - NC05ZTE0LThiYWM4MWMzYWFhNCIsInN0YXR1cyI6IlJVTl9MSUZFQ1lDTEVfU1RBVFVTX0ZJTklT - SEVEIiwicmVzdWx0Ijp7InJ1bklkIjoicnVuLWUzNTBjYmViLWJkNzctNDVhNC05ZTE0LThiYWM4 - MWMzYWFhNCIsImFnZW50SWQiOiJhZ2VudC1lYTVmZTEzMS1lY2JjLTQwOTYtOGQ2MS00NDllYjNl - MmMzMGMiLCJzdGF0dXMiOiJSVU5fTElGRUNZQ0xFX1NUQVRVU19GSU5JU0hFRCIsInJlc3VsdCI6 - ImN1cnNvciBjaGFyYWN0ZXJpemF0aW9uIGNvbXBsZXRlIiwibW9kZWwiOnsiaWQiOiJjb21wb3Nl - ci0yLjUifSwiZHVyYXRpb25NcyI6IjI3MTgiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTA1VDIwOjI4 - OjIyLjA4M1oiLCJ1c2FnZSI6eyJpbnB1dFRva2VucyI6IjExMzc3Iiwib3V0cHV0VG9rZW5zIjoi - MzgiLCJjYWNoZVJlYWRUb2tlbnMiOiI4NDE2IiwidG90YWxUb2tlbnMiOiIxOTgzMSJ9fX0sIm9m - ZnNldCI6IjkifQAAAACCeyJkb25lIjp7ImFnZW50SWQiOiJhZ2VudC1lYTVmZTEzMS1lY2JjLTQw - OTYtOGQ2MS00NDllYjNlMmMzMGMiLCJydW5JZCI6InJ1bi1lMzUwY2JlYi1iZDc3LTQ1YTQtOWUx - NC04YmFjODFjM2FhYTQifSwib2Zmc2V0IjoiMTAifQIAAAACe30= - headers: - connection: - - keep-alive - content-type: - - application/connect+json - date: - - Wed, 05 Aug 2026 20:28:23 GMT - keep-alive: - - timeout=5 - transfer-encoding: - - chunked - status: - code: 200 - message: OK -- request: - body: '{"agentId": "agent-ea5fe131-ecbc-4096-8d61-449eb3e2c30c"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '57' - content-type: - - application/json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkAgentService/CloseAgent - response: - body: - string: '{}' - headers: - connection: - - keep-alive - content-length: - - '2' - content-type: - - application/json - date: - - Wed, 05 Aug 2026 20:28:25 GMT - keep-alive: - - timeout=5 - status: - code: 200 - message: OK -- request: - body: '{"graceSeconds": 0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '19' - content-type: - - application/json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkBridgeControlService/Shutdown - response: - body: - string: '{}' - headers: - connection: - - keep-alive - content-length: - - '2' - content-type: - - application/json - date: - - Wed, 05 Aug 2026 20:28:25 GMT - keep-alive: - - timeout=5 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/cursor_sdk/cassettes/latest/test_characterize_no_downstream_provider_spans.yaml b/py/src/braintrust/integrations/cursor_sdk/cassettes/latest/test_characterize_no_downstream_provider_spans.yaml deleted file mode 100644 index d107643a0..000000000 --- a/py/src/braintrust/integrations/cursor_sdk/cassettes/latest/test_characterize_no_downstream_provider_spans.yaml +++ /dev/null @@ -1,201 +0,0 @@ -interactions: -- request: - body: '{"options": {"model": {"id": "composer-2.5"}, "apiKey": "", "local": - {"cwd": ""}}}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '277' - content-type: - - application/json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkAgentService/CreateAgent - response: - body: - string: '{"agentId":"agent-8572b9da-ef9a-4487-bb21-e2ac495764b0","model":{"id":"composer-2.5"}}' - headers: - connection: - - keep-alive - content-length: - - '86' - content-type: - - application/json - date: - - Wed, 05 Aug 2026 20:25:24 GMT - keep-alive: - - timeout=5 - status: - code: 200 - message: OK -- request: - body: !!binary | - AAAAAKt7ImFnZW50SWQiOiAiYWdlbnQtODU3MmI5ZGEtZWY5YS00NDg3LWJiMjEtZTJhYzQ5NTc2 - NGIwIiwgIm1lc3NhZ2UiOiB7InRleHQiOiAiUmVwbHkgd2l0aCBleGFjdGx5OiBjdXJzb3IgY2hh - cmFjdGVyaXphdGlvbiBjb21wbGV0ZSJ9LCAib3B0aW9ucyI6IHsiYXBpS2V5IjogIjxSRURBQ1RF - RD4ifX0= - headers: - accept: - - application/connect+json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '235' - content-type: - - application/connect+json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkAgentService/Send - response: - body: - string: !!binary | - AAAAAMh7InNka01lc3NhZ2UiOnsidHlwZSI6InN0YXR1cyIsIm1lc3NhZ2UiOnsidHlwZSI6InN0 - YXR1cyIsImFnZW50X2lkIjoiYWdlbnQtODU3MmI5ZGEtZWY5YS00NDg3LWJiMjEtZTJhYzQ5NTc2 - NGIwIiwicnVuX2lkIjoicnVuLTg0MDYwYWJjLWI0Y2MtNDM3Mi04MmI2LTRhYWJlMDAzYTc3NyIs - InN0YXR1cyI6IlJVTk5JTkcifX0sIm9mZnNldCI6IjEifQAAAADXeyJzZGtNZXNzYWdlIjp7InR5 - cGUiOiJ0aGlua2luZyIsIm1lc3NhZ2UiOnsidHlwZSI6InRoaW5raW5nIiwiYWdlbnRfaWQiOiJh - Z2VudC04NTcyYjlkYS1lZjlhLTQ0ODctYmIyMS1lMmFjNDk1NzY0YjAiLCJydW5faWQiOiJydW4t - ODQwNjBhYmMtYjRjYy00MzcyLTgyYjYtNGFhYmUwMDNhNzc3IiwidGV4dCI6IlRoZSB1c2VyIHJl - cXVlc3RlZCBhIn19LCJvZmZzZXQiOiIyIn0AAAAA3Hsic2RrTWVzc2FnZSI6eyJ0eXBlIjoidGhp - bmtpbmciLCJtZXNzYWdlIjp7InR5cGUiOiJ0aGlua2luZyIsImFnZW50X2lkIjoiYWdlbnQtODU3 - MmI5ZGEtZWY5YS00NDg3LWJiMjEtZTJhYzQ5NTc2NGIwIiwicnVuX2lkIjoicnVuLTg0MDYwYWJj - LWI0Y2MtNDM3Mi04MmI2LTRhYWJlMDAzYTc3NyIsInRleHQiOiIgcmVwbHkgY29udGFpbmluZyBl - eGFjdGx5In19LCJvZmZzZXQiOiIzIn0AAAAA3Xsic2RrTWVzc2FnZSI6eyJ0eXBlIjoidGhpbmtp - bmciLCJtZXNzYWdlIjp7InR5cGUiOiJ0aGlua2luZyIsImFnZW50X2lkIjoiYWdlbnQtODU3MmI5 - ZGEtZWY5YS00NDg3LWJiMjEtZTJhYzQ5NTc2NGIwIiwicnVuX2lkIjoicnVuLTg0MDYwYWJjLWI0 - Y2MtNDM3Mi04MmI2LTRhYWJlMDAzYTc3NyIsInRleHQiOiIgXCJjdXJzb3IgY2hhcmFjdGVyaXph - dGlvbiJ9fSwib2Zmc2V0IjoiNCJ9AAAAAM97InNka01lc3NhZ2UiOnsidHlwZSI6InRoaW5raW5n - IiwibWVzc2FnZSI6eyJ0eXBlIjoidGhpbmtpbmciLCJhZ2VudF9pZCI6ImFnZW50LTg1NzJiOWRh - LWVmOWEtNDQ4Ny1iYjIxLWUyYWM0OTU3NjRiMCIsInJ1bl9pZCI6InJ1bi04NDA2MGFiYy1iNGNj - LTQzNzItODJiNi00YWFiZTAwM2E3NzciLCJ0ZXh0IjoiIGNvbXBsZXRlXCIuIn19LCJvZmZzZXQi - OiI1In0AAAAA3Hsic2RrTWVzc2FnZSI6eyJ0eXBlIjoidGhpbmtpbmciLCJtZXNzYWdlIjp7InR5 - cGUiOiJ0aGlua2luZyIsImFnZW50X2lkIjoiYWdlbnQtODU3MmI5ZGEtZWY5YS00NDg3LWJiMjEt - ZTJhYzQ5NTc2NGIwIiwicnVuX2lkIjoicnVuLTg0MDYwYWJjLWI0Y2MtNDM3Mi04MmI2LTRhYWJl - MDAzYTc3NyIsInRleHQiOiIiLCJ0aGlua2luZ19kdXJhdGlvbl9tcyI6MX19LCJvZmZzZXQiOiI2 - In0AAAABIHsic2RrTWVzc2FnZSI6eyJ0eXBlIjoiYXNzaXN0YW50IiwibWVzc2FnZSI6eyJ0eXBl - IjoiYXNzaXN0YW50IiwiYWdlbnRfaWQiOiJhZ2VudC04NTcyYjlkYS1lZjlhLTQ0ODctYmIyMS1l - MmFjNDk1NzY0YjAiLCJydW5faWQiOiJydW4tODQwNjBhYmMtYjRjYy00MzcyLTgyYjYtNGFhYmUw - MDNhNzc3IiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6 - InRleHQiLCJ0ZXh0IjoiY3Vyc29yIGNoYXJhY3Rlcml6YXRpb24gY29tcGxldGUifV19fX0sIm9m - ZnNldCI6IjcifQAAAAEjeyJzZGtNZXNzYWdlIjp7InR5cGUiOiJ1c2FnZSIsIm1lc3NhZ2UiOnsi - dHlwZSI6InVzYWdlIiwiYWdlbnRfaWQiOiJhZ2VudC04NTcyYjlkYS1lZjlhLTQ0ODctYmIyMS1l - MmFjNDk1NzY0YjAiLCJydW5faWQiOiJydW4tODQwNjBhYmMtYjRjYy00MzcyLTgyYjYtNGFhYmUw - MDNhNzc3IiwidXNhZ2UiOnsiaW5wdXRUb2tlbnMiOjExMzc3LCJvdXRwdXRUb2tlbnMiOjM2LCJj - YWNoZVJlYWRUb2tlbnMiOjgzODQsImNhY2hlV3JpdGVUb2tlbnMiOjAsInRvdGFsVG9rZW5zIjox - OTc5N319fSwib2Zmc2V0IjoiOCJ9AAAAAMl7InNka01lc3NhZ2UiOnsidHlwZSI6InN0YXR1cyIs - Im1lc3NhZ2UiOnsidHlwZSI6InN0YXR1cyIsImFnZW50X2lkIjoiYWdlbnQtODU3MmI5ZGEtZWY5 - YS00NDg3LWJiMjEtZTJhYzQ5NTc2NGIwIiwicnVuX2lkIjoicnVuLTg0MDYwYWJjLWI0Y2MtNDM3 - Mi04MmI2LTRhYWJlMDAzYTc3NyIsInN0YXR1cyI6IkZJTklTSEVEIn19LCJvZmZzZXQiOiI5In0A - AAACM3sicmVzdWx0Ijp7ImFnZW50SWQiOiJhZ2VudC04NTcyYjlkYS1lZjlhLTQ0ODctYmIyMS1l - MmFjNDk1NzY0YjAiLCJydW5JZCI6InJ1bi04NDA2MGFiYy1iNGNjLTQzNzItODJiNi00YWFiZTAw - M2E3NzciLCJzdGF0dXMiOiJSVU5fTElGRUNZQ0xFX1NUQVRVU19GSU5JU0hFRCIsInJlc3VsdCI6 - eyJydW5JZCI6InJ1bi04NDA2MGFiYy1iNGNjLTQzNzItODJiNi00YWFiZTAwM2E3NzciLCJhZ2Vu - dElkIjoiYWdlbnQtODU3MmI5ZGEtZWY5YS00NDg3LWJiMjEtZTJhYzQ5NTc2NGIwIiwic3RhdHVz - IjoiUlVOX0xJRkVDWUNMRV9TVEFUVVNfRklOSVNIRUQiLCJyZXN1bHQiOiJjdXJzb3IgY2hhcmFj - dGVyaXphdGlvbiBjb21wbGV0ZSIsIm1vZGVsIjp7ImlkIjoiY29tcG9zZXItMi41In0sImR1cmF0 - aW9uTXMiOiIzMDg2IiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0wNVQyMDoyNToyNC43NzVaIiwidXNh - Z2UiOnsiaW5wdXRUb2tlbnMiOiIxMTM3NyIsIm91dHB1dFRva2VucyI6IjM2IiwiY2FjaGVSZWFk - VG9rZW5zIjoiODM4NCIsInRvdGFsVG9rZW5zIjoiMTk3OTcifX19LCJvZmZzZXQiOiIxMCJ9AAAA - AIJ7ImRvbmUiOnsiYWdlbnRJZCI6ImFnZW50LTg1NzJiOWRhLWVmOWEtNDQ4Ny1iYjIxLWUyYWM0 - OTU3NjRiMCIsInJ1bklkIjoicnVuLTg0MDYwYWJjLWI0Y2MtNDM3Mi04MmI2LTRhYWJlMDAzYTc3 - NyJ9LCJvZmZzZXQiOiIxMSJ9AgAAAAJ7fQ== - headers: - connection: - - keep-alive - content-type: - - application/connect+json - date: - - Wed, 05 Aug 2026 20:25:26 GMT - keep-alive: - - timeout=5 - transfer-encoding: - - chunked - status: - code: 200 - message: OK -- request: - body: '{"agentId": "agent-8572b9da-ef9a-4487-bb21-e2ac495764b0"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '57' - content-type: - - application/json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkAgentService/CloseAgent - response: - body: - string: '{}' - headers: - connection: - - keep-alive - content-length: - - '2' - content-type: - - application/json - date: - - Wed, 05 Aug 2026 20:25:28 GMT - keep-alive: - - timeout=5 - status: - code: 200 - message: OK -- request: - body: '{"graceSeconds": 0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connect-protocol-version: - - '1' - connection: - - keep-alive - content-length: - - '19' - content-type: - - application/json - user-agent: - - python-httpx/0.28.1 - method: POST - uri: http://cursor-sdk-bridge/sdk.v1.SdkBridgeControlService/Shutdown - response: - body: - string: '{}' - headers: - connection: - - keep-alive - content-length: - - '2' - content-type: - - application/json - date: - - Wed, 05 Aug 2026 20:25:28 GMT - keep-alive: - - timeout=5 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/cursor_sdk/test_cursor_sdk.py b/py/src/braintrust/integrations/cursor_sdk/test_cursor_sdk.py index 040c1e289..1c07cf462 100644 --- a/py/src/braintrust/integrations/cursor_sdk/test_cursor_sdk.py +++ b/py/src/braintrust/integrations/cursor_sdk/test_cursor_sdk.py @@ -79,39 +79,16 @@ def test_auto_instrument_cursor_sdk_subprocess(): verify_autoinstrument_script("test_auto_cursor_sdk.py", timeout=45) -@_REQUIRES_SYNC_BRIDGE -@pytest.mark.vcr -def test_characterize_no_downstream_provider_spans(memory_logger, tmp_path): - """Cursor's bridge owns provider calls, so no Python provider LLM leaf exists.""" - import cursor_sdk - - assert OpenAIIntegration.setup() - assert AnthropicIntegration.setup() - - workspace = _workspace(tmp_path) - with cursor_sdk.CursorClient.launch_bridge(workspace=str(workspace)) as client: - with cursor_sdk.Agent.create( - model=TEST_MODEL, - api_key=_api_key(), - local=cursor_sdk.LocalAgentOptions(cwd=str(workspace)), - client=client, - ) as agent: - result = agent.send("Reply with exactly: cursor characterization complete").wait() - - assert result.status == "finished" - assert "cursor characterization complete" in result.result.lower() - spans = memory_logger.pop() - origins = {span["context"]["span_origin"]["instrumentation"]["name"] for span in spans} - assert origins == {"cursor-sdk-auto"} - assert len(find_spans_by_type(spans, SpanTypeAttribute.LLM)) == 1 - - @_REQUIRES_SYNC_BRIDGE @pytest.mark.vcr def test_sync_wait_traces_cursor_owned_model_turn(memory_logger, tmp_path): + """Cursor's bridge owns provider calls, so no Python provider LLM leaf exists + even when provider integrations are enabled.""" import cursor_sdk assert CursorSDKIntegration.setup() + assert OpenAIIntegration.setup() + assert AnthropicIntegration.setup() workspace = _workspace(tmp_path) with cursor_sdk.CursorClient.launch_bridge(workspace=str(workspace)) as client: with cursor_sdk.Agent.create( diff --git a/py/src/braintrust/integrations/livekit_agents/cassettes/1.3.1/test_setup_livekit_agents_openai_e2e_voice_turn.yaml b/py/src/braintrust/integrations/livekit_agents/cassettes/1.3.1/test_setup_livekit_agents_openai_e2e_voice_turn.yaml deleted file mode 100644 index 439a679f7..000000000 --- a/py/src/braintrust/integrations/livekit_agents/cassettes/1.3.1/test_setup_livekit_agents_openai_e2e_voice_turn.yaml +++ /dev/null @@ -1,2563 +0,0 @@ -interactions: -- request: - body: '{"input":"hello there","model":"gpt-4o-mini-tts","voice":"ash","response_format":"mp3","speed":1.0}' - headers: - Accept: - - application/octet-stream - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '99' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.32.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.32.0 - X-Stainless-Raw-Response: - - stream - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.12.12 - x-stainless-read-timeout: - - '30' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/audio/speech - response: - body: - string: !!binary | - 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 - headers: - CF-RAY: - - 9fa2a67bdbd8ebbc-YYZ - Connection: - - keep-alive - Content-Type: - - audio/mpeg - Date: - - Mon, 11 May 2026 16:44:49 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '1132' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=WIpByQian9yq6v.s3p8L__2mOOqf8Cz0cyCe7Yqi6j8-1778517887.3377304-1.0.1.1-e7URskkAn1gwIyL9X7zbfHtE5_8i5vcN3atOXccqjhjs9focUoaFEX1XAcNTFb.GNu.3jCO22nYcFu8wG1iqLp6CPuhvhaJiNXa5GIkqJ5dTScJj6OjRzvqiBi5j1w2D; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.openai.com; Expires=Mon, - 11 May 2026 17:14:49 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999997' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_6b8cbdf71ff043c486a8bb94ea1cb837 - status: - code: 200 - message: OK -- request: - body: !!binary | - LS1jZjRmZjQ1MTc3M2E5YmQ4ZjUwOWE5ZjA0MDA2OWM5OQ0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJtb2RlbCINCg0KZ3B0LTRvLW1pbmktdHJhbnNjcmliZQ0KLS1jZjRm - ZjQ1MTc3M2E5YmQ4ZjUwOWE5ZjA0MDA2OWM5OQ0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1k - YXRhOyBuYW1lPSJsYW5ndWFnZSINCg0KZW4NCi0tY2Y0ZmY0NTE3NzNhOWJkOGY1MDlhOWYwNDAw - NjljOTkNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0icmVzcG9uc2VfZm9y - bWF0Ig0KDQpqc29uDQotLWNmNGZmNDUxNzczYTliZDhmNTA5YTlmMDQwMDY5Yzk5DQpDb250ZW50 - LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZpbGUiOyBmaWxlbmFtZT0iZmlsZS53YXYi - DQpDb250ZW50LVR5cGU6IGF1ZGlvL3dhdg0KDQpSSUZGhHcBAFdBVkVmbXQgEAAAAAEAAQDAXQAA - gLsAAAIAEABkYXRhYHcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAAAAAAAP////////////// - /wAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////wAAAAAA - AAAA//8AAAAA/////wAA//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAP//AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAP//AAAAAP//AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAAAAQAAAAAAAAABAAEAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD//wAA - AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAABAAEAAAABAAAAAAAAAP//AAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAB - AAAAAAAAAAAAAAAAAP//AAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA - AAD//wAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAEAAQAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAABAAAAAQAAAAAAAQD//wEAAAAAAAAAAQAAAAEAAAD//wAAAAAAAAAAAAAAAAAA - AQAAAP//AAD//wAAAAABAAAAAAAAAAAAAAD/////AAAAAAAAAAD//wAAAAABAAAAAAAAAAEAAAAA - AAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAEAAQAAAP//AAAAAP//AAD//wAAAAD//wAAAAAAAAAA - AAAAAAAAAAAAAP//AQAAAAEAAQABAAIAAQACAAIAAQADAAMAAwADAAMABAADAAMAAwAEAAMAAgAE - AAQABAAFAAUABQAFAAUAAwAEAAMAAwAEAAQABAAEAAUABAAFAAUABAAFAAQAAgADAAMAAwADAAMA - AwADAAMABAAGAAQABgAGAAQABQACAAMABAADAAIABQAEAAUABwAFAAcABgAFAAMAAwABAAEAAgAB - AAQAAwAFAAUAAwAEAAUAAgAGAAcABAAFAAYABQAFAAgACQANAA0ADgAQAA0ADQAOAAwACgANAAsA - DgASABQAFgAVABQAEwARAAsADAAJAAoACwAHAAoADgAOABUAGAAVABQADgAKAAYABQADAAgACAAO - ABAACwAPABEADAAMAAoAAQAGAAEA/v///wYACAANAA4AEAAVABQAFgAYABkAEQASAAwABAAFAAkA - BwARABkAGAAgACAAHAASAAYAAAACAAEACAALABUAGgAXAAkABQAIAAQAFgAYABsAIgAiABgADgAI - AAIAAgAHAA4AGAAiACkAMgApAB8AFAAHAAcABQAKAA8AEgAbACIAHgAYABgAEgAKAAgAAAD+/wIA - AAAFAAcAAgAAAAAA/v/5//b/6//u//H/7f/3//T/9//6/+v/3//X/9P/2f/c/9X/6P/r/9r/5//u - //T/AAAHAPz/+P/l/9n/1v/P/+j/6v/o//n/9//u//b/8v/v/+v/0P+//8b/xv/N/+T/4//9//v/ - 7//1//D/6f/s/+7/4P/r/9r/0//h/9//4//t/+3/+f8BAPX/9//3//j/+v/5/+b/7P/h/9b/6v/p - //j/EgAnACoAMAAeAA8ABwACAPz/+P8BAAoACwABAAsABQAeAC4AMQA4ADQAGQAQAAkA6P/6/wEA - CwAdACMAHAAxADcAJwArABAADAAeABQAEgATAAMAFAAXAA0AKAAwACIAMwAnAAsACAABAP7///8D - AP7/EwAjAB8AKQAeABYAIQASAPr//f////3////7//7/BQAJABcAGAAVAA4A9v/6/+r/6v/9//// - FgAdACAAEQAPAPX/5v/r/+j///8MAAMA+v/z/8z/1f/R/+//CwAJAAEABgAKAOP/5f/J/8L/1P/V - /9D/9//v/+X/7v/R/9j/8P/+/wcAKwAXAAQA8f/Y/8D/0P/H/9j/GQASAAoA8v/S/5z/mP+N/4f/ - t/+5/8T/+P/x/wgAJQD1/xAAFwDv/wYACQDS/9b/l/9x/67/xP/l/yYAHgDz/wAAr/+r/87/n/+k - /7f/pv+9/8P/zP8AAPD/7P8BAP3/4//z/9v/0//b/8L/sf+i/8H/+P8rADYASAASAMT/hf9g/6b/ - AgARABcAAwCn/3z/sv/p/wkASQAWAAQA7v/B/+f/3/++/83/v/+t/wkADgBEAFsAGgAFANP/oP+4 - /+f/1f8OAO7/ov+r/3r/Z//I/+r/JgBoAD0ASgAdAOX/yv+J/5r/sv/F/xQAJgBBAFEAKAACAMr/ - nf+N/4v/hP+e/6z/wv+v/2//n//u/x0AXwB8AFEAAgCO/1P/Sv8x/37/4f8XAGQAYABcAHYAEwDY - //3/FQATACgAFADx/wUA0v8sABoAAwBSAAgA/v/f/9P/KABBAOf/KgD5/+D/FAANAHcAjAB0ADkA - /v+b/6D/tv8vAGoAdwCLAEcAEgD1/xsA6v8dAOr/y//H/8//pf/N/yYACQByAGAAVgA7ALT/YP9p - /zz/p/8wAHEAwQChAB0A5/+//zP/Wv8W/zT/b/9w/8P/4f/r/woAPgDh/+X/3/9u/4H/Mv/e/kv/ - Xf9x/w0AQAAOAFYABwDF/8n/Y/+k/5b/gv/e/y4ASQClAOUA5AAbAaoAIQAqALL/i//7/6T/8f8q - AM//KwA0AO3/bwBJALf/IQCN/yL/Rf/3/jv/mP98//b/WwAYAGgAPwBEAE0ABgDd/7H/W/9G/6j/ - kP/o/0kAbAAwABUA9f+8/1T/Hv9r/17/b/+z/xkA2/9HAHcAAQBlAN0A1gDYAN0ASADT/0H/7P6W - /rD+D//m/hv/hP+f/+j/bQBBANr/Tf/w/gD/xf4v/+L/DQBvAIMA5ADSAEcArgBcALD/CABBAMf/ - GQAfAM3/FgAmAJwA7gDVANkArgA3AJr/Of8Z/1z/7f9KAO4A7ACuAMsAbwBOAIUAJgBx/z//3/4G - /4j/4P9vAJgAVAA0ABcAQwD7//v/bQAhADcAWgCYAIIAgABxAJQALwBwAJ8A1/9oACwA0f9iAHcA - 6/+xAHoAbwCZAEAABgBa/6X/jf95/0X/h//m/uD+Yf+6/14AngHkAf4A7AB6/5n+8/54/3v//gAI - AdYAXgEcAOX/qv9m/+3/LgD8/wEBPAAiAHYAKP/j/2sATgDkAIAB7gCMAZoBLQAgAQQBYwDVAKwA - 5wBFAeIAaQFfAWQAHQFkABkA0QB5AP3//wAuAcUAdgHIAKoAWQA5ANf/FwDx/ygABwBK//H/oP8m - AGkAVgC7AOMAwv/ZAGIBtgBZAcMAqgBGAfwANADSAOcAEQFyAM0AkwFSAK3/YQBGAGz/YgAoALH/ - AQBS/8z+zv9+/3v/pQDY/+UALwEMAB4BRwAHABUBoP8tAAIBpP+AAL4Ayf86AYcAYv/YAPb/Uf8Z - AOT/LABeAC4AMQD1AOEAowBXAO7/1AA+ANn/LwGVAPv+tf93/lL+bP8c/uf+4P8w/xv/t/44/sf+ - Jv6p/nT/s//mAGcByv8VARoBg/9SAYkAIAC7/zsA1v+5/7QAYAAO/97+GQA0/xn/h/+H/079Nv0q - /Yj8Av6k/gD/ugCXAUMCdgNhAkUCdwEyAC0AEgCl/u3/wf4U/j4AMP8tASYCxgCkAPj/P/3r/l// - kP6yAET/Nf/c/p7+XQDoAacCzQMKBJYBCwFY/6T9x/7//SD+MADS/5YAIAIrAX0BIgHZ/+T+/f1t - /qb/y/8vADABtwDRAO8AYAGyAfcBMQF/AEwAGf/K/eb+6v4+/Yn///9RAJ8BogFZAI//BP+q//X+ - QP7O/2P+Sv7l/hj/tP4EAYMArP/YAKn/Lf+p/sT/9v/aABQBZgEEAZMAQwG0AMoBggLQAAwAdQAN - /0X+Kv4o/mn+v/6l/xcAZgBZALr+Xv4//kT9Sv7U/pn/xgBs/5j/nf4M/WT+8f1V/l0A7QBhAIgA - kv+w/w0BGAJBApICVgI1AeAAEP/8/3v/QP75//YA/AB9AncCGwNSAvH/cABv/nr+oP/WABYBUwMu - A8sBTwO5AroCVwJXA8gB7f8aAAkAzPy6/Kn/K/yy/R4BIACeAcYBgQD7/0b+Hf5v/vL8oP3K/TP8 - Pf+2/kT+vAIMAkEBjQOhAtb/lf9m/i788ftq+4j8gv5y/Uj/yQCf/gD/GQBe/kQAxgCF/hIAZvw4 - /GH95PsM/6YAKgDKAS8Cof/yASEBqP4wAQsBxv8TAZ8CjgDV/0kBvf9cAdEDcAPUBAMDkgLCAsP/ - YgG7AXz/5wEQAeb9KALbACr/qwLPAHkA/ABz/3X/agCv/TP+1P/b/hQBwwEiAnUB1gBRAKj/uP6/ - /sL/g/4lAGEBcwDgAdkCYQHTAdIBcwCmAGcARf/2/qX/FP8dAA8D5QJpBHoIDQiMCLMIxAVZBEoB - k/9J/zf+yf7b/jn/hgH6A3oEygYLB9ADSgPuAIf+6v3b/I77nPy8+8j6cP6+/xUB0AOeBBsCSwAj - /q/7pPup+hT53/ef9pb3Mvm/+7QC+wJvACQBF/xw+DX7jvmP+t38ofk2+4n7Dvy2/ET83/zH+tP4 - m/qf+sH4SPpp+Wj7k/s7+zz+q/tX+s36kPfI98j4APdt+dD2aPbT9xv16Pce+HT2Dvm5+T73O/ku - +Lj1xPWM9Qj5pfoY/EP+y/5P/qL+fv00/60DoAGbAXQDQAIAAoUCNgSeBh0GRwZ5B9wGkAdMBdkD - jQTAAiEElwQBBd4FRwR7BE0ExQQQB3AIRwgqCHIGRQbaA7MC8weUBwsIoQgWB5cIlQcWB5kKTAor - CbkI6gbiCNgHDwjCCpcJpAl5CagGYAgrCrUIVQudCwAMww2ICykM1Qw/CzkMkwrqCSMMVQj8BlwI - bwODBPUF+QM2CKcJcAhrBzAG4gJ7/6r9bP+9AUABnwSGBjAHEAlXCVkJoQvXC98Jzwc/Bu4D1P69 - /Ob8SPxW/M/8Tv48Adv/nwD5/zP95/zC+EP3hvcX9jD1c/XH9Gj2u/eH+GL7RfvN/CP8/PeW+Xb4 - Tvbp9xH2L/Sd8ojz7PBr7uzvzu9q7yrxQ/I68rr0LfG48nTz3+8p8A3xjvDN8Sf0Z/Ga9XT0svKP - 84nwo/CL8XLv/ewr8BDuNO/Z7pHs/e2z7NLt1e9U8vfvmPAz757tjO+57hX3fvjg+VUBUQP8BBEG - SQj8CKoIQgidCoIJ1grWCfoFxwkRCFcJMQwQCkwNRw3RBNYHRgat/xUDgwEyAFgEjQMjAygKqQXd - BssKcQbRCFUH+gX8BxwHvQSqBSYH8QhKCiUL1w3tDS4NXAxhDAMOpgnYCMcKfgjWCUIJmwh1CYAI - DAYCBukHMQkICOcHhQjBBogErAG9AwYE1gIbA5MEcQS3AvICCQNHA8AC8wN/BKYFtQfDB7YHcAqW - CcMJ1Q5bDkoPdxGvD6YQKxFODq0PBBAXDa4LJAwjDDUK9AkyCigKFglMCBYIUgg3Bl4DiQYsCWEJ - bwvBDLILowiUB2YIugceCWYGjwMuBDkAIP2a/FD92f2I+zb6Lf0s/H75i/ec9ez3wfVV9Hj2afUB - 9Uvyg++68UHyRvIO9gX5pPaG9UL2t/I/8hb0L+4A75/wZehk63XqOOTS6AjpA+Zk7uLssuzE8q/q - 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 - Wh4NH/Ef7B5LHe8bZRqjF0UV9REBDPEHkQWDAR//Ef1k+R72w/T78Z/yhPRQ8+30afWd8yzxAPMB - 84zzo/S48uDv1+2069LlYOUY5U7iTt6f3Y3addNo0l7Yodfh1xfkU+lE7anu/vFK+QAAIgMoDa0X - mhWPF04X6hT4EWYWPxiXFpUVyRJhENMJEguZDWkOKA+kEd0Qfg+1D4kOzg9OD7MNjwoRCNgCVP3y - +7322+6866no5uOo4arjz+Kf4G/i0uO74/jmo+4B83345fvo/qIBpwMABz0LKBCiEIUSlhPREmkR - 1RJ5FB8XkhijGJIanhpgHFkcsh3eHwghpR/6Hjwf1BxFGwoYkRUBEtwMUAnTBzAEp/7B/Hb5TvbT - 8z7zPPTY8/bzQ/M188DxgvJ78kHzUPN18gHydu6l7O/p1OjW5bfkp+Bk3xLeotcF10TXf9S70bbc - Yt6h3iHth/H17LzzIv3A/kwI2A9HFSgahBi0FEwVNhc5F6AZfhkCGM8Uog+rDRgNDw8oEtkQuhGT - EykQ0A1jEHoQKhCdDikL1wfPAkj/9PqD9mDxxOz46BrmJ+Nw4nHj0OFW4BXii+Ra5a3rTPIQ9br3 - vPs7/gIAxwSICXcMKw9eEX8QHhEtEtAScRWNFxIZMhnaGYcbhRxrHeweGSERIXUgqR9KHz8fXx0Y - Gl0YKRZZEGwNpAskCOgDjQCD/Gf5xfeF9ev0GvW19KfyN/K98bLxe/KR8vzy3PFW8Ibutexz6gbp - Felm5hHjnd+H3jjcV9iJ12DXzNQV0qraJ9sj223pF+9E6xvwXfi3+roDPAq9EFIXkhcsFJMT7RX8 - FvoawxlbGnkZbBP9D1YPNhEeFG0TVRJ8FCsSJg8fD4UQlRGzDh8LWAnlBIwAXv1O+uj1i/Ak7AXo - NuZa5VHl+eOk4uHipuKb4grnVu2u8KzzOfbw+Lr6UP2dAuAGYQopDbANlw4/Dx0QvRJmFdsX4Bh5 - GY4axhvDHCAe5B+sINkglSBUIEggiR+HHTgcehlpFRATbRDpDbUKggajAgf/9vuv+SD4Vfdt9qT0 - QvNr8gzyKfLX8tfzR/Mw8rjwAO9B7rTtZOz26pDqyOa04w7hY9+p3SLbO9vr18rVz9O311HXU9nP - 5dXmkenS8J3y+PKG/jkGuwdIEvcV4BSmFcIVhxSkGIAbbhhLGeAXExVEEXMRrBP+EeATRxQYE/AS - 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 - mQcuCLUJWgqVC8AL3wt5DGwLWAt9C5kLpgqIC7YL2gqzCVIJaQd5Bx0IawYaCAEI1AYyBVAFBQTp - A2sEjgR6AvEDfwIg/zYCGv+d/hz/KP9Z+gj9Uv3Q+Or73ftX+vj4yvrM9pv5v/hG9k/6uvZX9MH1 - 1fY88fjyHPde79vvHfPb78DsPu4A8gXr/OyN7H3oJuss6IXnWebL6qPn6OXK61rrfuxP7LbuqO+E - 8JfyiPOr9gz3ZPjZ+AX5CvqD+ZT7If0E/rv+IAB0AcMBQAMJBTsHVAnICuILcQ38Dl8PVBBhEckQ - nRDKEAEQJA/8DgMOFg2ODGILeQp+CqIK8AmwCYkJLQmpCDsIvAcZB6EGvgWJBH8DQgIpAYUAuv+C - /lv9gP1p/eP81/xC/UX9Yf0f/qf+vP9yAL8ArgBAAagBbwFmAmMCaAJdA+4DIQQ+BBgFQgWlBvkG - 6QZ0CekI9AiQCS8KEwq5CQEKjAlrCSEJuwlHCAgJ1wfJB/QHHAeoBuwF1wf1Bf4FGAcfBqMD/wbz - BIsDDwbFAu8DywJ6A7AA6v+cAm//af93/Dr/9f+j+JQBbf3d9e3+NQGB9fL29f+T9tb8//cC9qb6 - o/XR+Hz1UPYP+PbzBfTc9vLwcfLp9KHz4fBS8lzyOfDn8eLuYfAc8Fvv1+yG7n/th+sK7fnvIu8O - 7jHzFfJP8arzg/UV9cb23vhG+Tv51fpY+Zn6svsf+z/8Qf2T/qP9yP8OAdEBmAJNBUsF3gVJCOYI - ugmkC9sLZAvfC4cKcwpeCtkKXwpcCoUJfQh/BykHOAfEB8II8QgzCDgIiAdlBqIHZwd3B4cGWwbc - BPkEIQReAg0DiAJtApgB/wEVAr4BEQIBA58CiQJtA0wDNQNrBG8EzQObBMwDbAJvA74DPwNHBJ8D - ZATqBB4EZgQnBV8FIgb9BsgFWwdcCBkGQAa9B2kGXQaJBnUFHAZ2Bs4FFwUzBZME8QUbBOgErwYc - A54G/wRUAycFZATkAxYD2wLzAlAFvP9/AGQDbP6+AZAAef5NAYP/gP86/9n/KP5T/b/+Of1KAOP6 - pPrx/g/7y/o8+sv8ovr89+T7cvkR+Bf6BfnO+Gf4mvhR+K32mvdY+MP2Kvds9qL0R/au9LzyzPRB - 9XjytPMx8zzxVvKO79HvrfBW793vHfDY8DDxw/CT8Y3yCvMg9OH0Z/Wr9kz3V/jt+Nr4f/p++sP6 - +vxW/XX95P6k/2//dADYAUoCMwQrBTgF0ga7B4UHGggtCX8J8AloClMKrwkcCigKGwkwCaUJ7ghA - CcoJ7ggKCaEI5Qd6CGMIJAgKCOkHsQcgBuUGvQVHBAoGrgQJBA0FawSMBHoECQSUBLgEkwSYBG4F - EwQbBNEFTwOuAwEFiwIJBEADjwPQBFoC7wPzA/0DqAPOBIQE2gNnBsUDVgPHBsoDsANPBmcE7QT1 - A44FBgW/AvcFYwY5A/YFXAYiAuMFuwWvAzoGWwQmBdsECQNTBj8CjgNcBegBVgP3A4AA9AG/Asj/ - +AKaAD8CB//v/qwEM/4C/UcFpP0a+qEGLPoQ+9gCoPl5/ZH+7PoL/Jb8svrh+TP/5/k19ZMAhPin - 9WcAIfcB9tv8T/gB95n6FPcp92/5gvdf+Eb27fYq9WT3PvYG9Jz5WvQ59LT1ffR188Dz7vSl8xzz - pfP58iXyFvQ59NH0tfVu9jL1jvbc9yr3E/hA+o/4Zfkg/Iv5kfua/B785/2J/kv+y/9XAFwAqQGu - ArgC/gP9A40EVgWKBXAGAQY+B+8GAAcjBxwH1AZACKQHKQe2BzgHLwdrBocHSwdoB2YHsQd8BjAG - rAYzBkEGZQatBlMFzAWnBTsE2gVgBeQE/wXIBcEFjwXjBJEFGgaiBfMF8wS+BoIEHAVKBdwE3AS0 - A6IFRgNVBSIDKgR0BA4DfQM6BJAEDgJ6BHwDUQMuAgwDXwTdAswCtQJZAwQDBwEqAwsEgwDEAt0E - SAFwA8kE4f/0AX4E/QH5/gUFDgMC/nIE6wDc/2wCZQD6AU8D/QAr/UwENQEN/J4F0Pxz/3wC5fzU - /0H/MwHp/BgBzP2C+ywC4foD/RQAd/v5+zb9hPts/O38fPv2/kn5Kfp2/gT4i/wO+lH6K/si9+v7 - LfmR9n/54fnH9sj4UvlL9nD3Bfgr9h/2xffH9t/z3PX59EbyOPWy8zjzDfNq9Z70K/N999H1MvUN - +KL3tver+SX4hvlp+nH5KPvF+2L7p/xb/Gj9+P5V/gkANwCnARwCUwK9A/0CagNRBZUEvATyBccE - 4wSvBVEFawUqBnwFkAWOBvsFzgXQBqQFbgcwBr8FLgdYBVwH9gVrBXcGQgUSBagGBwV3BFAGngVk - BAgFowYhBd4E7AU1BuEFUwUdBf8FfgT6BrwEJQOJCFcCUgLTBoUEwAN9BJ4DnwOyArQDxARBAmcE - uwNYA3cD8QIyBGECTQOzBE0EiQKrAoMErgI2AtAD8QNCAq0EXwNzAm4FpALoAxIEHAM7BP8DIQTS - ALYC0QVv/6wEZAQx/94EgwLyAZUCJgLDAF4D6f/fAXsCMf7kAWr/tgJb+/sCugEk+tQCMP37/2f9 - s/5m/iz8dv46/Fr8rPwq/vL4//xC/C77nvxu9Z3+wfr29c38Bfg7+iT5Xvmf+tT3J/qG+ET6d/mH - 92/6Wfh1+Lb54fZF+NL4rvUA9+/42fRY9Vj45PMO9V33g/Ri9k343vVe9534nfdW+RT42PgE+1r4 - 6fpM/A36O/xO+0r8kPwY/Hv9lv5X/o7+DQFZ/xkBXQHDAegCGwM5BBkENAPCA+EEXANHBeED/wOi - BWgFZgQWBvQFFgTvBZEFoAU1BSwHXwVkBR4G1gS/BaQFbwXuBO8EcQSHBaYEwwM1BlIEfAJUBW4F - 9wTtA5sFyAPdBMkFBwQYBhkCygXtBZICugQtBG0DrQSMA7sErgR6AgEHWgSsAisGjQOrAr0EwwSZ - BIsC1gT+AykCRwXmBDgCZwGTBMkDLQJJAx0GmP/nAogI1PzlA4UJWP55A7EJ+f2pAmgGq/0KBZ0C - HAH+Az0BVQStAVcCCwPHAWwBNADrAW8CFf8LAZ8Dcf3AAUUAn/1MAoz+o/8Z/+T+XwBB/A39v/9I - /Q/7BgA3/L/5R/879zD+Wv629LT/Kv2o9HX9Nv028tv8PPof9Br+J/Wy+kH6ePB//gv3S/OI+2/2 - lvZe+Pz3NPcT+N/zpvib9xvy2fkN+Frz8/fI9lfyv/YI8o7zFved9P/17vjp+Bj1xvm8+IX2RfxK - +z369P25+rL7gP1I/Mv7fP6k/5n9JQFVAYIA/gAnA8kBMwP9BKQDJwacBQcFdAagBTEGngWDBYwH - gAbKB6UH2wfLBpoGkQePBhgI2QaHBuAHqwXgBgEG8gNwBq8FgAWtBKwF3QWEA/oDVQR7A8wEKQWy - BG8EEQW3BWYCBwRLBVcDTgQbBZsE/wONAyUEEwKgAzEE4QInBD4EcgNYA38EAAKNA8QD+ALvAXkD - +wM9AokDrgLdAhQC8wG2A8AC/QDuBG4ENgI2BEYDrwLUBJcCVAMeBJUDZwOlA4MFbAHqArIF1gBn - AqgGfwHWBA4FewLcAFIFPgNx/ycFhAIT/xP/eAU5+24Dtf/H+74GQgDy+0L/dQJ0+ncBO/lZ/fD+ - hfqh+iT/XP1T9vcEvfb6+QX/OvY2+nf8bPjE9zz6nPn3+Mz3RvfY+YD3FfZQ+/byLvmu+Jn1//WN - 9m/3UvWY9t30Hvgx9gH3n/Ss9db0SfaP81f0FPdz8aHy5PK88UTw0fP28mT1+PUa9/v2IPcL+jH3 - +PhJ+5r4q/rW+375Evy7+uj7m/yu/Yz+PQDfAMsB3QMyBDYFTAXeBvEFuwY1Bz0GIQfjB5wFyAZE - B1MHqwcCCC0JjQgcCKwHXggDCCwHNQcoCBkGOQaEBagEvgSvBOEEeARKBBcFlgOYAz0GIQQXBXUE - MgOGBMIE9wNJBbEEVASmA8MEwASfBBAFXgUlB7EC8ATNBQwE5QAlBvYFuAEqBuQDDwRlArMCQQR5 - AtoBPgPcA1EEpwA1A7AEwv4CBI8G8/77AeQFZQHuAvoD6gSCAvUCngXMA5ED5QSvBjsFewG+BpgF - NgGdBsgEAATHBcsF7AUMBg0DuAYYBUUDtQaFBdIEHQRCBKQCsAR/AT0BFQSzAVcAEAVUAAAAywMI - /+QAZgQd/CT8NgXl+jL7dvqH/+r47/fm/3j7U/7Z9O7+8Pqm+d79EfKu/Wb8X/Fj+fb3F/SK9gv3 - x/WI9dD3TvFl9vX3EvNy9CP4j/OE8kH20vF39I31gPNx8v31CvLI8X3yJ/KE9GzzaPJD8iHyn+13 - 7y3vRO8Z7kPxTvQN9Hj3dPe4+G34nvgR+bP5kvsJ+2v6Wvx8+iD6l/tL/AEAfgHMAYkFiQdSBx8J - 8wkRCsUICQm8Cf4Ifgm3Cm0KMwlvCakJTAmoCpUMcA2NDUsNIgybCqwJkAgUCMEGcAYhBekEsAQi - A/IDOgOcAoMEDQTOA9sFVQQeBMUC1AHGAIsAfwLsAEIChgKyAUMCyAKxAyQELQUNBm8G+wXxBQEF - owPjBPICTAIeBBYEvwQOBIwEbAS8BEwEwwQVB2wFswV4B/wFgANoBdwE9AEFBdYDawJ8BdkEiwXC - Bl0FhAUIBjkGbAbcBnsHogagBgcGrwQrBSUFRAVTBjUHwAcKB1oGKAefBq0F5wYMB9wGtgaeBDsE - sQTeBO0BUgK2BfoDaQPfA2QF/QQQAgoB/QOgAUX+WQDZ/+n9Q/xi/fX6IvyZ/Ob8V/7m+VD9y/rL - 9/L7+/gk98f5ePcH8+T0h/R69rn14fGU9KDz2vbB8y7y4PUQ8d3zavJG7uLwp/Dx7qDu8PA+7hTt - efEu7tntlO+f7wzunOwh8MHq8uYZ6xrrjuWz5vTs2uy471z1MfZ9+j796fgX+eb75/ol+rH9i/5P - /UL99Pw1/lADjAZDCKUNNw/ZD7sR3xFQEawQMw+ZDBsL5wv9C80MrA1fDXcNFwxfCyMNXw9cD5sO - 0wwgCW4EwQE7AOn/8P7a/fn+Av8o/4D/2QD6ALUAw/+r/3cAF/+P/l3+yfwR+9f6/vtT/qEAQgOa - BRkHUgezBwIINAhGCZUI1AdACEcIHwfyBiQHlgbyB3UJ6gobDekOoA5NDTcMGwp/CA4GUwUJBjAF - 4QPNA/0D8QLqAscDbQSxBbkH8wb0Bp8GFwSMAi8B/QCEAZUB5ALiA0oEewUYBqwHrAgQCYUI2gpp - C+kIFQkrCdoHagZxB+MGlActCKMIdQkXCUMJ4AjECI8HZwakBX8EIgSHA6wBbAGbALn+mf2q/ff9 - h/yi+wb8gPrU+Jr4ZPfB9vr1DvQZ9FP0WPJV8j3zovLR8MzwHPAR8Kvvqe+P8O7uuPBl72Dvve9l - 71Xwvu3c7YTuzu1M7AHr9+2h683pp+uL6SXs7unT60XrwOjI7B3n/+Jf5EHn/OHW4PXl3+Zp7iXx - CvTYAwAFp/wgAPsBmvql+GcAVACjA5cF3gNfBt0HjQyyDxsW3xtLHU8dwhrgGOwWOhLeDCYMnwxe - CosMbhBuEgIT8g94DYMMFwxtCrwKpgomBpMAsPqU9kj1dvUf+Kn7Fv4jAE8AsACVALX+yvww/Nz7 - I/tk/Hz+df4f/qv+Gf+2AScGhgtfEGATmRMrEZQOQQy1CugKCAtBDCoO+A0/DtgOpA43DkQO0g6Y - D98PZw/EDZ8KDAbkABv9Tfvy/DH//gBgA8kDCQK3/wn/cv1E/Jb9zfys/ML8b/xV/PD73fuk/VUB - 3QF2BScLfAzpCzsLvQr6CakIqQknDrgQHBFhE8gUARP+EmoSSxHvEb0RehAPEA4QaQ1lCigIOgaD - Bc4FQAaXBywIpwZ4A4UA7P17+q742/cp9+r2hvb59OzzhvNv8srx1PGn8WjyyPIP8bnw7O9U7Zzr - 9evz7NntQfD68HTy+POj8ZrxjPGZ717vS++C7gTws+9n7tfv4O1i7BLsyOor6qzq5unm6WjqT+hJ - 5jfnJeTU4Mnj+9/34CvfA9/O35TfTeN64e/0IPub/JgM6gzjA5z+hf5t9Xn7ugSaBZ8PrRIzDk0Q - FxRHFRsfhiaLJG8mESXDGXMV7ROQDO8IDAqqCBcLXRPOE0oWGRmHD8MIpAU6/5j+5P9C/Zv5w/Xh - 73vtxvC+9NH7bgATAgQELwFI/mf9X/rO92H3gvgE+24AQwbnCZwMWg1wDfMPIRSsFzcaKBpXFoQQ - EAwPCTUJJQyqDtARzBTAFFcU9RL+DhIMkQexA0MCdQEzAF/93vly9hnzJ/GH8/P47vxU/iL/bfwY - +BH0gPAk8BfxevIl9lD6kv4vAj8DbAORBMUG2wckDPgQ6RKNEk8QiQ8DDwwPTBG3FqUaLBx4Hvke - EhuQF7MUyA85DfIMAw0jDJ8LHArHBnIE6gJUAlYD/AOhA3YCHP+E/DX4MvQ48wvyHPPt9WH4h/om - /LH5jvan9db0dfMk9U74cPfV92/3vPb59ir4JvpB+pD7ePwE+0n5IPiB9YTzWfFI8KvxvPEi8kPz - 4fFT8GHvIe1I7PzqXOpJ6NDlY+NZ4RXhK90L3wvixd3X3rXld+Li4WfnsOM24pzhC+D/3bnf8+DU - 4jrjSuNp7xvxgfxUDiAXdhpWFcUP8gJo/sL8PwZZE8UWuh3fGgAZKxqtGsEfOyhVKcEjrB9GFjwR - 6guOBmkGmgMLBKsF6wl7ES8UTBA5Cdz+yPR58CXv5vLe92v3tvNj8jnx0vIf+j//qgR6CMwFWgKK - /+r8Yfut+Qn8pQExBxkPLBhWHSMd4xoxFwoTlxI7FJAV3hXTEyERSw0nDNENtA+CEq0UaBVSE2AO - cQgaAkL6f/Rg8t7yDfWv+Nz77/oz+WL2IPP08uTzyvTL9PPzE/K073nu2u5z8Vb1Fvp2AHMHuQtj - DvwOyQvOCCwH5AdUCzYQexRsFhsYbxbuFdEXjhlQHN8bQBzXGsEWihHYDtoNPAgABBAH2AjfBx0M - vAvGCoMELftW+Xn2tfUe+YL7avqR+0b6Ivdl+Tn9fP4LAK4BRAGBACH+CP1x/tb9Q/w//xIDYQad - CD8JSQnxBgECdf/c//D9Ov9vACf/HP44/An8Afpo+MX3q/Zx9JLxVPCS7EzqW+cc5dXiE+Ou5Dbk - WeZl5aDnXeS+4VDjA+Je4Xzf0OO943Tir+Xx5ITniudr5yfsruuX8LbxovBS74/tqe5i5S7oGO6B - 7Kjnfu0K+274XAYqHMYfviK3G5IJoAE897b12ggkEG4VDSJRGPIMRhbXF9sYUSTOJDweERVwBkcC - JgJa/Nz8ugA/AdIDsgsqEYUSaw/PAhP0nuoV6MfrU/Kf+Wf+XfxV9wD4Df4WBLMHnwzmDLkEo//p - /a/8jv2aASgHKgsjEqUb2iAgIx4hHxrMEf4JnQkyDboPyBIhFIkQMQz8C3wMSA5kEEUQSwzSBMP8 - ZPZQ8Yrtl+5O8F3zZ/hN/I3/1P1o+QjzAuwj6qDqRu1T8gL3Bfip9nz42vrT/a8DnAj4DDcPaA2n - DLILUAlFCsoLAQ24EZMWjRkkHKsdqxp2FasRJA7tDAMMEQyqDTELsAYdBbQEggKuA1QHvgaNBOcB - gv6G+sn3Bvaq9lr5mfpR/ocCIgaiBl4HUwcnBmYEeAJ/BDwDhAYCCnkJlQp2DSQLOwgoCxwMvQs7 - CjULlwcqA6IATP9w/Z78Gf7G/JX9Av5Q/D34q/Ys81fvM+x266XrA+sa7Ebr9ek/56LnU+jd6HDo - kOj76GLoGOdI5zjoW+i56tzrzuzt7zDwIfBg8zfzHPE58C7zJe+670vxRfB18Krv2fLv79jyLfO3 - 8FbtUe8471Xr1+lw7q3tF+H75rzsq+wX7JQFRRZJEfgaTRfIBeb4QvYL9eYAOw1tFksc+hYvE4gR - 8A83FewgaSAVGnsVvQ1tBisCuwGpBKsCiwTfByELihFzEG0MIwM19G/qwuii6SHy0v0vAOr+sv44 - +b34y/5CArQFywSTAY3/aPxx+3cAcQS6B9UM5BIEGQUcGx25GpcU1wwqBvMGpgk3DdcRhxFOEekN - SgsjCgYKewoSCA0E8P59+4z3M/XO8kfzhvPI84j4BPxD/or8LfrV9dXvse6/7nPzwffM+uz+qP8+ - ASQCYATIBq4ILwliCoIMqQtuC8gK4wpxCjEMJRAAFUIZABZqEZ0OPApaBYgBegSsB7EEDQQvBd0D - HQL8AvwCfAKvAUj+Hf43/l78x/pb+Z36u/1IAJkEYApoDNIMMgp6CP8HmwS3BUUIBAmeCUQMkQ4N - DmUNmw7wDgcN2wtfCh0IFgXiAUD/iP7E/nj/nAH/Ar8Apf2b+yL67vaX8yXz1/IY8vDwCvG98YDy - 9vFB8nDyS/EM8Yfx3/By75zvQu9976rwAPP685H1yPbI9jfzHvLE9ADvYe9P8yLytPEP9AT2YvUk - 9HLypfMC8MnusO8R7kTvt+zr7UfuT+hA6FLrdOZQ6qbwNe1W76ztM+ob53TmiOmh6pXlAOht8U7u - AvQBBEAWZx3dF8oY/g4j+Fr0SPt5AbkQnBl9HUUfgxiBE3IX1xcVG6Yc+hEeC2AG3wGNAIcCfgTF - BMABZwNBB/UHJgsxBe36z/HI5R/kD+tt8kj9EQS0AzwBYP8E/rr/3AG6AsQDagHs/4MALgToCcsM - 3A5ZEowUPxaKGb8ZmBh5E2MKjQZvBGAGDAuwD10UKxMcEJYLjgYlA0cAwPz2+Pr2ifQA9A31k/YK - +Rr50/m9+jn73Prl+Tb4cvRc8gTxzvKR9pX9fgSwBoEKUwq7CGEIzQXYBZsG5QbjBtUJLQ3UDkwQ - sw+LEFcPcg7uDYUNAQ2MCakEYgLqAXv/ZgHpA/kEHgVpAi8AFf/C+1D66Pmj+Gb59/qk/Gf/OAOI - A7IEKwW4BccGUwdwCYUJsAl7CiAK9AltDM8NbBAcFK4SKhN7EoUN1AieBTUFBgPiBKEHWgktCfYG - SQVYAkkBTPtT9nr5YPsB9qX1Qfho+bv2ZPW895v2cfcU+KL4LveH9UzxBPOq9ZX2tfdJ+Cf8HvzB - +5T4f/ae9j73YvaV9zP4S/eM+aj7H/lP9Y7zifMI8+/vDvFj8Y7wvO6q79Dtl+247kntL+598O/v - dOrW7DLtbul16MfrLOr36+TwfewY7r7zWPHA7GXwYPL272LxOfFb8V/zYvDy7S3xU/aq9C0GOhZp - E4Uf4h4TCwMDgABT9kH8CQo7EqQaOhyXFRUUbxP4DqcSpxQwEa0IXwawAqr+PAKDA/0ALQO/A7gA - WgbuBYEEgwFO9kHun+v06vbwvPxqBYIHWgjKBdEBPQEMATEESQPDAhUDMQSSB6IMBxKXE+UUpBUr - FbMTixWuFTQSFw/aCOkE5gQsCBMOlxGgFLYRvAw0B8cAffuO+Kf45vSs9VP31PZE+mD81vtm+1z6 - 3vit91L4OPlY+Vj4YPgd+aP6zf/+BKgKIAzaDG8L5gcBB6oFqwWfBg0JxQreDHYPGBAHETcQYQ2K - ClwInAcjBl0FxgMPAiMAV/7r/s7/CAHJAfYAiv24+cz3A/c99/74vPol/Gb+VABmAC4DQwWTBlYG - VwXsBw8I8QXBB9IM/AyeDfcOaRKQEogQQg+jDUgPrAr1BP4GngpjBR0D1ATcBx4GsQEmA4L/xPus - +un3BveT+iH3kPUC+un5cvjF97/63PxG+Sv3EPjX9fD2s/h4+Ev8aP2T/Ar/8f+R/gT9R/y5/IL6 - +Plv+xv7ifz2+yb7UPsK+1r4OfYp9lz17vL97/jwGO+k7gLtMe138FnvIO1s7wfx6eul6ujpbOmX - 61Xs9uz18WPxIfIz8yvxlfI28RzvyPA89N7xHPXV9Y/2uPWW9Vr4f/XP9gf3r/U79CT1Ke287WP5 - OPi+AKcRIRVVG58Wiwl0BoT67fW9/b4IyxC7FIsWpBZjEuANMhIAElMQ7Q8KCCUCNwL9/4kA4QRq - BZIE1wR5A80GuQb5A20BP/gz8Ubs/e2s9aT/rQW9CL4LowUtAvcBc/8bApUCVALoBEEHegn6DTkT - VxM0EwgRfQ/bDxYQ+w/uDqENYgnnBogH3gmdDK0Oug/KDH4IFAOn/Yj7qPg/+Kn3k/g++pn6pf6c - /g/+Gf0u+sf4WvgR+Sb6lvtV+2L8/P0U/+EC+gV6CcgLBQvHCXkHhgXqA7cDuQRFCA0LPwyEDjEO - Ow3sCjYHjAWMBHoCLAFPAmECugEvAqMAOwAdACT+6fz2/PX8tfo++Yz5ivlZ+Rb7nP2IAPoCrAJr - BFMGDQVzBHIF0AbDBvQHgQr0C9cNxg8aECwQEBCFDTsMLgt1CboHpwUCB7QHtAUvBskFmAPDAtsA - Mv9a/h799vs3+8z52fnR+UD62fye/LT7wfti+8X69/lZ+eb6EvvM+vn8Mf7b/+AA7ABUAQj/m/4L - /i37Lf21/Wj9HP/e/u7+mP4M/bf8+fkf9/r3gPWr9Pb2AvT29LH1afBp8+bzsu2g8IXyh+1z78Ts - 7OuU8JbqjO7380vvz/HE89nvD/JZ8j7xmfUo9FD1wve69ZP4Hvna91j6QPmz9zT37PNC9rH51/a3 - +AX6PfSx9KX4wvSl9d32pfPd8+bw1Ox/8Kz+TwGSBlYXORUMDeAJ5ALb/In8dQBDCMMQfRVWFVkV - BxOMEG8QzBCuD38N/g2xB+sDcgd2BToDUAfVBc0CLQabBBEFagWD/xn8bPYT8YXy1ff6/RQEoAcu - B7UGsQL4AMkBEQHHA+ADoASMCLwKkg2OEJYRGBH4D2IORA7xDgAO+w3nCzEKuwivBicJwgtGDeEM - +gqLB9UDhv7G+rH6Pffx99T5ivpP/tP+uf5b/q78ZfrS96X3bPiI+oP89/0NAD4B4gE3A/oFrwZ4 - BiUIgQhqB30GKQbwBG0Fkge2CBILKAyZC/cJwwiTBgwDgQFfAAQBqACTAPwBhAETAWP/BP7Z/LD6 - Wvmn+fL63/lI+SH63/qk/K//egG7A18HigOA/pUBQQUkA8ICzQrEDz8LoQshD/YM1A3DDnkMJA0E - DRAIDAejCTgJwgUJBFQHNwZZAssBzQGfALj+BPz3+y/93fnb+Zb9mf2D+3P77vx2/NX6gvo5+ob6 - CPzj+7n70f0O/2b9oP3p/+3+6/7j/2z+4vwz/Aj95vs5/Bb+dP6X/nn9/fxJ/E/6gPc29/v24vQ7 - 9FP2n/Yf9eb0JvWc9E7yX/JG8QTw4+6j7VPsB+948HHsk/Cj9EXzmvGv8lj0xfKH7x3xEPOd8g/0 - IPOy90P7DPY6+Nv7gvZQ+Ej4avPF+Sn7MvUM+lL6Z/Uz9yn1l/ek+tX2s/bT+5X4lvOm9gP4TvUs - 8xn35vU18/b49/zsACgKzw3xEF0QKAllBpUBnP4MAw8KBwxMEI4TRBDwDXkOwxDIDdMM5w35B7YC - KANnAm8DVAbxBbYGxgUEApcC5gEuAMwAffw3+dD4yvfo+Sv/gQN4BcsFiQUxBfsBewHlBMUDiwTc - Bp8HtAoIDJQNGxAMEKQN1AwNDM8LugtTC/4MYQvMCE0IjQcpB1kHcAbTBmkGIwMcAZD/sP2M/BH7 - +Pq/+6b7jvyW/dX+9/3b/ML80fv6+6H8ev0H/2QB1wFGAgYFSgWrBI4F2QWwBWQEYARJBQwFdwV9 - BvMGzQdwCMgGcQceB2oEYwNaAVYAsP/z/nT/ZgD0/w8A9wDQ/kX+3v2p+0b7Rvvl+qH7Xv07/2YA - HgJIA+UClQN1BGsFkwXGBpAHUwh/CQMJFgqPCscKMgpYCg4L2glaCd0IHAisB3QHJgatBcQGOgOr - /Tb/PAEk/UX8GgGjAXr8+fyD/978Nf30/lX9wfwK/RD6d/pK/ez9hf4Q/wwChQGA/rP+p/+0/S39 - Yv7E/l//Ff5H/x0AhP86/lr9E/7N/f37Lfvn++r6LPoB+DP4B/rr+P31Rfet+Rf1HfM09BH1TPHU - 73f0GfNw8vXzYPOF8qnzzPEC8Vnzh/Ht8SjyH/ND9DnzBvWM9zH1/PZg+QT1Hvgw9x311Pdk9oL0 - iPjC+Y70Ivp//Hv6Qvqm+Ef5dPiB8yXyrvdy9VX0N/l/+/76ofkf+Ir4mPfE9Ev1ifeg+ZH5k/zj - /+8GtQmkCUEQ5g4RCeAFMQUWA4oE0AhaCzoQGxGKDX0O6w38CjQM/QkeCR8IBwTZAuMD2QOSA5wE - 7gJAAlMAvf6xAJb/aP4b/vT7Mfrp+fn6dv6oAUADvwVeBT8ENwTaAmYEggU4BXoH0AmVCtoLyw0z - Dg8O3AzmC5kLZwqlCiULgwvYChUJNwhBB0UGQQVRBYcF+wPwAXcAp/4p/VH83fqO+yH9zvuD/Gv/ - l/4j/bv9J/3j+/n7M/yG/msASAHsA0YEdgRkBQAFgQSbBfMFzQSaBb4GDAZzBhsIqweGB2QHwAUn - BaMFwwPcAkcDIgFs/yf+iP1l/cP9Df5q/r3+TP4m/WL7Sfwx/Nz7/v2W/4UAdAGlAtACFwO9A1ME - +QTcBekH/QgMCcEKsgt1CsQK6ApRClUKogrzCiUK6Qm/CBMHSgYhBq4FGgSzBE8DqQFnARX/Of/o - /mv95Pum+/T7hPvZ/Mj9pv+J/+r+ef67/fr+9fzg+m/9lf+B/VL9MwEvA3kARgCOApYABP8j/7j+ - NP6i/gL9Sfyu/Zb9DP2l/JT9kvso+Yz3NPeD9lv1+/W49bb2XPU/9U31RfUD9JDyLfMs8iLysvEc - 867yBvNg9Or0efT39ab2SPTz9Ef0hPNq88Lz+PJF9nD2XPb4+NH5f/hn99X4U/Vk98H1BPX391n4 - BPa698D5JfeU+kD5fPgL9+L3wPRr9LP3HPd/9qX2Dfk09lD50PfE+mX7evnX+Kz2c/lB9j75jPuq - Af0DEwhIDiEOeBA2DL0JTQiIBSADoQd5CokLRRAzEBcQ6xAADgkLBg20CdEG5QXtA3ADrQIqAxsE - LAWmAowBtgEbAOr+HP8k/579Hv3y+2T89/5GAHkCCAbhBhoG4gbEBkgGvQbBBqIHjwhQCakKtgwd - D0gP6w6fDtYMJQqoCMwIogibCEoIewgBCPoFpwUPBQoEEANtAdP/Tv4L/Qr75fpM+wf71voa/Ob9 - iv0W/mr+fP7L/Q79U/3Y/cn+rP+pAfoDbAXxBcUGXAcaBxgGiQVIBQQFkgT7BKQGqwbxBjgHnAax - BWQENAM3AhcCYQHf/3L/PP9O/vX8NP3M/Vf9hvw5/N38HfxL+2f7bP0y/QP9jf4R/6EB8QLFA9YF - zwe0Bo8F0wZeCLQILAlhC88LcwusCh0KTgooCtkIxge+BrYGuAR6AscERgSFAnkBPwAf/2H+3/0r - /+T/h/4m/rr8sPyp/Ej9m/5QAEEAOwC0AFD+Zf/+/mf+0/6R/yQAmQCEAn4B1wIaAl8AhwDT/lD+ - 2f0i/UX9fP00/Qb99Pz1/av8Q/u8+9D6X/k0+J34//dI96D2Avcm+I739fZV9y/4IPXP9N30FPQF - 9ZLzvfWw9lr33vbi9jT4hfZb9tT1ifbL9ib2i/VF+J73hvWT+Hf4vveH+Jz4Zfa19+z24PRA9gT3 - t/Xn9Yz4mva+9xz6u/hK+Nn6rvb198z4ofRB+UH1Hfj3+Mr4Jf2E+yT98vvl+3f4r/qm+e73PPxa - +XX7APu8+vv+HwDOAHoJcgyMCSsPZAuaCOMHAATgBkMHzQg2DHUNgA7aDlgNqgwxDVQKQwmnCHkG - OQalBD0EcQaSBRwENQXVA5ACgQIaAuQCHgKnAIr/Ev9G/kD+IAHtAqwE4QZWB1gIPAhRB2YHFAfp - BvgGBwg2CX0KFAxvDWYOuw3oDHQLtAkqCbwHhQfKB8IG5wUmBQgFRwMRAwMDsAFUAcP/D/8p/jf9 - P/yR/Dn96vy3/XT+If8Q/5H//f9zADEAm/8LAUoB+QFbA0UEswX5BQwGCAbbBb0FIgVOBcEFDgYa - BqUFqwUrBZAD3wIwAnIBLQEZAOT/1v9+/nL9Hf3g++n6efsa+9X7T/0//UX9wv33/R/96vxj/RX+ - 9v0M/zsBggIZBDIFRAeoBjQGxAYcBVgF3wVaBjkHigcBCAYI4AYPB4YGGAb6BRwE+QOYAlsBVgG/ - /8X/YgDb/rr/iAAFAAICRwENAZoBNf+M/hv+U/7Q/7b/HwHaAn4CYQKOAv8ClwLDAXIB8wD7/+T+ - sv6V/i7/3P5P/rb+Bv9Z/uX8Bv6k/QT8Fvtn+uf6ffm1+HX5VPkL+Tr4AflY+236EvkA+qz5SPeG - 9qL4A/mq+Iv5oPrp+qb5FvoE+wj6SPjU+FX4S/Z396L3U/jx9w34Y/kS94/2Kffu9qD2efY19jX1 - d/Ts9L709PSE9gv2ifXV9af2GPbS9Uv3ZPZC91P3hfVi+FL5Sfcb+Yb7YvkW+e/6t/iI+Hv5TPj+ - +JX6zPrO+uH7kfw1/Dj70flo+oT5B/cA+cz6A/qT/HwCPATUBrYMnAwDC1gKTwjHBWkDSwRoBvYG - 8QcGCwENTwwZDegNtAyRCjMIfAY3BHgCJgJMAhEDwANHAwsDiQPuAhECGgJvAvoAjf5a/lD+5P05 - /9kBtQN8BMMFXQfWB3IHCQgMCFYHLgcLBzoH+gc8CZEKIgz3DPULGQtmCgsJGwgpB4gGVQUNBP0C - UQLLAkACrgEFAnYBdv/8/q/+Fv3R/J/8c/zJ/DD9d/10/g4AvQBMAaYBCwLdAeAASQEtAhMC7QFV - Ay4EDQTgBHEF+QWsBa4EeARTBMsDRAMwAxMDfgJxAdUA/QCfAPX/NQAwADv/bP5v/ff8lfyo+0/8 - wvyF/D79AP7f/vL/AwFmATwBXAFXAQ8BQAEVAisDbQMdBCwGNgfuBp4HdQk5CKwGoAa/BYkFyQR8 - BDoFKgV3BBcEtwOyBCkEpQI6A8EBAAAa/8T+AP9Z//X/ugDvAFgBnAF9AOoB3wIBAvYB7gGYAVsA - OAA1AQ4BLQHtAfkBtQGrAQ8BFgE4AcH/2/8p//b9uv2Z/Jn87/t4+zT8Bvzl++j7yPs4+076c/ot - +if5O/kG+eX4pfgv+Ov4+vhP+ZP5U/kO+of6IPmJ+ZX6Uvn8+aX5wPlA+7L6Fvml+k37iPca+LL4 - 3fZz9+T2+fbB+DL3+vam+G33tvX093P2SvUG+Pnzp/XU98/01fY8+ZH21ffW+mn3CPhp+2P6wvf0 - +hf7hPkR+pv5L/vL+eL6GfxB/OP8F/18/bv7Uv3//HT6yPwe/Cf6bfsO+vn5EfxS/L8ABgX7BvAK - lA3PDFwJxwmHBegB7QOSARQF3wbzB4sM/wuoDO8LLgtqCc4E7gSPAmQA5gFaAQEDGAR0A9YDSAN+ - AqwBkwFOAZYA/QCt/6n/1gBfAC8BegKDA3ME3QXgBtYHrwjlB+gHWweRBWUFfgXXBQ0HywjaCQEK - vArmCbAI9AdzBgEFRgMpAuIBNwFwARoC7QEPAs4B+gDdADIA5/7s/mb+Sv10/eP90P3m/VH/WABy - ADQBTwIFA80CRQPuAzMDhwKgAkECfwGEAn4DkQM7BFEFmAX5BOQEpgSlA2wCYQGhACgAl/8YAMgA - uAC9AKcAaACo/sL9Av5J/Rf9PP0K/lb+tf7I/9H/UwDFALsAiQCzAfECKwNnBEIFiAXUBcwFkQWT - BVMGfAWbBLgG4wXHBQEHJwYGBsoExAJRAfAAof90/4H/rwBlAbj/UgGPAh4C0gAXAVwBz/4A/8f+ - jf5TAQsBkAC0AtcC9gC0AAcCYwKRAFIBzgLQAMoArwBPAGj/8P5//9z95f1V/4L+Pv7k/8X+EP7s - /Z38NvyS+5j6JPrZ+vX5Hvr4+pD6wPtV+3X7mvvl+j373Pkh+U/5i/j/9xH4Yvld+yz71vvk/Nb8 - PPv7+aT7fvpg+Zf5N/ra+f34ZvqL+gj6Yvnj+Qb5NveW+CT4zvfr9kb3CPhg9Xb2zfbo9hb3Zvfh - 99L3hveM90b4g/Yz+ZL42fb6+EH6Evmn+Qj9gfon/O38RfqD/FL82fm++sP89vra+mf9+vuE/JP9 - T/w9/Zn9Yfx1+yL8Q/pI+qv79fnR+9b/AwGOAw8JUwtUDMsL1goDCnMG1gNmBEYF+wNlBdwIxwl5 - Ck8MMw3vCwQKjwhABUkCIgEYAAEAmQBEAssClQKSAxcEsAPLAvICXAJwAO3/HwB0AOAA3AFnA1gE - 5wQpBo4HEwi2CEwJYwldCGkHbQe6Bi4GDQfcB3MHAQisCC0Ibwh0CE4HQwb5BBcD7gGsAKP/pP+g - /5b/MQAlASABBAFzAfoAjv8l/7L+gv1p/RD+yf5a/zIAUwE4AggDmAPWAycE4ANaA4MC3QE0AgYC - 2QGPAiYDFQMmAzkD2wPsAwgD0QJEAl4BYwDZ/+v/3/9b/wH/hf91/yD/LP+l/wgAMv/1/mz/UP+4 - /jj/PABPAMcAWQEUAjEDJgSaBO4EcAWBBboElQS3BKAE/QNNA1wEswRhBKEEHAbMBUwEngOiAiYC - jwAnAIIAmgCCAFwA4wDJASACugEQAikCxQGRADAAegDlAMcAqwCzAdUBFQF3AGwBFAIdAeIA1AFa - AWMAFwAbAEr/ev5R/mf9mf2F/T79i/2+/oP+b/6+/n391P0v/PD6JvuQ+tb5XvoQ+3f6CfxW/DX8 - dP2v/G78FPwf+hb6dPl++Ez5W/pp+6T7y/wH/UH9Lf1z/Mn81/tK+1H6WvoI+iH60/oD+nH7afpK - +gD6TvkY+s34g/nT98/4a/jw9fj34/aP98P3F/hl+bz4+fjU+YX5ffh++gX56vgP+pL5k/pM+Qb8 - Jfsr+lb9Q/tl/Gr97PtP/Or9rvwt+7L+3/vE++j8+/o6/Qr7svx2/bf8kv7u/YH9Kv1C/VX6GvtC - +oz4ufoK+Z39tf8aAb4Icwj3CjgMEAqiCe0F4AQvAyADowIQBDYHkwcrCusLNg1/DDELywm1BhoD - dQFAAPj+4QDlADMCXgQpBDEFLQX9BBQEqwLCAS8A/f9J/6L/HwGjAcsCGwT9BJQFFAbXBpoHcAeD - B2MH6AZ7BggGGwY6BgkGzQVgBoMGggY6B0wHCwe+BmwFJgQrA2wBMACo//n+pv7o/on/KQCqAEEB - zwHsAXwBLwGjAPn/wf8V/w7/pv/w/6EAkQEhA7oDiQNeBIkEegPZArECGgLSAXIBrQFiAoACUgPN - A/EDCwRTA2ACdAHCAKn/Kv9W/zv/T/88/5P/7/+U/4//6f9Z//H+CP/I/gr/Vv9u/+X/AgBNAGsA - TgDhACkBNwG0AXECfAKrAvECDwN6AgwCDwJjAXEB2QFuAqkC4wJOAyADcwKmAhICpgFbAXIAEQE5 - AFYAGAFPAfgBLAJ5ApMCNAItAmgCLwI8AlgCGgI8AZMBkgFLAW8BzAEbAioB+wBBAQEBNADnAOMA - KwANAKj/jP+Z/sX+m/7i/eX9N/7d/ST9f/6V/lL+dP4S/m3+fPwV+0T72/oA+2r6Nvyb/mz9Lf5a - /6T+x/05/Xb9fPy9++z7Rvvq+uf7Cvzq+7b8/vyw/Jn7GPxO/Iv6xvqi+jT62PlH+Qz6GvoL+kD6 - OvsE+//6j/tN+0H7hvrf+iz6Dvlm+dP5Zvkq+Wj6c/oS+ib6g/oU+xL62voU+hr6gfq8+Pj64Pgk - +i37g/l6+wf7QPxT+xf84vyx/Ir8HPxh/RD9k/uX+4L+hvuL+3795/um/dX7Uvwo/ib8c/zK/GL8 - nPw//Av8xPyz/Er8lvwh/Af8Wftx+h77PftZ+8L9LwAoApQF9ge9CIIJgAllB3sGgwXgAw8E1ALs - A1UFMwVeB1YJNwqQCVkJXgiFBSkDlwGWAGj/Hv/H/6kA0QAEApwDkgM/BP8D5gIBArUALwC+/8b/ - kgBjARoCNAOjBGcFbQZoBwMIxAf2BsMGKQb0BJIEOAUJBUAEiQSFBQ8FJQVKBpMGGQZSBWsFHQSF - AvUB/QApAKP/jf+Y//T/hAAaAUgByAFmArcBHgGbAGoAw/+Q/ln/rP9I//3/PwFFApgCZwMnBCgE - iwMrAzgDlgJQAkICIQK3ApMCYQIcAxED9gGrAcEBzwBpAAEA3v+S/53+v/7O/Y39Bv41/X792v0F - /ln+AP/x/2QAbACxAA4BRABnAKUArABUAbgBjAIFA3QDvQOuA6oDEAN1Au8BNQEVAbwAZADsAPsA - uQAUAUABIAFsAUUBSgEzAakAugDDAJMAzAA8AfcAtwEoAs4BqwL9AlUDYgO+AyMEPQNxA28DAQN0 - A94DzAP1A+sDfwJBAYoA3QAWAFP/0QG5AcUADQIgAoYBFQEVAZUAh/9m//T+Gf5T/rD+hv73/aD+ - 9f6L/UD9r/0i/T38ZPzs/B39Rvwu/Qf+KP0+/Rz9vf39/Or8/f0S/h7+5P2F/tr9m/yE/CD8+Poh - +1b7jfsX/MD7Rv08/Zf8Rf1W/J77Lvtc+oL5j/m1+Vn5MPra+ur6xPvU+4n77ftY++f6bPuM+mT6 - O/tl+TX6K/t/+YT6mvtj+yb7JvxY+yX8tfuf+c38XvrJ+cD72vku+4/6+/qN/Mf78PwW/kL92f3a - /aL9Of08+z3+fvsf+qb+svoE/dz9WfyF/xX9f/24/ej8JfxE/BL9XfuW/BX9Ev0A/eX+//7//Yf/ - f/4n/z/9m/0Z/rr7D/2m+0T9hv1G/ewBewKeBFAH3AejCasIwQYvB4QFvgL6ArICaQLbAkIELAY5 - B6kI2QguCQ8IAwaGBH0CVAGr/y//zP9HANAAygFsA70DRARBBMwDxgPnAVgBngHaALwAqAGAAroC - GgS7BHQFRAZMBoAGaQZ9BpgFoAWEBYkEewSyA5EDLQPBAnsDUwPiA/QD1gNFBFcDxQLaAccAn/9C - /hf+wv1c/e39Ov+j/woAdgHKAdkBwgFsAQwBCACK/43/u//l/5YAmQGbAoMD6gOLBJQEYgRfBJ8D - 4AKNAgICaAGSAdIBewFzAckBygE/ARYBOQG2AFEAPQDp/7n/v/+m/7b/uv+g/8f/3P/k/0kAhwDD - AOQALwFkAQgBfAGEAUMBQAEoAXYBRAGVASsCUQK8AigDIAMWA+8CVAIvAnkBKwFuAbMADwHJAdwB - EgJ+AtoCggL/AZMBHQGfAOv/w/8MAOX/IgCeACgBggFVAd0B7wFXAYoBKAG+AAIBkwB3AJgAvADr - ALsAOAFxAX4B6QHAAe8BvwEBAdIA3/8R/5f+x/2L/bD9A/4i/lH+4v5k/y7/ZP9I/1/+Sv5c/aX8 - kfwO/OX7JvwH/Qf9UP1N/nP+h/4E/pP+b/5P/AD9xfz6+o/7d/uD+wn85fuK/BP9e/xq/Kf8PPzc - +wj7Z/ts+5P6rvoY+037ePqe+/n7+Poj/FP8Afz/+7v80Pyp+1X8M/3r+5L7Of0t/Ln7mvyM/Ir8 - z/tX/S396fud/RT9RPzv/HT8kvx5/IL8+fz6/Nf8JP15/Zn8iP2U/On7mvx6+2/7AvyY/C/8Z/3G - /Cn9av25+0r9Q/wu/Db8qPsn/O/7l/xR/XP+lP51//z/Z/90/1D/3P7D/Zz+Df4u/Vj+Lv4S/w3/ - Z/9OAKQAgADi/xMB2/89/4r/8f7//vD+/v5U/6oAvP8YAAEBRwAFAF3/1P8z/wv/dP6D/mb/uP0O - /v//2f/K/x4D0gONBPYGcwayBy8HFAZZBscE6gPyA10DGgNoBL0EtgURB2UHoQidBwgHEQe/BDMD - 4gJ8ARQAxACDAPsABgKrAhoEEAQ1BDMEngN6AtQB5AGKAFgACAECAXcBiwLAAzwEHwX4BcYFMwbG - BUMFOQVQBFsEOgSLA6AD2gPvA+EDNATIBMIEiAR8BA8EqgO3AuMB0AGHACEASAC6/xsADgCDAGoB - YwEPAkQCzwHOAVUBrwCWAGwAJADIAPQAfAFDAiICxAIrAzID3gKkAmwCywHkAbsBpgFAAi4CRQKD - AocCfQL/ASwCQgLfAcUB6QH/AQYCxAGyAe4BOgEqATgB6gAgAa8A6gDlAIEABwGNAKYA0wA5AF8A - NwAmAHEAsABbATkCcwIhA2IDHQM9A2sCWQK4AfQAMQFnALEA5ADJAF8BLAFFAREBQQCO/9X+5P0c - /bD8Zvxa/J/8A/0h/aT9wP3j/SP+6v0m/tL9p/3E/VH9TP19/WL9zP0C/kb+9v7u/jT/N/9z/3P/ - qv70/qj+/f38/Zf9Y/1b/Q/9Tf1y/WX9gP1q/az9if0X/Sb9rPyP/Gb8sftu/OH7yfvb/CP89Pxa - /dL8b/0p/Uj9Nv3u/Hz9Xv3N/Rn+Sf6u/lD+Sf7t/UP9+/2f/ez8xv4j/vH9Kv/v/rn/Bv9x/xwA - zf4q/yH/w/60/pf+oP8Q//3+BwAM/x7/0f/d/iz/Hf+v/jz/7P3v/hb/1v0K/8v+of6X/gH/iP9n - /9L/9f9NAGMA7P8oAOz/if+y/3n/rf+C/yL/9f8FANr/2ABKAIMArwCv/ykAev8+/+r+yv6o/2v+ - /P7R/+P+jP8//3r/DQA7/kH/EADl/SX/1P+A/jj/kf8U/yr/Tf/I/mD/zP6t/tr/ZP5e//3/qf6C - /0L/3v4g/3v+9P5V/0T+kP+9/wn/HADo/v7/VP89/tj/hP5p/+D+vf61/03+HP+6/o7+GP8U/nX+ - R/5X/Wz+2f3E/T7/NP73/vb+LP49/9D9g/0n/nX9Ev2M/SD+p/0r/tv+Mf9u/6T/HAATAID/iP+l - /33+Bv8h/xj+S/8O/6P+uP/a/vP+Xv8m/tz98f1I/UX9pP3q/SUAAgDgAJcEmwOSAyMFgwSFA4IC - mgKyAngBOQH5AvAC7QLLBG8FsgXtBbMFOgV3BC0DmQK/AeMAMQF+AOYA1wE4AscCUwMjBN4DQgNI - AwsDHAJzAYYBewH0ABgBFAJIAtAC8wNyBAsFRgV1BVEFxgSlBF4E0gODA1gD/wIHAxsDtgNSBMUE - UQWjBbQFRgXoBHUEvwPTAh4CaQHiAG4AGgB6ABoBNgGpAV8ChgJtAhgCNQJ7AbMApQAnAM3/CQAg - AI0ANgGJAW8CggKkAucCYAImAoEBzACmACAA6v/s/+H/VgBdAKgAAgHlABUBIgF2AEkA/f8e/9z+ - fv6R/kr+Z/4H/87+EP+q/xcAIgCPAP0AwABrACAA0P9d/w//wf7z/gv//f6W//P/NACpAAYBVQFg - ASsB9wCMAAsAef8C/+v+2/7Y/tn+cP8BAAAAmgD5AP0AywAsABcAU/9H/h/+tv10/cL9HP6e/v3+ - c/8OADcAdgBWABcAHQB1//f+yf5i/t792/1R/uv9/v3i/tn+u/4O/1X/Mv96/pb+mP5j/Wz9rP3n - /AD9Of1z/aL9nf1s/nL+LP6k/nX+Gf7b/ZD9WP3j/Lj89/wX/UD9d/0u/sD+Xf7p/mr/vP6Z/oH+ - b/4A/lj90v2v/RD9lP0y/sX9+v2w/kf+Rv69/oP+Y/7G/qv+uv6Q/nn+9/4I/jX+5/4b/jH+aP6V - /jr+F/4q/9P+1/7d/v/+FP9O/fn9/f3C/CD9N/3E/Yj9hf2k/qT+Y/5g/6D/XP/G/5T/h/8L/4z+ - 3f7t/c79Yf6V/RX+Fv/V/kL/PgDA/1cA5v87/zIA+P05/hr+J/3H/fj8JP5x/on+SP/8/x8AEQAZ - AIIA+P+R/iMAlv7q/ef+N/5m/wT/5/8zAYsAcwHlAW0BHwH+ABYB6//5/4AAcv/I/x8AJACEAPj/ - FgFDAev/UQHiAEwA1QDM/5UAKABt/8UAYgAeANYAygAtAUMBjwFQAl8CmgKuAjADxgJPAs4CGwI6 - AhAC8AGaAjkCqgIUAx4DUwMuA5QDKAN5ArUCCwKAAV0BBQGMAWYBRQE8AjsCKAJDAkoCawLYAYQB - ZwFMAfAAvQA+AY0B4gHvAXUCPQPuAvUCMwNEAycDZwKtAvgCaQKbArAC0AIyA+0CEgN0A08DNwP0 - Au0CCwOIAkoCXwI/AhMCvwG3AQoCoQE9AX0BaQESAQsB9gAnAcQBbwGTAYMCYQLtAR8CVwIBArcB - mgGAAc4BlwFzASICGwIuAkQCaAKUAgIC4gHcAaEBgQHBAQUCWQJVAj8CvwJMAu8ByQFgAREBZQBO - ABoAvv+3/+H//P+w/xAA1f9N/zr/wP6W/lH+9v0K/hf+1P0W/jn+B/5T/gj+G/5A/uj9Jv7X/dz9 - OP7n/Vf+qv6R/uv+n/7O/jT/Wf6g/uj+Gv57/nT+Tv71/mD+jv4h/2z+lf7r/o/+cP5J/kL+Nf5m - /XP9uf1C/fP8FP2I/cP8S/wH/bL8w/v++0f88Pu1+9r7V/wi/Or7mvyK/Fr8jPwZ/Hr8w/xv/Lv8 - Vv17/Xf9uP0X/hn+4v16/lr+B/5n/kD+4v0T/v798P2t/XT98f1s/Uv9GP4A/kn90P2w/UX9OP3N - /OX8d/xS/DP8k/x+/F/8Lv0+/TX92f0M/q39G/6e/aX9y/3I/Jn94v3l/P/97/5f/oz/TQAfAOEA - nQDeANAA6v90AAoAV//9//v/nv/y/zAAPgACABIAcwDb/2n/AwCc/xT/wf9Z/2f/9P+0/2AArgCR - ACcB/wBBAV4BKwG0ARoBXQFfAQUBZwHcACEBSgEfAZgBAQIQAnUCFwP6AkIDWgMTAx8D2wKnAtMC - vwJiAq4C+wI4AywDOwPkA8kDSwN/A7wDKAPmAuoCDwOpAl4C5ALMAqUC0ALpAgIDLwMIAy8DQwNO - A1oDPgOBA3IDMAMwA2YDWAM0AzUDhQOAA3UDnAOJA4YDZgNKAxQDAAPsAuoC9ALqAhgDGgPTAuIC - 8AKrAqEClQKSAngCRQJvAmYCDwISAt4BuAGdAR8BXAFRAf4AHQHnAP4A7gCBAJQApABaAH4AdwBo - ALYAVQBzAGUABADn/77/zv9c/4H/7/+B/7L/8P+O/9j/jv9l/8j/VP9a/5v/Rv9i/4//SP9r/03/ - Nv8V/yP/K//r/jD/J/8Y/8z+5P71/oT+Qv45/i/+5f3U/SP+Wv5D/r/+s/7x/g//ev61/pH+Nv5F - /lP+Zf6l/mL+zP47/+b+Mf9+/0D/Q/9R/wP/FP/f/qb+a/6G/iP+5v0r/sD9A/4L/jL+bv5W/jn+ - L/4Y/pb9cf1k/Tn9Lv03/XH9j/2W/cf9Cf43/rb9Ef4l/mH9u/15/Wf9zf1V/Zz9+f2g/dj9Cf4W - /vX9xf3j/bj9P/2I/YT9jP2//av9fv6h/fD9PP5d/dn9Zf2o/aH9Bv2x/d39PP38/Rn+Uv6x/kL+ - OP/W/pb+7P5Z/oL+uv4i/rf+IP/O/nz/gP/t/w4Aqv/6/wQA8/5U/4P/f/5A/wb/Ef9B/x7/iP+q - /4v/2/8aALD/SgAwACEAfwCAAIAAkwB3ALMAkABqAAsBjgDuAOcAPwGCAWgBPQIUAlICVQIsAiwC - DQLdAboBzwESAgECYwL8AhYDZwOmAw4EuwOyA4gDDwPvAl8CRQJfAjkCmgLEAuwCnwOdA9ED/QP6 - A6cDcQNiA8YCtgJdAkQCjAJ/AtgCTQNrA7sDAQTOA/UD4wNQA1kD7QKmArYCOQJqAoICawLlAiwD - +QJwA48DVAMxAw4DOwNsAmUCcwILAhQC/gEUAiMCLAJEAlwCRQJiAj0C+wHLAX0B6wDRAMAALgBL - AG8AZwBJAKAA2QDXALQArQD9AIwAWwBvAD0Azf/X/+7/ov+t/77/CAD7/7n/9v/u/8z/q/+C/77/ - bf84/13/L/80/+b++/44//z+9v7//vv+nP6o/pb+Rv5Y/h7+U/5n/ib+W/5J/u/9GP7Z/cf9JP7a - /eT9Ef7Y/bv9vv2W/cr9mP14/dX9r/3O/f79Kv6J/mL+Pv6i/ij+7P3w/Z/9u/2R/eD9Lv5v/pj+ - uP4K/7P+jv5f/ln+D/6z/Tj+M/49/mj+3P7S/kr+f/4b/pv9LP38/Az90/wL/bD93f0C/k/+o/5w - /tn97/3P/X/9AP1x/dv9n/36/b3+Q//1/iL/OP8a/1X+3/06/sf9Zf1+/ST+Tv5j/hb/cP+u/6T/ - 1f/7/33/HP/j/rX+NP4b/if+Mv5R/h/+kf7F/pT+yP7I/qX+vf6N/pb+pf5Z/pL+vf6b/gT/Kf9c - /wIADgB0ALIA2AAyARQBFgEXAQIB5gCwALIAyQDRAPEA/wAbAScBTwExAT0BOAH7ACIBHQEJARcB - XQFrAXYBhgH8AQcCxgEyAisCNAIYAicCeAIRAgkCSQJYAlQCGQJSAocCPgImAqcCsQKMAqcC6QIc - A60CBgMgA+sCtgKiAuYCjAJpAmwChAJ/AmACdwKGAj8CJALYAb4BowEUAVkBaQE9ATEBYAGHAWAB - RAF3ATsB1QD6ALEAkAB2AMAA9QC2AAYBkgFLAQcBdwH6AMgAsgBaAKEAOADS/6MAPADT/9IAaADE - AM8AUwAbAZUANgCDAFQAIAARAAEAEQCj/8L/z/9d/wkAt//M/y8A0P8fANT/W//X/4D/Bv9N/wb/ - Nv/g/sP+D/8Q/0H/Xv+W/8H/tv9Z/+j/hv9N/3r/G/9f/wL/2P4P/1j/E/9d/6v/kv/+/9//5v8s - ABQAtv/W/5D/O/86/yj/B//z/jH/Iv8//yf/OP9T/0b/Zf+T/2z/UP+r/1v/Xv8w/z3/bP8p/3T/ - wP/+/+T/WACaAIgAgADEAOMAWgBrAEgAKgDu/+7/LwBmAIMA8ABbAT4BkgFoAToBwACHAFwACgA2 - ABsAfgDeAOMA9QBMATIBGAHPAIsA1AAsACIArAB9AH0A4wAlAUUBMwFHAZ0BWAEEARkB9gCrAM8A - 1ADZAN4AIQFjAd4ANAE3AdAA0ACdAJsAWwA7AE0AaQBMAGEAnACXAIMAvQCqAGAA0QCJAJkAEgHP - AOwARAEaASsBVwEfATUBFwHTAMMA/QCxAKIADwHSACsBJQG4ADwBGwFHAKIAlQD0/zsAHQBBAFYA - QAD0AK8AowAvAZMAhQCIADEAPACB/+7/QwBs/xwAZAA/AG4AWADJAHYAXQDHACkASQBRAPj/bQD9 - //n/PwACAGYAIgAWAHgAOgA2ABoAMgADAK7/7P9u/1//ev83/2j/Pv9h/1f/U/+0/1D/WP+6/3f/ - iP+H/4L/tP9l/5b/iv8k/3T/PP/4/iL/Qf9X/z//jv/m/7z/7/9RABQA3f/q/97/df9O/3D/Nf8/ - /1n/hf+T/6n/z/+a/6D/YP89/yL/7/4J/+H+7/5T/17/N/+u/7r/of/W/6z/5v/+/xgAHQAdAFwA - JwDN/5f/c/8O/57+iv6p/pr+uP4L/2//ov+7//T/w/+m/53/Xv8o/zf/Tv9q/4r/0f8lABcAOQBA - AC4AFQDg//z/wf+d/wIAr/+O/6b/SP9l/0v/K/9E/1z/p/+///f/fACMAHAAmgCnAHIABAD0/yAA - zP+P/8b/q/+C/6f/oP9n/1r/p/+l/3f/sP/u/9z/8P8UAPv/+f+2/7j/s/+M/+f/2f80AKgAmwDq - AOkApACJAF8ALAC8/4D/v/9u/zT/k/+U/3//uv/V/67/kf+m/4j/QP9n/1X/MP9e/7f/HwAlAE0A - pQC0AKAAnwBtADgASAAOAMX/8v/z//7/IQA6AHUAjQCrAKIAwQD5ALoAbwChAIkAJQAnAHwAoQBu - APgAdQFJAX8B9QG4AU8BagFHAZMAXACvAEAAEgBmAIkAXABXAOkA0gCLANIAzgCVAKAA1ADmALsA - 8gAaAfAAJwECAacAygC3AHsAhgC2AOEA9wAzAXMBjAF0AUoBHAG3AGEAHQCw/4r/kf9Y/1f/rv/K - /6D/3f8nAPr/6f/s/7D/fP9f/3T/Xv8c/1T/ff9w/4D/5v8MAOr/OgBjAAYA+P82AOP/of+Z/5H/ - Yv8M/3T/sP9C/6L/8P+n/8n/1P/D/6r/pf/i/7f/qv8OAP7/yv/6/x0AvP+K/7j/ef9Q/3L/b/90 - /6j/yv/r/+X/4f/s/4n/Q/83/+3+x/72/tb+Af9n/1P/c/+9/9//o/9q/5r/Tv/f/v7+Mf8N/wr/ - jv+k/3z/yP8QAOT/pf8FAAUAdP+O/5b/Wf8p/xP/Mv8R/xv/S/+l/7//1P81ACEA4v+7/4//Tv/6 - /sD+7/7f/tv+T/+w/8H/9v9lAEgAKQAsABkAwP+M/4z/R/8W/yn/Pf8x/2j/hf/C/9z/5P8AAOb/ - 7P/Q/8j/iv+L/4//Tv9o/1H/Y/99/5H/5v8QADYAYwCJALUAmwCOAIMANAD9/9z/x/+Z/7n/0//K - /+///f9EAFYAUABrAIEAaQBEAEcAKAD2/8n/wf+c/5P/o//G/+P/0f///w8A///c/93/1P97/1P/ - Xv9Q/2f/ov/y/y8ANQCDAI4AZgAYAA8A9f9h/4v/k/9T/5P/6//n/x4AQgBAAGwADgDk/8z/cP9P - /0L/Hf8z/2X/fv+g/8H/s/+q/83/iP9g/0P/CP/z/sf+tv67/vP+Gv8z/27/hP94/4b/ev9D/yj/ - FP8U/+f+z/72/ur+8v4J/w//Jv/9/vn+Dv/B/qL+of6r/sP+y/4K/zH/NP9L/zb/HP/y/rP+uP6C - /mX+nf6R/pv+2f7y/vX+Qf9k/zD/Vf9K/w7/Gf/W/s3+7/7C/vP+Iv8S/zz/iP+h/6b/t//R/57/ - V/9J/xT/6/7G/vT+Ov8n/4r/AAAHAC8AWAA1APL/tf96/yf/1f7I/tP+5f4l/3H/t//u/ykAKQAS - APz/uv+G/0f/GP/5/vX+EP8W/1X/r/+4/+3/NgAtACoAHAARAP7/q/+a/7H/cv9b/4v/rv/E//H/ - QgBnAIIAjwCMAG4ALwAQAMz/fv87/zL/N/8K/0H/l/+q/+f/WAB+AJIAvQC3AJYAVwDu/6n/df8i - /w7/Gf8z/3b/vP8kAIEAowDOAPAAswBEAAcAyP9a/0T/V/9A/4b/AgA/AF8ApQD5AOUAoQCwAIsA - EgD9//z/vf+h/7f/6v/n/+L/EQAnACEARQBuAEwAUgCJAG4AQgBWAEMACQD3//f/yf+t/97/7//s - /xUAVwBiAGIArwCzAGEAXABRAO//r/+f/3j/R/9w/6z/vv8EAEcAhwDDALoAogCLAEgA9f+v/4L/ - a/9b/5T/3/8QAFYAkwC+AL0AnwBoADQA+/+e/2T/S/8r/x//Tf99/4L/pv/v/wAA8P///wcA4f/P - /83/lf9q/2P/QP8r/0j/Uv9X/5j/1f/I/9z/FAAHAOz/5//i/6T/bv9+/1X/Kf9A/0//Xv9y/4n/ - nv+3/8T/tP+x/7L/jf9f/1r/Tf8q/xf/K/8+/zL/Uf+E/5D/kv+z/8j/sv+m/5X/if+D/2D/af9y - /1z/bv99/33/gf+G/4r/kP+b/6b/n/+e/6//ov+j/6j/lf+Y/47/hP99/2z/cv92/3X/kf+p/7j/ - 0f/t//v/7v/2//n/2/+9/6v/lP+E/37/eP+M/7H/xv/S//X/+f/3/wAA9v/1/9P/zv/n/8n/tv/X - /9f/xv/K/+H/6v/n/xIAJgAsADcAMgAuAA8A9v/p/8r/uf+h/5n/qf+k/7j/2f/6/wcABAAqACsA - FAAjABsACgD5/+7/7//d/8v/yf/m//n/AwAnAEAARQBFAD4AMwAVAO7/6P/Q/7X/vP/G/8z/2//4 - /wUAFwAeABsAIQAWAAYA+v/y/97/y//J/8X/xP/E/9b/8v/7/w8ALAA2ADUAKwAqABsA9f/Z/9D/ - yP+6/8X/4v/6/wMAIABCAEIAOQBBADoAGQAMAP7/9//v/+L/7P/1//3/BQAWACcAKAAzADUAMQAr - ABoAEQAHAPP/6P/r/+n/6v/y//z/FQAdACIANQBEAEQAPQBAACwAHQAUAAUAAAD6//r/BgAXACEA - OgBXAGsAdwB3AHMAYQBBAB8AEwD2/+H/7f/q//n/EgAkAD8AUwBcAGQAWwBKADIAFQD+/+P/2P/N - /83/2//h//r/EAAgADYASABNAEgASgA5ACEACgDp/9v/0f+7/8P/4f/x/wQALQBDAE0AWQBYAEgA - JAAGAO7/zv+x/7L/u//B/+T/DQArAE0AYwBrAG0AWQA5AB8ABADh/8f/xf/M/9L/6v8SADcARwBV - AGgAWAA7ACQADQDz/9T/y//c/+f/7P8NADYAQwBHAFoAXQBEACgAIwAVAPb/9f8EAAoADQAeADcA - QAA6ADwAQAAvABwAFwAQAAgAAAAGABYAEgAYACwAMAAoACQAIgATAAgAAwD//wIABgAPABoAJwAy - ADMANwA/ADIAJwAjABwAEAAHABYAFwAXACwANQA3ADwAPAAzAC0AKAAcABUAFQAXABYAFwAgACMA - GwAgACgAHQAbACEAIQAjACYALAArACYAIwAjAB4AGAAZAB0AIAAmACwAMgA3ADYANAAxACwAHwAa - ABkAFQAVABkAJAAsAC8AMgA4ADkAKwAgACAAGQAMAAIACgAXABEAFAAuADcAKgArADgAKAAKAAcA - CQD4/+r/9f8GAAYADwAsADYAMQA7ADkAJAAXAA4A/v/x//L///8GABMAMwBHAEsAVABXAEUAMQAb - AAcA+v/t/+3/+f8GABQAJwA1AEEAQwA2ADAAIgAKAPz/9//z//H/+/8HABQAHQAnADEAMgAxACsA - JwAfABcAEQAOAA4ADgASABsAIQAjACsAMwA0AC8ALgAuACQAGwAbABoAFgAWAB0AIwAkACkALQAv - ACwAJwAmACAAHgAZABgAIgAgACAAKAAvACoAJgAnACIAGwATABgAGAAVABsAJAAnACUAKQAsACgA - IQAgAB0AGwAYABwAIAAhACQALQAvACsAMQA0AC4AKgAsACkAIwAgACYAJgAeACcALgAqACwAMwA3 - AC4ALgAyACcAIQAiACIAHAAcACMAJwApAC4AOAA1ADMANwA0ACsAJwAmACAAIAAjACUAKQAvADMA - NgA6ADoAOQA2ADIAMAArACkAJgAjACYAJwAmACkALgAxADAAMgA0ADIALwAuACoAJwAmACAAIwAm - ACUAKQAvADQAMwAzADYANQAwAC4ALAAmACUAJgAlACUAJgArACoAJQAqACsAJgAjACQAIwAgACIA - IgAhACQAIwAlACMAIwAiACEAIwAkACMAIwAoACcAJwAmACUAJQAhACEAHwAfAB8AHwAdAB4AIAAg - AB8AIAAgAB8AHwAhACAAHwAhACEAHwAfAB4AHgAeAB0AHgAhACAAIAAhACEAIAAeAB0AHAAaABgA - GAAWABYAGAAXABcAFwAYABYAFQAWABQAEwARABMAEwATABUAFQAWABYAFgAWABQAFAAVABMAEQAV - ABQAFAAWABMAEwAUABIADwAOAA4ADAAKAAsACwANAAwACgALAAsACAAHAAgABwAGAAYABwAHAAkA - CgAKAAoACwAKAAYABwAHAAUABgAFAAYABgAHAAgABwAIAAgABQAEAAQAAQAAAAAAAAAAAAEAAgAB - AAUABQAFAAcABAACAAAAAQD///3///8AAAAAAQACAAQABQADAAUABAAAAP/////8//v/+v/8//z/ - /f///wAAAAAAAAAA/f/9//3//P/6//v/+//5//3//v/7////AAD///////8AAP///v/+/////f/7 - //3//f/7//v//f/9//v/+//7//r/+v/4//n/+f/4//j/+f/4//r/+v/6//n/+P/5//n/9v/4//n/ - +P/6//r/+//7//z//P/6//v/+f/6//j/+P/6//j/+v/7//v/+v/6//n/+f/6//f/9//4//b/9f/2 - //b/+P/2//f/9//2//X/9P/1//X/8//1//T/8v/0//X/9P/1//T/9v/1//T/9f/2//X/9f/2//X/ - 9v/2//P/9v/2//T/9f/2//X/9P/1//b/9v/1//X/9v/2//X/9P/2//b/9P/0//b/9P/z//X/9f/1 - //X/9f/2//T/9f/1//T/9P/0//P/9P/1//X/9P/1//b/9v/2//X/9v/1//T/9P/z//P/9P/y//T/ - 9v/1//P/9//2//X/9P/2//b/9P/0//T/9f/0//T/9f/1//b/9v/2//b/9v/2//X/9v/3//X/9v/2 - //X/9f/1//X/9v/1//b/9v/2//b/9v/0//T/9P/1//T/9P/1//X/9f/2//f/9v/3//f/9//3//b/ - 9v/3//f/9//4//j/+P/5//r/+P/5//j/+f/4//f/+P/3//b/9//4//f/9//4//f/+P/4//j/+P/3 - //f/+P/4//j/+f/5//j/+v/6//j/+v/6//v/+v/7//z/+//8//z//f/9//3//f/+//3//f/+//3/ - /f/9//7//v/9/////v/+//////////////////7/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAEAAAAAAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAIA - AQACAAIAAQABAAIAAQABAAIAAgACAAIAAgACAAMAAwADAAMABAAEAAMABAAEAAMABAAFAAQABAAF - AAUABgAGAAYABgAGAAYABwAHAAYABwAHAAcACAAHAAgACAAIAAgACQAIAAkACAAJAAkACgAJAAkA - CQAKAAoACQAKAAkACgAKAAsACwAMAAsACwAMAAsADAAMAAwADQANAAwADQANAA0ADQANAA8ADgAO - AA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPABAADwAQABAAEAAQABAAEAAQAA8AEAAPABAAEAAQABAA - EAARABEAEQARABIAEQARABIAEgASABIAEwATABMAFAAUABQAFAAVABUAFQAVABUAFQAVABUAFgAV - ABUAFgAXABYAFwAXABcAFwAYABgAFgAXABgAFwAXABgAGAAYABgAGAAYABkAGAAZABkAGAAYABkA - GQAZABkAGQAZABkAGQAaABkAGQAZABkAGQAZABkAGQAaABoAGgAaABoAGgAaABoAGgAaABkAGQAa - ABoAGQAaABoAGgAaABoAGQAaABoAGQAZABoAGgAZABkAGgAaABkAGgAaABoAGgAaABoAGQAaABoA - GgAaABoAGgAaABsAGgAaABsAGwAaABsAGwAaABsAGwAbABsAGgAbABsAGgAaABoAGgAaABoAGgAa - ABkAGQAZABkAGQAZABgAGAAYABgAGAAYABgAGAAYABcAGAAXABcAFwAXABYAFgAXABYAFgAWABYA - FgAWABYAFQAVABUAFQAUABUAFAAUABQAFAAUABMAEwATABMAEwATABMAEgASABIAEgASABIAEQAR - ABEAEQARABAAEAARABAAEAAQABAAEAAQABAAEAAQABAAEAAQAA8AEAAPAA8ADwAPAA8ADwAPAA4A - DwAPAA4ADgAOAA4ADgAOAA4ADgANAA0ADQANAA0ADQANAA0ADQAMAAwADQAMAAwADAAMAAwADAAM - AAwADAAMAAsADAANAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwACwALAAwACwALAAsA - CwALAAsACwALAAsACgALAAsACgAKAAoACgAKAAoACgAKAAoACgAKAAoACQAKAAkACgAJAAoACQAK - AAkACgAJAAoACgAJAAkACQAJAAkACQAJAAgACAAIAAgACAAHAAcABwAHAAcABgAGAAYABgAGAAYA - BgAFAAUABQAFAAQABAAEAAQABAAEAAQABAADAAMAAwADAAIAAgADAAIAAgACAAEAAQABAAEAAQAB - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////v/+//7//v/+//7//f/9//3/ - /f/9//3//f/9//z//P/9//z//P/8//z//P/8//z//P/8//v//P/8//v/+//8//v/+//7//v/+//7 - //v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v//P/7//v/+//7//v/+//7//v/ - +//7//v//P/7//v//P/7//v//P/7//v//P/8//v//P/8//z//P/8//z//P/7//z//P/7//z//P/8 - //z/+//8//v/+//8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/9//z/ - /P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8 - //z//P/9//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//v//P/8//v/+//8//v/+//7//v/ - +//7//v/+//6//v/+//6//r/+v/6//r/+v/6//r/+v/6//r/+v/6//n/+v/6//r/+v/5//n/+v/5 - //n/+f/5//n/+f/5//n/+f/4//n/+f/4//j/+P/4//j/+P/4//j/+P/4//j/+P/4//j/+P/3//j/ - +P/3//f/9//3//f/9//3//f/9//3//f/9//3//j/9v/3//b/9//2//f/9v/3//f/9//3//b/9//2 - //f/9v/3//b/9v/3//f/9f/3//b/9//2//f/9v/2//b/9v/2//b/9f/3//X/9v/3//b/9//1//f/ - 9v/2//b/9//2//b/9v/3//X/9//1//b/9v/2//b/9v/2//f/9v/3//b/9v/2//b/9//2//b/9//2 - //b/9v/2//b/9v/2//b/9v/2//b/9v/3//f/9//3//b/9//2//f/9v/3//f/9//2//j/9v/3//f/ - 9//3//j/9//4//f/9//3//f/9//3//f/9//3//f/9//3//j/+P/4//f/+P/3//j/+P/4//f/+f/3 - //j/+P/4//j/+P/4//j/+P/4//j/+P/4//f/+P/4//j/+P/4//j/+P/4//j/+P/4//j/+P/5//j/ - +P/4//j/+f/4//n/+f/4//j/+f/5//n/+f/5//j/+f/5//j/+f/5//n/+f/5//n/+f/5//n/+f/5 - //n/+f/5//n/+f/5//n/+f/5//n/+f/5//n/+P/5//n/+P/5//n/+f/5//n/+f/5//n/+P/5//n/ - +P/6//n/+f/6//j/+f/5//n/+f/5//n/+f/5//n/+f/5//n/+f/5//n/+f/5//r/+f/5//r/+f/5 - //r/+f/6//r/+v/6//r/+v/6//r/+f/6//r/+v/6//r/+v/6//r/+v/6//r/+v/6//r/+v/5//r/ - +f/5//r/+f/6//r/+v/6//r/+v/6//r/+v/6//r/+v/5//r/+v/5//r/+v/6//r/+v/7//r/+v/7 - //r/+v/7//r/+v/7//v/+//7//v/+//7//v/+//7//v/+//8//v/+//8//v/+//8//v//P/8//z/ - /P/8//z//P/8//z//P/8//3//P/9//3//f/9//3//f/9//3//f/9//3//f/+//3//f/+//3//v/+ - //7//v/+//7//v////7//v////7//////////////////////wAAAAD//wAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAQABAAAAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAgABAAEAAQABAAEAAgABAAIAAgABAAIAAgACAAIAAgACAAIAAgACAAIA - AgACAAIAAgADAAIAAgADAAMAAgADAAMAAwADAAMAAwADAAMABAADAAMABAAEAAMABAAEAAQABAAE - AAQABAAFAAQABAAEAAQABQAFAAQABQAFAAUABQAFAAUABQAFAAUABgAGAAUABgAGAAYABgAGAAYA - BgAGAAYABgAHAAYABgAHAAYABwAHAAcABwAHAAcABwAIAAcACAAIAAcACAAHAAgACAAIAAgACAAI - AAkACAAJAAkACQAJAAkACQAIAAkACQAKAAkACgAJAAoACQAKAAkACgAKAAoACgAKAAkACgAKAAoA - CgAKAAoACgALAAsACgALAAsACwALAAsACwALAAwADAAMAAwADAAMAAwADAANAA0ADQANAA0ADQAN - AA0ADQAOAA0ADgAOAA4ADgAOAA4ADgAPAA8ADgAPAA8ADwAPAA8ADwAPAA8AEAAPABAAEAAQABAA - EAAQABAAEAARABAAEAARABAAEAARABEAEQARABEAEQARABEAEQARABEAEQASABEAEgASABIAEgAS - ABIAEgASABIAEgASABIAEgASABIAEgATABIAEwATABMAEwATABMAEwAUABMAEwAUABQAFAAUABQA - FAAVABQAFAAVABUAFQAVABUAFQAVABYAFgAWABYAFgAWABcAFgAXABYAFgAXABcAFwAXABcAFwAX - ABcAFwAXABcAFwAXABcAGAAYABcAGAAYABgAGAAYABcAGAAYABgAGAAYABgAGAAYABgAGAAZABcA - GAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGQAYABgAGQAZABkAGAAZABgAGAAZABgAGAAZ - ABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAaABoAGQAaABkAGgAaABkAGgAaABkAGgAaABoA - GgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABsAGgAb - ABoAGwAaABoAGgAbABoAGwAbABsAGgAbABsAGwAbABsAGgAcABsAGwAbABwAGwAcABsAGwAbABwA - GwAcABsAHAAcABwAHAAcABsAHAAcABwAGwAdABwAHQAcAB0AHAAdABwAHQAcABwAHAAdABwAHAAc - AB0AHAAdABwAHAAcABwAGwAcABsAHQAcABwAHAAdABwAGwAcABwAHAAcABwAHAAcABwAHAAcABsA - HAAbABwAGwAcABsAHAAcABwAGwAcABsAHAAbABwAGwAbABsAHAAcABwAGwAcABsAHAAdABsAHAAc - ABwAHAAcABwAGwAcABsAGwAbABsAGgAcABsAHAAbABsAGgAcABsAGwAbABwAGgAbABsAGwAbABsA - GgAbABsAGwAbABsAGwAcABsAGwAcABsAGwAcABsAHAAcABsAGwAcABsAGwAcABsAGwAbABsAGwAb - ABsAGwAbABsAGwAbABsAGgAbABoAGwAaABsAGwAbABsAGgAbABoAGgAaABoAGgAaABoAGgAaABoA - GgAaABoAGgAaABkAGgAaABoAGgAZABoAGgAaABkAGgAaABoAGgAaABoAGQAaABkAGQAaABkAGQAZ - ABkAGQAaABkAGQAaABkAGQAaABkAGQAZABkAGQAZABkAGQAZABkAGQAZABgAGQAZABgAGQAZABgA - GAAZABkAGAAZABkAGQAZABgAGAAZABkAGAAZABkAGAAZABkAGAAYABkAGQAYABgAGAAYABgAGAAZ - ABgAGAAZABgAGAAZABcAGAAYABgAGAAYABgAGAAYABgAGAAYABcAGAAYABgAGAAYABgAFwAYABgA - FwAXABgAGAAXABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAZABgAGAAYABgAGAAYABgAFwAY - ABgAGAAYABgAGAAYABgAFwAYABgAGAAYABgAGAAYABcAFwAYABgAFwAYABcAFwAXABcAFwAXABgA - FwAWABcAFwAXABcAFwAWABcAFwAXABYAFwAXABYAFgAXABYAFgAWABYAFgAXABYAFgAWABYAFgAW - ABUAFgAWABUAFQAWABYAFQAXABUAFQAXABUAFQAVABYAFQAVABUAFQAWABUAFQAWABUAFgAVABUA - FgAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFAAVABUAFQAWABUAFQAU - ABUAFQAVABUAFQAUABUAFAAUABUAFAAVABQAFAAVABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQA - FAAUABQAFAAUABMAFAAUABMAEwAUABQAEwATABMAFAAUABMAFAATABQAFAATABMAFAATABMAFAAU - ABMAFAATABMAEwATABMAEwATABMAEwATABIAEwATABIAEwATABIAEwATABIAEgATABIAEgATABIA - EgATABIAEgASABMAEgASABIAEwASABIAEgASABIAEgASABIAEgATABEAEgASABEAEgASABIAEgAR - ABIAEQASABIAEQARABIAEgASABEAEQASABEAEQASABEAEAASABEAEAASABEAEQARABAAEQARABAA - EQARABEAEAASABAAEQARAA8AEQARABAAEAARABAAEAARABAAEQAQABAAEQARABAAEAARABEAEAAQ - ABEAEAAQABEAEAARABEAEAAQABAAEAAQABAAEAAQABAAEAARABAAEAAQABAAEAAQABAAEAAQABAA - DwAQABAAEAAPAA8ADwAQAA8ADwAPAA8ADwAPAA8ADwAOAA8ADwAOAA8ADwAOAA8ADgAOAA4ADgAO - AA4ADgAPAA4ADgAOAA0ADQAOAA4ADgANAA0ADgANAA0ADgANAA0ADQAOAA0ADAAOAAwADQAOAA0A - DQANAA0ADQANAA0ADQAOAA0ADAANAA0ADAAMAA0ADQANAA0ADQANAAwADQANAAwADQAOAA0ADAAN - AA0ADQANAAwADQANAA0ADQANAA0ADQANAAwADQAOAAwADQANAA0ADQANAA0ADQANAA0ADQAOAA0A - DQAOAA0ADQANAA0ADQANAA4ADQANAA4ADQANAA0ADQANAA0ADgANAAwADQANAAwADQANAA0ADAAN - AA0ADAANAA0ADQAMAAwADQAMAAwADQANAAsADAANAAwADAALAAwACwALAAwACwALAAwACgALAAoA - CwAKAAoACgAKAAkACgAJAAoACQAKAAkACAAJAAkACAAIAAgACAAIAAgACAAIAAcABwAHAAYABwAH - AAYABgAHAAUABQAGAAQABQAFAAQABQAEAAQABAAEAAMAAwAEAAMAAgACAAIAAgACAAEAAQABAAIA - AQAAAAEAAAABAAAAAAABAAAAAAAAAP//AAD//////////////v8AAP7//v////3//v/9//3//f/9 - //3//P/9//7//P/7//z//P/7//v/+//7//r/+//6//r/+v/6//v/+f/6//v/+P/6//n/+f/5//j/ - +v/5//j/+f/5//j/+P/4//j/9//4//j/9v/3//f/9//3//f/9//3//f/9//3//b/9//3//f/9//2 - //f/9v/3//f/9//2//f/9//3//X/9//2//f/9f/3//b/9f/2//f/9v/1//b/9v/1//b/9v/1//b/ - 9f/1//X/9f/0//X/9P/1//X/9P/1//T/9P/2//T/9P/1//T/9P/0//T/9P/0//T/9P/0//T/9P/z - //P/9P/0//P/8//0//P/8//z//P/8//0//L/8//z//P/8//z//P/8//z//L/8//z//L/8v/z//P/ - 8v/y//L/8v/y//L/8f/y//H/8f/x//L/8f/w//L/8P/x//H/8P/w//D/8f/x/+//8f/w//D/8P/w - //H/8P/v//D/7//v/+//7//u/+7/7//t/+7/7v/u/+//7f/u/+z/7f/s/+z/7f/r/+z/7P/s/+z/ - 6//t/+v/6//r/+r/6v/q/+r/6//p/+n/6f/o/+n/6f/o/+n/6P/o/+j/5//n/+f/5//n/+b/5//n - /+b/5//m/+b/5v/m/+b/5f/l/+X/5P/l/+T/5P/j/+T/4//k/+T/5P/k/+P/5P/j/+H/4//i/+P/ - 4v/i/+L/4v/j/+H/4f/i/+D/4f/g/+D/4P/g/+D/3//f/+D/3//f/9//3v/f/97/3f/e/97/3v/e - /97/3v/c/97/3f/c/9z/3P/d/9v/3P/d/9v/3P/b/9v/2//a/9v/2v/a/9v/2v/a/9v/2v/a/9v/ - 2v/b/9r/2//a/9r/2v/a/9v/2f/a/9v/2f/b/9n/2v/Z/9n/2f/Z/9n/2P/Z/9n/2P/Z/9j/2P/Y - /9j/2P/Y/9j/2P/X/9j/1//Z/9j/2P/X/9f/2P/X/9f/2P/X/9f/1v/X/9b/1//W/9X/1f/W/9X/ - 1f/V/9T/1f/U/9b/1v/U/9X/1P/W/9T/1f/V/9T/1P/T/9T/1v/U/9X/1f/T/9X/0//V/9T/1P/X - /9P/1v/U/9T/1f/T/9X/1f/V/9X/1f/X/9b/1v/V/9X/1v/U/9X/1v/V/9b/1f/V/9X/1P/V/9T/ - 1f/U/9T/0//U/9X/0//V/9P/1P/U/9P/0//U/9P/0//U/9P/1P/T/9P/1P/U/9P/0//U/9P/0//T - /9P/0//T/9T/0v/U/9L/0//U/9P/0v/U/9P/0//T/9T/0//T/9T/0//U/9P/0v/T/9H/0//S/9P/ - 0//T/9P/0v/U/9L/0v/T/9H/0v/S/9P/0//S/9T/1P/T/9P/0//T/9P/0//T/9L/0//S/9L/0v/S - /9P/1P/S/9P/0//S/9L/0f/U/9L/0//V/9L/0//T/9P/0//T/9P/0//U/9P/1P/U/9P/1P/U/9P/ - 0//U/9P/0v/V/9P/1P/U/9T/1P/V/9T/1f/V/9X/1f/U/9X/1f/V/9X/1f/U/9X/1v/V/9T/1f/V - /9b/1f/V/9X/1f/X/9T/1f/Y/9X/1f/X/9X/1v/W/9b/1v/X/9f/1v/Y/9b/1//X/9b/1//X/9b/ - 1f/W/9f/1//W/9j/1//W/9j/1//X/9j/1v/Y/9j/2P/Y/9f/2f/Y/9j/2P/Z/9j/2P/Y/9j/2f/Y - /9n/2P/Y/9n/2f/Z/9n/2P/Z/9r/2P/Z/9n/2v/Z/9r/2v/a/9n/2f/a/9r/2f/c/9r/2v/b/9n/ - 2v/a/9z/2//a/9z/2//b/9v/3P/a/9v/3P/b/9z/3P/c/9z/3P/e/9z/3f/c/93/3P/c/97/3P/d - /93/3f/e/9z/3v/d/93/3P/e/93/3f/e/93/3f/e/93/3v/d/93/3v/e/97/3v/g/9//3//g/9// - 4P/f/+D/4P/g/+D/4P/g/+D/4f/g/+H/4P/h/+D/4f/h/+D/4v/h/+L/4f/i/+L/4f/i/+H/4v/j - /+L/4//i/+L/4//h/+P/4v/h/+X/4v/i/+P/4v/j/+L/4v/j/+P/4v/k/+L/5P/k/+T/5P/j/+T/ - 5P/i/+X/4//l/+T/5f/m/+T/5v/m/+P/5v/l/+X/5P/l/+X/5v/m/+X/5v/l/+b/5//k/+b/5v/m - /+X/5v/o/+b/5//m/+b/5//l/+X/5v/m/+b/5//n/+X/5v/n/+X/5//o/+f/5//n/+f/5//n/+f/ - 5//o/+b/5//o/+b/5v/m/+f/5v/m/+b/5//l/+b/5//k/+f/5v/m/+b/5//o/+T/6P/o/+b/5//o - /+j/5//n/+j/6P/o/+r/5//n/+j/6f/o/+f/6P/o/+n/5//p/+j/5//p/+n/5//r/+n/5//p/+f/ - 6//p/+n/6f/q/+n/6f/r/+n/6v/q/+n/6//r/+j/6f/r/+j/6v/r/+r/6//r/+n/7P/s/+v/6v/s - /+3/6//s/+3/6//r/+3/7P/t/+3/7P/t/+v/7f/t/+z/7P/t/+z/7f/t/+z/7f/s/+3/7P/t/+z/ - 7P/t/+3/7P/s/+7/7P/s/+3/7P/v/+z/7f/t/+3/7f/s/+7/7f/t/+3/7//s/+3/7//s/+7/7f/u - /+3/7f/v/+3/7f/w/+7/7v/v/+3/7//v//D/7//u/+3/8P/u/+7/8P/u/+//7//v/+7/7v/x/+7/ - 7//x/+//8P/w//D/8P/v//D/7//w//H/7//w//H/8P/v//H/8f/w//D/8v/x//D/8v/x/+//8f/z - //H/8f/z//D/8v/z//L/8//z//L/8v/0//P/8//0//P/9P/z//L/8//z//T/8//z//X/9P/0//T/ - 9P/1//T/9P/2//P/8//2//T/9f/0//b/9P/1//b/9P/1//f/9f/1//X/9//2//X/9v/3//T/9//3 - //b/9v/3//f/9//3//f/9//3//b/9//1//f/9//3//b/9//3//f/9//2//f/+P/1//j/9//2//f/ - 9v/4//b/9//3//b/9//3//b/9//3//j/9f/3//j/9v/2//j/9v/3//f/9//2//f/9//4//j/9//4 - //b/+P/4//j/+P/5//f/9//6//j/+P/5//f/+P/4//j/+f/5//j/+P/7//n/+f/5//n/+v/6//r/ - +f/6//v/+v/6//v/+v/7//v/+f/8//r/+//9//r//P/7//z//P/9//z/+/////v//f////z//v/+ - //7//v/+//7//f/+/wAA///+/wAA/////wAAAAAAAAAAAAAAAAEAAAAAAAIA//8CAAIAAAACAAEA - AgACAAEAAgADAAIAAwADAAIAAwADAAMAAwAEAAUAAwAEAAUABAAFAAUABAAFAAYABQAGAAUABgAG - AAUABwAHAAcABgAGAAgACAAIAAcACAAIAAgACAAIAAoACAAKAAkACAAKAAoACQAKAAoACwAKAAsA - DAAKAAsADAALAAwACwALAA0ADAANAA0ADQAPAAwADAAQAA0ADQAPAA8ADwAPAA4AEAAQABAAEAAQ - ABAAEQAPABAAEgASABAAEQARABIAEQASABIAEwATABEAEwATABMAFAATABMAFQAVABMAFAAWABQA - FAAXABUAFQAVABYAFgAXABcAFgAYABgAFgAYABkAGAAYABkAFwAZABoAGAAZABkAGgAaABoAGwAb - ABsAGwAaABwAHAAbABwAHQAcAB0AHQAcABwAHQAdAB0AHQAdAB0AHQAeAB0AHgAeAB0AHgAdAB0A - HgAfAB0AHgAgAB4AHgAeAB0AHgAfAB4AHwAfAB4AHwAfACAAIAAfAB8AIAAgAB8AIAAgACAAIAAh - ACAAIQAiACAAIQAiACIAIQAhACIAIgAiACEAIgAjACIAIgAjACMAIgAkACMAIwAlACIAJQAlACIA - JAAkACQAJAAlACQAJAAmACMAJAAlACQAJgAlACUAJAAlACYAJAAmACYAJQAmACYAJQAmACYAJgAm - ACYAJgAmACcAJgAmACgAJgAnACYAJgAoACYAJwAoACcAJwAnACcAJwAnACgAJwAnACgAJwAnACgA - JwAoACgAJwAoACgAKAAoACgAJgApACgAJwApACcAJwAqACgAKAAoACgAKAApACgAKAApACgAKAAp - ACgAKAAoACcAKAAoACkAKQAoACgAJwApACcAKAAnACcAKAAmACcAKAAnACYAJQAmACcAJwAmACUA - JgAnACUAJgAmACUAJgAkACYAJgAmACUAJgAmACQAJQAlACUAJQAkACUAJgAjACQAJAAkACUAIwAl - ACMAJAAmACEAJAAkACIAJAAiACQAIwAjACMAIgAkACIAIgAiACIAJAAhACEAIgAiACEAIAAhACEA - IAAhACAAIAAgACAAHwAgACAAHwAfAB4AHwAgAB4AHgAfAB4AHgAeAB4AHgAeAB0AHQAdAB0AHAAe - ABwAHAAcABwAGwAcABsAGwAbABsAGQAbABoAGgAbABoAGQAaABkAGQAZABkAGAAZABkAGAAYABcA - GAAXABgAFwAXABcAFQAXABYAFwAWABUAFgAVABYAFgAVABUAFQAVABQAFQAUABQAFAAUABQAFAAU - ABMAEwASABQAEwASABIAEwATABEAEQATABEAEQASABAAEQARABAAEQAQABAAEAAQAA8AEAAQAA4A - EAAPAA4AEAAQAA0ADQARAA0ADgAOAA0ADgAOAA0ADAAMAAwADAAMAAwADAALAAwACwAKAAsACwAK - AAoACgAKAAkACgAKAAoACQAKAAcACAALAAYABwAIAAcABwAGAAYABgAHAAUABQAGAAQABQAFAAQA - BAAFAAMAAgADAAMAAgABAAQAAQAAAAIAAQAAAAAAAAAAAAAAAAD//////////////v8AAP7//v/+ - //3//v/9//7//P/8//z//f/7//z/+//7//z/+v/7//r/+//6//r/+v/6//r/+P/7//r/+P/5//n/ - +P/6//j/+f/4//n/9//3//j/+P/2//f/+P/2//f/9//3//f/9//3//f/9v/3//b/9v/3//f/9v/2 - //f/9f/2//X/9v/1//b/9v/2//b/9f/2//X/9f/4//X/9P/2//X/9f/1//b/9v/1//b/9P/2//X/ - 9f/2//T/9v/0//b/9f/1//X/9f/0//X/9f/1//X/9P/1//T/9f/1//P/9v/0//b/9P/2//X/9f/2 - //X/9f/2//X/9//1//b/+P/0//j/9f/0//f/9f/1//f/9f/2//b/9f/2//f/9f/3//f/9v/2//b/ - 9//2//j/9v/2//j/9//3//f/9//4//b/+P/3//f/9//4//f/+P/3//f/+f/4//f/+f/4//j/+f/2 - //n/+f/4//f/+P/5//f/+f/4//n/+v/4//n/+f/4//n/+P/6//j/+f/6//n/+f/6//n/+v/6//n/ - +v/6//r/+v/7//r/+v/7//r/+//6//z/+//7//z//P/7//z//f/6//3//P/8//3//P/+//v//f/+ - //z//f/8//7//f/8//7//f/+/////f/+//7///////7//v8AAP///v8AAP////8AAAAA/f8AAAAA - //8AAAAAAQAAAAAAAAACAAEAAAACAAEAAQACAAEAAgADAAEAAQAEAAEAAwAFAAIABQAEAAIABgAG - AAUABAAGAAcABQAFAAgABgAFAAcABQAIAAcABwAJAAcACQAJAAkABwALAAkACgAKAAoACwALAAsA - CwALAAwADAAMAA0ADAAMAA8ADgANAA8ADgAQAA4AEAAQABAAEAAQABEAEQARABIAFAASABMAFQAS - ABQAFAAVABUAFQAWABQAFgAXABYAFwAYABcAGAAYABkAGgAaABkAGwAbABsAHQAcABwAHQAeAB0A - HQAfAB0AHgAgAB8AHwAfACAAIQAgACIAIgAiACMAIgAjACUAJAAjACUAJgAmACQAJgAnACUAJwAo - ACYAJwAqACgAJwApACcAKQApACgAKgAqACkAKgArACoALAAsACsALQAsACsALQAtAC4ALQAuAC8A - LgAvAC4ALgAvAC4ALwAxAC8ALwAxADAAMQAvADEAMAAwADEAMAAwADIAMQAxADEAMwAyADEAMgAz - ADEAMwAzADMAMgAzADMAMwAzADMAMwAyADIANAAyADMANAAzADIAMgA0ADMAMwAzADQAMwAxADQA - MwAzADMAMwA0ADIAMwA0ADIAMgAzADIAMwAzADIAMgAzADMAMQAyADMAMwAzADMAMwAzADMAMwA0 - ADIAMwA0ADIAMwA0ADMAMwA0ADIAMwA1ADIANAAzADIAMwAzADMANAA0ADIAMwA0ADMAMgAyADMA - NAAzADMAMgAzADMAMgAzADMAMwAzADIAMQA0ADEAMgA0ADEAMwAyADMAMwA0ADMAMQA0ADEAMwAz - ADEAMwAyADIAMgAyADMAMQAyADMAMgAxADIAMgAxADEAMQAyADEAMgAxADIAMQAxADIALwAxADEA - LwAxAC8AMQAwAC8ALwAxAC8ALwAvAC8ALwAvAC4ALwAwAC8ALgAuAC8ALgAvAC8ALgAvAC4ALgAv - AC4ALwAvAC0ALgAuAC8ALQAtAC0ALQAuACwALgAtACwALQAtAC4ALQAtAC0ALAAtAC0ALQAsACwA - LgAsAC0ALQArAC0ALAAsAC0ALAArAC0AKwAsACwAKwAuACoAKwAuACsAKwAsACwAKwArACsALAAs - ACsAKwAsACsALAAqACoALAArACoAKgAqACsAKgAqACoAKwArACkAKgArACkAKgAqACkAKgAqACgA - KQArACkAKQArACkAKQApACkAKQAqACkAKAAqACkAKAAqACoAKQApACoAKAApACoAKQApACoAKQAq - ACkAKQAqACoAKQAoACoAKgAoACkAKQAoACkAKQAoACgAKgAoACgAKAApACkAJwAqACYAKQAoACYA - KAAnACcAJwAoACUAJgAoACUAJgAmACUAJgAmACUAJgAlACUAJQAkACYAJQAkACUAJQAlACMAJAAk - ACQAJAAkACIAIwAlACMAIgAkACQAIwAjACMAIwAkACIAIgAjACIAIgAjACIAIgAjACIAIQAjACAA - IwAiACAAIgAhACIAIQAiACEAIQAjACAAIQAhACAAIgAhACEAIAAgACEAHwAgACAAIAAgACAAHwAg - AB8AHwAgAB8AHwAfACAAHgAfACAAHgAfAB8AHgAfAB0AHgAfAB0AHgAeAB4AHQAdAB8AHQAdAB0A - HAAcAB4AHAAdAB0AHAAdABwAGwAdABwAGwAdABwAGwAcABsAHAAdABsAGwAcABsAGgAcABsAGwAc - ABsAGwAbABoAGwAbABkAGgAaABsAGgAaABoAGQAbABoAGgAZABkAGwAYABkAGQAZABkAFwAYABkA - GQAYABcAFwAZABgAFwAYABcAGAAWABgAGAAXABcAGAAYABYAFwAWABgAFwAWABgAGAAVABcAFgAW - ABgAFQAYABUAFgAZABMAFwAWABUAGAAVABYAFgAWABYAFQAXABUAFgAVABYAGAAVABUAFgAWABYA - FAAWABUAFAAWABUAFQAVABUAFAAVABUAFAAWABQAFAAWABQAFAAWABUAFQAVABQAFgAVABUAFQAV - ABQAFAAWABUAFAAVABQAFAAVABQAEwAVABQAEwAVABQAEwAUABQAEwAUABQAFAATABQAEwAUABMA - EwATABIAEwASABMAEwATABMAEQATABIAEwATABEAEwARABMAEgARABIAEgASABEAEgARABEAEQAR - ABEAEQARABEAEQARABIAEgAQABEAEQARABAAEAATAA8AEAASABAAEQARABAAEQARABAAEQARABAA - EQASAA8AEQARABAAEQASAA8AEAATABAAEAASABAAEAARABEAEAAQABEAEAARABEAEAARABIAEQAP - ABEAEgARABAAEAARABEADwARABAAEAASAA8ADwATAA4ADwASAA8AEQAQABAAEAASABAAEAASAA8A - EQARABAAEAARABAADwAQABEAEAAPABIAEQAPABIAEQARABAAEAARABEAEQAQABEAEQARABEAEAAT - ABIAEQARABEAEQARABIAEAARABIAEgASABIAEgARABIAEQASABIAEgARABIAEgASABEAEAATABIA - EAATABEAEgASABEAEgASABMAEQAQABMAEgARABIAEwARABIAEgASABMAEgATABIAEQAUABMAEgAS - ABMAEgATABQAEgATABMAFAAUABMAFAAVABMAEgAWABQAEwAWABMAEwAXABQAFAAVABUAFQAUABUA - FQAXABYAFQAWABYAFwAVABcAFwAWABcAFwAXABcAGAAXABcAGAAZABcAGQAZABgAGgAZABoAGQAa - ABoAGgAcABoAGwAcABsAHAAaABwAHQAbAB4AGwAcAB4AGwAcAB0AHAAdAB0AHAAeAB4AHAAeAB0A - HgAeAB4AHgAeAB8AHgAeACAAHwAfAB8AIAAhAB4AIAAhAB8AIQAiACEAIQAhACEAIgAiACAAIwAh - ACIAJAAhACMAJAAjACMAIwAlACIAJAAjACQAJQAjACQAJAAlACQAJAAmACQAJQAmACUAJQAmACYA - JgAmACUAJgAmACYAJwAoACcAJwAoACcAJwAnACkAJwAnACgAKAAoACgAKQAnACoAKAAoACkAKQAq - ACcAKQApACgAKQAoACoAKQAoACkAKAApACoAKAAoACkAKgAqACgAKAArACoAKAArACkAKQAqACoA - JwArACoAKAAqACkAKgApACkAKQAsACoAKQArACkAKgAqACgAKgArACkAKQArACkAKgArACkALAAq - ACgALAArACoAKQArACwAKQAqACwAKQApACsAKQAsACkAKgArACkAKwArACoAKQAsACsAKwArACoA - LAAqACsAKgArACsAKwArACwAKgAqAC0AKwArACsAKwAsACoALAAsACwAKwAsACwAKwAsACwALQAr - ACwALQArACwALAAtACwALAAtACsALAAtACsALAAsACsALAAsAC0ALAAsACwALQAsACwALQAsACwA - LAAuACwALAAvACwALQAvAC0ALQAtAC4ALgAtAC4ALQAuAC4ALAAuAC8ALQAsAC4ALgAuACwALgAv - ACwALgAuACwALQAvAC0ALQAuACwALQAuAC0ALQAuAC0ALQAuAC0ALQAuAC0ALQAtACwALQAtAC0A - LAAsAC0ALQAtACwALAAtACsALAAuACsAKwAtACwAKwArACwAKwAqACwAKQAqACsAKgApACoAKgAq - ACgAKQApACcAKQApACgAJwAnACgAJwAnACYAJwAmACUAJwAlACUAJgAlACQAJAAlACQAJAAiACQA - IwAhACQAIgAhACIAIAAhACAAIAAhAB8AIAAgAB8AIAAfAB4AHQAeAB4AHAAeAB4AHgAcAB0AHAAc - ABwAHQAcABsAGwAcABsAGwAbABsAGgAbABkAGgAbABgAGgAaABkAGQAZABgAGQAZABcAGAAZABgA - FwAXABcAGAAXABcAFgAWABgAFgAWABcAFQAXABUAFAAXABQAFQAXABMAFgAUABQAFQAVABQAEwAW - ABIAFAAVABIAFQATABMAFAATABQAEgATABUAEgASABMAEgASABIAEwASABEAEwARABIAEQARABMA - DwASABIAEAARAA8AEgARAA8AEQARAA8AEQARABAAEAAQABAADwAQABEADwAQABAADwAPAA8ADwAP - ABAADwAQAA4ADwAPAA0ADwAPAA8ADQANAA8ADgAOAA0ADgAOAAwADQANAA4ADAANAA0ACwANAA0A - DAALAAwADQALAAwADAAJAAsACwAKAAsACwAKAAsACgAKAAsACAAMAAgACAALAAgACAAJAAgACQAH - AAkACAAHAAcACAAHAAcACAAGAAYACAAHAAYABgAGAAYABQAGAAUABQAGAAMABQAEAAMABAADAAMA - BAADAAEAAwAEAAEAAgAEAAEAAQABAAIAAQACAAIAAAACAAEAAAAAAAEAAAD//wIA//8AAAAA//// - /wAAAAD///7//v/+/////v/8//7//v/8//3//f/7//3//P/7//v//f/6//v/+v/6//v/+f/7//j/ - +v/5//f/+v/4//j/+P/5//b/9//5//b/9//3//b/9//2//f/9//2//b/9v/1//b/9v/0//b/9f/1 - //X/9P/0//T/9P/1//P/8//1//P/8//z//T/8v/y//T/8v/z//L/8v/z//L/8v/y//L/8P/z//H/ - 8f/0/+//8//y/+//8v/x//D/8f/x//D/8P/y/+//8P/x/+//8f/v//D/7//v//D/7v/w//D/7v/w - /+7/7v/v/+7/7v/v/+//7v/u/+//7f/u/+//7v/t/+7/7f/v/+3/7f/v/+z/7f/t/+3/7f/s/+7/ - 7f/s/+7/7P/s/+7/7P/t/+7/7P/t/+3/7f/t/+7/6//u/+//6//u/+3/7P/v/+3/7f/t/+3/7v/v - /+3/7f/v/+3/7f/v/+3/7v/v/+7/7v/u/+//7v/u/+//7f/w/+//7//v/+7/8P/u/+//7//v/+// - 7v/v/+//8P/v/+//7//w//D/7//w/+//8P/u//D/8P/v//D/7//x/+//8P/w//D/8f/v//H/8f/v - //H/8P/x//L/7v/z/+//7//0/+3/8f/y/+//8v/w//H/8P/w//H/7//y//D/8f/x//D/8v/w//D/ - 8f/x//H/7//y//H/7//y//H/8P/x//H/7//y//L/7//y//H/8P/0//H/8P/0//L/8v/0//L/8//z - //P/8//0//P/8v/1//P/8//1//T/8//1//X/8//2//X/8//1//X/9P/2//b/9f/2//b/9v/2//f/ - 9v/4//f/9//4//j/+P/5//n/+f/5//r/+P/6//n/+v/7//n//P/6//z//P/7//z//P/9//z//f/+ - //3//f/+//7//v////////8AAAAAAQD//wAAAQABAAEAAAAFAAEAAgAFAAMABAAFAAQABgAHAAUA - BwAJAAYACQAKAAcACQAKAAkACgAMAAoACgAOAAsADAAPAA0ADQAPAA8ADwAQABEAEAARABIAEgAS - ABQAEwARABQAFQAVABQAFQAWABYAFQAXABcAFwAZABYAFwAcABcAGAAbABkAHAAbABsAHAAdAB0A - HAAeAB0AHgAeAB4AHgAgAB8AHgAgACIAIQAgACQAIgAhACQAIwAkACQAJAAmACYAJwAmACcAKAAo - ACgAJwAqACkAKgApACkAKwAqACsAKwArACwALQAtAC0ALQAtAC4ALQAtAC4ALgAuAC4AMAAvAC8A - LgAxAC8ALwAxADAAMAAxAC8AMQAxADMAMAAxADMAMgAxADIAMwAyADIAMwAyADMAMwAzADIAMwA1 - ADMAMwAzADQANAA0ADYANAA1ADUANgA2ADUANgA3ADYANQA5ADYANgA6ADYANgA6ADcANwA3ADgA - OAA3ADgAOAA6ADkAOQA5ADkAOgA4ADkAOgA5ADkAOQA5ADkAOQA4ADoAOQA7ADkAOwA7ADkAOwA7 - ADsAOwA8ADsAOwA9ADsAOwA8AD0APAA7AD0APgA7AD4APAA8AD4APAA9AD0APQA+ADwAPAA+ADwA - PAA+AD0APQA9AD0APQA9AD0APAA8AD0APQA9ADwAPgA+ADsAPQA+ADsAPQA+AD0APAA8ADwAPQA8 - ADsAPQA7ADwAPgA7ADwAPgA8ADsAPAA9ADsAPAA7ADwAPAA7ADsAOwA7ADsAOwA8ADoAOwA8ADoA - OgA7ADsAOwA6ADoAOwA6ADoAOgA7ADoAOgA7ADoAOgA5ADsAOgA5ADoAOgA5ADoAOgA4ADsAOQA5 - ADkAOQA6ADYAOQA4ADcAOAA3ADgANwA2ADcANgA2ADcANgA1ADYANwA2ADQANQA3ADUANAA3ADUA - NAA2ADUAMwA1ADUANAA0ADMANQAzADMANAA2ADQAMwA1ADMANAAzADIANAA0ADIAMwA0ADIAMwA0 - ADIANAAyADEAMwAzADIAMQAzADMAMQAxADMAMQAxADIAMQAyADEAMQAyADAAMgAxADAALwAyADAA - MQAwADEAMQAwADAAMAAwADAALwAwADAAMAAuADIALwAwADAALwAwAC8ALwAwAC8ALwAvADAALgAv - AC8AMQAuADAAMAAuAC8ALwAvAC8ALgAvAC4ALgAvAC4ALwAuAC4ALgAvAC8ALwAtAC4ALwAuAC4A - LwAuAC8ALwAwAC4ALgAxAC0ALgAwAC8ALgAvAC8ALwAuADAALgAvADAALwAvADEALgAuAC8AMAAv - AC4ALwAwAC0AMAAvAC4ALgAwAC4ALgAvAC4ALwAvAC4AMAAuAC0ALwAvAC4ALwAvAC4AMAAuAC4A - LwAvADAALwAuADAALwAwAC8ALwAxAC4ALwAxAC8ALgAxAC8AMAAvADEALwAwADEALwAwADEAMAAw - ADAAMgAxAC8AMAAxAC8AMQAwADEAMAAwADAALwAwADAALwAwAC4AMAAvADAAMAAwAC8ALwAxAC8A - MAAvADAALwAuADAALwAuADAALgAwAC4ALwAvAC8ALgAvAC4ALwAvAC8ALgAvAC8ALgAuADAALwAv - AC8AMAAuAC8ALwAwAC4ALwAwAC8ALwAwAC8ALwAxAC0ALwAwAC8ALwAwAC4AMAAvAC8AMAAxAC4A - MAAxAC8ALwAwAC8AMQAwADAALwAwADAAMAAvADEALwAxADAALwAxAC8ALwAxAC8AMAAwADEAMAAx - ADAAMAAyADAAMQAxAC8AMgAxADEAMQAxADIAMAAxADMAMQAxADIAMQAxADIAMQAzADAAMgAyADIA - MQAyADIAMAAyADIAMAAxADAAMgAyADAAMQAyADEAMQAyADEAMQAxADEAMAAyADIAMAAyADEAMQAy - ADIAMQAyADIAMgAzADEAMgAyADEAMgAzADMAMQAyADMAMQAzADEAMgAyADEAMgAyADMAMQAzADEA - MQAzADIAMwAyADIAMwAyADMAMwAyADMAMwAzADMAMgAxADMAMgAzADMAMQA1ADEAMgA1ADIAMgAz - ADMAMgAyADMAMwAyADMAMwAzADMAMwAyADIANAA0ADEAMgAzADMAMgAyADIAMgAzADEAMgAzADIA - MgAyADEAMwAzADAAMgA0ADEAMgA0ADIAMgAyADIAMgAyADIAMQAzADIAMgAzADMAMwAyADMAMgAz - ADQAMgAzADQAMwA0ADMAMwA1ADQAMwA0ADQANQAzADQANAA0ADQANAA0ADQANQA0ADQAMwA1ADQA - MwA2ADIANQAzADIANAAyADMAMwA0ADEAMgA0ADEAMgAyADEAMQAyADEAMQAxADAAMQAwADEAMAAv - ADAAMAAxADAAMAAwADAAMAAwAC4ALgAxAC4ALwAvADAALgAuAC4ALgAvAC0ALQAtAC0ALAAtAC0A - LAAuACwALAAuACoALQAsACkALAArACsAKgArACoAKgAsACgAKgAqACkAKgApACoAKAAoACoAJwAo - ACgAJwAoACcAJwAoACYAJgAnACUAJgAmACYAJQAlACYAJQAlACUAJAAlACQAJAAlACIAIwAjACMA - IwAiACQAIwAiACMAIQAiACIAIQAiACIAIQAhACIAIQAhACIAHwAhACEAHwAhACAAIAAgAB8AIAAe - AB8AHgAfAB4AHgAfAB0AHgAeAB0AHgAeABwAHgAeAB0AHgAdAB0AGwAdAB0AHAAcABwAHQAbABwA - HAAcABwAGQAbABwAGgAaABoAGgAaABsAGQAbABkAGgAaABkAGwAZABkAGQAaABkAGAAYABoAGQAX - ABkAGgAWABgAGAAXABkAFgAaABYAFwAZABUAGQAWABUAGQAWABcAFwAXABcAFQAYABUAFwAWABYA - FwAVABYAFgAXABYAFAAXABcAFQAXABYAFgAVABcAFQAWABYAFQAXABUAFgAXABUAFQAXABYAFQAV - ABUAFwAUABQAFgAVABQAFAAWABQAFAAUABQAEwAUABQAEgAUABMAEQAUABMAEgASABEAEgAQABEA - EQAQABAAEQAQAA8AEQAPAA4AEAAQAA8ADQAPAA8ADQAOAA0ADwANAAsAEAALAAwADQALAAwACwAM - AAoADAAKAAoACwAJAAkACwAJAAkABwAIAAkACAAHAAgACAAHAAYABgAIAAQABgAHAAMABgAFAAQA - BQADAAMABAADAAIAAgAEAAAAAwACAAAAAgABAAEAAAACAAAAAAAAAP//AAAAAP7/AAD+//7////+ - //z//f/9//z//P/6//z//P/7//v/+//7//r/+//6//r/+f/7//n/+P/8//f/+P/6//f/+f/4//f/ - +f/4//f/9//3//b/9//1//b/9f/3//P/9f/1//T/9f/z//X/9P/z//T/8//0//L/8//y//L/9P/w - //H/8v/x//L/7//y//H/8P/x/+//7//w//D/7//u/+//7v/t/+//7v/s/+7/7f/s/+3/7P/r/+z/ - 7P/r/+v/6//r/+r/6f/r/+n/6f/q/+n/6P/p/+r/6P/n/+j/6f/n/+j/6P/m/+f/5//m/+b/5//m - /+X/5f/n/+b/5f/l/+X/5f/l/+b/5P/k/+T/5f/j/+T/4//j/+L/4v/j/+L/4f/j/+D/4P/i/+D/ - 4P/h/+D/3//f/9//3//g/97/3//e/9//3v/d/9//3//e/93/3v/d/9z/3v/c/9z/3P/c/9z/2//c - /9r/2//a/9v/2v/b/9r/2v/b/9j/2v/a/9n/2f/Z/9j/2f/W/9j/2P/W/9n/1v/W/9b/1P/V/9b/ - 1P/V/9X/1P/V/9T/1P/V/9T/1f/U/9T/1P/S/9P/0f/U/9P/1P/U/9L/1P/T/9D/0//R/9L/0v/S - /9L/0v/T/9H/0v/R/9D/0v/O/9L/0P/Q/9D/0f/S/8//z//Q/87/0P/N/87/zv/P/87/zv/O/83/ - zv/O/83/zf/O/87/zf/N/87/zf/N/83/zf/O/83/zf/O/8z/zP/M/8z/zf/L/8z/zP/L/8v/zP/L - /8v/yv/L/8r/zP/M/8n/zf/L/8v/y//L/8v/yv/K/8v/y//K/8z/yf/K/8n/y//L/8n/y//K/8r/ - yv/K/8n/yv/L/8r/yP/M/8n/yf/K/8n/y//J/8r/yf/M/8n/yv/N/8r/y//L/8r/y//N/8n/y//M - /8v/zP/L/8z/zP/L/8v/zf/M/8z/y//M/83/y//O/83/zP/N/83/zP/O/87/zP/P/83/z//O/87/ - zv/P/87/z//O/87/0P/O/87/z//O/8//z//P/9D/zv/O/9H/zf/Q/8//0P/T/9D/0f/R/9D/0f/P - /9L/0P/S/9D/1P/Q/9L/1f/Q/9P/0v/S/9L/0f/S/9H/0v/V/9L/0//T/9L/0//Q/9T/0f/T/9L/ - 0//U/9L/1f/S/9P/0//S/9L/0v/U/9P/0//W/9P/0//U/9P/1P/U/9T/1P/V/9X/1P/V/9b/1f/U - /9b/1v/X/9T/1//X/9T/2P/X/9X/1//Y/9f/1//Y/9f/2P/Y/9f/2P/Z/9j/2P/a/9f/2v/a/9j/ - 2f/a/9j/2f/a/9n/2v/Z/9r/2f/Z/9n/2P/b/9n/2f/d/9j/2f/c/9n/2//c/9v/3f/a/93/2//b - /9z/3P/b/9v/3f/d/9v/3f/d/9v/3P/d/9z/3P/c/93/2//e/9z/3f/c/9z/3f/c/93/3f/d/93/ - 3f/e/93/3f/c/97/3v/b/97/3f/c/97/3f/e/9z/3f/e/9v/3v/e/9z/3v/d/97/3P/e/97/3f/d - /97/3v/d/97/3v/e/97/3//g/9z/3//f/97/3//e/9//3v/h/9//3//g/97/3//g/97/3//h/9// - 4P/g/97/3//h/+D/3//g/9//4f/f/+D/3//f/+D/3//e/+H/3v/g/+D/3v/h/9//3//h/9//3//g - /+D/4P/g/+D/3//h/+D/4P/i/9//4v/g/+D/4v/g/+H/4P/h/+H/4P/g/+H/4P/h/+H/4P/h/9// - 4f/g/+D/4v/f/+L/3//f/+L/3v/h/9//4v/h/97/4v/h/9//4f/h/9//4f/g/+D/4P/f/+D/3v/g - /+H/3//g/+H/4P/g/+D/4P/g/97/4P/h/97/4P/f/+D/3//f/+H/3//g/9//4P/g/97/4P/e/+H/ - 3f/f/+D/3v/g/97/3//d/97/3//c/97/4P/d/97/3//d/97/3//d/9//3v/c/9//2//g/9z/3f/h - /9z/3v/f/93/3v/e/93/3//d/97/3v/e/93/3v/c/9z/4P/c/93/3v/c/9//3P/d/93/3P/e/9r/ - 3f/e/9z/3v/d/9z/3f/e/9v/3f/e/9v/3f/e/9z/3f/d/93/3f/c/93/2//d/9z/3P/c/93/3f/a - /97/2v/b/9z/2f/a/9r/2//a/9n/2//Z/9r/2f/X/9r/2v/X/9n/2f/W/9j/2P/W/9b/2P/V/9f/ - 1//W/9n/1f/Y/9T/1//V/9P/1//T/9X/1f/W/9T/1P/X/9P/1f/U/9L/1P/S/9P/1P/S/9P/0//R - /9P/0//R/9L/0v/R/9H/0f/R/8//0f/R/8//0v/S/8//0P/Q/9D/0f/Q/9H/z//Q/8//z//P/9D/ - zv/P/8//zv/Q/87/z//Q/83/0P/P/8z/z//N/83/zv/P/83/zv/P/83/zv/P/83/z//N/83/zv/N - /8//zf/M/87/zP/M/83/zP/N/8z/zP/N/8z/zP/M/83/zf/M/87/zP/M/83/zP/O/8z/zf/O/8z/ - zf/N/8z/zP/L/83/zP/M/87/zP/M/83/y//M/83/zf/M/8z/zv/M/83/zP/M/83/yv/O/8z/zf/P - /8z/zv/N/83/zv/N/83/zf/O/87/zv/O/83/zv/O/87/zv/P/8//zv/P/87/zv/P/9D/zv/O/87/ - 0f/O/8//0P/P/8//z//P/8//0P/Q/8//0P/Q/9D/0P/Q/87/0v/N/9H/0v/P/9L/0f/R/9H/0f/R - /9H/0v/R/9L/1P/Q/9P/0//Q/9X/0v/W/9P/0//a/9H/1v/W/9L/1v/U/9b/1v/X/9j/1//a/9f/ - 2P/Y/9f/2//Y/9n/2//Z/9v/2f/b/9v/2P/d/9v/2//e/9z/2//e/97/2//g/93/3P/h/93/3v/h - /9//3//h/+D/4f/g/+D/4f/h/+H/4f/j/+H/4f/i/+P/4v/j/+L/4v/k/+T/4//l/+T/4v/l/+X/ - 5P/k/+X/5P/k/+f/5f/l/+b/5f/m/+X/5//l/+b/5//m/+f/5v/n/+b/5//o/+f/6P/m/+n/6P/n - /+n/6P/p/+n/6f/o/+n/6f/o/+n/6f/o/+n/6f/o/+n/6//o/+r/6//q/+r/6f/t/+n/6v/t/+n/ - 6//t/+r/7P/t/+v/7f/u/+v/7v/u/+v/7v/v/+v/7v/x/+z/7f/y/+7/7f/y/+7/7v/y//D/7v/x - //H/7//x//H/8P/w//L/8f/v//H/8v/x//H/8f/y//L/8f/z//H/8f/0//D/8f/1//D/8f/1//L/ - 8//z//L/8f/0//P/8f/0//L/8//0//T/8v/0//T/8f/z//X/8//y//b/9P/y//X/9P/z//X/9P/1 - //T/9P/0//X/9f/1//b/8//4//X/9f/1//b/9//1//f/9v/1//f/9//4//b/9//3//j/9v/4//f/ - 9//3//f/9//4//n/9v/5//n/9v/6//j/+P/6//j/+f/5//v/+f/4//v/+v/5//r/+//5//v/+//6 - //z/+//7//z/+//9//3//P/8//7//f/9/////f/+//7///////7///8AAP////8BAAAA//8DAP// - //8CAAAAAAABAAIAAQABAAIAAQADAAMAAQADAAMABAACAAMABAADAAQABAADAAUABAAFAAUABQAH - AAUABgAHAAYACAAIAAgABwAJAAkACAAKAAkACQAKAAsACgAJAAsADAAJAA0ACwAKAA0ACwALAA0A - DQAMAA0ADAAOAA4ADQAPAA4ADwAPAA8AEAAQABEADwAQABIAEQASABIAEwATABIAFAAUABMAFAAW - ABQAFQAVABUAFgAWABUAGAAWABYAGQAVABgAGgAYABgAGQAZABgAGgAZABoAGwAaABsAGgAcABsA - HAAcABsAHQAcABwAHQAcAB0AHgAeABwAHgAeAB4AHgAgAB8AHwAhACAAIAAgACIAIQAhACIAIgAi - ACMAJAAiACUAJAAkACQAJAAmACIAJgAmACQAJgAlACYAJgAmACYAJQAoACcAJwAnACcAKQApACgA - KAArACkAKAArACoAKQArACsAKAAsACsAKgAsACsALQAsACwALQAvAC4ALQAuAC4ALwAvAC4AMAAw - AC8ALwAxAC8AMQAxADEAMwAyADAAMgAzADMAMgA0ADQAMwAzADUAMwA0ADUANAA2ADQANQA1ADUA - NgA2ADUANgA3ADYANgA3ADcAOAA3ADgANwA4ADgAOQA5ADkAOQA4ADsAOgA6ADsAOgA8ADoAPAA7 - ADsAOwA8ADwAPAA8AD0APgA9AD0APgA9AD0APgA/AD4APgA/AD4APwBAAD4APwBAAD8AQABAAEAA - QQBAAEAAQQBBAEEAQQBBAEEAQgBCAEEAQQBEAEAAQgBEAEMAQgBDAEIAQwBCAEQAQwBEAEQARABE - AEUARABDAEQARQBEAEMARABFAEMARQBEAEQARABGAEMARABFAEMARABFAEMARABEAEQAQwBFAEMA - RABFAEQARABEAEMARABEAEUAQwBEAEQARABFAEQARABFAEMARABGAEQAQwBFAEQARABEAEYARABE - AEUARABEAEYARABEAEQARQBEAEMARABFAEMARABEAEQAQwBEAEMAQwBDAEMAQgBCAEIARABBAEMA - QwBDAEEAQgBCAEIAQQBBAEIAQQBAAEIAQABBAEEAQQBAAEAAQABAAD8AQAA/AD8APwBAAD8APgA/ - AD8APgA/AD8APgA/AD8APwA+AD4APwA+AD0APgA+AD0APgA+AD0APQA/ADwAPQA/AD0APgA9AD0A - PQA9AD0APQA9ADwAPQA+ADwAPAA8AD0APQA9ADwAPAA8AD0APAA8ADwAPAA8ADwAOwA9ADoAOwA8 - ADoAPAA7ADsAPAA9ADsAOgA8ADoAOwA7ADoAOwA7ADsAOwA6ADsAOgA6ADsAOgA6ADsAOQA6ADkA - OgA6ADkAOgA5ADkAOQA5ADoANwA5ADkAOAA4ADgAOAA4ADcAOAA3ADcANwA3ADcANwA2ADcANgA3 - ADcANgA2ADYANgA2ADYANgA2ADYANgA3ADYANgA2ADUANgA2ADYANQA1ADYANgA2ADUANgA1ADUA - NQA1ADUANQA1ADUANAA1ADUANQA1ADUANQA0ADUANQA0ADUANAA0ADQAMwAzADQAMwA0ADMAMgA0 - ADIAMgA1ADIAMgAzADMAMwAyADMAMwAzADMAMgAzADMAMgAyADIAMgAyADIAMQAyADEAMgAxADEA - MQAxADAAMAAwADAAMAAwADAAMAAwAC8AMAAxAC8ALwAwAC8ALwAwAC8ALwAvAC8ALgAwAC8ALwAv - ADAALgAvAC8ALgAuADAALgAvAC8ALwAuAC8ALgAvAC8ALgAtAC8ALgAtAC4ALgAtAC4ALgAtAC0A - LgAtAC0ALQAtAC0ALQAtACwALQAsACsALAAsACsALAAsACsAKwArACoAKwAqACoAKgAqACoAKgAp - ACkAKQApACkAKQAoACkAKAAoACgAKAAoACgAKAAoACcAJwAoACcAJgAnACcAJgAmACcAJwAnACYA - JgAmACYAJQAmACUAJQAmACUAJQAmACQAJgAlACQAJQAlACQAJQAlACQAJAAlACQAJAAkACQAJAAk - ACQAIwAjACQAIwAjACMAIwAjACMAIgAjACIAIwAjACIAIgAjACMAIgAiACMAIgAiACEAIgAiACEA - IgAiACEAIQAhACIAIQAhACIAIQAhACIAIAAhACEAIAAhACEAIQAhACEAIQAhACEAIAAhACEAIAAh - ACEAIAAiACEAIAAhACEAIQAhACAAIQAhACEAIQAhACEAIQAhACAAIQAgACEAIAAgACAAIAAgACAA - IAAfAB8AIAAfACAAHwAgAB8AHwAeAB8AHwAeAB0AHgAfAB4AHgAeAB0AHgAdAB4AHgAdAB0AHgAe - AB0AHQAdAB0AHQAcAB4AHQAdAB0AHQAdAB0AHAAeABsAHQAeABwAHAAdABsAHQAcAB0AHAAdABwA - HAAdAB0AGwAcABwAHQAbABwAGwAcABsAGwAbABwAGwAcABwAGwAcABsAGgAcABsAGwAcABoAGwAc - ABoAGgAbABoAGgAbABoAGwAaABoAGgAbABkAGQAaABoAGQAaABkAGQAZABkAGAAaABkAGQAZABoA - GAAZABkAGQAYABkAGQAYABkAGAAYABgAGAAXABgAGAAYABgAGAAYABgAFwAYABcAGAAXABYAGAAW - ABgAGAAWABcAFwAWABYAFwAWABYAFgAWABYAFgAWABYAFgAWABYAFgAVABUAFgAWABUAFQAWABQA - FQAWABQAFQAVABQAFQAWABQAFQAVABQAFQAVABQAFQAVABQAFQAVABMAFAAWABQAFAAVABQAFAAV - ABQAFAAUABUAFAAUABUAFAAUABUAFAATABUAFAAUABQAFAAUABQAEwAUABQAEwAUABMAEwAVABIA - EwAVABIAFAAUABMAEwAVABMAEwAVABMAEwAUABMAEwAUABMAEgATABQAEwATABQAEwATABQAEwAT - ABMAEwATABQAFAATABQAFAAUABQAEgAUABQAEwATABMAFAATABQAEwATABMAFAATABMAEwATABQA - EwATABMAFAATABMAEwATABMAEgATABMAEgATABMAEwASABIAEwASABQAEgARABMAEwASABIAEwAR - ABIAEgASABIAEgASABIAEQASABIAEQASABIAEQASABIAEQARABIAEgASABEAEQASABEAEAASABEA - EAASABAAEAASABEAEAAQABEAEQAQABEAEAARABEAEAARABAAEQAPABAAEAAPABAAEAAPABAAEAAP - AA8ADwAQAA8AEAAQAA8AEAAQAA8ADwAQAA8ADwAQAA8ADgAQAA8ADwAOAA8AEAAOAA8ADwAOAA8A - DgAOAA8ADgAOAA8ADgAPAA4ADgAOAA4ADgAOAA4ADgAOAA8ADQANAA4ADgANAA4ADgAOAA0ADQAO - AA0ADQAOAA0ADQANAA0ADQANAAwADgAMAAwADgALAAwADgAMAAwADQANAAwADAALAAwADAALAAwA - CwALAAsACwALAAsACwALAAsACwALAAoACwALAAoACwALAAsACgALAAoACwALAAsACgAKAAoACwAJ - AAsACgAJAAoACQAKAAoACgAKAAoACQALAAgACgAKAAkACQAJAAkACgAIAAoACQAJAAoACQAIAAoA - CQAIAAkACAAJAAgACAAIAAkABwAJAAgABwAIAAgABwAIAAcACQAHAAcABwAJAAgABwAIAAcABwAI - AAYACAAIAAcABgAIAAYABwAIAAcABwAIAAYABwAIAAcABgAIAAcABwAHAAgABwAHAAcABwAIAAgA - BwAHAAcACAAHAAcABgAIAAcABwAHAAcACAAHAAcABwAHAAgABwAHAAcABwAGAAgABwAGAAgABgAH - AAcABwAGAAcABwAGAAgABgAGAAcABwAGAAcACAAGAAYABwAHAAYABgAHAAYABwAHAAYABwAGAAYA - BwAGAAcABwAGAAYABwAGAAYABwAGAAYABgAIAAYABgAIAAUABQAIAAYABgAHAAcABwAGAAcABgAH - AAcABgAHAAcABgAFAAcABwAGAAYABwAGAAYABwAHAAYABgAIAAYABgAHAAYABwAHAAYABwAHAAYA - BgAHAAYABwAIAAYABwAHAAYABwAHAAcABwAGAAcABwAHAAcABwAIAAYABwAIAAcABgAIAAcABwAG - AAgABwAHAAgABwAIAAkACAAHAAgACAAIAAgACAAIAAgACAAJAAgACAAJAAkACAAJAAkACAAIAAgA - CgAHAAgACQAJAAgACQAIAAkACQAJAAkACQAIAAkACQAJAAoACQAJAAkACQAIAAkACQAJAAkACgAJ - AAkACQAKAAoACQAJAAkACgAJAAoACgAJAAkACgAKAAkACgAKAAoACQALAAkACgALAAoACQALAAoA - CwAKAAoACwAKAAoACwALAAoACwALAAsACwALAAsACwALAAsACwALAAwACwALAAwACwAMAAsACwAM - AAsACwAMAAwADAAMAAsADAANAAwADAANAAwADAANAAwADQANAAwADQAMAA0ADAANAA4ADQANAA0A - DQANAA0ADQANAA0ADgANAA4ADgANAA4ADQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAPAA4ADgAO - AA8ADgAPAA8ADgAOAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAQAA8ADwAPABAAEAAQAA8A - EAAQAA8AEAAQABAAEAAQABAADwAQABAAEAAPABAAEQAQABAAEAAPABAAEQAQABAAEAAQABAAEAAR - ABAAEAARABAAEAARABAAEAARABEAEAAQABAAEQARABEAEAARABEAEQAQABEAEQARABEAEQAQABEA - EQARABAAEQARABAAEQARABAAEQARABAAEQARABAAEQASABEAEAASABEAEQARABEAEQARABEAEQAR - ABEAEQASABIAEQARABIAEQARABIAEQASABIAEgASABIAEgASABMAEgASABMAEgASABIAEgASABIA - EgASABIAEwASABIAEwATABIAEwATABIAEwASABIAEwASABIAEgATABIAEgATABIAEgASABIAEgAS - ABIAEgASABIAEgASABIAEgARABIAEgASABEAEgASABIAEQASABEAEQASABEAEQASABIAEQARABEA - EQASABEAEQASABEAEQASABEAEQASABEAEQASABEAEgASABEAEgASABEAEQASABIAEgASABEAEgAS - ABIAEgASABIAEQARABIAEQASABIAEQASABIAEQASABIAEgARABIAEQASABEAEQASABIAEQASABEA - EgASABEAEgASABEAEQASABIAEgASABIAEgASABIAEQASABIAEQASABIAEgASABIAEgASABIAEgAT - ABIAEgASABIAEgATABIAEgASABIAEgATABIAEgASABIAEgATABIAEgASABIAEgASABIAEgASABIA - EgASABIAEgARABIAEgARABIAEQARABEAEQARABEAEQARABAAEQASABEAEQARABEAEQARABEAEQAR - ABAAEQARABAAEQAQABAAEQAQABAAEQAQABAAEAARABAAEAARAA8AEAARAA8AEAAQABAAEAAQABAA - EAAQABAADwARABAADwAQABAAEAAQABAADwAPABAADgAQABAADgAPABAADgAPAA8ADgAPAA8ADwAP - AA4ADgAQAA4ADgAPAA4ADwAPAA4ADgAPAA4ADgAPAA4ADgAPAA4ADgAOAA4ADQAOAA4ADQAOAA4A - DQAOAA0ADQANAA0ADQANAA0ADQANAA0ADAANAA0ADAAMAAwADAAMAAwADAAMAAwADAAMAAsADAAL - AAsADAALAAwACwALAAsADAALAAsACwALAAoACwAKAAsACgALAAoACgAKAAsACQAKAAkACgAKAAkA - CgAJAAkACgAKAAkACgAJAAkACQAJAAkACQAJAAgACQAJAAgACAAIAAgACAAJAAcABwAIAAcABwAI - AAcABwAIAAcABwAHAAcABwAHAAcABwAHAAcABwAGAAcABwAGAAcABwAGAAYABgAHAAYABgAHAAYA - BgAHAAUABgAHAAUABgAGAAYABgAGAAYABQAGAAUABgAGAAUABgAGAAYABQAGAAYABQAGAAcABQAF - AAcABgAGAAYABgAGAAYABgAFAAYABgAGAAYABgAGAAYABwAGAAYABgAGAAcABgAGAAYABgAHAAcA - BgAHAAcABgAHAAcABwAHAAcABwAHAAcABgAHAAgABgAHAAcABwAHAAcABwAGAAgABwAGAAgABwAG - AAcABwAGAAcABwAGAAcABwAHAAYABwAHAAYABgAGAAYABgAGAAYABQAGAAYABgAGAAUABgAGAAUA - BgAGAAUABAAHAAUABAAGAAUABQAFAAUABgAFAAYABQAFAAUABQAFAAUABgAEAAUABQAEAAUABQAE - AAUABQAEAAUABAAFAAQABAAEAAMABAAEAAQAAwAEAAQAAwAEAAMAAwADAAMAAwADAAIAAwABAAMA - AgABAAMAAQABAAIAAQACAAEAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP////// - //7///////7///////7//v/+//7//v/+//3////9//7////8//7//v/9//3//f/9//z//f/9//z/ - /f/7//z//P/8//z/+//8//v/+//8//v/+//7//v/+//6//r/+//6//r/+v/7//r/+v/6//n/+f/5 - //r/+v/5//r/+v/5//n/+f/4//n/+P/5//j/+P/5//j/+f/4//f/+P/3//j/+P/4//j/9//3//j/ - 9//3//f/9//3//f/9//3//f/9v/3//b/9v/2//f/9f/3//b/9v/2//b/9//2//X/9v/2//b/9f/3 - //X/9v/2//b/9f/3//T/9v/2//X/9f/2//X/9v/1//X/9v/2//b/9f/2//b/9P/2//b/9f/1//X/ - 9f/1//X/9P/1//T/9f/0//T/9P/1//T/9P/0//P/9P/z//T/8//z//P/8//z//P/8v/y//P/8v/y - //P/8v/z//H/8v/y//L/8f/x//L/8f/x//H/8f/w//D/8v/v//H/8P/x//D/8P/x/+//8P/x/+// - 8f/w/+//8P/u//D/7//v/+7/7//u/+3/7//t/+7/7f/t/+7/7P/v/+3/7P/v/+z/7f/t/+3/7f/s - /+3/7P/t/+3/6//s/+z/6//r/+z/7P/r/+v/7P/r/+r/7P/r/+r/6v/s/+r/6v/s/+r/6//r/+r/ - 6//r/+r/6v/r/+n/6//r/+n/6v/r/+j/6v/p/+r/6f/o/+n/6f/p/+n/6P/q/+n/6P/s/+j/6P/q - /+n/6v/p/+r/6v/p/+v/6f/q/+r/6f/p/+n/6v/q/+j/6f/q/+j/6v/q/+n/6f/q/+v/6f/r/+r/ - 6v/q/+v/6//q/+v/6//r/+r/6v/t/+r/6//r/+v/7P/p/+3/6//q/+z/6v/s/+v/6//s/+v/7P/s - /+z/7P/t/+3/7P/t/+7/7P/u/+7/7f/u/+7/7v/u/+7/7v/v/+//7//w/+7/8P/x/+//7//x/+// - 7//y/+//8P/x//D/8f/x//H/8f/y//D/8P/z//H/8f/y//H/8//y//L/8v/y//P/8v/y//P/8f/z - //P/8f/0//L/8v/0//L/8//z//P/8//0//P/8v/1//L/9P/1//P/9f/z//T/9P/0//X/8//1//X/ - 9P/0//X/9f/1//X/9f/1//X/9f/1//b/9f/1//b/9P/3//f/9f/3//X/9//2//X/9v/3//X/+P/3 - //f/9//2//f/9//3//j/9v/3//j/9//3//n/9//4//n/+P/6//j/+f/6//j/+f/6//r/+f/5//v/ - +v/7//r/+//6//v/+//7//3/+//8//3//P/9//7//v/9///////+/wAAAAD+/wAAAAD//wAAAAAA - AAEAAAABAAEAAAADAAEAAQAEAAIAAgAEAAMABAADAAQABAAEAAUABAAFAAUABgAFAAUACAAGAAYA - BwAHAAcACAAIAAcACQAIAAcACAAJAAgACgAJAAkACgALAAkACwAMAAoACwANAAwADAAMAA0ADQAO - AA4ADQAPAA8ADwAQABAAEAAQABIAEAARABMAEQATABQAEwATABQAFAAVABYAFQAVABcAGAAWABgA - GAAYABgAGQAYABkAGwAZABoAGgAbABoAGwAcABsAHAAdABwAHQAcAB0AHQAeAB0AHAAfAB0AHgAe - AB4AHwAfAB8AIAAfAB8AIQAgACEAIQAgACIAIgAiACIAIwAjACMAIwAkACMAJAAlACQAJAAlACYA - JgAlACYAJgAnACYAJgAoACgAJwApACgAKAAqACkAKQArACkAKgAqACkAKwArACsAKwAsACwALAAt - ACsALQAsACwALgAuAC4ALQAuAC8ALgAvAC8ALgAvAC8ALwAvADAALwAxAC8AMAAwADEAMAAxADIA - MQAxADIAMQAzADIAMwA0ADMAMwA0ADQANAA0ADQANAA0ADUANAA1ADUANQA2ADYANgA2ADYANgA3 - ADcANQA4ADcANwA4ADcAOAA5ADcAOAA5ADgAOQA5ADgAOQA5ADkAOQA6ADkAOgA6ADgAOQA5ADoA - OgA6ADoAOQA6ADkAOgA5ADkAOgA6ADoAOgA7ADsAOQA7ADsAOwA6ADoAOgA7ADoAOwA7ADoAOwA6 - ADwAPAA7ADsAPAA8ADsAPAA7ADwAPAA7ADwAPQA7ADwAOwA8ADwAPAA9ADsAPAA+ADoAPQA9ADsA - PAA8ADwAPQA9ADwAPAA9ADwAPAA7ADwAPQA8ADwAPAA9ADwAOwA8ADwAOwA8ADwAOwA8ADsAOwA9 - ADwAOwA8ADsAPAA9ADsAOwA9ADwAOwA7ADwAPAA8ADsAOwA8ADsAOwA9ADsAOwA7ADsAOgA8ADoA - OgA7ADoAOgA7ADoAOQA6ADoAOQA6ADoAOgA5ADkAOQA6ADkAOQA4ADkAOQA4ADkAOQA5ADkAOAA5 - ADcAOQA4ADcAOAA3ADkAOAA3ADgAOAA4ADcAOAA3ADcANwA3ADcANwA3ADcANwA3ADcANwA1ADYA - NgA3ADUANgA3ADUANQA3ADUANgA2ADUANgA2ADUANgA2ADUANgA2ADQANgA1ADUANQA2ADQANQA2 - ADUANAA2ADYANQA1ADUANAA1ADUANQA1ADUANAA1ADYANAAzADUANQA1ADQANAA0ADQAMwA0ADMA - MwA1ADIAMwA1ADIAMwA0ADIAMwAzADMAMwA0ADMAMgA0ADMAMwAzADMAMwA0ADMAMgAzADQAMgAy - ADQAMwAyADMAMgAzADIAMwAzADMAMwAzADMAMwA0ADMAMwA0ADQAMwAzADMANAAzADQAMwAzADMA - NAAzADQAMwAzADMAMwAzADMAMwAyADIAMwAzADMAMQAzADIAMQAyADEAMQAxADAAMgAxADIAMAAw - ADEAMQAwADEAMQAwADAAMAAvADAALwAxAC4ALwAwAC8ALgAvAC4ALwAvADAALgAuAC4AMAAuAC4A - LgAvAC4ALgAuAC4ALgAwAC0ALQAvAC0ALQAuAC0ALQAtAC0ALAAvAC0ALQAtAC4ALQAsAC0ALgAt - AC0ALQAsAC0ALQAtAC0ALAAtACwALQAtACwALQAtAC0ALAAtACwALAAuACwALAAtAC0ALAAsACwA - LQArAC0AKwAsAC0AKwAsACwALAAsACwAKwAsACwAKwAsACwALAAsACwALAAsACwAKwArACwALAAr - ACsALAArACoAKwAsACsAKwArACsAKgArACsAKwArACoALAAqACsALAAqACsALAArACoAKwAsACoA - KwAqACoAKwAqACoAKgAqACoAKQAqACkAKgAqACkAKQApACkAKQApACkAKQAqACkAKQAqACkAKQAr - ACoAKQApACoAKQAoACkAKQAoACkAKQAoACoAKQApACkAKQAqACcAKQApACcAKAAoACgAKAAnACgA - JwAoACgAJwAnACcAKAAoACYAJgAoACcAJgAoACcAJgAnACcAJAAnACYAJQAmACYAJwAmACUAJgAn - ACYAJQAnACUAJgAlACUAJgAmACQAJAAmACUAJQAmACUAJgAlACQAJQAmACQAJAAmACYAIwAlACYA - JAAkACUAIwAlACQAJAAkACQAJQAkACMAIwAkACMAJAAjACMAJAAjACMAIwAjACIAIwAjACMAIgAi - ACQAIgAiACIAIQAjACAAIgAiACEAIAAgACIAIAAgACEAIQAfACAAIQAfACAAHwAgAB8AHwAgAB4A - HgAfAB4AHgAeAB0AHQAeAB4AHgAdAB0AHgAdABwAHgAcAB0AHAAeABwAHAAdABsAHAAdABsAGwAc - ABwAHAAbABwAGwAbABsAGgAbABwAGgAZABsAGwAaABkAGgAaABkAGgAaABgAGAAaABgAGAAZABcA - GAAZABcAGAAYABcAFwAYABcAFwAYABYAGAAXABYAFwAXABcAFgAWABcAFgAXABYAFgAXABUAFgAX - ABUAFQAWABYAFQAVABYAFQAVABYAFAAVABYAFQAUABUAFQAVABQAFQAVABMAFQAVABQAFAAUABUA - FAAUABUAFAATABMAFQATABMAFAAUABMAEwAUABMAEwASABQAEwARABQAEgASABMAEgASABEAEgAS - ABEAEgARABEAEQARABAAEAAQABEADwAQABAAEAAPAA8ADwAOAA8ADwAPAA4ADgAOAA0ADgAOAA0A - DAAOAAsADAANAAsADAAMAAsACwALAAoACwALAAkACgAKAAoACQAJAAgACgAIAAgACAAIAAcABwAH - AAcABgAHAAYABAAHAAQABAAGAAMABQADAAMAAwADAAMAAQAEAAEAAQACAAAAAgAAAAAAAAAAAAAA - //8AAAAA///+/wAA///+//7//v/+//3//v/8//3//f/7//3/+//8//3/+//8//v//P/8//n/+//7 - //n/+//6//r/+v/5//r/+f/5//r/+f/5//n/+f/5//j/+f/4//n/+P/4//f/+P/4//f/9//4//j/ - 9//2//j/9//4//f/+P/3//f/9//3//f/9//2//b/9f/3//b/9//1//f/9//1//b/9//1//f/9v/2 - //b/9//1//f/9v/2//f/9f/3//X/9f/3//X/9f/2//X/9v/0//b/9v/1//X/9f/1//b/9f/1//X/ - 9//1//X/9f/2//b/9f/1//X/9f/2//T/9f/1//T/9f/1//T/9f/1//T/9f/2//T/9P/1//T/9f/1 - //X/9f/1//X/9P/1//T/9P/0//X/9P/z//X/9P/z//T/8//z//T/8//z//P/8//z//P/8//x//P/ - 8//y//P/8v/x//L/8v/y//H/8//w//L/8f/x//L/8P/y//D/8v/x//D/8v/v//H/8f/x/+//7//x - /+//8P/w/+//8P/v/+//8P/u/+7/7//t/+//7v/t/+//7v/v/+7/7v/u/+7/7f/v/+3/7f/v/+z/ - 7f/t/+7/7P/s/+7/7P/t/+z/7P/t/+z/7P/s/+3/6//u/+3/6//v/+v/7f/t/+v/7v/s/+z/7P/t - /+z/6//u/+v/7P/s/+v/7f/r/+z/7P/r/+z/6//s/+z/6//s/+v/6//s/+v/6//s/+z/6//s/+z/ - 6//s/+3/7P/s/+3/6//t/+z/7P/t/+v/7P/s/+z/7P/r/+3/7P/r/+7/7P/s/+7/7P/t/+7/7P/t - /+7/7f/t/+//7P/u/+//7P/v/+7/7v/w/+7/7v/v/+//7//w/+//7//w//D/8P/x//D/8P/x//D/ - 8f/x//L/8f/x//L/8P/z//L/8v/y//L/8//x//P/8v/z//P/8v/z//P/9P/z//P/8//0//T/8//0 - //T/9P/z//X/9f/0//T/9P/0//T/9P/0//T/9v/0//b/9v/0//b/9f/2//b/9P/3//X/9P/5//T/ - 9//3//X/9//2//b/9v/2//b/9f/4//b/9v/2//f/+P/2//f/9//4//f/9v/4//f/9v/4//j/9v/4 - //f/9//4//n/9v/5//j/9//6//n/9//6//j/+f/6//j/+v/5//n/+f/6//n/+f/8//r/+v/7//r/ - +v/8//v/+v/8//z/+v/8//z/+v/8//3/+//8//3//P/8//3//f/9//7//f/9//7////+/////v/+ - /////v//////AAD/////AAD+/wAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAQABAAIA - AwAAAAIAAgACAAIAAgAEAAEAAwAEAAMABAAFAAQABQAFAAQABQAGAAUABgAIAAUABwAIAAUACAAI - AAYABwAKAAgACAAKAAkACQAKAAoACQAKAAsACgALAAwACwALAA0ADAAKAA0ADgANAAwADQAOAA4A - DQAOAA4ADgAQAA4ADgASAA4ADwARAA8AEQARABAAEgATABIAEQAUABIAEwAUABMAFAAVABQAEwAV - ABcAFQAVABgAFwAVABgAFwAYABgAGAAZABoAGgAYABoAGgAbABoAGQAbABwAGwAbABsAHQAbAB0A - HAAcAB0AHgAdAB4AHgAeAB4AHgAeAB8AHwAfAB4AHwAgAB8AHgAhACAAHwAhACAAIQAgACAAIQAh - ACIAIQAgACMAIwAhACIAIwAhACIAIwAiACMAIwAjACIAIwAlACQAIwAkACQAJAAlACUAJQAkACUA - JgAmACUAJgAnACUAJQAoACUAJgAoACUAJQAoACYAJgAmACcAJwAmACYAJwAoACgAJwAnACgAKAAm - ACgAKAAnACcAJwAnACgAKAAnACcAKAApACgAKQApACgAKQApACgAKQAqACgAKQAqACkAKQAqACoA - KgAoACoAKwApACsAKgAqACwAKgAqACsAKwArACsAKgArACoAKgArACsAKwArACsAKwAsACsAKgAr - ACwALAArACwALAAsACsALAAtACsALAAtACwALAAsACwALQAsACwALQAsACwALQArAC0ALgAsACwA - LQAtACwALQAsAC0ALQAsACwALAAtACwALAAtACwALAAtACwALAAtAC0ALQAsACwALQAtACwALQAu - AC0ALQAuAC4ALQAtAC8ALQAtAC4ALgAtAC4ALgAtAC8ALQAuAC0ALgAuACwALQAuAC0ALQAsAC4A - LQAsAC0ALAAsAC4ALAAsACwALgAtACwALAAvAC0ALAAuAC0ALAAtAC0AKwAtAC0ALAAsACwALgAt - ACwALQAvAC0ALAAuAC0ALQAsACwALQAtACwALAAtACwALQAuACwALQAsACsALQAtACwALAAtACwA - KwAsAC4ALAAsAC0ALAAsACsALAAsACwALAAsACsAKwAsACwALAAsACwALAArACwAKwArACsAKwAr - ACwAKwAqAC0AKwArACsAKwAsACoAKwArACsAKgAqACsAKgAqACwALAAqACsALAAqACoAKgArACoA - KgAqACkAKgAqACkAKgApACkAKQApACoAKgAoACkAKgApACkAKgApACkAKQAqACgAKQAqACgAKAAr - ACkAKAAoACkAKQAoACkAKAApACkAJwAoACkAKAAnACkAKQAoACcAKAAoACcAKAAoACYAJwAoACcA - JgAoACYAJwAnACYAJwAnACYAJgAnACYAJgAnACYAJwAmACYAJgAmACcAJgAmACcAJwAnACUAJgAn - ACUAJQAoACUAJQAnACYAJgAmACcAJgAmACcAJQAmACcAJgAlACYAJwAmACQAJgAmACUAJQAmACUA - JQAlACYAJAAlACUAJQAkACQAJgAkACQAJQAlACQAJAAlACQAJAAjACUAJAAiACUAIwAjACQAIwAk - ACMAIwAjACMAIwAjACIAIwAjACIAIQAjACMAIQAjACMAIgAjACMAIwAiACMAIwAjACIAIwAjACIA - IgAjACIAIgAkACEAIgAkACIAIwAiACIAIwAiACIAIwAjACIAIgAjACIAIgAhACMAIwAjACIAIgAi - ACMAIgAiACIAIgAjACIAIQAjACEAIgAjACEAIwAiACIAIwAkACIAIQAkACIAIgAiACIAIwAiACIA - IgAiACMAIQAiACMAIgAiACMAIgAiACIAIgAiACIAIgAiACIAIgAiACMAIAAiACIAIQAhACEAIgAi - ACEAIQAiACEAIQAiACEAIQAhACEAIAAhACEAIAAhACEAIAAhACEAIQAhACEAIQAhACAAIQAhACAA - IQAhACEAIAAgACEAIAAhACAAIQAgACAAIAAgACEAIAAgACAAHwAgACEAIAAfACAAIQAgACAAIQAf - ACAAIAAgACAAIAAgACAAIAAgACAAHwAhAB8AHwAhACAAHwAhACAAHwAfACAAIAAfAB8AHwAgACAA - HwAfAB8AIAAfAB8AHwAfAB8AHgAfAB4AHwAfAB0AHgAfAB4AHgAeAB4AHwAfAB0AHgAgAB0AHgAg - AB8AHgAeAB8AHwAeAB4AHgAfAB4AHgAfAB8AHwAeAB8AHgAeAB8AHgAeAB8AHwAfAB8AHgAfACAA - HgAeACAAIAAeAB8AHwAfAB8AHwAeAB8AIAAfAB8AHwAfAB8AHwAgAB8AHwAfAB4AHwAeAB4AHwAf - AB0AHgAgAB0AHgAeAB0AHgAeAB4AHgAdAB4AHgAdAB4AHgAdAB4AHgAdAB0AHgAfAB0AHgAeAB0A - HQAfAB0AHQAeAB8AHQAdAB4AHgAdAB0AHAAeAB0AHQAeAB0AHAAeAB0AHQAeABwAHgAeABwAHQAd - AB0AHQAdAB0AHQAeAB0AHQAeAB0AHwAdAB4AHQAeAB0AHQAdAB4AHQAeAB0AHQAdAB0AHQAeABwA - HQAdAB4AHAAcAB0AHAAdAB0AHAAdABwAHQAdABwAHAAcAB0AHAAcAB0AHAAdAB0AHAAcAB0AGwAe - AB0AHQAcAB0AHAAdAB0AHAAdAB4AGwAeAB0AHQAdAB0AHAAdAB0AHgAdAB0AHQAeABwAHQAdAB0A - HQAdABwAHQAcAB4AHQAdABwAHAAdAB0AHAAcABsAHQAbAB0AHQAdABsAGwAcAB0AHAAcABsAHAAd - ABwAHAAbABsAHAAbABwAHQAcABsAHAAcABsAHAAbABsAHAAbABwAGwAbABsAGwAcABsAGwAdABoA - GwAcABoAGwAbABoAHAAbABsAGwAbABsAGgAcABsAGwAaABsAHAAaABoAGgAbABsAGQAbABsAGQAa - ABoAGQAZABoAGQAbABoAGQAaABkAGgAbABoAGQAaABoAGgAaABoAGgAaABkAGQAaABkAGQAbABkA - GQAaABkAGQAaABkAGQAaABkAGAAaABkAGAAZABgAGAAZABkAGQAYABkAGAAZABkAGQAYABgAGQAY - ABkAGAAYABgAGAAYABcAGQAYABcAGAAXABgAGAAXABcAGAAXABcAGAAXABcAFwAXABcAFwAXABcA - FwAXABcAFwAWABYAFwAXABUAFgAXABYAFgAXABYAFgAWABYAFwAXABYAFgAWABYAFwAXABUAFgAW - ABUAFgAXABUAFQAXABUAFQAXABUAFgAWABYAFQAWABYAFQAWABcAFgAWABcAFgAUABcAFwAWABUA - FgAWABYAFQAWABYAFQAWABUAFQAXABQAFQAWABUAFgAVABUAFQAXABUAFQAWABUAFQAVABUAFQAW - ABUAFAAVABYAFQAVABcAFQAUABYAFQAVABUAFQAVABYAFgAUABUAFgAWABYAFAAWABYAFQAVABUA - FgAVABUAFQAUABUAFgAVABUAFQAVABYAFQAVABUAFQAVABQAFQAVABQAFAAVABUAFAAVABQAFAAU - ABQAFAAUABUAEwASABUAFAATABMAFAATABMAFAATABMAEwATABIAEwAUABIAEgATABIAEgATABMA - EgARABIAEgASABEAEgASABEAEQASABEAEAASABAAEAASABAAEAAQABEAEAAQABAADwARABAADwAQ - ABAAEAAPABAAEAAPAA8ADwAOAA8ADwAOAA4ADgAPAA4ADwAOAA4ADgAOAA4ADgAOAA0ADQAPAA0A - DQAOAA4ADgAMAA0ADgAMAA4ADQAMAA0ADAAMAAwADAAMAAwACwAMAAwACwAMAAsACwALAAsACwAL - AAsACgALAAsACgAKAAsACgAKAAkACgAKAAkACgAKAAoACgAJAAkACgAJAAkACgAJAAoACgAIAAkA - CgAJAAgACQAKAAgACAAIAAkACQAHAAkACAAIAAgACAAIAAcABwAIAAcABwAIAAgACAAHAAcACAAH - AAYABwAIAAYABgAHAAcABgAGAAcABgAGAAcABwAFAAYABwAFAAYABQAGAAUABgAGAAMABgAGAAQA - BQAEAAUABQADAAUABAAEAAUABAADAAQABQAEAAMAAwAEAAMAAgAEAAMAAgAEAAMAAQADAAMAAgAC - AAIAAwABAAEAAQADAAEAAQACAAEAAQABAAAAAQACAAEAAAACAAAAAAABAAAAAQABAAAAAQABAAAA - AAABAAEAAAAAAAEAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAAAAP//AAD//wAA//// - /////////wAA///9/wAA///+/////v////7////+/////v/9/////v/9//7////9//7////8//7/ - /v/+//7//v/+//3//v/+//3//v/+//3//v/9//7//v/8//3//v/9//3//v/9//3//f/+//3//P// - //z//P////3//P/9//7//f/8//3//P/9//7//f/9//3//f/8//7//v/8//z//f/9//z//v/9//v/ - /P/+//z//P/9//z//f/9//z//f/9//z//P/9//z//f/9//z//f/9//z//f/8//3//P/8//3//P/9 - //z//P/+//v//P/+//v/+//9//3//P/8//3//P/8//3/+//8//3//P/8//3//f/9//z//f/9//z/ - /f/9//z//P/9//3//P/9//z//f/8//z//v/7//3//f/9//z//P/+//z//f/8//3//f/7//7//f/8 - //3//P/9//z//f/9//z//f/8//z//f/9//z//P/9//3//P/9//3//f/9//3//f/9//7//f/+//3/ - /v/+//3//v////3//v8AAP3//f8AAP7///////7///////7///////7///8AAP///////wAAAAAA - AAAA//8AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAACAAAAAQABAAEAAQACAAIAAQAEAAIAAwAEAAMA - BAADAAQABAAEAAUAAwAEAAYABQAEAAYABQAGAAYABgAGAAYABwAGAAgABwAHAAkABwAIAAkACAAJ - AAgACgAKAAgACQAKAAkACgAKAAoACgAKAAoACQAKAAsACQAKAAsACwALAAwACwALAAwADAANAAwA - DQANAAwADQAOAA4ADQANAA8ADgAOAA4ADwAOAA8ADwAPABAADwAPABAAEAAQABEAEQAQABEAEgAR - ABIAEgARABIAEwASABMAEwASABMAEwAUABMAEwAVABMAEwAWABQAEwAUABUAFQAUABUAFQAVABUA - FQAVABYAFgAUABUAFwAWABUAFgAWABYAFgAWABUAFwAXABUAFwAXABYAFwAXABYAGAAYABYAFwAZ - ABcAFwAZABgAFwAYABkAGAAZABkAGAAZABkAGQAaABoAGQAaABsAGQAaABsAGgAaABsAGwAaABsA - GgAbABsAGgAbABwAGwAaABsAHAAaABwAGwAbABsAHQAbABwAHAAdABwAHQAdABwAHQAdABsAHQAc - ABwAHAAeABsAHAAdABwAHQAcABwAHAAcABwAHQAcABwAHAAdABwAHAAcABwAHgAcABwAHQAdABwA - HQAdABwAHAAeABwAHAAdAB4AHAAdAB0AHgAdAB0AHQAdAB0AHAAdAB0AHQAdAB4AHQAeABwAHQAe - ABwAHQAdAB4AHQAfAB0AHgAfAB0AHQAfAB4AHgAeAB8AHQAeAB4AHgAeAB4AHQAeAB4AHQAdAB0A - HQAeAB0AHQAdAB4AHQAdAB8AHQAdAB0AHQAeAB0AHgAfAB0AHQAeAB4AHgAeAB4AHgAeAB4AHQAe - AB4AHQAeAB4AHQAdAB8AHgAfAB4AHgAfAB8AHQAfAB4AHgAfAB4AHQAfAB4AHwAeAB4AHgAfAB0A - HgAeAB4AHgAfAB0AHgAdAB4AHQAdAB0AHAAeAB0AHQAcAB0AHQAdAB0AHQAdAB0AGwAdAB0AHQAc - ABwAHAAcABwAHAAdABsAHAAbABwAHAAcABsAHAAcABsAGwAbABsAHAAbABwAGwAaABsAGwAbABsA - GgAcABoAGwAcABkAGwAbABkAGwAaABoAGgAaABoAGQAaABkAGQAZABoAGgAZABkAGQAZABkAGAAZ - ABkAGAAYABgAGAAYABgAFwAZABgAFwAYABcAFwAYABcAFgAYABcAFgAXABYAFwAWABYAFgAWABUA - FgAXABYAFQAWABUAFQAWABUAFAAWABUAFAAVABUAFAAUABUAFAAUABQAFAAUABQAEwATABMAEwAS - ABIAEwASABMAEgASABIAEQASABEAEgARABEAEQAQABIAEQAPABAAEQAQABAAEAAPABAADwAPAA8A - DwAPAA4ADgAOAA8ADgANAA4ADgAOAA0ADQAOAAwADQANAAwADQANAA0ADQAMAAwADAAMAAsADAAN - AAsADAAMAAsADAAMAAoACwANAAoACwAMAAsACwALAAsACgAKAAsACwALAAsACwAKAAsACgAJAAsA - CwAKAAoACgAKAAsACgAKAAoACgALAAoACQAMAAgACgALAAoACgAKAAkACgALAAoACQALAAkACgAJ - AAoACQAKAAkACQAKAAkACQAJAAoACQAJAAkACQAJAAkACAAJAAoACQAJAAkACgAKAAoACAAKAAkA - CQAJAAoACQAJAAoACQAJAAkACwAJAAoACQAKAAoACgAJAAoACgAKAAkACgAKAAoACQAKAAoACQAK - AAkACQAKAAoACQAJAAsACgAIAAoACgAIAAoACQAJAAkACgAIAAkACQAJAAcACQAJAAgABwAJAAgA - CAAIAAkACAAHAAgACAAIAAcACAAIAAcABwAIAAcABwAJAAYABgAIAAYABgAHAAcABwAGAAYABgAH - AAcABgAGAAYABgAFAAYABgAFAAYABgAFAAUABgAFAAUABQAGAAQABAAEAAMABAAEAAQABAAEAAMA - BAAFAAMAAwADAAMAAwACAAIAAwABAAIAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD/ - //7////+//7//f/9//7//f/9//3//P/9//v//f/9//v//P/8//v/+//7//v/+//7//r/+//6//r/ - +//4//r/+v/5//j/+f/6//j/+f/4//j/+f/3//j/+P/4//f/9//3//f/9//3//b/9v/3//b/9//2 - //X/9v/2//b/9v/2//X/9f/1//X/9f/1//X/9f/1//X/9f/0//T/9f/z//T/9P/z//T/8//0//L/ - 8//0//L/8//z//P/8//y//P/8v/z//P/8v/y//L/8v/y//H/8f/y//H/8P/y//H/8f/x//H/7//x - //H/7//w/+//8f/v/+//7//x/+//7v/v/+//7v/u/+7/7v/v/+3/7f/u/+3/7f/u/+3/7v/t/+z/ - 7v/u/+3/7P/t/+7/7P/t/+3/7f/r/+3/7P/t/+z/7P/s/+v/7P/r/+v/6//s/+v/6//r/+n/7P/q - /+r/6v/q/+r/6v/q/+r/6f/p/+v/6f/p/+r/6f/r/+j/6f/p/+n/6f/o/+n/6f/p/+j/6f/o/+n/ - 6v/o/+n/6P/o/+j/5//o/+f/6P/p/+f/6P/o/+f/5//m/+f/5v/m/+b/5v/m/+X/5v/l/+X/5f/l - /+T/5P/l/+T/5f/m/+X/5P/l/+T/5P/j/+T/4//k/+P/4//j/+T/4v/i/+P/5P/j/+P/4//j/+H/ - 5P/i/+L/4v/k/+P/4v/j/+L/4//i/+L/4v/j/+H/4v/i/+L/4v/i/+H/4v/h/+D/4f/h/+D/4f/g - /+H/4f/g/+D/4P/h/+D/4P/i/9//3//g/9//4P/g/9//4P/f/9//3v/f/9//3v/e/97/3v/f/93/ - 3v/e/9z/3v/e/93/3f/d/97/3P/e/93/3f/c/9z/3f/c/9z/3f/c/9z/3P/d/9v/3P/b/9v/2//Z - /9z/2//a/9v/2//c/9r/2//b/9r/2//b/9v/3P/b/9v/2//b/9v/2v/b/9z/2//b/9z/3P/c/93/ - 3P/d/9v/3f/d/9z/3f/d/93/3f/e/93/3f/f/93/3v/e/97/3v/f/97/3//f/97/3//g/9//3//f - /9//4P/g/9//3//f/+D/4P/g/+D/4P/h/+H/4P/i/+D/4P/h/+D/4f/h/+H/4v/i/+P/4v/k/+L/ - 4v/k/+L/5P/i/+P/4//j/+P/4//j/+X/4//j/+X/5f/k/+X/5P/l/+T/5f/k/+X/5f/l/+b/5P/l - /+b/5P/l/+T/5v/m/+T/5v/m/+X/5v/m/+b/5//m/+f/5//n/+j/5//n/+j/6P/n/+j/6P/o/+j/ - 6f/p/+j/6v/p/+j/6f/q/+r/6f/p/+v/6v/q/+r/6//q/+r/6//q/+z/6//r/+v/6//r/+z/7P/q - /+z/7f/r/+3/7f/r/+3/7f/s/+3/7f/s/+3/7f/s/+7/7f/u/+3/7P/v/+3/7f/u/+7/7v/t/+7/ - 7//t/+7/7v/u/+7/7//t/+7/8P/u/+7/7//u/+//7//u/+7/7//w/+7/8P/w/+7/8P/v/+//8P/w - /+7/7//x/+7/7//x/+//7//w//D/8P/w//D/7//w/+//7//v//H/8P/v//H/7//v//H/7//v//H/ - 8P/v//D/8P/v//H/8P/u//H/8f/u//H/8f/v//H/8f/v//D/8v/v//D/8f/w//H/8P/x//D/8f/x - //D/8v/v//D/8f/x/+//8P/y//D/8f/x//D/8f/w//D/8v/w//D/8f/v//H/8f/v//H/8f/x//D/ - 8P/x//D/8f/x//D/8f/y//D/8f/x//L/8f/x//L/8f/x//H/8f/y//L/8v/y//L/8f/z//L/8v/z - //H/8//z//H/8//z//L/8//z//L/8//1//L/8//0//P/9P/z//T/9P/z//T/8//0//T/9P/0//T/ - 9P/0//T/9P/0//X/9P/0//X/9P/0//X/9P/0//b/9f/1//X/9f/2//X/9f/1//X/9f/1//X/9v/1 - //b/9f/1//b/9f/2//f/9v/1//b/9f/2//b/9f/2//f/9f/4//b/9v/3//f/9//2//f/9//4//b/ - 9//3//f/9v/4//f/+P/3//f/9//3//j/+P/3//n/9//5//j/+f/4//n/+f/4//n/+f/5//j/9//4 - //n/+v/4//j/+f/6//n/+f/5//n/+v/4//v/+v/5//r/+v/6//r/+//6//v/+//5//v//P/6//v/ - /P/7//z/+//8//v/+//+//r//P/9//v//f/8//3//f/8//z//f/+//z//f/9//3//v/9//3//v/+ - //3//f////7//f////7//v////7//f///////v///////v8AAP///v8AAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAABAAAAAAABAAEAAAABAAEAAAAAAAEAAQAAAAEAAQAB - AAEAAQABAAEAAgABAAEAAQABAAIAAQABAAEAAgACAAEAAgAAAAMAAgAAAAIAAgABAAEAAgABAAEA - AQABAAEAAgACAAEAAgABAAIAAwABAAEAAgACAAEAAgAEAAEAAgADAAIAAwADAAIABAAEAAMABAAE - AAMABAAFAAMABQAFAAQABgAGAAMABQAHAAUABQAHAAYABgAHAAYABwAHAAcABwAIAAgACAAIAAgA - CAAHAAkACgAJAAgACAAKAAkACQAJAAoACQALAAgACgAMAAkACQAMAAoACwALAAsADAANAAwADAAO - AA0ADQAOAA4ADQAPAA4ADQAPABAADwAPABIAEQAPABIAEQASABIAEgATABQAFAASABQAFQAVABUA - FAAWABYAFgAVABYAGAAXABgAGAAXABgAGgAZABkAGgAZABoAGgAaABoAGgAaABoAHAAbABsAGwAd - ABwAGwAcABwAHAAeABwAHQAdAB4AHQAdAB8AHwAdAB8AHwAfAB8AHwAfAB8AIAAgAB8AIAAiACEA - IAAhACIAIQAiACMAIgAiACMAJAAkACMAJAAlACQAJAAmACUAJQAnACUAJQAnACYAJQAmACcAJgAm - ACYAJwAoACgAJwAoACgAKAAnACgAKQAoACgAKAAoACkAKQAoACkAKgAqACoAKgArACoAKwArACsA - KwArACwAKwAtACwALAAuAC4ALQAtAC4ALwAuAC8ALgAvAC8ALwAuADAALwAwAC8ALwAwADAALwAx - ADAAMQAwADEAMQAyADEAMQAxADIAMQAyADIAMgAyADIAMwAzADIAMwA0ADMAMwAzADMANAA0ADMA - NAAzADQANQAzADQANQA0ADQANAA1ADQANQA0ADUANQA0ADUANQA1ADUANQA2ADUANgA2ADUANQA2 - ADUANgA1ADUANgA2ADYANgA4ADcANgA4ADgANwA3ADkAOAA3ADgAOAA4ADkAOQA4ADkAOQA5ADgA - OQA6ADcAOQA5ADcAOAA4ADkAOAA3ADgANwA4ADgAOAA3ADgAOQA5ADcAOAA6ADgAOAA5ADgAOAA5 - ADkANwA5ADkAOAA4ADgAOQA4ADgAOQA6ADkAOAA6ADkAOQA5ADkAOgA6ADgAOQA6ADkAOQA6ADoA - OwA6ADkAOgA7ADkAOQA7ADsAOQA6ADwAOgA5ADsAOgA7ADoAOgA6ADoAOgA6ADkAOQA6ADoAOgA6 - ADoAOwA6ADoAOQA5ADkAOgA5ADoAOQA5ADsAOgA5ADoAOgA7ADgAOQA6ADkAOAA5ADkAOQA5ADoA - OgA5ADkAOwA4ADkAOQA5ADgAOQA5ADgAOAA5ADgAOAA5ADgAOAA5ADkAOQA4ADgAOQA5ADgAOQA5 - ADkAOQA6ADgAOQA6ADgAOAA6ADkAOAA4ADkAOQA4ADkAOAA5ADoAOAA5ADoAOAA3ADkAOQA4ADcA - OAA4ADcAOAA4ADYAOAA5ADcANwA3ADYAOAA3ADYANwA3ADYANgA3ADYANwA4ADYANwA2ADYANgA3 - ADcANgA2ADcANwA3ADUANgA3ADUANQA4ADUANQA2ADYANgA1ADcANgA1ADYANQA2ADYANQA0ADYA - NgA1ADQANQA1ADQANQA1ADQANAA0ADQAMwA0ADQAMwAzADMANAAyADMANAAzADIAMgA0ADIAMgAy - ADMAMgAxADMAMQAyADIAMgAyADEAMQAyADEAMQAwADEAMAAxAC8AMAAwADEALwAwADAAMAAwADAA - MAAwADAAMAAxAC8ALwAvAC8AMAAvAC8ALwAwAC4ALwAvAC8ALwAvAC8ALwAvAC8ALwAwAC4ALwAv - AC8ALwAuAC8ALwAvAC8ALwAuAC8ALgAuAC4ALwAvAC4ALgAvAC0ALgAvAC4ALwAuAC4ALwAvAC4A - LgAvAC0ALgAvAC0ALwAuAC4ALgAuAC4ALQAuAC8ALgAtAC4ALQAtAC0ALQAuAC0ALQAtAC4ALQAt - AC4AKwAtAC0ALAAsACwALQAsACsALAAsACwALAAsACsALAArACsAKgArACsAKgAqACoAKgAqACoA - KgAqACoAKgAqACkAKgAqACkAKQAqACoAKAApACoAKQApACgAKQAoACgAKAAoACkAKAAoACcAJwAo - ACgAKAAnACgAKAAnACgAKAAmACgAJwAnACcAJwAmACcAJwAnACYAJgAnACUAJQAnACUAJQAmACYA - JQAlACUAJgAlACUAJQAlACUAJQAjACQAJQAkACMAJAAkACQAIwAjACIAJAAjACIAIgAjACIAIwAi - ACIAIwAjACEAIgAjACEAIQAjACIAIQAhACIAIQAhACEAIQAhACEAIQAiACEAIQAhACIAIQAhACIA - IQAhACIAIQAhACEAIQAiACIAIAAgACEAIgAgACEAIQAhACEAIAAgACEAIQAgACAAIAAgACEAIAAh - AB8AIAAgAB8AIQAfAB8AIAAgAB4AHwAgAB8AHwAfAB4AHwAeAB8AHwAeAB0AHgAdAB4AHgAeAB0A - HgAdAB0AHQAdAB0AHQAeABwAHQAeAB0AHAAdAB0AHQAcAB0AHQAcAB0AGwAdAB0AHAAcABwAGwAd - ABwAHAAcABwAHAAdABsAHAAbABwAGwAcABwAHAAcABsAGwAbABwAHAAbABwAGwAaABsAGwAbABsA - GgAbABsAGgAaABoAGgAaABoAGgAaABoAGQAaABsAGgAaABoAGQAaABoAGgAaABkAGQAZABoAGgAZ - ABoAGQAYABkAGAAZABkAGAAZABkAGAAYABkAGAAYABkAFwAZABgAFwAYABgAGAAYABgAFwAXABgA - GAAYABcAFwAYABcAFwAXABcAFwAXABYAFwAWABcAFwAWABYAFgAXABYAFwAWABUAFgAVABYAFgAW - ABUAFAAVABYAFgAUABQAFAAVABQAFAAVABQAFAAUABUAFQAUABQAFAAVABMAFAATABQAFAATABQA - FAASABMAEwATABMAEwAUABIAEwAUABIAEwATABIAEwASABIAEgASABIAEQATABIAEgARABIAEgAR - ABEAEQARABEAEAARABEAEAARABEAEAAQABAAEAARABAAEAAQABAAEAARAA8ADwARABAAEAAQABAA - EAAPAA8AEAAQAA8ADwAQAA8ADwAPAA8ADwAPAA4ADgAQAA4ADQAPAA8ADgAOAA4ADgAOAA4ADgAO - AA4ADQANAA4ADQAMAAwADQANAA0ADAAMAA0ADAAMAAwADQAMAAsADAALAAwADAAKAAsADAALAAoA - CwALAAoACgAKAAoACwALAAkACgAKAAsACgAJAAkACwAJAAkACQALAAgACQAJAAkACQAJAAgACgAJ - AAkACQAJAAkACQAJAAgACAAJAAcACQAIAAcACAAJAAcABwAIAAgACAAIAAcABwAHAAgACAAHAAcA - CAAHAAgABwAGAAgACAAHAAYABwAHAAYABgAHAAYABgAHAAYABgAHAAUABgAHAAUABgAGAAUABgAH - AAUABQAGAAUABQAGAAUABQAGAAUABAAGAAYABQAFAAcABQAEAAYABQAFAAUABAAFAAYABgAEAAUA - BQAGAAYABAAGAAYABQAFAAUABQAFAAUABQAEAAUABQAFAAUABQAFAAUABQAEAAUABQAFAAUABQAG - AAUABAAGAAYABQAGAAUABQAGAAUABQAFAAcABQAEAAYABgAFAAUABgAFAAYABgAFAAUABgAGAAUA - BgAHAAUABQAGAAYABQAGAAYABQAFAAYABgAGAAUABgAGAAUABQAHAAYABgAHAAUABQAHAAYABgAH - AAcABwAGAAYABwAIAAcABwAHAAcACAAGAAgACAAHAAgACAAHAAgACAAHAAgACAAJAAgACAAIAAcA - CAAIAAgACAAIAAgACAAJAAgACAAJAAgACQAHAAgACQAIAAgACQAIAAkACAAIAAkACQAJAAkACAAH - AAkACAAIAAcACAAIAAcACAAIAAgABwAHAAcABwAHAAcABwAHAAYABwAHAAYABwAHAAcABgAGAAYA - BgAGAAYABwAFAAYABwAEAAYABgAFAAUABQAFAAQABQAEAAQABQADAAQABAAEAAMAAwADAAIAAwAD - AAIAAgACAAIAAgACAAEAAgABAAAAAQABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA - //////7///////3///////3//v/+//7//v/8//7//f/9//3//P/8//z//f/8//v//P/8//v/+//8 - //v/+//8//v/+f/7//v/+v/6//r/+//5//n/+f/7//n/+P/6//n/+f/5//n/+f/6//j/+P/5//j/ - +P/5//j/+P/4//f/+f/4//j/9//4//j/9//3//j/9//3//j/9//4//j/9//4//b/9//2//f/9v/3 - //f/9//3//X/9//2//f/9v/2//b/9//2//f/9v/1//b/9v/1//b/9v/1//X/9v/2//X/9f/1//b/ - 9f/1//T/9v/z//X/9f/z//T/9P/0//T/9P/0//T/9f/1//T/9f/0//P/9P/z//P/8//z//P/9P/0 - //L/9P/z//L/8//z//P/8v/0//L/8v/0//L/8v/y//L/8v/x//L/8v/y//L/8f/x//H/8f/w//L/ - 8v/y//H/8v/y//D/8v/x//D/8f/y//H/8f/x//D/8v/x//D/8f/x//D/8P/x//D/8f/x//D/8P/x - /+//8f/w//D/8P/w//D/8P/w//D/7//w/+//7//x/+//7v/w/+//8P/v/+//8P/u/+//7//v/+// - 7//u/+//7//v/+7/7//v/+7/7//v/+//7v/v/+//7v/w/+//7//v//D/8P/u//D/8P/v/+//7//w - /+//7//v//D/8P/u//H/8P/v//D/7//w/+//8P/w//D/8f/w//D/8f/x//D/8P/x//H/8P/x//L/ - 8v/x//L/8f/x//L/8v/z//L/8//z//H/8//z//P/8//0//L/8//1//P/9P/0//P/9P/0//T/9P/0 - //P/9P/1//T/9P/0//X/9f/1//X/9f/1//X/9P/1//X/9f/1//X/9P/2//T/9f/2//X/9f/1//X/ - 9v/1//b/9f/3//T/9f/2//b/9v/2//X/9v/1//b/9f/3//b/9v/1//f/9v/3//b/9v/2//b/9v/2 - //f/9//2//f/9f/3//f/9//3//b/9//3//b/9//3//b/+P/3//f/9//3//f/9//3//j/9//3//j/ - +P/3//j/9//4//j/+P/5//j/+P/5//j/+P/5//n/+P/4//n/+f/5//n/+v/5//n/+f/5//v/+v/6 - //r/+v/6//v/+//6//v//P/6//z//P/6//z//f/8//3//f/8//3//v/9//7//f////3//f////7/ - /v/////////+////AAD/////AAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAB - AAAAAQABAAEAAgACAAEAAgADAAEAAgAEAAMAAgADAAQAAwAEAAQABAAFAAQABAAFAAYABQAFAAcA - BgAGAAcABgAGAAgABwAGAAcABwAHAAkABwAHAAkACAAIAAgACQAJAAkACAAJAAkACwAJAAoACQAJ - AAoACQAKAAkACgAKAAoACgAKAAoACwALAAoACQALAAoACwALAAoACgALAAoACwALAAoADAALAAsA - CwAKAAsADAAMAAwADAAMAAwADAANAAsADAAOAAwADAANAA4ADQANAA4ADgAOAA4ADQAPAA8ADgAP - AA8ADgAQAA8ADwARAA8AEAAQAA8AEAAQABAAEQARABAAEQASABAAEQARABIAEgARABIAEgASABIA - EgASABIAEgASABMAEgASABMAEwATABMAEwATABQAEwAUABUAFAAUABUAFAAVABUAFQAWABUAFQAW - ABYAFgAWABYAFwAWABcAFgAXABcAFgAYABgAFwAXABgAGAAYABgAFwAZABkAGAAZABkAGQAaABkA - GQAaABoAGwAbABoAGwAbABoAGgAbABsAGwAbABoAGwAbABwAHAAbABsAGwAbABwAGwAcABwAHAAc - ABwAHAAdABwAGwAcABwAHAAcABsAHAAdABwAHQAdABwAGwAcAB0AHQAdAB0AHQAdAB4AHQAdAB0A - HQAdAB0AHgAdAB0AHgAdAB4AHQAeABwAHgAfAB0AHQAeAB0AHgAdAB0AHgAeAB0AHgAfAB4AHQAe - AB4AHwAeAB4AHQAfAB4AHgAeAB8AHQAfAB4AHgAeAB4AHQAfAB4AHgAfAB4AHgAfAB4AHgAfAB8A - HgAfAB8AHwAfAB8AHwAfAB8AHwAgAB8AHwAfAB8AHwAfACAAHwAgAB8AHwAgACAAHwAfAB8AHwAg - AB8AHwAfAB8AHwAfAB8AHwAfAB8AIAAfAB8AHwAfACAAHwAfAB8AIAAfAB4AHwAeACAAIAAeAB8A - HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AIAAeAB4AHwAfAB4AHwAgAB4AHgAfAB8AHwAf - AB8AHwAgACAAHwAgAB8AHwAgAB8AHwAfAB8AIAAgAB4AHwAhAB8AHwAgACAAHwAfAB8AHwAgACAA - HwAgACEAIAAgACEAIAAfACEAIQAhACAAIAAhACAAIQAgAB8AIAAgAB8AIAAhAB8AHwAgACAAIAAg - AB8AIAAiACAAHwAhACEAIAAgACEAIQAhACAAHwAhACIAIQAhACIAIgAhACIAIQAiACEAIQAiACMA - IgAhACIAIgAjACIAIQAjACMAIgAhACIAIgAiACIAIgAiACIAIwAjACIAIgAiACMAIgAiACIAIwAi - ACIAIgAjACIAIQAiACIAIQAiACEAIgAiACEAIQAhACIAIAAgACIAIgAhACEAIgAhACEAIQAhACEA - IQAhACAAIQAiACEAIAAhACEAIQAhACIAIQAgACEAIQAiACAAIQAiACEAIAAhACEAIQAiACAAIAAi - ACEAIAAhACEAIQAhACAAIQAiACEAIQAhACEAIQAgACEAIQAhACAAIQAgACEAIQAgACAAIAAhACEA - IQAhACAAIQAhACEAIQAiACEAIQAiACEAIQAiACIAIQAgACEAIgAhACIAIQAhACIAIQAiACEAIgAi - ACEAIQAiACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACAAIQAhACAAIQAiACEA - IQAgACEAIQAhACEAIQAhACEAIQAgACEAIgAhACAAIQAiACAAIQAgACEAIQAgACAAIAAhACAAIAAh - ACAAIAAgACAAIAAgACAAIAAgAB8AIAAgACAAIAAhACAAIAAhACAAHwAgACEAIAAgACAAIAAgACAA - IAAfACAAIAAgACAAIAAgAB4AIAAgAB8AHwAfACAAHwAfAB8AHwAfAB8AHwAeAB8AIAAfAB4AHgAg - AB8AHgAfAB4AHgAfAB4AHgAeAB8AHQAeAB4AHgAeAB4AHQAfAB4AHgAfAB4AHQAeAB0AHwAeAB4A - HQAeAB4AHgAeAB4AHgAeAB0AHgAfAB4AHQAeAB4AHQAdAB8AHgAdAB4AHQAeAB4AHgAeAB4AHgAd - AB0AHQAdAB0AHQAdAB0AHQAeAB0AHQAcAB0AHAAdABwAHAAcAB4AHAAcABwAHQAdABwAHAAcABwA - HAAcABwAHAAcABwAHAAbABsAHAAbABsAGwAcABsAGwAbABoAGwAbABoAGwAbABoAGgAaABsAGwAa - ABoAGwAaABoAGgAaABoAGgAaABkAGgAaABkAGQAbABoAGQAZABkAGQAZABkAGQAZABkAGQAZABkA - GAAYABkAGQAYABgAGAAYABcAGAAYABYAFwAYABcAFwAXABYAFwAXABYAFwAXABYAFgAXABYAFgAX - ABYAFgAWABUAFgAWABYAFQAVABYAFgAWABUAFQAVABUAFQAWABQAFAAVABUAFAAUABQAFAAUABQA - EwAUABQAEwASABMAEwATABIAEgASABEAEgASABIAEgASABIAEQARABEAEQAQABEAEQAQABEAEQAQ - AA8AEAARAA8AEAAPABAAEAAOAA8ADwAOAA8ADgAPAA4ADgAOAA4ADgAOAA0ADgANAA0ADQANAA0A - DAANAA0ADQANAA0ADQAMAA0ADQANAAwADAANAAwADQANAAwADAANAAsADAANAAwADAAMAAwADAAM - AAwADAAMAAsADAANAAwACwALAAwADQAMAAwADAAMAAwADAAMAAwADAAMAAwADAANAAwADAANAAwA - DAAMAAwADAANAAwADAAOAAwADAANAAwADQAMAA0ADQANAA0ADAANAA4ADQAMAA4ADQANAA0ADQAO - AA0ADgANAA4ADgANAA8ADQAOAA4ADgAOAA0ADwAOAA0ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4A - DgAOAA4ADgAOAA8ADgAOAA8ADgAPAA4ADwAPAA4ADgAPAA8ADgAOABAADwAOAA8ADwAPAA8ADwAP - ABAADwAPAA8ADwAPABAADwAPABAAEAAPABAAEAAPABAAEAAQABAAEAAPABAAEAAPAA8AEAAQAA8A - DwARAA8ADwAQABAAEAAPAA8AEAAPAA8ADwAQABAAEAAOAA8AEAAPAA4ADwAPAA8ADgAOAA4ADwAP - AA0ADgAOAA4ADgANAA0ADgAOAAwADQAOAA0ADQAOAA0ADAANAA0ADQAMAA0ADQANAAwADAANAA0A - DAAMAA0ADAAMAA0ADAAMAA0ADAALAAwACwALAAwACwALAAwADAALAAsACwALAAsACwAKAAsACwAK - AAoACgAKAAoACgAKAAkACgAJAAoACgAJAAkACgAJAAkACQAKAAkACQAJAAkACQAIAAgACAAIAAgA - CAAIAAgACAAHAAcACAAIAAcABwAHAAcABwAHAAYABgAHAAYABQAGAAcABQAFAAYABQAGAAUABQAG - AAUABQAFAAUABAAFAAUABAAFAAQABQAFAAMABQAEAAQABAAEAAMABAAFAAMAAwAEAAMABAADAAMA - AwADAAMAAwADAAMAAgADAAMAAgACAAIAAgACAAIAAgACAAIAAQABAAMAAQABAAIAAQACAAEAAQAC - AAEAAQABAAEAAgABAAIAAQABAAIAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAAABAAEAAAABAAEA - AAABAAAAAAABAAAAAQABAAAAAQABAAAAAQABAAAAAQABAAAAAAAAAAEAAQAAAAEAAAABAAEAAQAA - AAAAAQAAAAEAAQABAAAAAAABAAEAAQAAAAAAAQABAAAAAQABAAAAAQAAAAEAAQAAAAEAAQABAAEA - AQABAAEAAQAAAAEAAgAAAAAAAgABAAEAAQACAAEAAQADAAEAAgACAAEAAgABAAEAAgACAAEAAQAC - AAEAAgABAAIAAgABAAEAAgACAAIAAQACAAIAAQACAAIAAQACAAIAAQACAAIAAQACAAIAAgADAAIA - AQADAAIAAgACAAIAAgACAAIAAgADAAIAAgADAAIAAgACAAIAAgACAAIAAQADAAIAAQACAAIAAQAB - AAIAAQACAAIAAQABAAIAAQABAAIAAQABAAEAAgABAAEAAQABAAEAAAABAAAAAQAAAAAAAQAAAAEA - AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAP////8AAP////8A - AP////8AAP//AAD///////8AAP////8AAP7///8AAP7/AAAAAP7///8AAP///v8AAP////////// - /////////////////////wAA///+/wAAAAD///7///////////////////////7//v8AAP7//v8A - AP////////////8AAP///v8AAAAA//8AAAAA//8AAAAA//8AAAAAAAAAAAEAAAAAAAAAAAAAAAAA - AAAAAAEAAQAAAAEAAQABAAEAAAACAAIAAgABAAEAAgACAAIAAgACAAIAAwACAAIAAwACAAMAAwAD - AAMABAADAAMABAAEAAQAAwAEAAUABAAFAAQABQAFAAUABQAFAAYABQAEAAYABgAFAAYABwAGAAYA - BgAGAAcABwAHAAYABgAIAAcABwAHAAgABwAIAAgACAAIAAkACQAJAAgACQAJAAkACQAJAAkACQAL - AAkACQAKAAoACQAKAAoACgAJAAoACQALAAoACgAKAAsACgAKAAsACwAJAAsACgAKAAoADAAKAAsA - CwAMAAsACwALAAwADAALAAsADAAMAAsACwAMAAwADAAMAA0ADQAMAA0ADQAMAA0ADQAMAA0ADQAN - AA0ADQANAA0ADAANAA0ADQANAA0ADQANAA0ADQANAA4ADQANAA4ADQANAA4ADQAOAA0ADQAOAA0A - DgAOAA4ADQANAA4ADgAOAA0ADgANAA4ADwANAA4ADwANAA0ADgAOAA0ADgANAA4ADgANAA0ADgAO - AA0ADgAOAA0ADgAOAA0ADQAOAA4ADgAOAA0ADgAOAA0ADQAPAA4ADgAPAA4ADQAOAA8ADgAOAA4A - DwAOAA4ADwAOAA8ADwAOAA4ADwAPAA0ADwAPAA4ADgAPAA8ADwAOAA8ADwAOAA8ADwAOAA8ADwAP - AA4ADgAQAA8ADgAPAA8ADgAPAA8ADQAPABAADgAOAA8AEAAPAA4ADwARABAADgAQABAADwAPABAA - EAARAA8ADwARABAAEAARABEAEgARABAAEgATABEAEQASABMAEQARABQAEgARABMAEgATABMAEwAT - ABMAFAATABMAEwAUABMAFAAUABMAFAAUABQAEwATABQAFAATABQAEwATABUAFAATABQAFAAUABMA - FAAUABQAEwATABQAFAATABQAFQATABQAFQAUABQAFAAUABQAFAAUABMAFAAUABQAFQAUABQAFQAU - ABUAFQAUABQAFQAVABUAFQAVABUAFgAWABQAFQAWABUAFAAWABYAFQAVABYAFgAVABUAFQAVABYA - FQAVABYAFQAUABYAFgAVABUAFQAVABUAFgAWABQAFQAWABUAFQAVABQAFgAVABQAFQAWABQAFQAV - ABUAFQAWABUAFQAVABUAFQAVABYAFQAVABYAFgAWABUAFgAWABUAFQAXABUAFQAWABcAFgAWABcA - FgAWABcAFgAWABcAFgAWABcAFwAXABYAFgAXABYAFwAXABYAFgAXABcAFgAWABcAFgAWABcAFwAW - ABYAFwAWABYAFgAXABcAFwAWABcAFgAVABcAFwAWABYAFwAXABYAFgAWABYAFgAWABYAFwAWABYA - FgAWABYAFQAWABcAFgAWABcAFwAWABcAFwAXABYAFwAXABcAFwAYABYAFwAYABcAFwAYABcAFwAX - ABcAGAAXABcAGAAYABcAGAAZABgAGAAYABkAGQAZABgAGAAYABkAGAAYABkAGQAYABgAGAAZABgA - GAAZABgAGQAYABgAGQAaABkAGAAaABkAGQAZABkAGQAZABkAGQAZABoAGQAZABoAGgAZABkAGQAZ - ABkAGQAZABkAGQAZABoAGQAZABoAGQAZABkAGQAZABkAGgAaABgAGQAZABkAGQAZABkAGQAYABkA - GAAYABkAGAAYABgAGAAYABkAGAAYABkAGQAYABgAGQAZABgAGAAZABkAFwAXABkAGAAYABgAGAAY - ABgAFwAYABgAGAAXABcAFwAXABgAFwAXABgAGAAXABcAGAAWABcAFwAXABcAFwAWABcAFwAXABYA - FwAXABYAFgAXABYAFgAWABYAFgAWABUAFgAWABYAFQAWABYAFgAUABUAFgAWABUAFQAVABUAFQAV - ABQAFQAVABQAFQAVABQAFQAUABQAFQAVABMAFAAVABQAFAAVABQAFAAUABQAFAAUABQAFAAUABQA - FAAUABQAFAAUABQAEwAUABQAFAATABQAFAATABQAEwAUABQAEwATABQAFAATABQAEwATABMAEwAT - ABMAFAATABMAEwATABMAEwATABIAEwATABIAEwASABIAEwASABEAEgATABIAEgASABIAEgARABEA - EgARABEAEgARABEAEQAQABEAEQARABAAEQARABAAEQARABAAEAARABAADwARABEADwAPABAAEAAQ - AA8ADwAQABAAEAAQABAADwAQABAADwAQAA8AEAAQAA8AEAAQAA8ADwAQAA8AEAAQAA8ADwAPABAA - DwAPABAADwAOAA8ADwAPAA8ADgAPAA8ADgAOAA8ADgAOAA4ADgAOAA4ADQAOAA8ADgAOAA4ADgAO - AA4ADgAPAA4ADgAOAA4ADgAOAA4ADgAOAA4ADQAOAA4ADQAOAA4ADQANAA4ADgAOAA4ADQAOAA4A - DQAOAA4ADQAOAA4ADQANAA0ADgAOAA0ADQAOAA0ADQAOAA0ADQANAA0ADQANAA4ADQANAA0ADQAN - AA0ADQANAA0ADQANAA0ADQANAAwADAANAA0ADQAMAAsADAANAAwADAAMAAwADAAMAAwADQAMAAwA - DAANAAwADAAMAAwADAALAAwADQALAAsADAAMAAwACwAMAAsACwANAAsACwAMAAsADAAMAAsACwAM - AAsACwAMAAsACwALAAwADAALAAwACwALAAsACwALAAsACgAMAAsACwALAAsACgALAAsACgALAAoA - CgALAAsACgALAAoACwALAAsACwALAAoACwALAAoACgALAAoACgALAAoACgALAAoACgALAAoACgAL - AAwACgALAAsACwAKAAsACgALAAoACwAKAAsACgAKAAoACwAKAAsACgALAAoACgAJAAoACgAKAAkA - CgAJAAsACgAJAAoACgAKAAkACgAJAAoACQAJAAkACgAJAAkACQAKAAkACgAJAAkACQAKAAkACgAK - AAkACQAJAAkACAAJAAgACgAJAAkACQAKAAkACgAJAAkACQAKAAkACgAKAAgACQAKAAkACAAKAAoA - CgAKAAkACQAJAAoACQAKAAoACgAJAAsACQAJAAoACwAJAAoACQAKAAoACgAKAAoACgALAAkACgAL - AAoACQALAAoACwAKAAoACgAMAAoACgALAAsACgALAAoACwALAAoACgALAAwACwALAAwADAALAAwA - DAAMAAwACwAMAA0ADAALAAwADQANAAwADAANAA0ADQAMAA0ADQANAA0ADQAMAA0ADgAOAA0ADQAN - AA4ADQANAA4ADgANAA0ADgAOAA0ADAAOAA8ADQAOAA4ADgAOAA4ADgAOAA8ADgANAA8ADwAOAA4A - DwAOAA4ADwAPAA8ADwAPAA8ADwAQAA8ADwAPABAADwAQABAADwAPABAAEAAQAA8AEAAQAA8ADwAQ - AA8AEAAQAA8ADwARABAADwAQABAAEAAQAA8ADwARABAAEAAQABAAEAAPABAAEQAQABAAEAAQABAA - EAAQABAAEAARABAAEQARABAAEQARABEAEQARABEAEQASABEAEQASABIAEQARABIAEwASABIAEgAR - ABIAEgASABIAEgASABIAEgASABIAEgASABIAEwASABIAEgATABMAEgASABMAEgASABMAEwATABIA - EwATABIAEwAUABMAEwATABMAEwATABMAEwATABQAFAATABMAFAATABMAFAAVABMAEwATABQAFAAT - ABMAFAAUABQAFAAUABMAFAAUABMAFAAUABQAFAAUABMAFAAUABQAFAAVABQAFAAVABUAFAAUABUA - FQAUABUAFQAVABUAFQAVABYAFQAVABUAFgAWABQAFgAWABUAFQAVABYAFQAVABYAFQAVABYAFgAV - ABYAFwAWABUAFQAXABYAFQAXABYAFgAWABYAFQAWABcAFgAVABYAFwAWABUAFgAYABcAFgAYABcA - FwAXABcAFwAYABcAFgAYABcAFwAYABgAGAAYABcAGAAZABgAFwAZABkAGAAYABoAGAAYABkAGAAZ - ABkAGQAZABkAGQAZABgAGAAZABkAGQAZABkAGQAZABkAGAAZABkAGQAZABkAGAAYABoAGQAYABkA - GQAaABgAGQAZABkAGAAZABkAGAAYABkAGgAYABkAGgAZABgAGQAZABkAGQAZABgAGQAZABgAGQAZ - ABkAGQAZABoAGQAYABkAGgAZABgAGQAZABgAGQAaABgAGQAaABgAGAAaABkAGAAZABkAGQAZABkA - GAAZABkAGAAZABoAGAAXABkAGgAYABgAGAAYABgAGQAZABcAGAAZABgAGAAYABcAGQAYABcAGAAZ - ABcAGAAYABgAGAAZABgAGAAYABcAGAAYABkAGAAYABgAGQAZABgAGAAZABgAGAAaABgAFwAZABkA - GAAYABkAGQAYABkAGAAZABkAGAAYABkAGgAZABgAGQAZABgAGQAaABgAGAAZABkAGAAZABkAGQAY - ABkAGQAYABkAGgAZABgAGQAaABkAGQAYABkAGQAXABkAGQAZABkAGQAZABgAGAAZABkAGAAYABgA - GQAZABgAGAAZABkAGAAYABkAGQAZABkAGQAZABkAGQAaABgAGQAaABkAGQAZABkAGQAaABkAGQAa - ABoAGgAaABoAGgAZABoAGgAaABkAGgAaABoAGgAaABsAGwAbABoAGgAbABsAGwAaABsAGwAbABoA - GgAbABsAGwAbABsAGwAbABsAGwAcABsAGwAcABsAGwAcABsAHAAbABwAGwAcABsAGwAcAB0AHQAb - ABwAHAAcABwAHAAdAB0AHAAcAB0AHAAcABwAHAAcAB0AHAAcABsAHgAcABsAHAAdABsAHAAcABwA - HAAcABwAHAAcABwAHAAbABwAGwAcABwAHAAbAB0AGwAcABsAHQAdABsAHAAcAB0AGgAbABwAHAAb - ABwAHAAcABsAGwAbAB0AGwAcABsAGwAcAB0AHAAbAB0AHAAcABwAHQAbABwAHQAcAB0AHAAcABwA - HQAcABwAHAAdABsAGwAcABwAHAAcABwAHAAcABwAHAAbABwAHAAcABwAHAAaABsAHQAcABsAGwAb - ABsAHAAbABsAGwAcABoAGwAbABsAGwAbABoAHAAbABoAGwAcABsAGwAcABwAGwAbABwAHAAcABwA - HAAcABwAHAAcAB0AHAAcABwAHAAcABwAHAAcABwAHQAcAB0AHAAdAB0AHAAcAB0AHQAcAB0AHAAc - AB0AHQAcAB0AHQAdAB0AHQAdAB0AHAAdAB0AHQAdABwAHQAdAB0AHAAdABwAHAAdAB0AHAAdABwA - HAAcABwAHAAcABwAHQAcAB0AHAAcABsAHQAcABwAHAAcABwAHQAcABsAHAAeABwAGwAcAB0AHAAc - AB0AHQAdABwAHAAdAB0AHAAcAB0AGwAdABwAHAAdABwAHAAdABsAHQAcAB0AHAAdABwAHQAeABwA - GwAdABwAHQAcABwAHQAcAB0AHAAdABwAHQAcAB0AHAAcAB0AHQAdABwAHAAcAB0AGwAcAB0AHQAc - AB0AHAAdABwAHQAdABwAHAAdABwAHQAcAB0AHAAdABwAHQAcAB0AGwAdAB0AHAAcAB0AHAAdABwA - HQAdAB0AGwAdAB0AHQAdAB0AHAAdABwAHQAdAB0AHAAdABwAHQAdABwAHQAcABwAHAAdAB0AHQAc - ABwAGwAdABwAHQAbABwAHAAcABsAHQAdABwAGgAcAB0AHQAcABsAHAAcABwAGwAcABoAGwAaABwA - HAAbABsAHAAcABsAGwAbABsAHAAaABwAHAAbABoAHAAbABsAGwAcABsAGwAcABsAGwAbABsAHAAb - ABsAGwAbABsAGwAbABsAGgAaABsAHAAaABoAGgAbABoAGgAaABsAGgAbABoAGgAbABsAGgAbABoA - GgAbABoAGwAcABsAGgAbABsAGwAbABoAGwAbABsAGwAbABoAGwAbABsAGwAbABsAGwAbABoAGgAb - ABsAGgAbABsAGgAbABsAGwAbABoAGwAbABoAGgAbABsAGgAaABoAGwAbABsAGwAbABsAGQAaABoA - GwAaABkAGgAZABsAGgAZABoAGgAaABkAGgAZABkAGQAYABkAGQAZABgAGQAZABkAGgAYABgAGQAZ - ABgAGQAZABgAGQAZABkAGQAZABkAGgAZABgAGgAZABgAGQAaABgAGQAZABkAGgAZABcAGQAbABkA - GAAZABkAGQAZABkAGQAZABoAGgAZABoAGgAaABsAGQAYABoAGwAaABkAGgAaABoAGQAaABkAGgAa - ABgAGQAbABkAGQAaABoAGgAZABkAGgAbABkAGQAbABoAGQAaABoAGgAbABkAGAAaABsAGgAaABwA - GgAZABsAGwAaABoAGgAbABsAHAAaABoAHAAcABsAGgAcABsAGwAaABsAGwAbABsAGwAaABsAGwAc - ABsAHAAcABwAGwAbABwAHAAbABsAHAAcABsAGgAcABsAGwAcABwAHAAcABsAGwAcABwAGwAaABwA - HAAbABwAHAAbABwAHAAcABwAGwAbABoAHAAcABwAGgAbABsAGwAbAB0AGgAaABsAHAAbABsAGwAc - ABsAGwAcABsAGwAcABoAGgAcABsAGgAbABwAGwAbABoAGgAcABwAGwAbABwAGwAaABsAHAAbABsA - GwAbABsAGwAbABoAGwAcABsAGgAbABsAGwAbABsAGwAcABsAGwAbABsAGwAcABwAGwAaABwAHAAc - ABwAGwAbABsAHAAbABsAHAAcABsAGwAcABsAGwAbABsAGwAbABsAGwAbABsAGgAaABsAGwAbABsA - GwAbABoAGwAbABoAGwAbABsAGgAaABsAGwAbABoAGwAaABsAHAAaABsAHAAbABoAGwAaABoAGwAa - ABsAGwAaABoAGgAaABoAGwAbABkAGgAbABoAGQAaABoAGgAZABkAGgAaABkAGQAbABoAGQAbABoA - GQAZABsAGgAZABoAGgAaABoAGgAZABoAGgAZABkAGwAbABgAGgAaABkAGQAaABoAGQAYABoAGQAZ - ABoAGQAYABkAGwAaABgAGQAaABkAGQAaABkAGAAaABkAFwAZABoAGQAYABkAGgAZABgAGQAbABkA - GAAaABkAGQAYABgAGgAaABgAGAAaABkAGAAaABkAGgAZABgAGgAbABkAGAAaABoAGQAZABsAGQAY - ABoAGQAaABkAGQAaABkAGgAaABkAGQAaABkAGgAZABkAGgAaABkAGAAZABkAGQAZABkAGAAYABoA - GQAYABgAGQAZABgAGQAZABgAGAAYABgAGAAYABkAGQAYABgAGQAYABgAGAAYABgAGAAYABcAGAAY - ABcAGAAYABcAFwAXABgAGAAXABcAGAAXABcAGAAXABcAGAAYABcAFwAYABYAFgAZABgAFwAXABcA - FwAXABcAFwAXABgAFwAXABgAFwAVABgAGQAXABYAFwAXABcAGAAXABUAFgAYABcAFgAXABYAFwAX - ABYAFwAXABYAFgAXABYAFwAYABYAFwAXABYAFgAXABcAFwAWABcAGAAYABYAFwAXABYAFwAZABcA - FgAXABcAFwAXABcAFwAXABgAFgAXABgAFwAWABcAGAAYABYAFwAXABYAFwAYABcAFwAXABcAFgAX - ABgAFwAWABcAGAAWABcAGAAXABYAFwAYABcAFwAWABgAFwAVABgAFwAWABcAFwAXABYAFgAXABYA - FgAWABYAFwAWABYAFgAXABcAFQAWABcAFwAWABcAFwAWABcAFwAXABYAFwAXABYAFwAXABYAFwAY - ABYAFgAYABcAFwAXABcAFwAXABcAGAAYABYAFwAZABcAFwAXABgAGAAYABcAGAAXABgAFwAXABgA - GAAYABcAFgAYABgAGAAYABgAGAAYABcAGAAZABgAFwAZABgAGAAZABgAGQAZABgAGQAZABkAFwAZ - ABsAGQAYABkAGQAZABkAGQAaABkAGgAaABsAGgAZABoAGQAaABsAGgAZABoAGwAaABgAGgAbABkA - GgAaABoAGgAaABoAGQAaABoAGQAZABoAGQAaABsAGgAaABoAGwAbABoAGgAbABoAGgAbABsAGQAZ - ABsAGwAbABkAGwAbABoAGQAbABwAGgAaABoAGgAbAB0AGgAZABwAHAAbABsAHAAaABsAHAAbABwA - GwAaABsAGwAbABsAGwAcABoAGgAcABsAGgAcABsAGwAaABwAGwAbABsAGwAbAB0AGwAaABsAHQAc - ABsAGwAcABwAHAAbABsAHQAdABsAGwAcABwAHAAcABwAHAAcABsAHAAdABsAHAAdAB0AGwAcABwA - HQAdAB0AHAAdABwAHAAdAB0AHQAcAB0AHAAdAB0AHQAcAB4AHgAdAB0AHgAeAB4AHQAdAB4AHgAd - AB4AHgAeAB0AHQAdAB4AHwAeAB0AHgAeAB4AHwAfAB8AHgAfAB4AHwAeAB8AHwAfAB0AHwAgAB4A - HgAfAB4AHwAeAB4AHwAfAB0AHgAeAB4AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAfAB0AHQAe - AB8AHQAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHQAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4A - HwAgAB0AHQAeAB4AHwAfAB4AHgAeAB4AHgAfAB4AHgAfAB4AHgAeAB8AHwAeAB4AHgAfAB8AHgAf - ACAAHwAeAB8AHwAfAB8AHwAgAB8AHgAfACAAHwAgACAAHwAfACAAIAAgACAAHwAhACAAIAAfACEA - IQAhAB8AHwAhACAAHwAgACEAIAAhACAAIAAgACAAIgAiACAAIQAhACAAIAAhACEAIgAhAB8AIAAh - ACIAIgAhACAAHwAiACIAIQAgACAAIQAgACEAIgAiACEAHwAgACEAIwAhAB8AIAAhACEAIQAhACAA - IAAgACEAIQAhACEAIQAiACEAIQAhACEAIQAhACEAIgAgACAAIQAhACEAIQAiACAAIQAjACAAIQAh - ACEAIQAhACEAIQAhACEAIQAiACIAIQAgACEAIwAhAB8AIQAiACEAIAAiACEAIAAiACEAIAAhACEA - IAAhACIAIQAhACEAIQAiACEAIAAiACIAIQAhACEAIgAhACEAIgAiACAAIQAjACEAIQAhACEAIQAi - ACEAIQAhACAAIQAiACEAIAAhACEAIAAhACEAIQAhACAAIQAiACAAIAAgACAAIAAhACEAIQAgACAA - HwAgACAAIQAgAB8AIAAgACEAIAAfACAAIQAgAB8AIAAfAB8AIAAfACAAIAAfAB4AHwAfAB8AIAAf - AB4AHgAfAB8AHwAfAB4AHgAfAB8AHgAfAB8AHwAeAB4AHwAfAB4AHwAfAB0AHgAfAB4AHwAfAB0A - HwAgAB4AHQAfAB4AHgAfAB4AHgAeAB4AHgAeAB4AHwAfACAAHgAdAB8AIQAfAB4AHgAfAB4AHgAe - AB4AHgAeABwAHQAfAB4AHQAeAB0AHgAeAB0AHQAfAB0AHgAeAB0AHQAeAB0AHgAeAB0AHAAeAB8A - HgAdACAAHgAdAB4AHwAeAB4AHQAfAB8AHwAdAB4AHwAfAB4AHQAfAB8AHwAeAB4AHwAfAB4AHgAe - AB4AHwAfAB4AHgAfAB8AHgAeACAAHgAeAB4AHwAfAB8AHQAfAB4AHgAeAB4AHgAeAB0AHgAdAB8A - HQAcAB4AHQAdAB0AHgAcAB0AHAAdAB0AHAAdABwAHQAeAB0AHAAcABwAHAAcAB0AGwAbABwAHQAb - ABsAGwAcABsAGgAcABsAGgAbABoAGgAcABsAGgAbABsAGwAaABoAGQAbABsAGgAaABoAGgAZABoA - GgAaABkAGQAaABoAGQAZABkAGQAaABkAGQAZABkAGQAZABkAGAAZABgAGAAaABgAGAAZABkAGAAX - ABgAGQAYABkAFwAXABgAFwAXABcAFwAYABYAFgAXABYAFgAWABYAFgAWABYAFQAWABYAFAAUABUA - FQAVABQAFQAWABQAFAAVABQAFAAVABUAFAATABQAFAAUABMAFAAUABQAFAATABQAFAAUABMAEwAU - ABMAEwASABMAFAASABIAEwATABIAEgATABIAEgATABEAEQASABIAEQARABEAEQARABAAEAARABAA - EAARABAAEAAPABAADwAPAA8AEAAPAA8ADgAOABAADgAOAA4ADwAPAA0ADwAPAA0ADgAOAA8ADgAM - AA4ADgANAA4ADQAMAA0ADwAOAAwADAAOAA0ADAAOAAwADAANAAwACwAMAA0ACwAMAAwADQAMAAoA - DAANAAwACwAMAAsADAALAAsACwAMAAsACwALAAoADAALAAsACwALAAoADAAMAAsACgALAAwACwAK - AAwACwAKAAsACwALAAsACwALAAoACwALAAsACwALAAsACwALAAoACwALAAoACwALAAsACgALAAsA - CwAJAAwACwAKAAoACwALAAoACgALAAoACwAKAAsACgAKAAsACgAKAAoACwAKAAsACgALAAoACwAK - AAoACgALAAoACgAKAAoACwAKAAsACgAKAAkACwAKAAsACwAKAAoACwAKAAoACgAKAAoACgALAAsA - CwALAAsACwALAAsACwALAAsACwALAAwACwAMAAwADQANAAwADAANAAwADQAMAAwADAANAA0ADAAL - AAwADAAMAAwADQAMAAsACwAMAAwADAANAAwADAAMAAwADAAMAA0ADAAMAAwADAANAAwADQAMAAwA - DQANAAwADAANAA0ADQANAA0ADQAMAA0ADAAMAA0ADQAMAAwADQANAA0ADQANAAwADQAOAA0ADAAM - AA0ADQANAA0ADAANAA4ADAALAA0ADgANAAsADAANAA0ADAALAAwADAAMAA0ADAALAAwADAALAAoA - DAAMAAoADAALAAsADAALAAoACwAMAAwACgAKAAsADAALAAsADAALAAsACwALAAoADAAMAAsACwAM - AAwACgALAAsADAAMAAsACwAMAAsADAALAAwADQALAAoACwAMAAwACwALAAsADAAMAAsACgAMAAwA - DAAKAAwADAALAAoACgAMAAsACwALAAoACwALAAkACwALAAsACQALAAkACwALAAoACgALAAkAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAA0KLS1jZjRmZjQ1MTc3M2E5YmQ4ZjUwOWE5ZjA0MDA2OWM5OS0tDQo= - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '96608' - Content-Type: - - multipart/form-data; boundary=cf4ff451773a9bd8f509a9f040069c99 - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.32.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.32.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.12.12 - x-stainless-read-timeout: - - '30' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/audio/transcriptions - response: - body: - string: '{"text":"Hello there.","usage":{"type":"tokens","total_tokens":26,"input_tokens":21,"input_token_details":{"text_tokens":1,"audio_tokens":20},"output_tokens":5}}' - headers: - CF-RAY: - - 9fa2a68b9b44f00c-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Mon, 11 May 2026 16:44:50 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - content-length: - - '161' - openai-organization: - - braintrust-data - openai-processing-ms: - - '195' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=0WakyeNqPqwmhMhVlyd0prTyQuc_g_yd5uT2igthpd8-1778517889.8606637-1.0.1.1-6EzYeLeGgNx_lUEJO4n4Y_GKgAM0tZmqmIGFynTha7vl8I6nFJIzvVuEJFZJe0iUSwjoA3w.2ogFk.RAzmA2Cc.KegqoOLjKmR.Wci6pCCRBEA1mVqbjbYOHuc1Dx2ey; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Mon, 11 May 2026 - 17:14:50 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-reset-requests: - - 2ms - x-request-id: - - req_d28f8e1fdbd842409a9c97d1fbb0e659 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","content":"Reply with exactly: hi there"},{"role":"user","content":"Hello - there."}],"model":"gpt-4.1-mini","max_completion_tokens":8,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '217' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.32.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.32.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.12.12 - x-stainless-read-timeout: - - '10.0' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DeO2NfJdMAcGx5e3TdskveTjVQFyX","object":"chat.completion.chunk","created":1778517891,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_7508c9a7b2","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kThPYlbG"} - - - data: {"id":"chatcmpl-DeO2NfJdMAcGx5e3TdskveTjVQFyX","object":"chat.completion.chunk","created":1778517891,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_7508c9a7b2","choices":[{"index":0,"delta":{"content":"hi"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"COf7Xsxu"} - - - data: {"id":"chatcmpl-DeO2NfJdMAcGx5e3TdskveTjVQFyX","object":"chat.completion.chunk","created":1778517891,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_7508c9a7b2","choices":[{"index":0,"delta":{"content":" - there"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nwEr"} - - - data: {"id":"chatcmpl-DeO2NfJdMAcGx5e3TdskveTjVQFyX","object":"chat.completion.chunk","created":1778517891,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_7508c9a7b2","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"K0OI"} - - - data: {"id":"chatcmpl-DeO2NfJdMAcGx5e3TdskveTjVQFyX","object":"chat.completion.chunk","created":1778517891,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_7508c9a7b2","choices":[],"usage":{"prompt_tokens":20,"completion_tokens":2,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"t8FaYJvdVG"} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9fa2a695a93aeff9-YYZ - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Mon, 11 May 2026 16:44:51 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - braintrust-data - openai-processing-ms: - - '322' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=Eb0BDe3BKOJGMJjqNR40lc6s4L1W2p1vZjd5oG1KjGo-1778517891.470859-1.0.1.1-zNw0wh2R4i8j99vLfAx26O3VQ.Bs2iSlgGRrA_ekX15BukyHhDnU3g8.80g46hSRgaE4d.W12RQ8wgDj3xU7WGf._0I5AqtIcMwXO1yh1Ja8_zPt0BNrZBg8x3T5K4rB; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Mon, 11 May 2026 - 17:14:51 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_d9658ce0f2884777a7c40fe8bdeee7a6 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/livekit_agents/cassettes/latest/test_setup_livekit_agents_openai_e2e_voice_turn.yaml b/py/src/braintrust/integrations/livekit_agents/cassettes/latest/test_setup_livekit_agents_openai_e2e_voice_turn.yaml deleted file mode 100644 index aba31a062..000000000 --- a/py/src/braintrust/integrations/livekit_agents/cassettes/latest/test_setup_livekit_agents_openai_e2e_voice_turn.yaml +++ /dev/null @@ -1,2301 +0,0 @@ -interactions: -- request: - body: '{"input":"hello there","model":"gpt-4o-mini-tts","voice":"ash","response_format":"mp3","speed":1.0}' - headers: - accept: - - application/octet-stream - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '99' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - AsyncOpenAI/Python 2.32.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 2.32.0 - x-stainless-raw-response: - - stream - x-stainless-read-timeout: - - '30' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.13.5 - method: POST - uri: https://api.openai.com/v1/audio/speech - response: - body: - string: !!binary | - //PExABaxDkoAM5w3ECZiBBc8QlGAGY4AChDPhMwTQAZZrDGGOXkTLYw8NrGf+WROCn9eZ7HkfuW - am4KaytZVieCv20noBZEmKgcPGDRgkOXYS/Xw8L/S2XSeKZ15JDMPPK57Q2mP/hlZnpbInnYgwNh - C2Uji8IkcRMETA0mhAx5YUusAiQy4XAFxAjcFMF61PJhBAImIboL4B8wFQuWsI47mKcpwJMIjpgL - nbg1VkS1VvrfZo278S+lf5tWLsXZoy9rDc27OS05qzUG3kEebCqsiqJGIoD1BJaAxg8Ja0pqhEPM - HmCSy+Cp2sPvGJfIIOgeHIbgB625MtW+v9tHHfynuxJ+W/b9tGvsobu3JrrJlPLcXu4lqCWlLFS6 - IgDwC/aYDD30m9WqKEP2/kBwY8LWmSrjW+vx55a8S8UVhIo9MamHIL5qkcOUS55WLsXaA093IblE - rqb7YjboNjX0qVJImARAQPR8WHbpEbXaTDK9L5RJYagV50xBTUUzLjEw//PExABZbDmsANve3DiT - czqCDtg1VbMPJDMgot2pmAgMVESYfMMEC9oYFsAsrQZSEAAjAUsi5BojjZjkixFwsj1mcTQt7MrF - WXw3TbFwHOSoiBDxdydDoLe+VjIX9DinJwXcwjFEzJAcJlxF8yx8HSXtDD/Pgrgcg0RLhHC6mMgB - 6xFxvBcCFnwZo5g8ACcEiEqB+A5wZgWkEuAEBtiAkPOAW8XQkoc5dFCrVUPQQMjw1BUmscBoEjJ8 - LQIWdyVZmgnBd0chF5kPXlh42Mpcy6Iag0ILeUZbiGCblAcp5FgG+UJjEsN9XOLtWLtNHO3LEeIc - 57GIJoUZlH0cZBCzK4hC6iJwzzGHAi1MkThHGSA8TrV6SLAPsyTzcDrHIXEMMoCSE8TSfjxzcRpB - 2Iy3Y+CwhIxdCamOXARwZIb4KQnpJ8Ig8CcMLkk0KE0HuOsbhakEUJxqw/yoI4HOOUWsviMazrUj - K3KIXAWchwag3SxrhUJiCmopmXGJgYAAAAAA//PExABb/DmMANve3DXs08RNNRlg7XNWVTFBIyse - DAMxAfHhYxAjEiAxUSRPBwCzleBgoIOgwYLAgHSgANixiapQtyhXQ9RvhykyJsX1Gl9UBlE9Nwxy - WkqLNCxwmcYxbWgvyXFtM08FtGjeLuMUfR9n8ZRMTaHqU6w0mSGaNwDSBmjMEyhziOlvBujKIcdK - JNoFMIOM4I6XQt5LAYwB6HQAPiBDqkM0eIQ4uYmK9FOUqBSgYJCA5iesBhFvDlFmK8XGJIQYzibE - pWE8rl9CT+cWI6j1QJpQ9H6pyWkyOsvKHMK6SaOJShhxJ2ja8Qo/ls6Wx8xHyTUIcTAUo5XiRPwf - wwUIUKtO4xhunQS5hySoqxSRXjGJ6WEkRei/LVSenADmIGEpCTG0LcjlKW1QCFGmDlQ8I6WADMOc - NEv2x9D2CVAaovAMxpiaoAL46CFKJfE1KAGMLqGiMEeI3lXFO01RCifiZFSLCYQ/j5LCplcW0ZQj - QE6SQFUX8cK8mIKa//PExAAAAANIAAAAAExBTUUzLjEwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//PE - xAAAAANIAAAAAExBTUUzLjEwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//PExAAAAANIAAAAAExBTUUz - LjEwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//PExABbjDmQANYw3DnkDxMDX1TPijPDC6AqJMmNGQRo - yI4UM0EApkIXmELERgxJMmFGLGo1AAAqwven2jYgMWDDgIzpdoCFQIJ1PomNRRUdVd8uhzHs3L4D - cduDJFpr3UoXotNUCGbFi4C6S060i0C+QgCW641AHZae7D0veu94mCLzakqR9Wnvo/zTFK2dIAEO - Y0MAKQNNyhwoKuFkExDCdH4xAWiEIRnW8kQ3Ve7KIFa/EXHghxHTdd0HUfdtGlvmwyBWHw8uyKrs - hlicSZZBbruhBzkR2RxiZkb6Sl+4/F4Yopf3sonHQg5h7vLEbCtdaDVlSPq0+ISaNzFWXxOjhidj - dqkpLsOQHA7gRVncBOJAb2OXBkHM7eJkilbQkH2ZJWLzX+pg6qp3+WPBTqRORxCihumfuAJM1uGm - IPW09uDV1hHBV2zBvGHw06j6S1/45IHbjTXI60x44HcCDmtxZhkOsQgl13QhLlx5+InIXLgx1HDh - TWJa/6YgpqKA//PExABaFDmwAOYe3D/JVMJI0wqBDBYkMHAQHBUQhFAcCQcChWNEpMExMBjAAgTj - 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 - ZYCuTxpGkmIKaimZcYmA - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a313d2d50b3faadc-YYZ - connection: - - keep-alive - content-type: - - audio/mpeg - date: - - Wed, 26 Aug 2026 15:20:59 GMT - openai-processing-ms: - - '489' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '150000000' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e68ca56c122e40908000b8102e9da39a - status: - code: 200 - message: OK -- request: - body: !!binary | - LS1kM2Q0ZDcyOTVjNGVkMTc3MDA4ODUxZTY5M2ZhNDc5Nw0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJtb2RlbCINCg0KZ3B0LTRvLW1pbmktdHJhbnNjcmliZQ0KLS1kM2Q0 - ZDcyOTVjNGVkMTc3MDA4ODUxZTY5M2ZhNDc5Nw0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1k - YXRhOyBuYW1lPSJsYW5ndWFnZSINCg0KZW4NCi0tZDNkNGQ3Mjk1YzRlZDE3NzAwODg1MWU2OTNm - YTQ3OTcNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0icmVzcG9uc2VfZm9y - bWF0Ig0KDQpqc29uDQotLWQzZDRkNzI5NWM0ZWQxNzcwMDg4NTFlNjkzZmE0Nzk3DQpDb250ZW50 - LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZpbGUiOyBmaWxlbmFtZT0iZmlsZS53YXYi - DQpDb250ZW50LVR5cGU6IGF1ZGlvL3dhdg0KDQpSSUZGBE8BAFdBVkVmbXQgEAAAAAEAAQDAXQAA - gLsAAAIAEABkYXRh4E4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAABAAEAAAAAAAAAAAABAAEAAQAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQAAAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAABAAEAAQAAAAEAAAABAAEA - AAAAAAAAAAABAAEAAQAAAAAAAAABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAgABAAIAAQACAAIAAgACAAIAAgACAAIAAgAC - AAIAAgACAAIAAgACAAEAAQACAAIAAgABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAEAAAAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAIAAQACAAEAAQACAAIAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgAC - AAEAAgACAAIAAgACAAIAAgACAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIA - AQACAAIAAgACAAIAAgADAAIAAgACAAIAAgACAAIAAgACAAEAAgACAAIAAQABAAEAAgACAAMAAwAC - AAIAAgACAAEAAgACAAIAAQACAAIAAQADAAIAAgACAAMAAwACAAIAAwADAAMAAgADAAMAAgACAAIA - AgACAAMAAgACAAEAAgABAAEAAgADAAMAAgACAAEAAQACAAEAAQACAAIAAwADAAEAAQABAAEAAAAC - AAUAAwAEAAMAAgACAAAAAQACAAQAAQADAAMAAAABAAIAAQACAAIAAgADAAEAAAABAAMAAQADAAIA - AgACAAMAAwABAAEAAgACAAEAAQACAAIAAQADAAIAAwACAAEAAQACAAIAAwADAAQABQADAAIAAgAF - AAQABgAFAAUAAwACAAMAAgAEAAUABgAEAAIAAQACAAEAAQACAAEAAQACAAMAAgAEAAMABAABAAAA - AQAAAAIAAQADAAIAAgADAAIAAAABAAMA//8DAAQABAADAAQAAgABAAAA/v8DAAIAAAADAAQAAgAD - AAIABQAEAAIAAgAAAAAAAgAEAAEABQAEAAQAAwACAAIAAwACAAMAAgABAAMAAgAEAAEABAAAAAAA - AgACAAMAAwAEAAIAAwADAAQAAAAFAAUAAgAGAAQAAwACAAIACQAEAAYABgADAAIAAQAEAAIACAAK - AAsABgADAAEA/v8AAAUABwAHAA0ADQALAAYAAwAAAAQAAwAFAAsAEAATAAwACAAIAAYAAQAKAAsA - CgAKAA4ADwAPAAsADgANAAcACwAJAA0ADwASABQAFgATAA4ADwANAA4AEwAVABUAGAATABIADwAT - ABQAEgAVABcAGQASABMADwAMAAsAEAAaABYAGgAeABgADgANAA8AFAAbABoAHgAfAB0ADwAPABMA - EgAWAB4AKQArACoAIQAgABMAAwAJAAwAFAAbACUAMAArACEAFwAUAAoADAAOABEAGAAZABwAFgAV - AA4ADQANAAwADwASABAAEAAYABcAGgAYAA0ADwABAPf/BgALABIAHQAnAB8AFwAIAPr/AQACABMA - HwAdACUAIwAXAAcA9v/+/wUACQAXACUALAAmABcAAwD8//P/AQAaAB4AKQA5ADUAHwABAPL/8//9 - /wgAJwA5AC8AKgAMAPb/9v8BAAAACwAeAC4ALgAbABkAEAADAAkAIwAjACQAKwAdABYA/P/y/wwA - GAAwAEQAPwAvABYA//8DABIAEgAjABkAIgAbAAcAFwAoACoAIAA0ACYAEwATABwAIgAdACcALgAi - ACcAMQArACkAFwAaACAADgATACYAJQAfAB4AIAAPAA0AHwApACIAJwA/ADoALgAVAAUA+P/w/wEA - GwApADUAPwAqABAA/f/9/wQAAwATADAAOgAvACMAIQAIAP7/CwAiACUAJAAoAA0ACQAVAB0AIgAh - ABAAHgAcAA8AEgAfACQAGQAoABgAAgDm/9n/7f8OAAUAJwBRAEoASgAsACQAAQD7/xUAOgAnAPT/ - 7v/X/9//CgA3AFoAcQBXACYA/P/8//v/CgAkAEEAUQBMAFUAMAA2ABcABAAXAAwACwATADEASwA8 - AB0AJQAEAPv/HQA3AFIAcwBqAE0AOQD8/+H/5f8TAFAAcgBpAFUAMAABAP//7v8CAB4ANwBsAHYA - eABXACEACwD+/xEAOwCNAIUAWwA0APj/+P/z/xAASABrAGoAdQBsADcADwANAPr/8v8IABEAIQAQ - ADcAQQAQADQAZABNAFIAUwA4AA4A3//z/woAOQBgAF0AQgA0ACwAEgAoACkA///8/wsAJgAdACYA - MwAaAPz/4v8YACoARwBZADkAEQDz//b/CAA4ACwASwBDAA8AGgD0/9X/sP+e/9D/EgAWAAgABgDl - /8v/1f9GAHkAWgAfAMz/e/9O/5j/wP/d/xUAFAAEACcALAA1ANr/eP9u/3n/r//M//X/8v8SAO7/ - BQBgAH4AWgB2AKcARAAvAOX/rv9V/w//N/+Q/+b/TQDfANEAfADi/1j/Fv/1/lj/yP+h/+z/VgAL - AHj/l//2/7r/7v+dAPoAzgDRAJ8AMwCv/4D/vP+b/5j/3v9jAI4AewBmAC0Au/8x/yj/pf8XADQA - lADOAGoAIwALANL/SP9o/8T/5v/y/+X/BwBg/6P/7f8nAH0AfQCkABYAx/+B/4P/cP/r/zEASwAk - AFr/CP8m/33/uv9/AEIAHQDX/73/FQBEAJUAGQH/ABcAcwBFADQAu/+h/+7/dv8c/7v/GwAd/+b/ - kwBKANf/6//C/zz/RP8wAF4A1P/EANkAigA2ANb/LP/i/vj+vv9qAPP/DgAYAKH/Qf8WAJoAigAq - AJgAoADr/3cAXQCRAEkAFgBQALv/u/+YAMMB7QGvAccBxQGfAMn/cgC/AC4AZwDGAW0B0wAzANz/ - nP/z/lUAgwGKAdYAlwBRAI3/HP9UAEQBhADhANsACgBF/zP/r//u/8T/+wArAoEB3wC8AHcAIwCE - AFkBqQHpABYBagHkANwAjgFiATAB4wALAbkA1P/EAKwA0QAuAAQAPQBu/3n/DwDmAFgArv87APn/ - if+LAPQAEAFxAAkA+/8UAHL/CgA4AbIAZwGqAUYCCAHl/4X/M/88/9r/ZgEjASoBCAHVAKb/Hf8h - /zr/6//x/ykAfgDe/+X+Nf9q/4X/gv9HAOMA0AC2AKsA/v90/6//VgCpAMkA2QEDAS0ANv/z/gX/ - Hv9A/8j+m/+t/3P/PP/N/ir9tv1f/i7+0v9yAMUAkAC9AOIA8QAbAc8ACQEzAYkBUAFcAHMAi//U - /gD/c/84AOH/JADf/3//R/5R/jz/Lf5y/tH++v62/jr+0f5+/wsA4wDzARQBCAC1/0f/eQCV/4// - JwAs/7X/lwDnAXMBwADu/5n/F/+h/k0A5AEvAcL/0ADs/7T+Yf4VAD8BJQAHARoB4/8l/g7/mv+j - /kP/XgDSAPH/fgCnAEgAmP9R/+H/pv4P/z//ev8sAMn+r/5e/0j+Nv0s/14A/v+xAAECewLOAAQA - OwAC/yT/9P/PAFoBiAAtAdYAn/9g/jv+Hv6m/bb+CwBjAIT/5v9s/y7+Ev4mALQAYQDUANQAGADK - /S7+eP4//qT+KwCTAVwBvgHSATECrQC3/4YB8AFqAfIBqwIRAssAof9HAKP/B//EAOsALQHV/1gA - LwJ5AGH/4f+H/27+3P4NARMBvACZAcr/yv6O/o//0f8MAOr/+v8mAAD/mQDr/ysAxv9qAC0B3/98 - AHwAbf9P/mv/ZAG/AYkA0gErAnYACf+FACwAjf9yAVgCSgPlAJf/5/6a/iX96Pyf/uX/Wv+t/mcA - 5v6D/L383f5O/c/9n//X/qX+kf2u/aH+bf4C/9z/cf89AEAAJgHOAFL+3/+7ALr+Tv/pACgBjP98 - ABsBXADIAboAJgCr/1z/ZP/X/yT/X//O/7D+Kf9H/o3+MP+H/sP+cP8B/nz8FPwd/V/82vyT/T/+ - 2v9J/v3/KQBQAdz/lf5aAO394vwE/Ur+/fzz/YAAfgA9AHf/Tv+t/qj94/yD/bv81/u6/HP9cP3g - /ssAef8LAEgCXAK3AaMBqQAF/gf8EPxj+3D77P13/Xz9m/7c/1r/bf44ALL+/vxi/fn9RPxe++z9 - Cv42/RcAPAIqAcUAsgMIBPQAiAI5AvP/Nv+T/7P+Rf2o/u7+jQCEAQsBCQEaADD+8fzs/Qr/Sf5k - /tj/cf///okAFQAd/0oAH/+F/wv/1/7+/pH+1f++/jcALgCz/xEAAwL5AdL/wwLPAn4B0wCfAVoB - 8v8sAWsCAQJGA2UELgJJAsMBEAD+/5gAxf/tAHwBrwFnAd//7wA4/1T/IwDXAIoAPACa/3/+l/5Y - /QkA1AIwAqUBiANrAej+dgBEAZ//jwD7AAIBMwKB/0oA9v8pASMAWwCYAp0ALwAEAGgAhf3o/eH+ - hv5n/rD+Wf9GAE0AtP7PAJcBp//H/tH/b/+c/pr+sgDg/of+vQDq/38A3QAqAXX+dADoAPz+zv8z - AHr/ZP2M/+b9jf3k/kv+ff91/+H+GP0Q/4D/4vyf/t//zP2o/Bj/XgAu/839Pv88AKz9if0N/9r/ - 2v5F/cj/xADC/bj9qP9t/q/7q/22/8n+BP7e/W79Vvxd+/T7Av/o/Wb+DgEbAH4AUP6B/zcA6vpi - /Q78dvhh+6X74Pqf+9f7Vfss/P77Iv23/ND8+fxY/X3+SP1V/Yn9x/7m/Lb9XQClAJQAlwLBA3QA - U/+z/w8Asf+5/8oBdwIxAO4ALAEzASsA5/9QAt8CJATwBJQGCAU6BEsEOQTHBGMD+APMBJkFtQSn - BPkF/wRbBFMEBAU2BAoDxwSGBC8DnALmAeUBzgKVA3QFmQZ0Bo8HJgiGCIcHQAaJBWEFsQQBBP8D - bAOAA6IDgwQYBxEIlwfWBzQHMASuAh0DrgGdAWUBPwIiAekAGQMeA4ME6gX9BloFOQQxAsb/XP7K - /Ej8Lv0H/tv+ugG1AuQC4QF+Aa0AMP9eAGoCyAFPAAoA+f7v/Fn8Xv2O/WT+1/1GANgAWv6+/V78 - RPzH+Un5FPwL/Cb7p/xG/Sz85Pue+9L7Pvvi+xX8Q/uA/D78mftt/Br8UvvR+kr69foS+jb5b/po - ++j7SfyE+1/89/15/Mr83vs7/FX7aPi3+nv6cfi++R/8rv6dAA7+Jf41/uz6NvtB+ur4kviI92X3 - hvek+KX44vfA+uz8K/xT+8X75Prd9032bveb9q32X/ha+Ij44Phq+0X9dwDdAmUELgXqBEEE0QHp - AZkBKQI8A4cDVwPwAuYDtwT/BNwE2wTmBCAEQwS3AtECOALEAEYBbAAvA7ED7AMRBhUIfAX9Bb0H - PwZWB2QFcQfQBhEF5wS6BAADEALnBF8F5gfxCCQJlgp3CAEHewf4BXwGgwZMBo4GSwU5BXkGQwdp - BwsIwQhYB9sFPwcDBqsE6QRQBYwFsASDBFYGQAYBBvIH8gi8CNcHGAi+BzIG/QObBLAERwIqAZIC - PwP7An0DKgT0BfkDngIABHED0QHIAK4BOQJoACr/zQCJAqoAhgKXBHMD+QJKAssC3P8L/uH9//2f - +xn7if02+9L70vvo+j/7qPpo/B78Pvu6+s75JPr1+LX4M/jI+Hr5cPnD+oH7H/sN+of6pfsX/J37 - 4Pvo+rL60Pi+9yH6PffW+BL5y/Wy+R/5R/fc9sz3XfoA+ET1iPY/9erxt/PB9b72jfSq9V/2afUm - 9b/1z/ZN8yLzVPRm9cHxZ/WP+iL8l/xHABYLPgcwAWQFZQqHBSQBzwMOCdADO/vWADYFswDk/HcE - 9worCJIDYwf6CcwCqv08/wIB3/yM/NIAnwH/ASsBigJgBtAEBAWuB1QK1wiPBCsEYgRsANP9PQFX - A1ADCARVB/oJ4AjiBy0KSArACEsHXwhgCLkEYgSlBFgFXQTIAyIGtgc3BtYFKwifCB4H0wUXBqYH - xgY+BMgFZAiBB6gEJwZ5CZgIIAaSB4YKVQhXBUUGbAYfBc0DqwSeBsAFcwX3BXUH1QeXBiIGigen - BuMDUgRGBX8EGQIKA8UEwgLvALMB5QI0Aff/eAG7AJr+2f0H/nb8R/tH+z37Fftg+v77wfsy+8z7 - +fyZ/JX8nv7m/Ub85PtE/PX5rPcK+Fn52vb39dz4WvcI9sv17fav99v0Q/T59TH2ZPSy9EX1fPMb - 8WzwjvHw8LDvnfI69ij0GvMq9Ar3NvG17P/wHfJv79XsW/P78sXv+etl8zr9yvqA/goHgw7MCOQG - Agh0C7cIawIqBwsHqASF/7//+ABBAXEAWgJ/CJgIbAgqBr0FxQNFAMn+7/u++x/6W/kh++r7hPzy - /k8DcAQJBFkGxQk2B1AD1QNVA60Ag/3N/acBqAL6AVMFIwllChkKbgviDXEOSQ01C3YKzggrBWwC - wwGCAaYA/gCIAT4EOAVTBFUGcAZKBbECdwQiBl0DnQIFBFoEJwKeA64FFAjtCL0JOAtsCz8L3QmR - CvAKZAtDC8kLIgz1CTgI4Ac7B/MFGQZ2B5oHhAY7BuUFugXRBM0D/wPBAiUAgP7e/Qz+MP/L/2f/ - nP7L/KP7w/pn+vT7p/02/TP8+P3s/WP8Cfx//G/8Yvy//Cz74fna94T1fvRh9c72r/X19d/2dfUP - 9R71vvNR8wXz7PCJ8Mbvy+3x66zrSOw07CvtkO6j76ftou2P7r7vQ+1L6yHskOqv6e7n5eyc8xr7 - n//LCTAX6hLXCr8NRhLYC7kH9QuoEhcM7gHXA74EBP7d+bECeQg7CdUI5AdtBoUB/Pxm++v7Kvp6 - +Xb4/vWz9CjzY/Ox9b34tPs1AF4EIAW1BYQGIAhpBs0EWweUBwIFxQMtBVAHHAd5BU8J9AzrDVMP - GxIcEiEOogvmCJQHJgZsA9gAyv5d/Gr7//pl+tT+kQLnAmkEMAacBQsByf7m/+X/FACiARsEBgWg - BQ4GsghKDOUP1hHhE7wWARbEE1ERKhFPDkwMIgz0C04KBQmsCOwFMwQuA44EJAPlAu8E2wWYA0MB - 2AAK/kP8FvuY+/j7bvx7/IX8UP3M/Tn+MP6A/i3/tP5k/dT8o/wX/Az6/PkO+gX5YPkn+8z5kfmZ - +if3IvXI9O71wPJk8avw5O1F7J7pi+oK7KjtouoJ7cnufOw46XjnE+k84/vi4+Ob5jTh5OKa7sPt - E/ZnB7IR+xBBFB0V5BMJEv4QnxYFFa8R3xCgCVkBIwWSAez6Ewb0Df8IcQl8C3kJzQPo+5v9zP/Z - +K3yEfMG7tPn9uU8587skPEV9uj8KAIvAygG3QUGBrcJhwqpCcAIrAdQBc0DlgLXBKQIrAo5DloT - NRbzFXEWjBMhEKQOZgy1CZ0EDQBV/BL4gvRB9Wf37PcG+NP6hf59/tz+Yf/r/oz9zv2C/kP/swAG - Af//aQCyBCoHBgmoDWITZhaxGF4b2huBGgYYIRZjFcwTsRDDDjoLdwZ6A6oBgwC9AGAC0AO5AxcC - NAHe/0f+pP75/rb+2/2V/JT7TvqW+oD72vx5/Rb+mgBbAboAEgDY/lv9nv2B/e78nfsn+mj5avbM - 9Pv1WPek9Xfzl/T/9MbyuvD38HjygO+f7PDqyekt6ivmPOOZ4f3klOQ93wDghOVR6sPlTu9rAxkK - GQrgD/UWEBFvCgkSGRslFTURYBVxDncDxgNiB/oDXwRNC7EPqg1NCYgL1wnG/4/+OQMw/0X46fQR - 8BbpU+RE5bHog+s5767yP/bB+Oj6xv9eBKoIVgyhDacMiQqtB1IEWwN0BZAHrwhzDFoPsQ7nDWkQ - JxL+D/ERtxXkE4IOqQleBUT/bPlL+AD4yvXf8wX0c/Rc89D04vb09rT4M/wK/ygAowG7AhIBHQCz - AF0DwAXJBzgJoQoXDTYP8xHwE4sXqRlCGu8aFhufGBYU+hHNEHIN6wjoBkEE2v5Q/Bz/+P91/rv9 - F//j/q38kfyD/uX+v/zZ/KT9yPwG+6P6mfnt+Qj6L/pu+/37Kvvy+eX5d/kX+mj5KPqg+df3FfY4 - 9RL1evKq8LPxS/I773rrsOtB64XmA+fS6R/qU+eh5xrpVecT5s/rcfNu99YA2QlZDOIHvAnODakO - hxC1F4EbThMQDX4JSQYoA1wIpgpVCV0KEAv5CHUEJQYHBjIDlAAKAwECUfu09Kfwi+5Z6rTqHe29 - 7sLuwO727z7zOfcP+2H/SgRKCeEKxQmSCCYKjQnFBlcIYQtWCk8HjAcRCgwKKgl9DKkQvBEgEv4S - qRFkDSsJqAfkBoMEpwEg/yD7gPXG8cjxYvII83nzYPVf+bj5B/mP+pz/VgF0ASsGLwmgCGMFhwXK - B4QJKAnTCnQPXxA8D64QohVSFvUUcBbpGOsWKxKlEEgPMQzJCHUGogRRAOr6SfoB/I76R/rG+wP7 - UfrM+n38wPuB/Bj+rv0l/an8k/sd+M72o/U19EDzEfTo823zuvL982324PVz9on4ivrM9wv39vcn - 9z3yAO4U77Tt3edi5GHmTOdT42jj2+oL8ZH0BvgXA3wHgwcCBz4JMw+hEjgUOA9dEecM/QIR/V0D - cwntBF8E8Qe5C8EEyATlC0YP7AxIDQQPQwuqBQ3/7/sj9i70lPOJ8J7tt+yk7DXqXOsA8eX1Nfg0 - /cIBVQJfAWcCFwQcA6QEEwjWB4MF5wPcA7cCeQH9BAoKeAs+DG8OSRCcDkUMIg9WEaIRkhHTEWgO - MQeHA3sBpP/A/i7/yP2u+nr3mvUt9Tb1T/g2+838Lv4j/6H+yf2TAOkCjgOTBVoIkAhPBroFlwYK - B2gHMgvdDV8OOQ8MELYP7A5sEM8QfxG+EYUR9Q3HCdQHRAZQBMICfgOoAVj/Sf00/Ez6tfn9+S37 - Z/ub+cT4O/cr9uX0yfUa9eX0zfMK84rwsO1V7W7tKu4a7jXvZu5H7sHrhuww7jPvlO0174vx0+2W - 7efvq/J98On1Bft6/5b+gP/EBHACGgTRCXsQvA2PDggP/QtKBsgI9Q6OCr8IHwuNDBsE1gIFB2kH - RATQBuwKwQjRBIsATAFd/jb99v13/RL6//UX8xnvQ+4F8AXyb/LL9dL3AfXc9L34ufv++pL/+wWv - BIoCrwIcBJgB4gA0BAMHBQYABTgHXgYJBd0EZwhOChQN/A8GEJwODQ2UDNwKMAy7DXwNcgrWCJMF - HwFv/xn/oP/G/jb/Q/7Q/Ej7fPsL/Uf+1wDZApQDbgJfAuQCFQN2BPoF0gbqBSYFCQXOBIsEigV6 - BmEGagfoB1wI9QfAB3kIegkqCvIJYQqLCRYHRgV4BCEDXAGMAJD/8vxC+mL4dPcF9rH1j/Vv9Vz0 - DPPJ8pzx7vA48HTxjfGa8I/u5+0d7brreupj6p3qFelm6cXnZ+n16WvsFO5R8lj6j/yR+5f8sgOp - BBwGQAsUE8IR6QrACiMMTQsRCXwNGw6lC/IHPAc/B7oHtAl6CQQKFwuvDcIKDgiXCH8IwQRsA9QF - PAM8/Zv5rfil9G3y6/Qo9qTzrfLB87fy7PGr9Jb4QPpN+7z9tv47/Xz9YQBfAVgBRQPhAzgCNgHE - AoACaAHHAmUFvQXXBaEIxgmCCZ0IWAq9DCEONA/OD9EPOA2dC4ALhwv6CzwM+wlcB3UGbwUIBH4D - kgQrBGsCRwLNAgUC0AHNAlkDpQJrAl0DQQOLAhQCEQO6ArYAZQHKAtABvwCDAVwB4gDiAdkC5gLG - AvICcQInAjADTAQvBF4DmAIJAeH/Q/++/lj+jPyz+mr5F/hG9sT01fPf8q/yAfLU8PDvGe/27kDu - IO2c7Bvteuzg6ZzpR+u76xjpc+tO8q/zkPEY9N34E/jX+E/+FAXvBdIEJAaKBkAG5gfzC5wLwwvu - C9EKywhdCtANNQzwCaULQg/MDLoLBA4fDrEK7gkNDK0LMwk9BjcFFwJi/93+6/71/Mn6OPl09gP1 - bfUu9qv1qPUZ9hL2WvWK9sj46Phg+cD7r/w5/Oj8W/6c/jn+hv94AFIAMACtAbECZALrAh4E7gSd - BecHoAnRCW8KCwyQDAsNNg9jEKIPBg+uD2oPYg6UDrgO1AwoCkoJFAneByUGWwX2BMcDzwLeAjMD - jQIlAqYBtwGPAqcCGQIkAlUCpQCE/yUAOgF6AEz/7/5U/lf9/fwl/rf+pv7N/V39T/3b/LT8Mv3E - /Sb9bfwA/Pz66vkX+Zr4bPfE9uj1FPQm8/DxyvA271/vcO6m7ZfsMOyB7YfrN+sw7RLxkPAb8vb2 - t/ca9hf3OPx5/xMCbQICBUAFMgNvA+cFhggyCjsKCAcJCN4I2AiqCJQL/Qx/CzALSQxfDx0NcgsO - Df8NtwxGDdIMhAmoBy4FXAOSAoYCoAGD/yD88/k0+dX3Kfig+az5I/gm95z3Bfia94X4WfoE+9j7 - O/xV+x/7Lvxz/Dr8sP2s/o3+Gv4G/uL+d//b/0EBJAO8AysFfAZ0BpgH/QnKCwsMtg2sD4sPuA4j - D5IQSRB8D08PTQ/oDTAMLwt3Ci0KzQjkB5IHgAcuBqoEhwT+BMMEagOmA8wDBwMlAQABiAFEAJ7/ - gP80/1z90vyG/NP7A/wF/L37//oq+8X6ZfoY+lT6gPqh+bf5DfnC94/2xva69ob1nPR+8/LysfG1 - 8JbwaPBT79bt0+3b7bTtE+1q7THwCvFa8JDzNPiw9jT1o/iA/Lv+4/5aAU0EEQTxAMwB+wUmCDMI - lga6B5oI0Ae4BnUJVwx0CxoKfwrqDMkM8AsgDEINrwwRDE8MuQsqCr0HwwaZBb0ESgRRAx0Bnf7p - /KL72/rt+l77mvr1+Oj3R/j89yb3YvgM+vP5XPmY+Sf6Efol+sr6vPtM/GH8rfzw/CH9EP1s/sv/ - xf9LALEBwgLFAogDLwUTB7YHkAinCtkL6wtfDEMOpw4PD90Pww9YD9QOXQ6rDVoNPAxUC24K7QnS - CAQH6AYOByAGPQQpBCoEBQPhAVUB6gE4Ac3/Rv+f/87+yv1C/Yr8k/wv/Ib7f/pc+tP5t/hu+KP4 - svh/9yj3oPbx9Wn1CfUa9fP0IPT98uHyFvJ/8T3x6vD68M3v5+5Q7yjvUe4g7xHx/O+F8FH0zfVj - 9cf1IfhL+lT7m/zBAO4B6/8gAWoCTwJUBDMHPgYGBmIGPwY6Bx8IVQluCi8KGAmnCsILfgsoDGAM - 2AvMCzUMGwwtC8MJaAloCI4GdwZwBqgEcgLhAOz/8f7H/Wf9hP1B/LL6Lvrx+YT5cfmO+Yv5vvl9 - +TT5S/m0+S/6M/qm+rL7o/tu+9z7rvxd/Zb9E/7O/rn/EAC/AHYBtgIdBKgEOAXtBj8JbgmGCTQL - Cw3iDHsM9w1+D8EOjQ1RDnEOmg3BDJUMAAz3CgMKhwl8CYUIvAf9BmAGXAXYBKYE6wNoA38C/gEb - AQgAcv8l/8D+p/1x/Mv7wfvI+sX5ZvkY+cX4uffh9s/2qPZE9cT0LPVS9LDzMfON8hXyNvJj8VXw - vPD68Jbvoe317mnwie5G7EDvxfFc7wzw+/Oj9pz0BfRs9/H68PtO/BX/NQBcAHD/hQBlA1oFdwUI - BUkG+gXuBcIGowhxCfIIFwmwCVYKjQoTCwkLoQv7C7sLnAvLCzwLEgrXCFEH7AdECDsGpwQjBIgC - bABC/5H/lP9S/kT9dvxL++X5JPo8+yz7B/pE+jf7M/o5+Zn6Cvxx+1n72Ptr/EL8r/uw/Jb9cv2h - /an+Lv9j/6T/oAC2ARAC/AKCBAoGmgYqB1QIMwoFCzcLrwz+DUQO0w2gDjgPtA4ODvgNCA5XDS0M - UgsZCywKWAmsCAIIMAemBg4GkgSIBOkElANZAh4C9gEyAQQADQABAJb+t/3R/UX99fuM+7j7n/o3 - +fD4ovjP97H2kfVc9QT1//PX81DzSvK+8Qnx9PDM8VrwrO688P3wMO4F7kDw9vAs8O/uLvFN9fjz - uvLf9XL3GfgU+n/6af35/z7+iv71/5MBBwTfAxwDGwZzBgME8wVsCDwJcgniCA0KQwypCnoJkQxd - DTYMVgy1DHkNfAz3CRkK4ArpCQgJZAg9BxgGwgQfAnEBkwJOAbL/G/9m/n39nvtg+sD7svws+zv6 - j/pl+qz5b/nq+bn6Qvtm+g76zvpl+wX7rvoR/Mb8hvzY/Lv9HP5c/uL+qv/WAEcCxQMNBLMEQgZ6 - BwAIIAlgC7oMSAxBDK0N5g01DZINPQ5RDuENqwwCDO0LagsBC7EKMAqQCWQIPQfCBhoGlwVBBU4E - 5QIzAmEBvQAwALT+a/6F/tn86Psr/BL7vfor+gj5l/ge+Iv3+PWg9QL15PO781Xzk/JI8R3xPvE7 - 8Grvbu9Y74rv4e5K7ZHtPe+q7/HtNu9A82T0yfJX8zL2PfdO+KD6CP0o/pn+0v73/nwA8QLxA6cD - vwSJBZYEIQTxBjgJUAisBw8JowojCrkJCgt3DOkLVwtuDNoM1AtmCwALfQlwCcwJcwiyBwwHbwX1 - AyACngHrAT8BDQA5/1n+lPxw+3P7OvxA/Mf7FfuF+h76nfn7+Uv6DftG+6X6S/p0+sP61fpc+wD8 - mfz5/Er9h/1//m7/2v/4AHQC0ANlBGMFxQa3Bw8ICQnKCrwLNwx/DN0MYAwNDHsMpQyEDF4MCwzc - CvYJdQmbCaIJTQnmCNEH4QZeBvkFJgUABdkEnAOeAicCFQFbADEAJP+d/h/+Wv2C/KH7GftU+l75 - 1Pii+FD3U/ZZ9vH1SfSk8/XzMPPQ8nnxT/Gk8QfwEe9y7wvw0e4l7p7the4c8NvtNe8k89LyJvLQ - 80b10Pbv+OH5vvv0/In9Xf/R/hb/HQO4A98BzQNBBcwEkgRnBbsHGQgMBx4I6AlxCScJoQolCzgL - vwuNC8ALHgwzC2wK8AmoCX4JeggXBwYGBwVmA7IBSwEIAcL/Ev8v/oX89Pvh+3j7v/u8+zX71Ppq - +nv6Zfqi+gX7Sft1+0L7M/sz+6v7DPwU/LD8rP2t/Yn9+f3p/hgAZQAxAaUC8gO8BEwFjwanB7QI - ngl9CpMLIAxbDCAMBwxSDEwMYwwwDJ8L2wrmCYUJSwlvCUAJiAiLB4YGKgapBZsFUAVcBNwCMgLu - Ab8AVADz/wD/ZP0G/R39wPtH+077ivrY+OT3ePgq+DL3v/WI9c71VvQ78zvzwvNk8tDwZvBn8I7v - me4M74rutO3J7ePu9+1m7ZrwEPNz8vnxsvTo9k/20/eX/IH+K/z2/IcAQAB6/wsC6gRjBKoCKwMU - BdcFkwUgB4UI8Qe+B9wIhgkeClYLyAuRC4AL3QtlDAUMbQuOCxkLXAnFCPMIlAdrBlwFnANMArAB - ZQD7/wgAgv4S/Rb84/sW/FH8Kfzg+5j75/pw+tD6rPsR/LT7LvtE+yL7JPvJ+zz8h/zV/OH8Wv1G - /tH+Zv+xAM4BRAI6A3EEjgUCBxkIuwjACd0KTQuYC3IMBQ0eDQIN7AzCDCYMtAvQC2sLhwoNCskJ - QwlBCLsHJwfkBrMGfwXRBKQECgTTAggC/wHBAb0Axf/s/rL9Cv2y/DT8EfuX+i36ifiz9wD3z/b3 - 9dT00fSY9GfzN/Jp8vrwYfAJ8Ejvw+8t74bue+207bntDe5K78PwbvIB8hjzu/SG9Rv36fpA/AL7 - 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 - Fg4+D14P6w+VDtMKCgmfBzMGCAa7BVwEawGS/h/9E/wR/b3+Yv9jAG//Ev5H/YP9IP6l/2sBxgC0 - /6T+5/yh+sj6bvsl+5L7svuG+3/7RfyV/Qr/rgD0AVUD5gTwBj8JbAqyC1AM9gupC8sLxAxyDZQN - 8A2JDakMUQs+Ck4KQQrSCnILIwzSCwALUAp9CaYIkAcwB1UHIwbVBL8ERwMeASv/rf1K/Hb7CPvw - +sr6hfp8+Hj3T/fE9Xj2G/do+Iv3avdr9yb2XfWC9G30bPNA9Mnz5fMv85TyMfKH8OLwEfC58bbx - D/Ad8tnvvO6Z7zTvR+6Z7FXxtu9275n1dfc69xL2HPom+T75K/6SAJwClgJPA5QC/wBsADYCUQSs - A40EPgaPBUIE0wUtCAYIZAngC1oM2QwfDhIPhg82EBEPuw3/DBgL1gnVCYoJLwdMBa0DpQD1/rf/ - ZwA2AdUCYAIfAVsAhgCMACEB/wL1ArMByQCm/6b9tPx1/Kj6DPq8+lD5Zfq9/Kb8Zf2E/sr+mf+b - Ac4DYQU+B80ISwhuCEUIHghZCLUIdwkQCi4KNAoyCmgJNwkPCfYJMQoMC3ULKwthC30KswlOCbII - aAgCCAUHbwZqBBQDrgFZADEAav9B/mH+uP3J/Ar8gPxp/DT7O/sZ+vb6y/l3+pf6Bfme+Wz4C/cr - 9on2O/ba9XD2oPZJ9kP1nvLe80L14/O581T2h/YD8pPySfRt8XbwevFD8RnwR+5/7sruSvAY7nDx - T/b78//14PcI+K32f/u8/SP9lgBfARABaP+l/+r/6gBAAs0BLgMZBKID7gMhBaoHxAgyCnwL1wtN - DHQNNw+yD5YQVBBpDmIMowtJCr4JogrGCeIHiganBFADwwNkBP0EqwWLBcUETQQ/A+YCJQNWAmsB - mAEpAKT+cv25/En75fox+wf65fpq+0T8N/wk/iH/k//1/+D/3wAhAWsDPASrBIIEUASOBEoEwATd - BU0G7gaVB9UHNgj1CBsJoghlCfgJagk1CVMK8gmLCaUIuAfuBrIFawWBBsEFQwVoBVMDfgLoAh8C - ngAWAUkB8wCnAIYAyf0h/hn+Nv22++r8+/0h/MD8MPnD+uX6y/xd90j4cvs79sv66Pnk+Lr2+fg/ - 9/L04PZg97n2z/WH9yTzgfNL9Ubz2PLb83zyM/Js8Sjwvu/e8Jzvqu268R3weu829DD2wPQx9Zr3 - Wvgt+EH71fxH/Vb/iv6a/qL+7v6X/r0AkgK0AfICXgTsA/ECPAZuB7gHcgoWCvwKSQwCDIMMUw0w - DSkMNwyRC5AKwwpqCtEIagglCK4FuQSRBQ4FGwW0BesEAARtAxQDuwEzAl0CRAH3ANr/Df/c/f39 - rf1o/Cz8XPwA/FL8kvyL/KX9f/08/mj+bP87ANH/NAGQAYoCxwLOAkkDVQPjAwMEzgS4BHUFnQWn - BeQFpQX0Bo0GywYVB4EHPge6BkMHZgYJBhIHkQVzBC0FCQVtBPUD6wVzAowBTQJBAEkDAgRO/pUB - fgS3/Mn/sgGO/+f9X//j/x79Rv6o/h7/gvod+1v9bftt/B77ZPvl+mn6ov0N+/X6Nvtp+1b56fqP - /Pz3XPxS+dr58PmP9+746vl5+en2FPsq+W/2Bvm3+Er22PdM+Of3K/cj9871GPbB9Rj19fWC9Nb2 - VfUv98L1X/a8+fb3u/nK+lD7Ufz2/HX9BP+u/in+gP8bAM3/1wCCAHEBJgEEAmcDmQOfBCoEdwX1 - BV8GAwcyCG4HzwdiCAAICAf5BwkIEwfVBwYGHgbjBYYEegTGBdIEhwTZAwAEMQQLBKkECQQIBNoD - lQNZA1sDvQJZA/4BvAFQAh4CCQGjAcIBTQH7Ac8BaAFuAQUCRwH+AqwBigKXAhsC+QGRApYD9gKs - A2ACrwIqAqMEYgSLAsUClAOpAtQCPgPnAkQE7QJEBC8D0gEVAyED+AFcAxcEfwJ7AoACggFiAgAC - +gHVAn8BMgKVAfYBMgF2AfIAbwEhAUAB7AGg//kAeAATAY7+KwDnAPT9lP+2/2z/Yv6Z/oj+8P7t - /c3+vf4Q/mL+Uf4k/+v8q/2O/kT90Pw4/QL9Qf17/Dv8wPuL+3b86voU+5j6pfuS+ub6H/sq+of7 - cvph+yv6uPlU+j35tfms+rb4svht+VH42Pd99034Hfcb95L4Rvib+HT5NPgv+e74fPms+pL64Pvj - +1z8LfyH/Cz8Vv14/Zv9yP5N/7f+F//F/5X+BQAgACMBNQHTAW4CmgKmAyoDZgOkAwYEewQ/BcIE - tgT6BB0FjwSIBF0EKQRLBQYFuAUUBiQF5QR7BdwE4AQ4BoUF2QX1BYAEvQSABAQE9AMhBA4EcwPI - AykD+gLgAqQCvAIbA3kDeQPKA4IDpANiA3EDHgO1A6UD2wPsA1gD/wLXAWgDqQFCAhcDCgL7Am8C - YQKxAuwB2gE+A0sCmwP8AnkDDQNpAQEE0gEQAqgCTQGvAlIBjwFRAtMAmgHFAVcB5wBhAS4BJgGL - AbMAOgDpAKsAUf+AADkAUv+0/17/k/6E//z+Kv8q/4j+L//7/U7+4v7z/WX+4P7K/Vv+ff1G/l/9 - Nv1C/gb95P1U/TT9If3o/BP9nv0G/Xb9ovwc/Wf9Rvw5/dX8ePxy/Nb8rvs2/Gz8y/vc++z7nPsn - +3n7CPsb+/r70PrP+sr7ePoM+0/7yvpq+6X70Ppl+/L63Po6+5L7sPuJ+/f7ovo7+/X7I/wy/F/9 - 6vwK/V79V/0k/oH9uP5F/zz/j/+2/6f/XgAbACUA9wAyASIBswElApoBBAJ/AgMCXQKqAxEDgQPj - A4QDvQPcA58DdQMOBPYD6AMVBO4DOgScAwIEBwRZA2YEEwQFBFEEhATsAzUEOgT+AzgEKAQDBB8E - MgSKA8EDUAOHAy0DiwMQAzUDkQPgAr8CCAPrAmcCSwP1ArsC+QLrAi4CJwP3AUYCmQL+AfMCBgLj - AvcBdwGQAqgB3QF4AskBhgKAAUgCtAF9AQoCjwFOAnoBMAJaAdABUQFdAZQBJwE4ATIBRAFbAVEB - wABsAcAAZQDdACgBYgA0AZcA4ADhAHcA+v+k/6MAz//z//3/VgAo/zsAOf8H/xQANf8LAFL/Qf9Q - /1T/a/8H/zr/x/7z/n3/Sv4s/w3+MP/I/gv+Fv+y/ZH/IP6c/qP+ZP7a/jT+f/5S/rH+/v01/x7+ - 6v29/gH+jf4W/nr+Af7T/Xb+BP69/dH9K/6g/Zr9+v1D/fv8fv3u/Oj8Z/06/X/85fwD/UH85fyg - /DH8KPxF/V/8M/wo/WH8aPzt/Mb8Pfxl/e38Sv2b/W39mf2+/WX+B/50/tn+Cv8B/0T/Zf/5//z/ - NQCnAC4AzQDWAAQBewGAAT0BhAEMArMB3gH0AUUCCwJ6AngCxwF3AlYCrgJFArMCeAJKAhwDewL1 - AsYCtwIDA8cCCAPeApoCTgO6Ar4CGwP0AhMDBAMHA9wC/gJuAgIDsQIFA+oCLgJAAzIC4wELA6kC - PgKaAlQCTAIqAmcCKAKvAVYCEwLlAdkB1gHIAXIBQwLsAQECxgFHAeoBFAHPAWsBLgFzAa8BVwHp - ALsBoQCFAdYAlgC9AbUA3wDDAG4ACgF1ALwAWADk/6MAPQCcAAwAMQBR/3EA+P+g/4UAQP+iAFT/ - CADN/8T/n/9+/9z/RP8xAPj+pf9R/1z/Fv+g/5n/V/8YAEf+VP9GAMb+4P7U/6z+7v5T/9D+7/7t - /sH+gP/7/ob+cP9f/vL+K/8M/5z+Rv4o/1b+Hv4j/8j+oP2p/pb+Of24/ln+Pv2Q/sX9L/0o/sP9 - aP3r/cr9nf2D/fL9cP2j/WD9BP0m/ir9gf2j/GP9Vv2W/PP97vx0/BX9hf27/IT9zvx2/T/9vPyf - /dT8VP0e/cX9iP3x/Wr9pv0//s/9Jv5v/kr++/0I/y7+Pv7T/qz+Yf55/xL/1/7Z/5f/tf8o/zEA - uv8xAOIANADQAGUASgAAAQ8BFgFxAS0B9gCyAa8BGAEoAjcBKwGYAlcBoQGJAgkCZQGhApUCWwH6 - AeMClwKkAYADxgG2AcIC9gGTApQBkQL7AUkCSwKPAtIBcgGpAvYB/AHaAZkCrgHsASQCWQFEAcAB - cAFLAdwBuAFDAYUBOQGSAZ4BpwA1Ap8AbAG0ARwBHAEpAfAALABsAZ8AyQDXAL0AOAAGAYUAyQBN - AGAAUgFUAGQAxwDSAEb/HQFhANX/ugD2AJT/SgCwAJr/7wDm/90ALgBOAFMAagAFADoAVgDV/6kA - cf+MAJX/cf9kACEAG/+X/3gAkP5EAPD/w/4uABj/df8t/zT/HgCj/5n/0f6m/3n++v4tAE3+S//W - /5n+3P4gABL+Xf5xABn+qP5h/2r++/6V/rf+Pv+y/m/+1f9H/mn+gP9U/pX/If4Y/yv+NP4sADz9 - nP8w/gj+5f96/fD/E/45/qj/7v2X/4X9Lv9N/lL9gAC5/Qr/bP4t/lX+Dv7h/7L9Yv79/jb+5f1T - /vb9nv4x/gL+TP5y/cL+mP3X/eH+wf2q/UD/Wf0j/n7+8/2f/vL9vf62/Z7+wv1//pH+vf4Q/m/+ - hv5v/WP/e/0S/6P+sP60/sT+if8t/pX/9f4G/x4ASv9J/+n/Uf9iAFIABwDQANL/yv+sAPwAuwB3 - ACgBtgABAQUBdgFTAZ4BqQHkAFsCHAGGAu0BSgJOAicC7gEUApYC+gAKA8oBsgIiAg8D9gFNAjsD - 7gHjAhMC/gLgASQD+wG0AQMCMgJhAr0CTQPWAc8ClwKfAeQB3AFBAlsCnwFdAocBQgLdAa8B/QAE - ApUB6gCEAgMA1gE9AvUA0AA+AckA/ADsAAMB/wB+AJMAbgGVAHAAtAH2/vsAnwC2AMn/mQAMAb7+ - UgEPALP/wv/s/5D/Qv9FANL+oP5dAan+4P45AWv/Q/8xAE0A1f47AOT+Z/9d/4v+r/+a/q3/IABH - /z7/rP+c/jf/bP+q/oP+7v6W/xr/yP1p/6b/JP1oAKf9I/4EAG39Uf5x/QH/Bv0N/8n+9/zO/iz+ - Tf9R/p7+Wv7g/c/9oP/b/YH8xP35/uP8Zv2v/x784v5Z/lf9DP2o/x/9A/xO/vf8bf6w++n9Ffxa - /TH9fv3C/+/7S/25/GL9kP1f+2X9pvw9+7v+c/t0/HD+CPyI/TL96fyF+8H8vvwV/Cr9qvsT/aT8 - 2/zo/cr7bv1s/WT8Z/xg/ST8vPtc/Wv7Dvwg/Tn8qPx0/br83v2Z/VT+Df5Z/oD/4P32/i3/uv6r - /sX/sv8jACgApwC2AO4AkQHkAIIBPwHqAd0BNwJlAm0ChALfAvcCBwNYA24DGwNDA94DjwPGA1kD - iANjA8IDIAODA8gD1QL6AicDxgJLA4UDQQJIA+QCqwKgAvECsgJqAsUCTAJ2An4CMALpAVACqAFP - Ag4C1QFAAhYCpgGXAYECbgECAvIBQgE5AuMB2wG+AawBbAEOAmoCdgHLAVkBvQG2AfUBCQJ5AdEB - wwEWAnQBtAEIAkcBiAFDAu8BxQFVAs8BtAD3AvABuwBeAs4AMAGSAZsBowCGAeIBqABsASQB/gBI - Ab4A0wCuAOP/AwHL/+j/VADL/yMAcAByAJD/TgCXAB//Qf8NAJ/+Jf/C/jP/PP9x/hD/3f5j/zj+ - nP49/+z97P3h/VL9Rv1t/Vn90/z3/Kb8Cv17/D38C/2w+6r7hvvK+o77cvt8+vf50vke+8X5Z/p9 - +wf6O/om+if6aviF+Vf61vfT+vL6c/ey+uD5iPhL+vz4UPix+JP5HvgX+K75e/j+9374JPiJ9wH4 - wfh497H3SPce9433Bvcb93D4k/nD+RX8yvwz/cv8N/0P/aP9lP79/dP/UgAMAJMAxwFmAjoDbASg - BUUGhweGB/QH3QfbBvMGMAYcB6cH5gf5BxkJ/QhhCJYINQgrCNUHnQelBhUGoQWyBBcEDQSCA78D - 4gPvArgDbwN8Ak4CvQF6AbMALgHsAM8A0gAMANMA0wAzAYgBuwE4AnICWwKWAs4CUQLrATQCjALA - AsEDBgROBNYEpAQwBGYEzATMBHAFtAVGBUcFXAQHBD0EzAOQBAYFRgV4BaUFUAU4BAEEkAOaA1MD - HQMgBK0DZAOGA1kDyQLHAl4DgQMWBI0DqQOwA7cCrwKRAoECfAIAA9kDkwOxA7MDswPkA4ID+gPh - Ax8D3QL4ApICRgJQAkECUwJbAnICzwKRAnoCcwKvAUEBpAC/AN3/o//4/6v/4P93/+//cP9r/nj+ - 4/1y/fn85vxc/e388PuB+/X7MfsR+wn7Fvvv+hL6XPoi+vL5ivkl+Ub5ivmf+Jn4d/jv+D/4kPeN - +Dn3gPgF+Hb3dvcy9qP2d/UF9ab0r/Qq9XHzb/Q99cD0bvTd8if01vLA8XvxXvHR8/jwUu9Y8Y3z - R/Kr7yr0h/Y192j43Pm0/4X/9voo/KYAKP7t/AsCrANVBfoEfASlB7gKVwruCt4OuA6pDqYOIw1R - DXYMlgoQCY8KJww8C+gLuwzpC1EK5gckBi4HvQa6A3gDTAPlAK7/fP/z/zkB+/8V/6wAuQDH/y7/ - Pv/I/hP9vPxb/hEAbAABAZcCLAOJA5QE0gXoBncH6Qf8B2QItAiTCPsIQAnTCfkKnwtbDAkO3Q2D - DJwLVQqFCd0Ikwh3CEEIKAcRBr8FcAUmBUsEUASiBKgDfwICAsEB4v/j/Vz+Tv6m/qkAMgEMAgsD - gAI1AvMCnQOTA+8DZgSyBJIFHwbuBQsHfQi8CHIImAptDNMK5QqtCrEJrwgjCG8HagefB34Gtgek - BxwIBAhfBtMFTgRSAmIBrwGFAckAZAD5///+xv4f/xP/9v7L/vz8NvwQ/OX6WPrX+vL6cvtk/KT8 - Sv0k/QL9k/sR+3L66vnB+T76F/sW+137D/yB/Bf76Psz+8P6Avk4+HH3rPb/9tD0Tfa89n72gvac - 90D2+vRx8yPxo/CR8SPwCO0S8J/w0+6p7UfxxfE88MTv1e+78Jfuduy27BTwxO0T7nPySvf8+Kn9 - bgIhBasE0AEzA0r+df8iAvMFWQbwCKwOCAzWCpIOVRTED1YQRhS0EdoMMgo1CmsIHwe6BUkItwri - CXsKEgs5CT8H4wLG/iz90PwI/Dj80fy0/Nj90PuL/CMAlQD//24AMwEvAHf+z/2c/c/9wf6TAEkE - bgjnClAMhQzsC8EKcwmtCK4Itwp1CqoJVQsgDNYLJwzMDDENtwy7CkcKgQmiBt8DygFPAGn/AgA7 - AW0CLgP8AbsAxf4//bf8KvtP+3H7uPvt+9X7e/zk/Jb9ZP3d/lwB3wHhAjQDgQOcA1QCsgPRBagG - kAdVCSEKwgnOCbcJFQlgCI4IIgjgB1kI4QgnCEAHIgdkBoYF6gQ1BV0FzQNHAmUCzQDD/zkAgAAd - AawAtwEUAvwAuQCk/17+l/2K/cv9Fv8FAR0BRAGkAW8BHACN/5wA0QBTAUMBowG7AdwAUwCx/3j/ - QP8F/3r+r/5d/4b+xfzx+zX7R/pI+fH48/gS+ML3qPZE9rf1G/WF9UbzxvO09BDzbfOR8wvzU/Iw - 8avwA/F88TPz3vTm9ub1dvRF9F/yhPH78HvzK/IX9F/0uvG89GjzoPCZ8LD00fIK8m/yQvN38oDu - s++i7zfyaPAA82/2hvmaABsDPAUhBi0HZ/9i++7/6wKjBKkGjQxyDp4KVgnkDbkQyxDDD9EPcw4C - CtIHaQayBhAHzAWOBHwGSwnnCKQH9AYVBcj/gPtY+hD7xvtM/Jz9sv1t/pz+u/5HAIoBUALPAWcA - 6/8QAbkA1gCCArgE6gbFB1IKCQ1XDiYNJAt4CuQI4QcRCEQJNAqxCm8K2AlRCjEKfwkOCKUGNQXN - An0A0P4N/l79Y/1Z/in/uABHAWsAdP4x/LX6n/jW+Dr6/Pvr/QL/OgAFAWACJQL8AQIDkwNeA6QC - 8wJLA0wD9gJ+BLoGMghOCWwJwQrfCdoGnwQfA2kC0gAWAdMC4AOuAzkDJANPAucB5gDn/6v/Qv8D - /kf9Nf6Z/mb+wv6f/2sBuwIgBAYGAwamBKsCmgIGA3MCPgQnBgYHuwZdBz8JAAknCQsInQf1BrcE - zwK+AYsDLQKpAaEEWAfmBaUDlAPRAST+ivsv/O36X/vo++T84v0I/lv+9/2O/TX8RPsJ+VH58PgO - +V35XPlo+tX6BPtH+zj86/wt/ML6nPtV+Sb4D/fY9+n3Lvge+r33Pfk5+Kf2H/ds92P2PvT88/vz - 6fIY9En06PGZ8pLyDvLZ8nT1mfO68ojy4O/c7kXvYu8077fxKPN18xbzT/VR8xTzsfAE8fDxRu+p - 8zD0DPsn/KEGmQvjBS8NjgZK/yP9BAKlAocFdg70DEAOHQ0xC4YNXBHMDxcOhA4/CfIGpgZGBWQF - HwayBPcC8gVXB1MHXge3AywAmvuN9//2Afqz/Uz/oAHHAUEAywCb/1z/sgEFApIBCAJCA+EDUQSO - BH4FLAjbCc4L4A5kD8gNsAtdCJkFuwVnBhsIUQqxC3wMxwqeCmIIUgZQBXEC2ACd/2n/jP1N/Qf9 - VP0h/hr+iABhAUoBov+Q/bX72/kr+qv6mvxj/+sAsQGOAmgEewR1BK8EhAQcBEgC4gG9AtgDLgSX - BLgGawi0CB8JjAlHCZcGGAPGAKT/ef8GALkBNwPDA6wDGAM/AW4Brf9e/M78/vyq+2H7B/63/2z/ - hQAeAhADtgEtAdgCsAGlAGsAzgIaBPoDKwQBBcsHOAcrB30I2gn2BrUDHAOQBIcDMwLZBDEEoANI - A4wDLwOhAgkBrv+O/hr/DP+5/aH/3/76/KH8J/7//Ov8Cv61/QD9c/xN/Wz9jf1p/Sz9bfwI/RT9 - Df69/xX+gP0Z/av6OvsH/dz8zvwd/mL9E/sr+vL52vhC90f3fven+BD3IPaP9tD2YvWk8/31dfTo - 8jfzr/MK8w/zaPT283zz+vNx9C7yW/KQ9Uv2YfSi9kL2KvPk9KnzyPOI9W33pvZm9s33FPUG9Pnz - 5PQy87T0IPVQ9iD2AfPz9tX2w/rV+14D9QhlA98FzAOt/wz7pv1rA7QGWgrKDFMP6gzoCWQIKgm5 - Cb4IewdzB7oH5gU0Bd4G7wavBWYEKQQ3BaME3wIhAIn+vPuC+CD5+/tr/wcCPwKFArABOgDM/yz/ - dgCBAN4ArQG1AtAE2AZPCNgIdwnkCDIJRQlMCVMJWQgiBwMGFweKBxYI+AnDCgALTQldByYFSAO2 - AS//VP9f/6j/HwAuAKsAMQAZAM//zP8N/9v9Xvzl++n8bPy8/Z3/jgG+ApwCQwSuBJgEBwQ4A6MC - EQJ0AmQCRwMeBc8FMgaPBq4GfgbiBRIFIQMbAsIAFf8h/04A2AD9AFkCjwJxAkUB0f/E/vD8aft9 - +l37TvyT/ef/+AC4AhgDYwICAqEAegCv/3cA2gBCARMEKgVTBmEHzgYGB3YHtAXqBMYEjQNXAm8B - hQHWAU8C9wNmBAUE2wMFAub/zv5j/kj8SPwg/pj94f1u/nr+uv2E/cT9rPzK/eP9gv2p/Rz9efzo - +n38ev3o/f/+XwAfAHP/Zf/K/dH9gPw6+9b6yvtI/df9dP5i/z7+uf1//Vr7y/oh+ff4CPny+Pv4 - 5fl8+fP3J/jF9974Jfh895D3efXF883yoPKV8wf1q/Yo+Nj4OPjf99/20/av9v31kfSV9fz3kPVq - 91f4rffW+Fj5k/ix+UH5gPeO+AP3BPaM9Lz3UPZE9i340Pd1+HX2nvmM9uL1ofYG9nX18/WU+xL6 - 5v5EBcYG3QaABIgHhAEz/HICjARKBdkILAzpC44KzAkBCv8Jkgo/CjgJ7QjLBiUFlwQtBaIEiQXT - BNkEmwWmBGQDggJuAW39Sf30/Pz9uP+JAakDnAN+Ay0CPgOhAk4BVgP/A1wEBAW+BNYG/weCCL4I - XgkkCh0J7QgsCUIJbAd7BywHGAcGCIkH4gcmCMcIPAa+A+ICaQETAIr+oP9VAGcA/ACdAHMBsgBM - /+b+FP/S/jv+Tv8M/7D/HgFeAaIBtQJKA4oC/wKhA7cDbQPmA6oEUQSmBKcEQQQOBfQE/ANjA8wD - QAN5AqcDoAJUAm0CSAGeAUYBpABpAOwAcf+6/UP+hP40/pb9fP95AOX/SwCMAK0ACQFRAgcB9gHQ - A18BlAHQA7YERASmBCUGtgZTBqwF8wQXBQkFYQPdA/8EcgQGBCgFQQWvAygD8AJkAaIA9gBn//X/ - igCn/8r/aAAXAQcAXv8OAOf/g/5Q/lv+av4w/qz9zP7b//L/3P9yAPb/jf7J/Wr9ff2k/aP92P3m - /kz/Xf6E/dH9XP1Z+2z85vzP/O78G/x5/NL6uPra+Y35gfpU+nP6IvpK+pD5gvkA+WP5lvhK+J74 - L/jT+Uf5yviY+mz5U/cJ+vb5JPjT+Ef65fj69hz4QvnY+Ab3r/k8+R/4Jfn++DL48vc5+af3n/c/ - 99b4wPf89zT6Uflf+iH5u/nm+Sb5cvc1+fz5rPiH+UH5ovhQ9xH7fPl/+SD7g/qS+r/4vPhe+BX7 - s/mW/M/+V/8LA5wDBgZlBI8E8AImAL4BHwRwBT0GmAnJCtUJBwl8CZgJBQnBBwEHZAYCBeIE2gQJ - BbcFHQazBPoDdAR7AzcCzQGFAS4A+f7w/hAA0QBTAWwDKAQPBBEELQQQBNkCUwMPA9gCpgO5BOoF - hQZACHAIUAguCIoH9gbQBXUGCAbKBM8FhQZIBroGswa2BvkG9ATSAwgD/QB0APn/GADjALQA2gAj - AZEBywG+AAcASf8T/27+Nv7m/wgAJQFEAloCowKfAqYCsgIqAwkDoANcA6YDFQSmA0IEMASrBHUE - twRQBBUD0wLdARsCEAKlAcgBmAE4AccATQDR/67/ef9+//3/V/+9/jH/G/+F//P/nAA6AYQBNAFY - AMAAWgHtAYQBKQMUBcoD0AM3BHYEjwRMBfAF6wVgBo0EogPqA1wEjwMtA0kF4gQpBKgDIANqAnAB - 3wD6AJsB+gDRAFsBpQHPAB0AWgBgAEoArQAwAGcAkQDe/1wACwCGAAEAWP9+ADMAYP9P/3b/Nv8J - /+/+Bv8R/+D+zv6J/h7+df1y/Qr9I/1l/ST8x/zK/KP8UfxT+8v7Jvth+vP6ePvv+nv7c/sN+5r6 - kPoR+vv4Kvqg+c75bPph+sL6Rvps+nv6k/lU+RX62flP+pn6tfk0+y76dfgj+576Qvlu+WX6KPnU - +A35SPhC+hP4Jvl/+QH6QPqE+cX5/vi5+tH38PiH+Wn6n/na+er79vo0/UD7kvxz/BD7c/pl+0z7 - mvtT/Kf71vxk+mr+C/wA+9X9mPt7+437x/pD+gD9hvqf/T//VP+nAtgD9gX2AwwG1ANVAfYCdwMl - BO8E4QgnCZAJKgpiCZIJBQjsBusGHQaQBAgFZwXdBMcF3QWjBVkFXQW6BNYC2gPpAtsAXQF7AI4A - vwBbAb8DqAT7BKkFyQWbBNgDiANlA4wDXQOLBB0FGwaBB6EHxwgvCBEHsAYbBXAF2gTqAwYFowWR - BT0F5wWcBXUFVgS5AysDNQE1AUEAggCIAGQAzABDAeABhAHMAdAAogArAIP/f//d/6QAnADYAY0C - bgKUAssC3QJ6Al4CjgIqAgYCbgJKAoICvwIUA4UDmQNVA7ACSQKQAUEBIAEPAfQA9wAyAX0A7gDF - AB4AUAA7ACkAfP+Q/4z/f//1/3UABgFYATECGQKzAdcBSwLTAn4CdgMwBI8D9AMBBEoEKQW4BboF - YgV3BRIEJQNmA4sDPAMlA2ME2gP3AkoD3AKcAYMBPwHmAHoBEwG1AVEC5gHuAZEBSAHMAZgBOgIS - Ag4CmgIwAYsBowG1AdwApQDwAdQAJAAEACMAaf+r/tn+nf6k/oz+x/48/gf+VP68/D/8Bf3E/Df7 - yfvY/PT79fum+1H87PuI+gX7t/tT+6z6//uj+0/6hfu2+lT6rPtQ+8/7gvvI+0n8zvpJ+537LfuV - +zb7rfvK/Of7yvuc/K374vuL+1D73vsQ++37PPvo+gP7A/s8+5/5n/uD+/b5JPsd+h/6Qvqp+Mz5 - 7vmY+N753vnd+fz5fvlk+7r6//nL+0/77vn5+Tr7yvlD+kr8avs8/E/8V/x2/Zn8nfzj/an82PuR - /Ev8w/yq/HX8Cf63/Av9Xf7x++r8j/yk+1X7MPsW/Rn8dvzV/OL9L/7r/sUCJQO3BCMExgMgBDYB - EwL/Al4EZQRaBZsHogYJB7YH+Ad2BywHyAWeBN4EzwO7A3gEJgU5BYEEiwSTBJsDLwOLA+YCmAFP - AYoAGgC0ANMB3gI2Ax8ENgSdA74DDwSlA78D4QOaA6cDzwOxBJ0FHAa3BrkG3AXLBZ0F6QTPBPkE - DARUAzMD2AJaA3gDuQPAAyQDQwKIAS4BLgACAMv/kv+5/ysACAFYAWICmwK2AU8BNwFnAOP/tQCt - AMoAkAF4AuIC+wKuAzsDVAIRAiEBhwDcAEwBxwECAqECiAKoAuQCHQLzATUBAgHUAFQAtgDLAA4B - 9wA6AZIBiQGMARsBLAHQAIwAlQC9ABIBMQEWAjoC4gLLA2EDKAMFA/4CYgIiAs0CqgKlAiMDKQNa - A40DaAMiA0QD/wI1AmECPQLcAV8BSQFeAUkBuwGLASwCHgJ0AZcBygBfAP//Pv9u/zYAMwA/AHMA - LwBgANP/pv/a/4T/Y//V/sj+nv5u/mv+Uf4z/1b+7P2e/iv92fx2/Cv8m/s2+z789/ss/Bf8Wv3t - /PP7ufwD+7b6I/rV+Ur6TvqQ+4L7l/uj/Gr8z/v1+8f7Bvsw+//6zvrZ+4b7SPzx/N780P3E/Jr8 - hfxR+536vvoK+2j6Jvtg+6L7yPsK+wX7Xfrk+Rj5vfjm+DL5r/nx+TD6wfmK+lL6/fhd+sb6LvmL - +RT6A/k3+VL5EPmu+nv63vql+077yfvM++b7TftL/Pz7Bvus/H785vvD/Uz9of3e/ib9PP76/dv9 - Pv2q/bH+U/1k/ZT9rP0G/Lj9LP2P/S/+HPy3/SX9Bvxd/JX/Dv+EAOcDUAMPBc8DnAMPA80ByAJg - AtYD+QT8BWcHigesB4MHDQgIBrUEJAZDBCQDdATNBKgEuQXZBc0ENwUVBKIC7gJsAjcCtwEuAdUB - oAEQApICNgPwA4YDKgRFBAQERATAA7QDtgNoA/MDMwTLBJ8F9QU0Bq4F1QU0BeYDHQTcAyUDQQM+ - A1oDjwNwA1gDGwOuAsoBYAE0Ac4ApgCRAFoASwAwAGEA5wA/Ad0BKAK+ARUB+gADAH7/Pv81//T/ - mP91AIsBoAF0AccBXwF+AIEAYwBOALsAOAEeAeUBoAEHAjkCUgErAlQBPgECAkECgQKUAh0DfAIa - AlQB/QA+AVMA5wCBAd8AkAEIAtUBRgLMAhADZQLRAgYDXALZAlMDhQMxA5YD+AOSAwEEewRSBIQE - mAQ4BEIEFgSiAzAD6gL6Ap4CUQJOAkUCXgL1AZwBGwECAXkA9/+XAAgARQAkAO3/y/9f//b/Jf+o - /97/rf+o/9z+Nv8+/qj+NP6//ff+Df6f/v79zf0P/t388vwV/JH8xftC+zP88Puv/Kn7ZPza/PL7 - zvuO+x38cPoW+yD7o/rW+4L7MPwl/Of8iPwc/Mf8a/zp+4f7WvwQ+976mvsk+0r7D/sl/M/7TPtb - /Mn71/uI+0/7nvvJ+s36VvpQ+w/7dfoA/HL7ffsW+1X7pfrN+TH6NfkM+mb6+/oP+xr7Ofsg+u35 - q/nz+kD6svl4+o/5q/nt+P767vsC/Fb9Uvxh/ZX7KPvK+4j7y/tD/N38qPsK/kv9c/2I/hH/Sv9D - /a7+4v2I/Yb9/f13/tz95/3w/Rz+lP2A/gT+f/2o/Ub9C/1F/d/9Bv4K/9sAFQH1AYMErgNLA9oD - 5QPQA7sC1QPQBJMEfAS3BUEHZQZ0BqwHLgdEBsMFcAW+BHUEagRhBP8EvAS7BHsEMwSQBCMEWwPp - Ao8CZQHfADcB6gFTAtwCcQO0A74DmAPnA0MDkwPGA/4CJAOHA6AD3QO6BGoF1wWkBa4FUAWwBIUE - VwRBBMcDxgN6A+IC9wIVAw0DCwPZAnkC2AErAbIAOwAjABsA//+AAKQAVgCZAPcAEQF7AG0ArgAF - AID/AgBmABsA5ACNAb8BNgJsAjICDgJqAskBXwHVAbIBXgHcAQEC0gEWAhcCcgJcApgCbQK9AbsB - AwG2AK8AywBqAekBGgJMAnkCmAJcAlgC3wK2AsIC+QIVA1cDXgNNA6ADzQPVA+UD0wM2BGoEDAT1 - AzcElQMvAz4DrAPMA70DOgT2AxMEdAMmA00DygJ6ApkBywGfAQYBNwERAXcBkQDZ/2AAof93/3H/ - 4f/Y/yL/VP9w/on+S/4g/nH+Xv4F//r9MP6J/j7+AP6a/Wr+eP1V/Xv9Rv3n/U39ev2C/WP9ZP3R - /D79nP0k/Z/8Vv39/EH8fvxH/E/8tfse/CH8EPyu/GP82PzI/F78Uvw0/Kn7iPub+4b7nfvm+1r8 - Lfx8/Dr85PtF/Hb7kPv7+1370/sX+1b72Pv3+tX7wPsf/Eb74/p2+yr6n/pJ+nf64fr7+qH7j/tc - /H78qPvu+qP7nPqG+Q76l/oc+0n6JvwD/Gr8ivyp+7X9nvvb/Mv8wvvN/T78ZPxv/Tn9af0V/sr9 - 2v5x/sn9Tf7U/Uz+pf15/Uf+jP77/KD+3/4//lj/vP17/n79kPzD/F/9vv36/qYAVgHVA24DlQSu - BKwDxwPBAhkD5AKXAy8EJgUOBroGwAecB9UHkAemBuwF8wQ0BAMEnQPZAygEVgSaBFYEhAQ+BPkD - zwNMA/ECaAIbAt4BIgKOApwCYAPNA7UDLwRGBHQEdQQ3BE8E/gMqBPkDXQTlBKsEWAU1BSEFQwXT - BOUEtwR6BKQEaAQzBA8E3AOuA24DXAMnA+wCngJzAjECDQLeAeAB/wEYAksCFgI1AqQBYgFvATUB - FAE3AWMB/AAjAS8BaQFXAXABtgF9AacBdwFqAaIByQHeARMCMgKUApwCJgKAAn4CQwI/AnkCrAKp - AuwC8wLGAsYCeQL1Ac8BhQGAAQsBCAGVAWwBtwEUAngCZQJ4AqUC4QIBA/ICcAM2A20DrgOgA/wD - ZwR5BCIEVQQ9BKkDUgPuAvoCJgLNAVACggH6AQAC9wEBAlQBUAFEAOn/tf+e/6D/hP8vAPf//f9d - AFEAagArAAYAwv88/9L+pf7N/rX+H/9E/3L/mf9u/7L/ef81/8/+ff6o/Qn96vyF/ID8ufxT/XH9 - iv0B/gH+jv0b/Yv88vtm+8H62/pL+1f7sPtb/I/8DP36/HL8vfyU/Pn7T/uV+yn8J/vC+pD7Y/tF - +xH71/sb/Vj8pfze/Lb8U/xB+0L8F/zp+4X8Xvzb/BP8Hvxm/Mz76ftB/EX8z/t3/Ev8y/sf+w77 - Y/ve+R76cPpw+nT6hvqd+2X7lPul+0L7dft++x/7wPpS+/z7n/tZ+9/8qvxH/O38xvzD/R79I/3Q - /ez9ef02/Yz+IP1H/YD9rfwL/VX8Lv3Y/GP9/P1K/TP+K/0I/dH8a/zi/BP8CvxJ/Nf7IPv2+yv9 - xP1n/rsATQIuAuwCCgORA0MC5AHWAo8C0AK6Ai4EDAVmBTwG3AZgB1oGhAUFBWUEXAOAArwC3gJo - AlkCCANEAykDIwOwA5UDYALPAYYBBwG+AB8B2QHcAQQCrwL5ApUDygNBBFcEzAO6AyMDSgNPAzgD - xgMRBH0EggS3BCQFCwUgBZ4EewQmBDAD+QLjAsUCTwKEAhYC+gFAAkICgQJVAmoCbgFCATQBsgCg - AKMAxgCMAK0ApQD1ACYB+QA+AZsBngE7ARoBpAGpAQUBgwH/AbAB8gGMAk0DNQMeA4YD0wJUAvUB - BALOAbQBLAJVAtoC4QLyAtIC5gKKAi0CjgKPApECYgJ8AnkCCQL3AbwBmgHwAZQBxwEZAuYBBQKm - AdsB+wFVAWsBNQFiAckB1AHXAs0C2AIdA6QCpAKpAqsCkAJQAooCZwLlAS4C4wEEAgMCpQHrAakB - YQGGAZUBmAGqAWoBTQEAAasANwBhAOX/z//g/yj/tv9i/4n/pf8RAB4AEQBwALv/z//6/tL+Uf74 - /Tj+qP1g/hP+e/46//b+V//6/tv+m/09/CP8QPsR+9b6xfth/Av8Qf16/cn9w/3c/e79HP25/PP7 - wftK+3L7FvwJ/JH8C/32/LT8R/0e/VX8aPzW+077ffqS+h77dPoZ+2b70Puf+6L7ePwW/OT7jfsW - /Ff7+/pE+3H7dvsC+138z/vT+yX8OfyS/P77Av0Y/BD89/vq+nf7hPpZ+9/60PoA/Hz7Dvwa/ND8 - k/y9/Mj8ofza/Hn80Pwv/ID9YP0D/R3+7P3g/hr+sv7j//3+Q/++/gb/fv7O/SL+8f1U/iH+xP76 - /vv/sP/z/rr/Tf61/cv8nPwW/V38yfxi/fv9r/2k/Sr/d/9l/wABfAH6AdkCEgIjA8ICNgLeAjoC - GgP3Ao0DCQSWBAcGUgW0BRoGCwUqBEUDyAKWAmMB4wHyAjAC3QIjAz4DZQP1AjoDUQIBAk0BugCv - AEYAOwHcAMMADwKlAqgCbgOcBM4ELAR3BNEEAgTkA+4DOAQmBIgExwS7BHIFYwWyBfcFLQZbBvoF - BQaJBbcEMAQ/A6UCSwL6AVoCmALHAiYD+ALcApwCDQKFAQsBfQAPAEUAQwB6AAoB0wEsArICpAOf - A3IDmAObA9cCggJSAmgCaQJAAj0DQQOIA7YDmQPPAzkDGQOUAn4C/wG2ARYCvgFZAkECTQKSAlkC - KALUAccBrwFpAWwBtgFTAXEBYAE1AU0B/wDqAMIA1gCtAK0A+QD+AEYBMQE+AX0BKQFdAVIBfwGt - AdIBSAIyArsCsALaAvUCzALoAiwCIALTAXABAAG7ABoBfwCUALgAnQCzAGMADwCV/zT/HP6d/U/9 - Tf2l/Yz90f5K/5n/NwAwAJIADADQ/1T/d/6k/rL9hf0C/vv9gf54/vf+Gv+G/hr+1P2v/dr8d/xT - /Pv7s/t6+2/7gfuM+6f79fvi+1T8ovxW/Dz8efxr/F37FvsH+9T6iPrF+r37+fs4/BT8yvyr/Mr7 - Ofx0+x/72/qL+kT6CvrM+jL6ZPoM+yr7KfsB+6X7yfts+6b7EPxb+037RPti+of6e/o8+ob6IPvN - +xz8tvyQ/AT9O/04/JD8Jfw6/Jn7EfvA+4/7gvsf/BX9Sv23/rT+zP6M/xH/jv6r/WL+zv3w/Nr9 - af76/kr/EgAQAcsAnQCgAH0Alf8+/yb/dP6O/kP+ZP4x/sj+Cf+U/lv/Ov/n/p/+w/7h/mT+jv4Z - /jT+9/3I/HT+yf1A/Zn+9P1i/87/UAAnAgMDUgOrA4sEuQMzAxcD3ALSAokCaAOrA3YEqgUhBq0G - 2AblBpgFnQTyAw0DJQIUAWQBRAEGAY4BUwK8AlICxwLlAvcB0wFeAc4AlwB2AMYAHQGcAVkCbgPC - A2cEZwVIBT0FUwVjBRwFhgRaBGoE6gOWAzkEbQSBBLsE+QQFBckEpwQaBAYEkAPYAqUCjgJgAuoB - UQJ9AqEC2ALrAicDygKlAngCZgI7AggCDgIIAkkCDwIUAlACTAJ3ApQCmQKaApUCTgJjApkCYwJo - As4CzgKsAgUDcANgA1YDxAO5A2sDnQPbA6YDxgOvA6oDxgM6AxQDAwPmAmQCjgJ5At4BQQK6Ab0B - nQFMAVMBpADaALgAyQAQAX4BqQGMAdEBNQE8AaEAdwChAAEAawB5AJcA3wATAY0B6QHKAU8BIwFu - AIv/Vv8s/z3/Pf9y/+L/pv+w/5b/Tf9H/5/+ZP75/aT9kf1D/dr9vP3v/S/+2v3D/fX96f2b/c79 - fv2l/cj8i/zj/CT8MPxL/G38ivya/F78s/zi/Lj81vwg/Qj9jfxi/O/7q/tC+zP7Xvud+6P7x/uL - /Fr8RvyP/IT8E/xt+4n7/Pqm+t36V/v6+wD8SP0B/W39pf19/Ab94/te++D6Zfq1+qj69fq9+0X8 - XPzt/Kb81/zs/G/8ZPzG/Kb8NPxp/ID8bfyT/Pb8d/0X/gT+WP4w/lr+Kf65/Vf+1P0N/s39qP02 - /h7++P3s/l3/N/8ZAGH/JQC4/7/+tf9n/mH+Fv41/b79//3h/fL+yv+3//IADgBXAEkATP5a/lb9 - y/yC/Dv8lPz+/Or8mP0p/iL+T/9X/qj/ygD3/zwByQELArIBSAI7AnsCiwL6AV4DsgJrA/wD5AM3 - BQUFFgX5BAYF0AOlAigCOAH5AOr/ggAUAeoAaQEQAhQDfwI7AkUC2QGpAOr/IwB9/1X/gf9iAL8A - mAGxAs8CqQOlA3QDPAOQAlkCOQKlAd4BjQKiAskCRQMkBC0ENATaBBoFwwSjBKQEaAT2A20DiAMP - A/ICQgP4AvcCNgNJA5YC0ALiAv0BmgHDAKkALwBS/5n/w//j//X/2wCHAZgBJgIoAv4B4AFBARcB - GQHdAIQBvAFFAgEDNQOIA4EDfwM2AwUDigJ/AkECJQJAAiMCnAIrAjICHwLwAbwBvgDJAHgAsf/0 - /8n/MwC0AJ8AZAG4AfUBAwLzAdwBwQFrAQsBDAEIAaoA//9YAAcAgv+m/97/6v+g/+P/AAALAPz/ - 0P/s/7b/A/9e/mP+6/0f/Xz9zP3U/TT+0P4p/33/gf9K/yr/Ff65/f38IPxP/Or7NPxt/Jn8J/2h - /fX9GP6j/lT+xv2N/TX9TPyL+4j7E/vc+h77hvsx/MT8Pv39/Sj+AP54/bj8L/zp+iH6Evqu+Z75 - evov+/v74PzT/VX+Df72/fz8xvv4+kf6pfmS+T36i/ox+xv8vPyQ/d79qv27/YT9RfzO+w/8j/vq - +z/8S/35/db96f4C//b+/v49//r+l/4S/6j+sv4m/zj/7f4h/zz/1v4s/hj+tv4G/bf8Mv4F/cf8 - 0f2H/SL+uP0Y/qb/Pv6H/lL/SP4f/k3+Cv4G/mT+lf4L/wn/zv9AAPj/8QDbAOAA7gAbADYACABM - /0P/AADt/xQA7QBDAWUCJgILAg4DOgJmARsBCgH3/9D/SQAmAN8A9wDfAfgBMALpAngCHQLPAaEB - gADd/wMAZgAyAGcA6gFYAtICTgPWA2kEtAO8A9QDTQP3AqUCxgKeAogCjgL4AtQC2wK2AzcDogMs - BNsD0AO5A/cDmANyA04DMgP5AqwCtwK0AkUDUQPzA2gE9gT/BJ4EAQVjBIoD9wLRAvkBhwGcAfoB - /wGPAlMDyQMVBN4DkATLA3UDUgPoAqACjQKPAsQCBQP9AvUDBAQnBIMEpQRpBBsE6APTAxQDbQJd - ArwBJwEUAV8BGQF/Ac8BMAKGAnkCrAJoAukBowH2AIkArQCHAJ0APAG/ARQCtQLcAksDQgPbAngC - IAJ9AagAhwBeADwAWwCNAMEAIQGuANwA2wCNAFgAJQARANH/lv80/3T/8P79/vn+Kf9A/x3/3f+H - ////SgAlAHcALgAsAOb/X/8S/xj/hv53/r7+bf4L//f+SP+v/9H/HwC9/7H/c/9z/t/9pf0E/bb8 - wfww/Uf9k/0m/n/+V/6V/nD+8P2K/Q39LP02/Ov8hf0p/Un++v71/jf/Y/8w/8n+Gv4O/rv9Xv2u - /eT99v11/pH+R/5b/j3+mv0h/Xr9Cf3d/Hr9pv3q/dz9dv5Z/hH+Vf7T/c39kP27/V/9i/0j/r/9 - //3+/TD+t/1F/eb9W/0F/Uf9Iv3b/F78bPyZ+037dvvv+rf6a/t5/On7J/1+/o3+ef44/gf/Wf3L - /ID9kvzp/Ov8U/51/tj+lAD1/1AAIQDR/wT/Yf5w/s/9Qv36/UX+cP2h/on+8v2S/g3+VP15/Xj9 - zfxu/K39EP4N/cX9uP4H/gH9xv10/rr9Gv6W/4IAtACVASUD0QLCAqcDEQP3AR8CHAL7ADgBGQKR - AqwCBgS4BHMEpQQWBJYD/QHCAM4AQv84/vL+Bf9H/9v/KwH/AVcCPwNaAyQDTQP1AucB8gH3AW0B - QAHaAYcCnAIHA0QEvASgBBcFPgWxBMoD3gPxAt8BAAKyAXQBRAL/AhkDKwSXBKIEegQ2BFMEZwP/ - AhYDoQJxAqUCuAL7AlIDygPWA14D2AM3AzcCFwKaATUByACCAFUAGAC4/+P/2v/M/z4AaQChALgA - agHnAYYBkwE7Av4BTwFiAY4BggFYAY4B7gEgAngCmQK8Av0CvQKfAgQCywH5AQEBYwDoAPAASgCQ - ACABlQFGAcUBqwIYAiwCSQKLAbAAWQDd//v+EP9n/03/tP8/AMcAkAB6AM8AEQBe//3+Rv6J/Zz9 - cv2r/Xr+L/+S/+v/3gBAAGH/tv8o/yL+Gv5l/nL+vf6E/z0A7ADqAAMB3gDj/z7/X/6F/TT9Hf2w - /P78dv3Y/bX9AP5n/qz9hP0r/az8uPsy+1f7DvuL+jX7Mfwz/EP8Uv1x/of9sv3m/tL9H/2+/Tz9 - Ef04/c/9g/4r/sX/3AApADwBdwHVAKQArP+v/xH/qP6e/0f/vP8MAfcA4QAaATMBBAAq/1H/qP7s - /RT+l/6F/kL/kP9SAIkAEgBNAHv/yf5c/s/9lf2v/X79MP60/gP/k/8vALEAWABhAHgA+v95/1b/ - hf8s/w3/BwDz/y0A4wCJAcQBUQHgAd8BgAA6ALf/2/7E/vj9Wf6X/rn+Df/O/x8AOgCnAAUA4P8l - /0/+Ef6A/fb86v3Z/f/9av/n/0MA6ACMAUQB4QDUAK4Aw/9W/6//kv8E/7f/8/8aAMsArwCpAc4B - vQGlAW8BXAFpAFAAGgDB/97/5P9RAIUAMQGrAf8BeQK9AvoCnQKOAokCLAJ0AZ8BSgHUACwBDgFq - AcMB4AEfApcChQKVAs8CuQJvAhQC8gHMAYUBdQGYAbAB7gH2AV4CrgLzAuECigKLAjICrgEJARIB - MAFAABkAkAAnADYAUwDQADMBsgARAQwB4wA7AEQAUgAY/4j/ZP/s/lb/7v/g/2AA9gCsAF0BuABy - AGQAVf9B/7n+IP43/kX+Lf7m/en+6/6a/nH/TP+z/+f+5f61/rn9xf3e/Cj9Cv34/Gn9ef3A/S/+ - ZP5M/pL+cv6A/rD9dv3N/Tb9//wO/XX9Vv3t/Dn9xP0x/Tn9o/2H/dj9iP3V/Tn+rv3N/cn9nv1j - /eD8af3u/B79wP3A/T3+bP6P/jf+qP5l/j3+uP58/nn+1/52/uP+Pv97/hL/Ev+i/mT+r/6p/pb+ - Yv6d/rD+1P0P/r39rP26/dX9cP62/kT/AQAGAI4A4QC0AIUAaQCBAPD/xv++/ywAMAB5AAEBTgFq - ASYBSgE4Ad4AUwCZABEAqf/H/3b/rv9R/3f/5P92/9T/PQAAAFgAlQCBANEAnACTAKgA6f8vABEA - yP8yAJ4AHgFVAQoCRQJ8AkECAgIGAkEBBAF4AIQApABCAAsBpAG5AScCBwP7Au8CUgPRApECOgLG - AaQBcAFqAcwB1wERAr0CowLmAiYD+gIHA5QCUwIUApoBjgFnAaEB+gHbAWMC8gLlAgcDXQN9Az4D - wQL8AhUDTgK7AgUD6gIWAwkDZgNXA/AC/wIYA1UCXAJTAuMB1AGiAeABpgHPAQICBgICAhAC7wGv - AcoBeAFKAQsBUAH8ALMAcQFlATUBVAFsASQBlwBDAB8Agf+R/6z/Rf8MADEAIwDbAAEBBAEeAdIA - 1ABWAP7/iQA2AJAAQQF/AXoBrgHWAS0B6gCDADUAu/8w/wb/3v5s/vX9Cv7N/Yn9f/22/Sn+Lv6b - /ln/Yf+T/5//bf9G//3+y/7M/lP/Vf+I/zEAZwALABwAWgCA/y3/wf6O/hr+of2K/nr+pv5K/23/ - pv+b/1n/Of8j/+b+k/6N/uj+f/5U/sz+1P6//pz+Af8W/1b+Q/5l/sL9Rf1z/TT9JP1J/U/91P0t - /pX+Nf+q/wcAPwAQANz/wf9//z3/VP+D/73/2v/p/0EATQBzAGoARQBbAOP/Ov/z/m7+Tv4H/tv9 - qf7a/kH/v/91APMAwAD9AOwAgAAdAKH/Xv9l/1D/uf/9/3wABgHWADsB9QC9AJQA1P/g/6r/Wv+a - //7/KgDBAOgAPgGWAQYBVgEVAegA1AC5APUAzgDZAPQAOgFNAUcBTwF1AQQBqQCYAEcAAADi//7/ - 7f9DAFAAfAAOAQwBOwFiAREBywBqANz/mP+l/8v/KQC5AE0B/QEGAuMBZALPAeYAwgBUALX/O/83 - /4T/pf/Q/3AA7ABAAS4BGAE7AawACQCh/1f/7/6m/sv+T/9i/wQA3wDzAIMBjQGTAWEBqAC5AEEA - kv+Z/4z/h/9+/+r/agBiAI4A2gDrALYAdQCfAJEACAAYACwA7v/h/9X//v9EABkANgCkAJwAbQDO - AJoARwCPAMb/fv+l/zn/9f5l/3v/vf8nAAsAugCWADwARQA2AOH/0f/a/8f/TgBFAFIA7gAFAdcA - +wDzAN0AoQCGAL0AygDDAOsAQgElAb8ADQHkAHIAvgBpAIgAwACLAM4ADwFJAWcBdQHOAd0BgwGA - AVUBBAHPAKgAjQB1AJ4ApACXANcADgE0ARkBYgF7AQkBAwGYAFwAOQDz////PABzAIcA/QAyATkB - nQGTAXYBlAFSARoBzgBiAD4AGQC0/9P/JQAkAH0A1wAWAYQBqAGLAYYBXgEDAWsAIAAgAP7/BwBU - ANMA6QDlABMB8wDYAHUAGQAiAPH/cv9x/97/nf+u//L/YQCOAG8ADgEgARQBIwEvARkBDQEjAeUA - /gAPAeoA5gAKAdYA2wDyAHYAigBmACIAJwDR/xMAFADb/0AAegB4ALQA7wDDAOAAsQCRAL0AgwC7 - APQA4QAkAUEBAQEyAQABlwCsAHQALgASAFoASwBRAMkAxQATAQABzwAFAaIAlACoAG8AigCXAIMA - YgCEAKMAaQCGAJ4AdQB4AEYAJgBCABsAGQAmACQAUwA5ACAAdgBqAE8AXgBbAGgATQBDAEoAYgBy - AGoAVwCXAKwAWwBZAFgATgAtAAYASACUAGIAfADDAIoAZgA+AAoA7/8VAC0ALQCcAOAA1gDLAPAA - wwBNAC4AGADq/9f/7P8LAEMATgB/AJ0AiAB6AEwABQDa/7//hP+L/23/pf+//7n/EABCAGQAmwDO - AJoAoAB4ABcA4P+2/4z/bf97/5X/yP+2//f/HgDT//P/wv9C/yX/B//H/rb+yv4X/0H/Ef+C/57/ - S/97/2j/ff9z/1b/gP9z/2T/P/8a/wb/8v6h/of+zv7w/tn+1v4+//3+kP6T/lX+Mv43/mD+p/79 - /mj/i/+d/8X/kv9U/xP/Af/O/p/+2f4P/yH/Nv+m/1z/EP8b/8L+UP78/Q7+9/3U/fv9Z/6D/nz+ - 5f7x/sj+4P7c/rD+uf7g/vL+Af8X/0//V/9P/0n/Z/9z/z3/P/85//n+r/5//kD+PP7f/eT9Tf5m - /sT+Pv/O/8f/AQAXALb/YP8t/yb/9f7//kL/2v/t/wsAoQCjAGcAUwAdAKz/XP8J/7z+u/6k/tL+ - GP9G/6z/JwBPAFAA1QDrALIAogDJAKgARwAlAB8AOwD7/wsAVAA4ADYASQANAPL////u/3j/g/+x - /03/bv9//7n/6v/w/ywAiwCZAKEA/AANARwBMwEcAQABEAG7AHgAYQAZANL/qf+1/7T/7P8cADcA - cAB9AJIAfwB3AJEAfwCDAHYAhQB/AJgAxwDdAPkAHwFIAS0BJQH3AOIAoQBaAFEADQDX/+n/7/+7 - /8L/8//7//P/KQBHAFQAlADHAL8A1gAXAREB0wCxAMoAtQCWAI8AwQDUALkA6ADuAMsAqgB8AEIA - AgDC/7j/3P/k/wsARQBFAEwAagBOABwAOgBMADYAKgAsAFoAKwAYADwAJwAlAAAAFAALALv/tf++ - /43/af+U/5X/nv/L/9D/8/8HACMALwD1//3/1/+d/5T/hP+4/+D/BQAuADkAJAADAOD/pP+F/17/ - Mf8T//v+8f4K/wT/Jv9v/2D/kv+0/7b/wf+d/5H/bf9J/zj/Of9d/4z/oP/H//j/2P+n/6b/qP9a - /zf/QP81/yj/B/8+/13/Uv+K/4P/fP+J/0//Mv8l/yn/Kv8c/z3/Tv9k/4T/d/97/5f/l/+b/3H/ - i/+t/2L/ZP+G/4r/W/9H/0X/D//e/sH+yf7L/vL+I/9M/57/sf+4/9T/xv/a/6T/ef+U/2b/bf97 - /5X/w//G/9n/2f+r/37/bP9I//v+6f7+/s/+yP72/hz/PP9Z/37/kv94/47/o/+H/6P/m/+o/6H/ - Uv9b/1r/Lv9Q/1j/Yf+F/2j/ef90/17/av9r/17/XP94/2b/Wf93/4b/e/+Y/7//sf+y/67/nP+r - /5L/a/9u/2P/Pv8i/xz/Iv9H/0D/RP91/2X/QP9O/2D/N/9J/2r/a/93/3n/pv+9/8f/zv/q//X/ - 0f/b/7b/oP+x/4v/jP+U/3f/d/9x/2L/af+F/4j/q//a/8n/4/8BAAoA/P/9//L/uP+E/1n/S/86 - /2v/uf/i/wUAKwAqAPL/t/+L/1v/Nv8X//X+CP/6/v3+TP+D/7z/EgBEAG0AiABXAC0A7f+c/2b/ - I/8A/xP/Pf9b/6H//f8YADcALwAYAPr/pf94/0L/F//w/uL+9f74/jP/df+j/9//GgA4AEUATgBG - ACoA+//E/4T/Xf9b/2D/k//Y/xYAVABgAG8AaAAvAPP/0P+t/2f/QP86/z3/QP9X/4z/xP/2/x4A - RgBbAF8ASwBCAEMAKAAeAA8A9f/a/9b/4v/4/yAAUAB7AIcAjABqAC4AEwDs/7H/o/+u/6D/uP/l - /wQAGQAkAEkASwAuAEYAZQBOAC4APwAqAPT/6//z//L/7f8HADcAPwBTAIIAmQCPAHsAfwBgACAA - EAAVAPr/+P8JACEANQA0AGEAiACWAJQAjgCQAGoANwASAOz/xf+t/5//yP/k//b/OgBmAHoAiACa - AI0AXgAzABIA8P/N/8//7/8UACkAWQCJAJgAiQB/AIYAVQAiACMAEADu/+j/5f/l/8r/wv/e/+L/ - 5v8FADIARgBCAEUAQAApABYAAQD+/wEA8f/q//n/+v/7/xkALAA+AD8ALwAdAPn/2P/M/7v/tv/A - /7D/sv/A/8v/5P8CACgAQABKAFMAUQBDACoAIAAeAAUA9//3//r/BAAQAB4AKgAkAAoA+v/g/8f/ - vv+8/8P/yf/Y/93/5P/z/wAAGgAmAC8ANQAuAB8AEgAbABEAEgAaABUAIgALAP//AgD7//X/7v/6 - //T/3f/d//D/5//y/woAGQAVAA4AKAAUAA4AEQATABwACQAXACYAIwAwADkANAA1ACAADAD7/+r/ - 4//X/9j/5f/x//z/AgAUABYABwAQAA0ABQD+//L/6//y//n/AgAOAB8ANAAwADQAMQAtACoAFwAU - ABIA+//x//P/9f8AAA4AJAA0AC4AKQA1ACIAAQD5//X/2P/I/+H/8v/v/wMAKgAyADUAMQBAADkA - FQAkABwACQANABAAIAAtADEAPwBPAD4AOABKADYAKAAsACEAFgAQABsAIgAsADcARABNAD0APwA6 - ACMAFQAbABIAEQAnACsAQQBUAF4AYQBkAGwAWQBKAEAANgArACsAPABOAFYAawCEAHoAaQBkAF0A - SQAyAC4ALwAoAB4AJQA3AEMASQBZAG0AZQBaAFoAUAA+ADAANQA2ADMAPQBOAF8AbQBwAHkAeQBs - AGIASAA4ADcAJwAjACoAKAApAC8AMQBBAEoASQBXAEsAPQAzACIAHQAZACEAMgBBAE4AYgBsAGMA - XgBXAEsAOAAxADEAMgAtACoANwAwACkAKQAsACwALAA0ADkAOQAvADMALAAkAB4AJAAtACsAOQBE - AE8AUABLAEwARgA8ADcALwA2ADoANgA9AD0ANQAwADIALAAzADYAPwBHAEUASQBBAD8AOQAyACoA - KAAsACgALQA5AEQAUABUAFMATQBEADsANQAyAC8ANAA2ADgAPwBCAEoASABPAFQATwBOAE8ASAA9 - AEMAOwA0AD0AQABLAEoAUABZAFEASABJAEgAPgBCAEYARwBRAFIASgBMAEkAOAA2ADgAMQAuADMA - PAA+ADsAPgBGAEEAOgA/ADwANQA0AC8AMAAuAC8APQBBAD0APgBFAEEAPgA+ADsAOgA1ADIAMAA0 - AC8AMgA3ADUAOgBDAEoARQBEAEAAPwA2ACoAKgAwACYAHwAsADAAMgAzADoAPQA/ADwANAAzACsA - IwAeACYAJQAnADAAOAA9ADkAPwBAAD8AOQA6ADcAMQAwACoAJAAjACUAIgAnACIALwA2AC8AOQA9 - AD0APQA2AC4AJwAdABcAGgAmACYAMQA4ADwAPwA4ADoAOQA1ADAAKgAiABoAGwAaABUAGQAfACsA - KQAwADgANQAyACoAKwAgABcAEAAUABIAFAAcACMALAArADIAMQAyACsAKAAtACIAFwAZABoAFwAb - ACIAKwAvADEANQA0ACsAJwApACMAHQAcABkAGgAaAB4AIgApACkAIwAmACEAHwAbAB0AHQAfACAA - HgAjACAAIwAnACYAJgAoACYAJgAjACQAKQAmACcAKwAsACYAKgAvACkAKQAtACcAJQAjACMAIwAf - ACEAJwAqACcAKQAyACoAKAArACQAIwAhACAAIwAhACIAKwAsACoANAA4ADIAMwAzAC0AKgAoACQA - JQAoACoALQAsAC8ALwAuAC8AKwApACkAKQAmACUAJgAiACQAJwAmACkAJwAqACUAJgAmACUAJwAl - ACcAJQAnACIAJgArACIAIgAmACMAIgAfAB8AIQAfAB0AHwAhAB0AIgAmACMAJAAnAB0AFQAdABkA - GAAZACEAIwAhACMAJAAkACAAHgAhACEAHAAaABoAGwAVABUAFgAZAB0AHQAdABgAGwAXABUADwAM - AA8ADAANAA8AEgAVABcAFwAWABcAGAAXABoAGgAeABsAFgAYABYAFgAZABoAHgAiAB8AHwAfAB4A - GQAWABYAFgAUABMAFQATABUAFwAVABUAFwAYABgAFAAZABYAEgAQAA8AEQAOABMAEwAUABgAGQAa - ABcAFgAXABUAEAAVABMAEAAWABAADwAWABUAFQAYABoAGAAXABMADwAVABAADgARABAAEwAQABIA - FAASABEAEwASAA8AEAAQABAADgAQAA0ADgAOAAwAEQAPABQAFAATABMAEwATABAAEAAOABMAEQAN - ABEAFQATABUAEwATABgAEQASABQAEgASABAAEQAUABAAEAAVABQAEwAVABUAFAAUABMAEAAMABAA - EAARAA8AEgAWAA8AEwAVABEAEgARAA8ACwAKAAoADQAOAA8AEgAQABcAFgASABYAFQATABEAEwAU - ABMAFgAYABgAGQAaABcAGAAWABUAFwAVABIAEwATAA8AEQASABMAEwAWABUAFQAUABIAEwARABAA - EAASABAADgATABQAFQAYABYAGwAcABgAGAAWABcAEwATABQAFQAXABcAGAAaABsAGgAZABgAFQAS - ABQAEwARABYAFAAUABYAGAAYABUAFgAZABgAFAAZABYAFAAZABYAFQAbABgAGQAbABcAHAAYABcA - GQAZABgAFwAZABYAGwAYABcAGwAaABUAFwAZABQAFQAZABgAGgAbABkAHQAdAB0AGQAbABwAGAAY - ABwAGwAYAB0AHAAgABwAHwAeABsAGgAYABgAFAAXABYAGAAXABYAGgAaABgAGQAYABoAGQAWABkA - FAATABYAFAATABcAGAAZABcAGQAbABcAEwAUABYAEgARABMAFQASABQAFQATABQAEwAUABIAEgAU - ABEAEAAUAA4AEQAQAA4AEQAPABUAEQASABIAEgAQABAAEwAQABAAEAAWABAAEQAWABEAFAAWABQA - FAAUABUAEwATABEAEAAUABIAEgATABQAEgAQABUAEQAUABIAEwAWABIAFQAUAA8AEgAVABIAEwAV - ABYAFgAWABUAFQATABEAEwASABAAEgARABAAEgAQAA4ADgARAA8ADQANAA8ADgAKAA0ACwALAAoA - DAAQAAgACgAOAAkACwALAAsADAAJAAoACwAIAAgACAAGAAgACQAKAAYACAALAAMABgAGAAQAAgAD - AAYABAAGAAYABAADAAQABAABAAIABQADAAIABQAFAAQABAACAAQAAgAAAAQAAQAAAAEA//8BAP// - /v8AAAAAAQAAAAAAAAAAAP7/+//9//3/+//6//7/AAD7//7//v/8/////f////v//v////v//P/9 - //z/+//9//z/+//9//z//P/8//r/+v/7//n/+f/7//f/+f/6//f/9//3//f/+f/3//j/+P/3//n/ - 9//1//j/9v/3//b/9f/4//X/9v/5//b/9//2//X/9//1//X/9P/3//X/9v/5//T/9//3//T/9v/2 - //b/9P/1//n/9f/z//j/+P/1//b/9//1//b/9//1//f/9P/x//b/8f/z//b/8f/1//P/9f/y//H/ - 8//z//D/8f/z//H/8//z//P/8//y//T/8f/x//X/8f/y//L/8P/y//D/8//v//D/8f/x//H/7//z - //D/7//v//H/8f/x//D/8P/v/+//8P/v//L/7f/v//H/7f/u//D/7f/s/+3/7v/q/+7/7v/t/+// - 7v/v/+7/7f/t/+//7f/t/+3/6//v/+v/6v/v/+z/6//u/+z/7f/s/+v/7f/q/+r/6//r/+r/7P/r - /+v/7P/u/+r/6v/s/+v/6v/r/+r/6//r/+n/6//q/+v/6v/p/+r/6//p/+b/6f/p/+b/6P/q/+j/ - 6P/n/+j/5//n/+f/5//p/+b/5//o/+r/6P/m/+z/6P/l/+n/5//m/+b/6P/n/+b/5//m/+b/5v/k - /+b/5v/j/+b/5f/j/+P/5f/k/+L/5f/j/+P/4//j/+X/4//m/+P/4//j/+H/4//h/+L/4v/k/9// - 4f/k/9//4P/h/9//4P/g/9//4v/f/97/4P/d/9//3//d/9//3//e/97/3f/d/9//3f/f/9z/3f/d - /9r/2//d/93/2//c/93/3P/a/9z/2//c/9z/2//d/9v/2v/c/93/2//d/9r/3f/b/9n/2//a/9r/ - 2f/b/9n/2v/b/9n/2P/a/9n/2//a/9r/2//Z/9v/2f/a/9r/2f/a/9j/2P/Y/9j/2P/X/9j/1//X - /9f/1v/V/9f/1//V/9f/1v/X/9b/1f/Z/9X/1f/X/9b/1//W/9j/2P/W/9n/1v/U/9j/1P/U/9f/ - 1f/W/9b/1//W/9b/1f/V/9f/0//W/9b/1f/Y/9X/1f/V/9T/1v/V/9X/1f/V/9X/1f/V/9X/1v/W - /9b/1f/W/9f/1v/W/9X/1v/X/9f/1v/W/9b/1v/X/9X/1//X/9T/1P/W/9b/1v/V/9T/1v/V/9X/ - 1P/U/9b/1f/U/9b/1v/U/9X/1v/W/9X/1v/W/9b/1v/W/9b/2P/W/9b/1//V/9j/1P/Y/9b/1//b - /9X/2f/Z/9j/2v/Y/9n/2v/Y/9j/2P/a/9j/2f/Z/9n/3P/a/9r/3f/b/9z/2//c/9z/2v/c/9v/ - 2//c/93/3P/c/9//2//e/9v/2//d/9r/2v/c/9v/2//c/9z/3v/d/93/3v/e/97/3f/f/93/3f/d - /97/3v/f/9//3//g/9//3//g/9//3v/e/9//3v/f/9//4P/f/+D/3//g/+D/3v/g/9//4f/g/+H/ - 4P/g/+H/3//h/+D/4f/h/9//4f/g/+D/4f/f/+H/4//g/+H/4//i/+H/4v/i/+L/4v/i/+L/4//i - /+P/5P/h/+P/5P/j/+P/4v/l/+T/4v/n/+L/5f/j/+L/5f/j/+T/5v/m/+T/5v/n/+P/5v/m/+T/ - 5v/m/+T/5f/n/+f/5v/n/+f/5//n/+f/5//n/+f/5v/n/+f/5//n/+j/6P/n/+n/6f/q/+j/6P/p - /+n/6v/p/+r/6P/r/+f/6f/t/+f/6v/q/+n/6//p/+n/6f/q/+n/6v/r/+r/6//r/+r/6//s/+v/ - 6f/r/+z/7P/r/+3/7P/q/+3/7f/r/+3/7P/s/+7/7P/r/+v/7P/s/+z/7P/t/+3/7f/t/+v/7v/t - /+7/7f/s/+3/7v/t/+7/7f/u/+7/7v/t/+7/7v/u/+//7v/v/+//7f/u/+//7f/v/+7/7//w/+7/ - 7//v//D/7//u//D/8P/v/+//8P/u/+//8P/v//H/7//v//H/7v/x//D/8P/v//H/8f/w//L/8P/w - //H/8f/x//H/8f/y//H/8P/y//L/8P/0//H/8P/1//H/8v/y//L/8//x//L/8f/0//L/8v/z//L/ - 9P/z//P/9P/z//P/9P/z//T/8//z//T/8//0//P/9P/0//T/9f/z//X/9P/1//T/9P/1//X/9f/2 - //X/9v/0//b/9//0//f/9v/0//j/9v/1//j/9v/2//f/9f/3//b/9//3//j/9v/3//f/9//3//j/ - 9//2//n/9//3//f/9//5//f/+P/5//f/+P/5//j/+P/3//j/+P/4//f/+f/4//n/+//4//n/+v/4 - //j/+f/5//j/+f/5//n/+v/5//n/+f/5//j/+v/6//j/+f/5//j/+v/5//n/+//5//r/+f/5//r/ - +f/6//n/+f/6//r/+f/5//r/+f/6//r/+//7//r/+//6//v/+v/7//r/+v/7//r/+v/7//r/+v/6 - //v/+//6//v/+//6//v/+//6//v/+//7//r/+v/7//r/+v/8//v/+v/8//r/+v/8//r/+//7//r/ - /P/6//r/+//7//v/+v/8//v//P/8//v//f/8//v//P/9//v//P/9//z//f/9//z//v/9//7//f/9 - /////f/9/////v/9/////v///////////wAA/////wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAQAAAAEAAQABAAEAAQAAAAEAAQABAAEAAQAB - AAIAAQACAAIAAQACAAIAAgACAAEAAwACAAIAAwACAAMABAADAAMABAADAAMABAAEAAMAAwAFAAQA - BAAGAAQABQAFAAUABgAFAAUABQAGAAYABQAGAAcABQAFAAcABgAHAAYABgAHAAYABwAHAAYABwAH - AAcABgAGAAcABwAHAAcACAAIAAcACAAJAAgACAAJAAcACAAIAAgACAAJAAgACQAJAAkACQAJAAkA - CQAJAAkACgAJAAoACQAKAAkACgAJAAoACgAKAAoACgAKAAsACgAKAAoACwALAAoACwALAAoACwAL - AAoACwALAAsACwALAAsACwAMAAsADAALAAwADAALAAsADAALAAwADAALAAwACwALAAwACwALAAsA - DAALAAsACwALAAsACwAMAAsACwAMAAsACwAMAAwACwAMAAwADAAMAA0ADAAMAAwADAAMAAsADAAN - AAwADAANAAwADAANAAwADAANAAwADAAMAAwADQAMAAwADQANAAwADAANAAwADQAMAA0ADQANAA0A - DAAMAA0ADAAMAA0ADAANAA0ADAANAAwADAANAAwADQANAAwADQANAA0ADAANAAwADQANAA0ADQAN - AA0ADQANAA0ADQANAA0ADQAMAA0ADAAMAA0ADAAMAA0ADQANAA0ADAAMAA0ADAAMAAwADAAMAAwA - DAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwALAAsADAALAAsACwALAAsACwALAAsACwAL - AAsACwALAAsACwALAAoACwAKAAsACgALAAoACwAKAAsACgAKAAoACgAJAAkACgAJAAoACQAKAAkA - CgAKAAoACQAJAAkACQAJAAkACQAJAAkACQAJAAgACAAIAAgABwAIAAcACAAIAAgACAAIAAgACAAI - AAcABwAHAAcABwAHAAcABwAHAAcABwAHAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAUABgAGAAUA - BQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAE - AAQAAwAEAAQABAADAAQAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAgACAAIA - AgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAA//////////////////////////////////////7/ - ///+//7////+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/9//7//f/9//3//f/9//3//f/9 - //3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3/ - /f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/8//z//P/8//z//P/8//z//P/8 - //z//P/8//z//P/8//z//P/8//z//P/8//v//P/8//v//P/8//v/+//8//v//P/8//z//P/8//v/ - +//7//v/+//8//z//P/7//z//P/8//z//P/8//z//P/8//v/+//7//v/+//7//v/+//7//v/+//7 - //v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/ - +//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7 - //v/+//7//v//P/7//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z//P/8//z/ - /P/8//z//P/8//z//P/8//z//P/8//z//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9 - //3//f/9//3//f/9//3//f/9//3//f/9//3//v/9//7//f/+//3//v/+//7//v/+//7//v/+//7/ - /v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+ - //7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//7///////////////// - //////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////8AAP///////wAA//8AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA - AAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQABAAEAAQAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEA - AQABAAEAAAABAAEAAQABAAEAAQABAAAAAQABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB - AAAAAAAAAAAAAAABAAEAAAABAAEAAAABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQAAAAAAAAABAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAQABAAEAAAAAAAAAAQABAAEA - AAAAAAAAAAABAAAAAQAAAAEAAAABAAEAAAABAAEAAQABAAEAAQABAAAAAAABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA - AAABAAAAAAABAAEAAAABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAQACAAEAAQACAAEA - AQABAAIAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAC - AAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAQACAAIA - AQACAAIAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAEAAgACAAIAAgACAAIAAgAB - AAEAAQACAAEAAgABAAEAAgACAAEAAQABAAEAAQACAAEAAQABAAEAAQACAAEAAQABAAEAAQACAAEA - AQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAIAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQACAAIAAgABAAIAAQACAAEAAgABAAIAAgACAAEA - AgACAAEAAQACAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA - AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB - AAEAAQABAAEAAQACAAEAAQABAAEAAQACAAEAAQACAAEAAQACAAEAAQACAAIAAQACAAIAAQABAAIA - AgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAC - AAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIA - AgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAC - AAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADAAIAAgACAAIA - AgACAAIAAgACAAIAAgADAAIAAwADAAIAAgADAAIAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD - AAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMA - AwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD - AAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMA - AwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD - AAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABAAEAAMABAAEAAMABAAEAAQAAwAEAAQAAwAEAAQA - BAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAE - AAQABAAEAAQABAAEAAQABAAEAAQABAAFAAQABAAEAAUABAAFAAQABQAFAAUABAAFAAUABAAEAAUA - BQAFAAQABQAFAAUABQAFAAQABAAFAAUABAAFAAUABQAEAAUABQAFAAUABQAFAAUABQAFAAUABQAF - AAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUA - BQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAGAAUABQAGAAUABQAG - AAUABQAGAAYABQAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAcABgAGAAYABgAGAAYA - BwAGAAcABgAGAAYABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAH - AAcABwAHAAcABwAHAAcABwAHAAYABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcA - BwAHAAcABwAHAAcABwAHAAcABwAIAAcABwAIAAcABwAIAAcABwAHAAcABwAIAAcABwAIAAcACAAI - AAcABwAIAAgABwAIAAgABwAHAAgABwAIAAgABwAIAAcABwAIAAgACAAIAAgACAAIAAgACAAIAAgA - CAAIAAgACAAIAAgACAAJAAgACAAJAAkACAAJAAkACAAJAAkACAAJAAkACAAJAAgACQAIAAkACAAJ - AAgACQAJAAkACAAJAAkACQAJAAkACAAKAAgACgAJAAkACAAKAAkACQAJAAoACQAKAAkACQAJAAoA - CQAKAAkACgAKAAoACQAKAAkACgAJAAkACQALAAkACQAKAAoACQAKAAkACgAKAAoACQAKAAkACgAJ - AAoACgAKAAkACwAKAAoACQAKAAoACgAJAAsACgAKAAkACgAKAAkACgAKAAoACgALAAkACgAKAAoA - CgAKAAoACgAKAAoACgAKAAsACgAKAAsACwAKAAoACwALAAoACgALAAsACwALAAsACgALAAsACwAL - AAsACwALAAsACwAMAAsACwAMAAsACwALAAsACwAMAAwACwAMAAsADAANAAsACwAMAAwACwAMAAwA - CwAMAAwACwAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAM - AAwADAAMAAwADAAMAA0ADAALAAwADQAMAAwADAAMAAwADAAMAAwADQAMAAwADAAMAAwADAAMAAwA - DAANAAwADAANAAwADAANAA0ADAAMAAwADQANAAwADQANAAwADQANAAwADQANAAwADgAOAAsADAAO - AA0ADAAOAA0ADAANAA0ADQANAA4ADQANAA0ADQAOAA4ADgAMAA4ADgANAA0ADgAOAA4ADgAOAA4A - DQAOAA0ADgAPAA0ADgAPAA4ADgAOAA0ADgAPAA4ADgAPAA4ADgAPAA4ADwAQAA4ADgAPAA8ADgAP - ABAADwAPABAADwAQABAADwAQABEAEAAQABAAEQARABEAEAASABEAEQARABEAEQARABIAEQARABIA - EgASABEAEQASABIAEgASABIAEgARABEAEgASABEAEQASABIAEQASABEAEgASABIAEQASABMAEQAQ - ABIAEgARABEAEgARABEAEgASABEAEgASABEAEQATABMAEQARABIAEwASABIAEgARABIAEwASABEA - EgASABEAEgASABEAEQASABEAEAASABIAEAARABIAEQARABAAEQASABEAEAARABEAEQAQABIAEQAQ - ABIAEQAQABEAEQARABEAEQASABEAEQARABEAEgARABEAEgASABEAEgASABEAEgASABIAEgARABIA - EwASABIAEgASABIAEgASABIAEgASABMAEgASABIAEQASABIAEgASABIAEgARABIAEQARABIAEgAS - ABIAEgASABEAEgASABEAEQATABIAEQARABIAEgASABEAEgARABIAEgARABIAEgASABEAEgATABEA - EgASABIAEgARABEAEgASABEAEgASABEAEgASABEAEgASABEAEgASABEAEQASABIAEQASABEAEQAT - ABIAEQARABIAEQARABEAEgASABEAEgASABIAEgASABEAEgASABEAEgASABEAEQASABIAEQARABEA - EQARABIAEQARABEAEgASABAAEAASABIAEAASABEAEQARABEAEAARABEAEQAQABEAEgAQABAAEQAS - ABEAEQARABEAEQARABAAEgASABAAEQASABEAEAASABIAEgARABAAEgAUABEAEAATABMAEAARABQA - EQAQABIAEgASABEAEgASABIAEwASABEAEQATABIAEgASABIAEgASABIAEQASABIAEQASABIAEQAQ - ABMAEgAQABEAEQASABEAEQARABEAEQARABEAEQAQABEAEgAQABAAEQAQABEAEAARABAAEQAQAA8A - EAARABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEQAPABAAEAARAA8ADwARAA8AEAARABAAEAAQ - ABAAEAAQABAAEAAQABEAEAAQABEAEAAPABEAEQAQABAAEAARABAAEAARAA8ADwARABAADwARABAA - EAAQABAAEQAQAA8AEAARABAAEAARABAAEQARAA8AEAASABEAEAARABEAEgARABAAEAARABAAEAAT - ABAAEAARABEAEQAQABEAEQAQABEAEAARABEAEAAQABEAEgASABAAEQASABAAEQASABEAEQARABEA - EAARABEAEQAQABEAEgAQABEAEgARABAAEQASABEAEQAQABEAEQAQABEAEQARABEAEAARABAAEAAR - ABAAEQARABAAEQAQAA8ADwAQABEADwAPABEAEQAQABAAEQAQABAAEQARAA8AEAARAA8AEAARABAA - EAARABAAEAARABAAEAAQABAAEAAQABAAEAARABAAEQARABEAEAAQABEAEgARABEAEQAQABIAEQAR - ABEAEQARABEAEAASABAAEQASABEAEgAQABEAEQARABEAEAASABEAEQASABEAEgARABEAEQASABIA - EAARABMAEgAQABIAEgASABIAEgASABIAEgASABMAEgASABMAEQASABMAEgASABIAEwATABEAEgAT - ABIAEgASABIAEwASABIAEgATABIAEgASABIAEgASABIAEgASABMAEgASABIAEgASABIAEgATABMA - EQARABMAEgASABIAEgASABIAEQASABMAEgASABIAEgASABQAEgARABIAEwASABMAEwARABIAEwAT - ABMAEgASABMAEwASABMAEwAUABIAEgAUABIAEgATABMAEwASABMAEwATABMAEwATABQAEwASABMA - FAAUABIAEwATABMAEwATABIAFAAUABIAEwATABMAEwATABMAFAAUABIAFAAVABIAEwAVABQAEwAU - ABQAFAAUABQAFAAVABQAFAAVABUAFQAVABYAFQAVABUAFQAVABYAFgAWABYAFQAWABgAFgAVABcA - FwAWABYAFwAWABcAFgAWABYAGAAXABYAFgAXABcAFgAXABYAFwAWABYAFgAWABYAFgAXABUAFQAX - ABYAFgAWABUAFgAWABYAFgAWABYAFwAVABYAFgAVABYAFwAXABUAFgAWABYAFgAXABUAFQAXABYA - FQAXABcAFgAWABcAFgAWABYAFgAXABcAFgAXABYAFgAXABcAFgAXABYAFwAXABYAFwAXABcAFwAX - ABYAFwAYABYAFgAXABcAFwAXABgAFwAWABcAFgAWABcAFwAXABcAFgAWABcAFwAWABcAFgAWABcA - FgAWABgAFwAWABcAFgAXABYAFwAYABYAFgAXABcAFwAXABcAFgAWABcAFgAWABcAFgAXABcAFgAW - ABcAFwAXABYAFgAXABcAFQAXABcAFwAYABYAFgAWABcAFwAXABYAFwAXABYAFgAXABYAFwAXABYA - FgAWABcAFwAWABYAFgAXABcAFgAWABYAFwAWABUAFwAYABUAFAAWABcAFwAVABQAFQAWABYAFQAV - ABYAFgAUABYAFgAVABUAFwAWABUAFgAVABYAFQAUABYAFgAVABQAFgAVABUAFQAWABQAFQAXABQA - FQAWABQAFgAVABYAFQAVABUAFQAWABUAFQAUABYAFwAVABQAFQAWABUAFQAWABUAFQAWABUAFQAW - ABUAFQAWABYAFQAWABUAFgAXABUAFQAXABcAFgAWABYAFgAWABYAFgAXABYAFwAYABYAFgAWABYA - FwAXABYAFgAXABYAFgAXABcAFgAWABcAFgAXABYAFgAXABYAFgAXABYAFgAWABYAFgAWABYAFwAX - ABYAFQAWABYAFgAWABUAFQAVABcAFgAUABYAFwAWABUAFgAVABUAFQAVABUAFgAVABUAFQAVABUA - FQAUABMAFQAVABQAFQAWABQAFAAVABUAFQAUABQAFgAVABQAFQAVABQAFQAWABQAFQAVABMAFQAW - ABIAEwAWABUAFAAVABUAFAAUABQAEwAUABUAFAAUABUAFQAVABUAFAATABUAFgAVABMAFAAUABQA - FAAUABMAFAAUABIAFAAVABIAEwAUABMAFAASABMAFAAUABMAEwAUABMAEgATABMAFAAVABIAEQAT - ABQAEgATABUAEwASABQAFAAUABMAEgATABUAFQATABMAFAAUABMAEwAVABUAFAATABQAFAATABQA - EwATABMAFAAUABQAFAAUABQAFAATABMAFAATABMAFAAVABMAEgAUABQAEgAUABMAEwATABMAEwAT - ABUAEgARABMAEwATABMAFAATABMAEwATABMAEwATABIAEgAUABMAEgASABMAEwATABQAEwASABMA - EwATABIAEwATABMAEgATABIAEgATABEAEgAUABIAEQASABMAEgASABEAEQAUABIAEgASABMAEgAR - ABMAEwASABIAEwASABIAEgASABIAEwAUABMAFAAUABMAFAAUABQAFAAUABQAFQAWABQAFQAWABYA - FQAUABUAFwAVABYAFgAVABcAFgAVABYAFgAWABYAFQAWABUAFQAWABYAFgAWABYAFgAWABYAFQAV - ABYAFQAWABYAFgAWABQAFgAWABQAFgAXABYAFQAVABUAFgAWABUAFgAVABYAFwAVABYAFwAWABUA - FgAXABUAFgAWABYAFgAVABUAFQAWABUAFgAXABUAFgAXABUAFgAXABYAFwAWABUAFgAWABYAFgAX - ABYAFgAYABYAFQAWABcAFgAWABYAFwAXABYAFwAWABcAFgAWABYAFwAXABUAFgAWABYAFgAWABYA - FgAVABYAFgAVABYAFQAVABUAFgAWABQAFAAWABUAFAAWABQAFAAVABQAEwAVABUAFAAUABQAFQAT - ABMAFAAVABUAEwAVABUAEwATABQAFQAVABMAEwAVABMAEgAUABQAFAATABMAFQAWABMAEgAVABUA - EgATABYAEwASABQAEwAUABMAFAAUABMAFAAUABMAEgAUABQAFAATABMAFAAUABMAEgATABMAEwAT - ABMAEgASABUAEwASABMAEwAUABIAEwATABMAEgASABMAEgASABMAEwASABIAEwASABIAEgATABIA - EgASABEAEgATABIAEgASABEAEgASABIAEgASABIAEwASABIAEwASABIAEwAUABIAEgATABIAEwAV - ABQAEwAUABQAFAATABQAEwAUABQAEwAUABUAEwATABUAFQAUABMAFQAUABMAFQAVABIAFAAVABQA - FAAVABQAFQAVABQAFQAVABMAFAAVABQAFQAWABUAFQAVABQAFQAWABUAFQAVABUAFgAWABUAFQAW - ABQAFQAXABQAFAAVABUAFQAVABYAFQAVABUAFAAVABUAFAAUABUAFgAWABQAFQAVABMAFQAWABQA - FAAVABUAFAAVABUAFAAUABUAFQATABQAFQAVABQAFAAWABUAFAATABQAFAASABQAFAAUABQAEwAU - ABIAEgATABMAEwATABIAEwATABIAEgATABMAEQASABMAEgASABIAEgARABIAEgATABEAEgATABEA - EQASABEAEQASABEAEQASABEAEQARABEAEQARABEAEgASABEAEQASABEAEAAQABEAEgASABEAEQAR - ABIAEAAQABEAEQARABAAEAARABAAEQASABAAEAAPABAAEAAQABAAEAARAA8ADwARABAAEQAQABAA - EAAQABAADgAPABEAEAAPABAAEAAQABAADwAQABAAEAAQABEAEAAPABEADgAQABEAEAAQAA8AEQAQ - AA4ADwAQAA8AEAAPAA8AEAAPAA8ADwAQAA8ADgAPAA8ADwAPAA8ADwAPAA8ADwAPAA4ADwAPAA4A - DwAPAA8ADgANAA8ADwAPAA4ADwAPAA4ADgAPABAADwAPAA4ADgAPABAADgAOAA8ADwAOAA8ADwAO - AA8ADwAPAA4ADgAOAA8ADwAOAA8ADwAPAA4ADQAQAA4ADgAPAA8ADgAOAA4ADgAOAA4ADgAPAA8A - DwAOAA4ADwAPAA0ADgAOAA0ADQAOAA0ADwAPAA0ADgAOAA4ADQANAA0ADgAOAAwADgAPAA0ADQAP - AA4ADAANAA4ADQANAA0ADQAOAA0ADAANAA4ADQAMAA4ADQANAA0ADAANAA4ADQANAA0ADAANAA4A - CwALAA0ADQAMAA0ADQAMAA0ADAAMAAwADQAMAAsACwALAAwACwAMAAsACwALAAoACwALAAoACwAL - AAoACgALAAoACgAJAAoACQAJAAoACgAJAAkACgAJAAoACQAJAAkACgAJAAgACQAJAAkACQAJAAgA - CAAJAAgABwAJAAgABwAHAAkABwAIAAcABwAHAAgACAAHAAcABwAHAAcABwAHAAcACAAHAAYABwAG - AAYABwAGAAYABwAIAAUABQAGAAYABwAGAAcABgAFAAUABQAFAAYABQAFAAUABQAEAAUABQAEAAQA - BAAEAAUABAADAAUABQADAAMAAwAEAAMABAAFAAMAAwADAAMAAwADAAMAAwACAAMAAwACAAMAAgAC - AAMAAQABAAIAAgACAAIAAgACAAEAAAACAAEAAQADAAEAAAAAAAEAAQACAAEAAAABAAAAAAABAAEA - AAABAAAAAAAAAAEAAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAP///v8AAAAAAQAAAP//AAAA - AAAAAAAAAAAA/////wAAAAD/////AAAAAP7////////////+////AAD+//7//////////v////7/ - //8AAP3//v////7////+/////v/+//7//v////7//v/9//7////9//3//v////7//v////7//f/+ - //7//v/+//7//f/+/////v/+//3//v////7//f/+/////v/+//7//v/+/////v/+//7//v////7/ - /v/+//7///////7//v////7//v///////v///////v////7//v/////////////////+///////+ - /////////////v////////////7////+/wAA///+////AAD///7///////7//v/+////AAD///7/ - ///+///////+//7/AAD///7//v////7/////////////////AAD///7///8AAP7///8AAP7///8A - AP7/AAAAAP3///8AAAAA//8AAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAD+/wAAAAAAAP// - AAAAAAAAAAAAAAAAAAAAAP//AAABAP////8AAAAAAAD/////AAAAAAAAAAABAAAAAAAAAAAAAAAB - AAAA//8AAAAAAAAAAAIAAQAAAAEAAQABAAAAAAABAAIAAgAAAAAAAgACAAEAAQACAAIAAgABAAEA - AQABAAEAAQAAAAEAAgACAAEAAQABAAIAAQABAAIAAgABAAEAAgADAAEAAQADAAIAAQACAAIAAwAD - AAIAAgADAAQAAgABAAMAAwACAAMABAACAAMAAwADAAMAAwADAAMAAwAEAAMAAgADAAQAAwADAAQA - AwADAAMABAAEAAMABAAFAAMAAwAEAAQABAAEAAMABAAGAAQAAwAEAAUABQAEAAMABAAGAAUABQAF - AAUABQAFAAYABgAFAAYABgAGAAYABgAFAAYABwAHAAcABwAHAAcABwAHAAgACAAIAAgACQAKAAgA - CQAJAAoACQAIAAgACgAJAAsACQAJAAsACgAJAAkACwAJAAoACgALAAoACwAKAAoACgAKAAoACgAK - AAoACgAJAAsACgAKAAoACgALAAoACgALAAoACwAMAAsACgAKAAoACwALAAsACgAKAAwADAAKAAsA - DAALAAoACwAMAAoACwALAAsACwAKAAwACwAKAAsADAALAAoACwALAAoACgALAAsACwAKAAoACgAK - AAkACQALAAoACQALAAoACQAKAAoACQAJAAoACgAKAAkACgAIAAoACAAIAAkACgAJAAgACQAIAAcA - CAAIAAgACAAGAAcABwAGAAcABgAFAAUABgAGAAQABAAFAAQABAAFAAMAAwAEAAMAAQADAAMAAgAB - AAIAAwAAAAAAAAACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7//v8AAP////////3///8AAP7/ - /f///wAA/f/9/wAA/f/7//3//f/9//3//f/9//z//P/8//v/+//8//z//P/7//v//P/8//v/+//7 - //v/+//6//v/+v/5//z/+v/5//r/+v/7//n/+v/6//n/+f/5//r/+f/5//n/+v/4//n/+v/4//j/ - +f/4//j/+f/5//j/+f/5//n/+P/5//j/+f/4//n/+f/4//f/+P/4//j/+f/4//f/+f/5//f/+P/5 - //j/+P/5//n/+f/4//n/+f/4//j/+P/4//n/+P/4//r/+P/3//n/+f/5//n/+v/5//j/+v/5//f/ - +P/6//n/+f/5//n/+v/6//n/+v/6//n/+f/6//n/+f/6//r/+v/6//r/+v/6//v/+v/5//v//P/6 - //r/+v/7//r/+v/9//r/+f/7//v/+//6//v/+//6//v/+//8//z/+v/7//z//P/8//r/+//8//r/ - /P/+//z/+//8//z/+//8//z//P/8//3//P/7//z//f/8//z//P/9//z//P/7//3//P/6//3//P/8 - //z//P/8//v/+//8//z//P/8//z//P/8//v/+//8//3/+//8//3//f/8//z//f/9//3//v/+//3/ - /f/+//3//v////7//v////7//v/////////////////+//////8AAP//AAAAAAAA/////wAAAAAA - AAAAAAAAAAAAAAAAAAEAAQAAAAAAAAABAAAAAQACAAEAAgABAAEAAgACAAIAAgAEAAIAAwAEAAMA - BAAEAAQABAAFAAUABAAEAAcABgAFAAYABgAGAAYABgAGAAcABwAHAAcACAAHAAkACAAJAAkACQAK - AAkACgAKAAkACQALAAoACwAKAAsACgALAAoACwALAAsACgAKAAsACwALAAwACwALAA0ADAAMAA0A - DQANAAwADQAOAA8ADQANAA8ADwAOAA4AEAAPAA8ADwAQABEAEQAQABAAEAARABIAEQARABIAEgAS - ABMAEwASABMAEwATABQAEwATABUAFQAUABQAFAAVABQAFAAWABUAFQAVABYAFQAVABUAFgAWABYA - FgAXABcAFwAWABYAGAAYABYAFwAXABcAGAAYABcAGQAZABcAGAAZABkAGQAYABkAGgAaABgAGQAb - ABkAGgAbABoAGgAaABsAGwAbABsAGwAcABsAGwAcABwAHAAcAB0AHAAcAB0AGwAcABwAHQAcAB0A - HAAeAB4AHQAcAB4AHgAeAB0AHgAdAB4AHQAdAB4AHwAdAB4AHQAeAB0AHgAeAB4AHgAeAB0AHQAd - AB4AHgAeABwAHQAeAB0AHQAdAB0AHQAdAB0AHgAdAB0AHgAdAB0AHgAeAB0AHgAdAB0AHQAeAB0A - HgAeABwAHgAeAB0AHAAeAB4AHQAcAB4AHgAeABwAHQAeAB4AHQAeAB0AHQAdAB4AHQAeAB0AHgAe - ABwAHQAdAB0AHQAeAB0AHgAeAB0AHAAeAB0AHgAdAB4AHQAdAB0AHQAcAB0AHAAdABwAHAAcAB0A - HQAcABwAHAAcABwAHAAcAB0AHQAcABwAHAAcABwAHQAcABwAGwAcABwAHAAbABwAGwAcABoAGwAb - ABsAGgAbABsAGgAaABsAGwAbABoAGgAbABoAGQAbABsAGgAbABoAGQAZABoAGgAaABkAGQAZABkA - GAAZABkAGQAZABgAGAAYABkAGQAYABgAGAAZABkAGAAXABcAGAAXABcAFwAYABcAFQAWABgAGAAW - ABQAFgAXABYAFgAWABUAFQAVABUAFgAVABUAFgAWABQAFQAUABUAFAAUABUAFQATABMAFAAUABQA - FAAUABMAFAAUABMAFAAUABIAEwATABMAEwATABIAEgATABIAEgASABMAEwASABIAEgASABEAEQAS - ABIAEQARABEAEQARABEAEAARABEAEQARABAAEAARABAADwARABEAEAAQABAAEAAQABAAEAAQAA8A - DwARABAADwAPAA8ADwAQAA8ADwAPAA8ADgAPABAADgAOAA8ADwAPAA4ADgAPAA4ADgAOAA4ADgAN - AA0ADgAOAA4ADQAOAA0ADAAMAA0ADQAMAAwADAAMAA0ADAALAAwADAALAAsACwALAAsACwAKAAsA - DAALAAoACgAKAAoACgAJAAoACgALAAkACgAKAAoACQAKAAkACQAIAAkACQAJAAkACQAJAAgACQAJ - AAgACAAIAAcACQAIAAYABwAJAAcABwAHAAgABwAIAAYABwAHAAcABwAHAAcABwAHAAcABgAFAAcA - BwAHAAYABgAFAAYABgAFAAUABQAFAAUABQAGAAQABQAGAAUABQAEAAQABAAFAAQABAAFAAQAAwAE - AAQABAAFAAMAAwAEAAQAAwAEAAUABAADAAQABQAFAAMAAwAEAAUABAADAAMABAAEAAQAAwAEAAQA - BAADAAMAAwADAAQAAwACAAMABAADAAMAAwADAAMAAwACAAMAAwACAAMAAwAEAAIAAgAEAAMAAgAD - AAMAAwADAAMAAgADAAUAAwABAAQABAACAAMABAADAAMAAwADAAMABAADAAIAAwAEAAMAAgADAAMA - AwADAAQAAwADAAMAAwADAAMABAAEAAMAAwAEAAMABAAEAAMAAwAFAAQAAwAEAAUABAADAAMABAAG - AAUABAAFAAUABQAFAAYABgAFAAYABgAFAAYABgAGAAYABgAHAAcABwAHAAcABwAHAAcACAAIAAcA - CAAJAAcACAAIAAkACAAHAAgACgAIAAoACQAJAAkACQAIAAkACQAJAAkACQAJAAkACAAKAAkACQAI - AAoACQAJAAkACQAIAAkACAAJAAkACgAJAAkACQAKAAgACgAKAAoACAAJAAkACgAJAAkACQAKAAoA - CgAJAAoACgAKAAkACgAKAAkACQAKAAkACQAJAAoACQAKAAkACQAJAAkACQAKAAgACAAJAAkACQAI - AAgACAAIAAcABwAIAAcABwAIAAcABQAGAAcABQAFAAYABgAGAAUABQAFAAUABAAEAAQABQAEAAMA - BAAEAAMAAwADAAMAAgABAAIAAgABAAEAAQAAAAEAAQAAAAAAAAAAAAAAAAAAAP//AAAAAP///v// - /wAA/v/9//7////8//z//f/+//z/+//9//z/+//7//v//P/8//v/+v/8//r/+f/6//v/+v/6//n/ - +v/7//n/+P/6//r/+P/4//r/+f/4//j/+P/5//j/+P/4//f/+P/3//f/9//3//f/9//4//b/9//3 - //f/9v/3//f/9//2//f/9v/1//f/9v/1//b/9v/2//b/9f/2//X/9f/0//b/9f/2//X/9v/1//X/ - 9v/1//X/9f/1//X/9v/1//T/9f/2//X/9f/1//X/9f/1//b/9v/1//X/9f/1//X/9f/1//T/9v/1 - //X/9P/2//T/9P/1//b/9f/1//X/9f/0//X/9f/0//X/9f/0//X/9P/z//X/9f/1//T/9v/0//T/ - 9f/1//P/9P/2//X/9f/1//X/9v/2//X/9v/1//T/9f/1//X/9f/2//X/9f/1//T/9f/2//X/9f/0 - //b/9v/1//X/9f/1//X/9f/3//X/9P/1//b/9v/1//b/9f/1//X/9f/1//b/9P/1//X/9v/2//X/ - 9f/2//T/9v/2//b/9P/2//X/9f/2//b/9v/1//b/9v/1//b/9v/1//X/9v/2//b/9f/1//b/9f/0 - //b/9v/0//X/9f/1//T/9P/1//T/9P/0//T/9f/0//P/8//0//X/8//0//X/9P/0//T/9P/0//X/ - 9f/1//T/9f/1//T/9f/1//X/9f/1//T/9P/1//X/9f/1//X/9P/0//X/9f/1//T/9f/2//T/9P/1 - //b/9f/1//T/9f/0//X/9f/1//X/9v/1//X/9P/2//X/9v/2//b/9f/1//X/9v/2//f/9f/4//b/ - 9//4//j/+P/4//f/9//4//j/9//4//n/+f/4//n/+f/5//r/+v/6//r/+v/6//v/+//6//z/+//8 - //3//P/8//3//f/+//z//f/+//7//v////7////+/////////wAA/////wAAAAAAAAAAAAAAAAEA - AQABAAEAAQACAAEAAgADAAMAAgACAAMABAAEAAMABAAFAAQABAAFAAYABgAFAAUABgAHAAgABwAG - AAgACAAIAAkACAAIAAkACgAJAAoACQAJAAoACgAJAAoACwALAAoACgAMAAwACwAMAAwADAAMAAwA - DAANAA0ADQAOAA8ADgANAA4ADwAPAA4ADwAPAA8AEAAPAA8AEQARABAAEQARABEAEgARABEAEwAT - ABEAEwAUABMAEwAVABUAFAAVABUAFQAWABYAFgAXABcAFwAXABgAGAAYABkAGQAZABoAGQAZABoA - GwAaABsAGwAbABwAGwAbABwAHQAbAB0AHAAcAB0AHAAcAB0AHgAcAB0AHQAeAB0AHQAdAB0AHgAe - AB0AHgAdAB0AHwAeAB4AHgAfAB4AHgAeAB4AHgAeAB8AHwAfAB8AHwAfAB8AIAAfAB8AIAAgAB8A - IAAgACAAIQAhACAAIAAiACEAIAAiACMAIQAhACIAIwAiACIAIgAjACQAIwAjACMAIwAkACQAJAAk - ACQAJQAkACMAJAAlACQAJQAlACQAJQAnACUAJAAlACYAJQAmACYAJgAmACYAJQAlACYAJgAmACYA - JQAlACYAJgAmACYAJQAlACcAJgAmACcAJwAlACYAJwAnACYAJwAoACcAJwAnACcAJwAnACcAJwAn - ACcAJgAmACYAJgAnACcAJgAmACYAJwAmACYAJgAnACYAJQAmACcAJgAnACYAJQAmACYAJwAmACUA - JgAmACUAJQAlACYAJQAlACQAJAAkACYAJQAkACQAJAAlACUAJAAkACQAJAAkACMAJQAlACMAIgAj - ACQAJAAjACIAIwAjACMAIgAiACIAIgAhACIAIwAiACIAIwAjACIAIgAhACIAIQAgACIAIgAgACAA - IQAgACAAIQAgACAAIQAhAB8AIAAgAB8AHwAfACAAIAAfAB8AHwAgAB8AHgAeAB8AHwAeAB4AHgAf - AB4AHgAfAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB0AHQAeAB0AHQAeAB0AHQAdAB0AHgAdAB0A - HQAdAB0AHQAeABwAHQAdAB0AHQAeABwAHQAdAB0AHAAdABwAHAAcAB0AHAAdABwAHAAcABwAHAAb - ABwAGwAbABsAHAAbABwAGwAcABsAGgAZABsAGwAaABoAGgAaABsAGgAZABoAGwAZABkAGQAZABkA - GQAZABkAGgAZABgAGAAYABgAGAAXABcAGAAYABcAFwAYABcAFwAXABcAFwAXABcAGAAXABYAFwAX - ABYAFwAYABYAFwAWABYAFwAXABQAFgAYABYAFQAWABYAFgAWABYAFQAVABYAFQAVABYAFQAVABYA - FQATABUAFgAVABQAFAAUABQAFAAUABQAFAATABIAEwAVABIAEgATABQAEwASABIAEwAUABIAEgAT - ABMAEgATABMAEwATABEAEQASABIAEQARABMAEwARABIAEgASABIAEQASABMAEgARABEAEgASABEA - EAASABIAEQAQABEAEQAQABEAEAAPABAAEQAQABAAEAAQABAADwAPABAAEAAPAA8AEAARAA8ADgAQ - ABAADwAPAA8ADwAQAA8ADgAPABAADgANAA8ADwAOAA4ADwAOAA4ADgAOAA4ADgAOAA0ADgAPAA0A - DQANAA4ADgAOAA4ADQAMAA0ADgANAAwADQANAAwADAANAAwADAANAAsACwANAAwACwAMAAwADAAL - AAoACwANAA0ACwAMAA0ADAALAAwADAALAAwADAAMAAwADAAMAAwADQANAA0ADQANAA0ADQANAA0A - DgAOAA0ADgAPAA4ADgAPABAADwANAA8AEAAPABAADwAPABAADwAOABAAEAAPAA8ADwAQAA8ADwAQ - ABAAEAAPABAAEAAQABAADwAPABAAEAAQABAAEQARABAAEQASABAAEQASABEAEQAQABEAEgARABEA - EQARABIAEgARABIAEwASABEAEgATABEAEgASABIAEgASABIAEgASABIAEgASABEAEgATABIAEQAS - ABIAEgASABEAEgASABEAEQATABIAEQATABIAEAARABMAEgARABIAEwATABIAEgASABMAEgASABIA - EgATABEAEQASABEAEQARABIAEQAQABAAEAAQABEAEAAPABAAEQAQAA8ADwAQAA8ADwAQAA8ADwAQ - AA8ADQAPABAADgAOAA8ADwAOAA0ADgAPAA4ADgAPAA4ADgAOAA4ADwAPAA4ADgAQAA0ADQAPAA8A - DwAPAA4ADwARAA8ADgAQABEADgAOABEADwANAA8AEAAQAA8AEAAQABAAEAAQAA8ADwAQABAAEAAQ - AA8AEAAQABAADwAPABAAEAAQABAADwAPABEAEAAPABAAEAAQABAAEAAQABAADwAQABAAEAAQABAA - EQAQABAAEQAQABAAEAAQABEAEQAQABAAEQASABEAEQASABIAEgASABMAEwASABIAEwATABMAFAAU - ABQAFQAVABQAFAAVABUAFQAXABcAFgAWABcAFwAWABcAFwAYABgAFwAYABkAGAAXABkAGQAZABgA - GQAaABkAGgAaABgAGQAbABoAGgAaABoAGwAbABsAGwAbABoAGwAbABsAHAAcABwAHAAcABsAHAAc - ABwAHAAcAB0AHQAdABsAHQAcABwAHAAeABwAHAAdAB4AHQAdAB4AHgAdAB4AHQAeAB4AHQAdAB4A - HwAfAB0AHgAfAB0AHgAgAB8AHgAfAB8AHgAfAB8AHgAeAB8AHwAdAB4AIAAfAB4AHwAgAB8AHgAe - AB8AHgAdAB8AHwAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHgAdABwAHAAdAB0AHQAdAB0AHQAcAB0A - HQAdAB0AHQAeAB0AHQAfAB0AHgAeAB4AHQAfAB0AHgAfAB4AHQAeAB4AHgAdAB4AHgAeAB4AHwAf - AB4AHQAeAB4AHwAfAB4AHgAeAB8AHwAeAB4AHwAfAB4AHgAfAB4AHwAfAB8AHwAeAB4AHwAfAB8A - HwAgAB8AHwAgAB8AIAAgAB8AHwAgACAAHwAfACEAIAAfACAAIAAgACAAIAAgACEAIQAhACEAIAAg - ACEAIAAgACEAIQAgACEAIQAhAB8AIAAhACEAIAAgACAAIAAgACAAIAAgACAAHwAfACAAHwAgACAA - IAAgACAAIAAgACAAIAAgACAAIAAhACEAHwAfACEAIQAgACAAIQAhACAAIAAhACEAIQAgACAAIAAh - ACIAIQAgACEAIgAhACEAIQAhACEAIQAhACEAIAAgACIAIgAhACEAIQAiACAAIAAiACEAIAAhACEA - IQAgACAAIQAhACEAIAAhACIAIQAgACEAIgAiACAAIAAgACAAIAAgACAAIQAhACAAIAAgACAAIAAf - ACAAIQAhAB8AIAAhACAAIAAiACEAHwAgACEAIQAgACAAIQAhACEAIAAhACEAIQAhACIAIQAhACIA - IQAhACIAIgAhACEAIQAhACIAIQAgACEAIgAhACEAIQAhACEAIAAgACEAIgAhACAAIAAhACAAIAAg - AB8AIAAgAB8AHwAfAB8AHwAfAB4AHgAgAB4AHgAeAB4AHgAdAB4AHwAdAB0AHgAdAB4AHgAdAB0A - HgAdAB0AHQAeAB0AHgAeABwAHAAeABwAHAAdAB4AHAAdAB0AHQAdABwAHAAdAB0AHQAdABwAHQAc - AB0AHAAeAB0AHgAdABwAHQAdAB0AHAAdABwAHQAdABwAHAAdABwAHQAcAB0AHAAbABwAHAAbABsA - HAAcABwAGwAaABsAHAAbABoAGQAaABsAGgAaABwAHAAaABoAGgAbABsAGwAbABoAGgAbABoAGgAZ - ABoAGgAaABoAGQAaABkAGQAaABoAGAAZABoAGQAZABkAGQAaABkAGAAaABoAGQAaABkAGAAYABkA - GQAaABgAGAAZABgAFwAYABgAGAAYABcAFwAYABkAGAAXABcAFwAYABgAFwAXABcAGAAXABYAFwAY - ABYAFQAWABcAFwAWABUAFQAWABYAFQAVABUAFQAUABUAFgAVABUAFgAWABQAFQAUABUAFAAUABUA - FQATABMAFAAUABQAFAAUABMAFAAVABMAFAAUABMAFAATABMAEwATABMAEwAUABMAEwASABMAFAAS - ABIAEwATABMAEgATABMAEgATABMAEgATABIAEgATABMAEgASABIAEgATABIAEgATABMAEgASABIA - EgASABIAEwASABEAEwATABIAEgASABIAEgASABIAEgASABEAEQASABIAEQARABIAEgASABEAEQAR - ABEAEQASABIAEQARABEAEgARABEAEQARABEAEAAQABEAEQAQABAAEAAQABEAEAAPABAAEQAQAA8A - EAAPAA8ADwAPAA8AEAAPAA4ADgAOAA8ADwANAA0ADwAOAA0ADgAOAA0ADQAOAA0ADQANAA0ADgAO - AAwADQAOAA0ADQAOAA0ADQANAA0ADgANAAsADAAOAA0ADAANAAwADAAMAAwACwALAAwADAAMAAwA - DAAMAAwACwALAAwADAALAAsACwALAAsACwALAAoACwAKAAkACgALAAkACQALAAoACgAKAAkACgAK - AAkACQAKAAoACAAJAAkACQAKAAkACAAKAAkACQAJAAoACQAJAAkACgAJAAkACQAJAAoACgAIAAkA - CQAKAAgACQAJAAoACQAJAAgACQAIAAkACAAIAAgACQAIAAgACAAJAAkACAAIAAkACQAIAAgACAAJ - AAgABwAJAAkACAAIAAgACAAIAAgACAAIAAkACAAGAAkACQAHAAgACQAIAAgACAAIAAgACAAIAAcA - CAAJAAgABwAIAAkACAAIAAkACAAHAAgACAAIAAcABwAIAAcABwAHAAcABwAIAAcABwAIAAgABwAH - AAgABwAHAAYABwAIAAgABwAHAAgABwAHAAgACAAHAAgACAAHAAcACAAHAAcACAAJAAgACAAIAAgA - CAAIAAkACQAJAAgACQAKAAkACQAJAAkACQAIAAgACQAJAAkACQAIAAoACQAJAAkACgAJAAkACAAJ - AAgACQAIAAkACQAJAAkACQAJAAgACAAIAAkACQAJAAkACAAJAAkACQAJAAkACQAKAAkACAAIAAkA - CQAJAAkACAAIAAgACgAHAAkACQAIAAcACQAJAAgABwAJAAgACQAHAAgACAAIAAgACAAJAAgACQAI - AAgABwAIAAgACAAHAAcABwAIAAYABwAIAAgABgAIAAcABgAHAAgABwAHAAcACAAIAAcABwAHAAgA - BwAHAAcACAAIAAYABwAHAAYABgAGAAcABgAFAAcABgAFAAcABgAFAAYABwAGAAUABQAGAAUABQAG - AAUABQAGAAUABAAFAAYABQADAAUABgAEAAMABAAFAAQABAAFAAUABAAEAAQABQAFAAQABAAFAAQA - AwAEAAUABQAEAAMABQAGAAQAAwAFAAYABAAEAAcABQADAAUABQAFAAUABQAFAAUABQAFAAUABQAF - AAUABgAFAAQABQAFAAUABAAFAAUABQAFAAUABAAEAAYABQADAAQABQAFAAQABAAEAAQABAAEAAQA - BAAEAAQABAADAAQABQAEAAMAAwAEAAQABAADAAMABAAEAAMABAAEAAQABAADAAUABQAEAAQABAAF - AAQABAAEAAQABQAFAAQABAAFAAQABAAGAAYABQAFAAUABgAFAAUABQAGAAYABQAGAAYABQAEAAYA - BwAGAAYABgAGAAYABwAGAAQABQAHAAcABgAGAAYABwAGAAYABwAHAAYABgAHAAcABwAIAAcABwAI - AAcABwAIAAgACAAHAAgACQAIAAcACAAIAAcACAAJAAgABwAIAAkACQAIAAkACAAIAAgACAAIAAoA - CAAIAAgACgAJAAkACAAKAAgACgALAAoACgAJAAoACAAKAAoACgAJAAoACgAJAAkACwAKAAoACgAL - AAoACgAJAAsACgAKAAoACwAJAAoACQAJAAkACgAJAAoACQAKAAkACgAJAAoACQAKAAoACQAJAAsA - CgAKAAoACwAKAAsACwALAAoACwALAAsACwALAAsADAAMAAsADAANAA0ADAANAAwADAAMAAwADQAN - AAwADQAOAA0ADQANAA4ADgAOAA4ADgAOAA4ADwAOAA8ADwAPAA4ADgAPAA8ADwAPAA8AEAAPAA8A - EAARABAAEAARABAAEQASABEAEgASABEAEgASABIAEQASABQAEwASABMAFAAUABMAFAAUABQAFAAU - ABUAFQAUABUAFAAVABYAFgAVABYAFgAWABUAFgAXABYAFgAXABcAFgAWABYAFgAXABcAFgAWABcA - FwAXABgAGAAXABgAGQAZABgAGQAZABgAGAAaABoAGAAYABoAGgAZABkAGgAaABkAGQAaABsAGwAa - ABoAGgAbABwAGwAaABwAHAAbABwAGwAcABwAHAAdAB0AHAAcAB0AHQAcABwAHAAdABwAHAAdAB0A - HAAdAB0AHQAcAB4AHQAeAB0AHgAeAB8AHgAdAB0AHwAfAB4AHgAfAB4AHwAeAB4AHwAfAB0AHgAf - AB8AHwAeAB8AIAAfAB4AHwAgAB8AHwAhACAAHwAgACAAIAAhACAAIAAhACEAIAAhACIAIQAhACIA - IQAiACIAIgAhACMAIwAiACIAIgAjACQAIgAiACMAJAAjACMAIwAjACMAIwAjACQAJQAkACMAIwAk - ACMAIwAkACQAJAAkACQAIwAjACMAJAAkACIAIwAkACMAIwAjACMAIwAjACMAIwAjACIAIwAjACMA - IwAiACIAIwAiACIAIgAiACIAIgAiACEAIQAiACEAIQAiACIAIQAhACIAIgAhACEAIQAhACIAIgAi - ACEAIQAiACIAIQAiACIAIgAhACEAIgAiACEAIgAiACEAIgAjACIAIQAhACIAIgAiACIAIQAhACIA - IgAiACEAIQAiACIAIQAhACIAIgAhACEAIQAhACEAIQAhACIAIQAhACEAIgAiACEAIQAjACIAIQAh - ACIAIgAiACIAIgAiACIAIQAhACIAIgAiACIAIQAhACIAIwAiACEAIQAjACIAIQAiACIAIgAjACIA - IgAiACIAIwAjACIAIgAiACIAIQAiACMAIgAhACEAIQAiACIAIgAhACEAIAAiACIAIgAhACEAIQAh - ACEAIgAiACEAIAAhACEAIgAhAB8AIAAhACEAIQAgACAAIAAgACAAIQAgACAAIAAhACAAIAAgACAA - IAAgACAAIAAfACAAIAAgACAAIAAgAB8AIAAhAB8AHwAfAB8AHwAgAB8AHwAfAB8AHwAfAB8AHwAe - AB8AIAAfAB4AHgAfAB8AHgAfAB8AHgAfAB4AHgAfAB4AHgAfAB8AHgAeAB4AHgAfAB4AHgAfAB8A - HwAeAB4AHwAfAB4AHwAfAB4AHwAfAB4AHgAfAB4AHgAfAB4AHgAeAB4AHgAeAB8AHQAeAB4AHgAe - AB4AHgAeAB0AHgAeAB4AHQAeAB0AHgAdAB4AHQAeABwAHQAcAB0AHQAdABwAHAAcAB0AHAAcABwA - HQAcABwAHAAcABsAHAAbABwAHAAcABsAHAAbABwAGwAbABoAGwAbABsAGgAbABoAGwAaABsAGgAa - ABoAGwAaABoAGgAbABoAGwAaABoAGgAaABkAGwAaABkAGgAbABoAGQAaABsAGgAaABkAGgAaABoA - GgAaABkAGgAaABsAGQAZABoAGwAaABkAGQAaABkAGgAZABkAGQAaABgAGQAZABkAGQAZABkAGQAZ - ABgAGQAaABkAGAAaABkAGQAZABkAGQAZABkAGAAZABkAGQAaABoAGQAZABkAGgAZABoAGQAaABoA - GwAaABoAGgAbABoAGgAbABsAGwAaABoAGwAbABoAGgAaABsAGwAbABoAGgAbABsAGgAaABsAGgAZ - ABoAGgAaABoAGQAaABoAGQAaABoAGgAZABkAGQAZABoAGQAYABoAGgAZABkAGQAYABkAGQAYABkA - GQAYABgAGAAZABkAFwAYABgAGAAYABgAGAAXABgAGQAYABcAGAAYABcAFwAYABcAFgAXABYAFgAX - ABcAFgAWABcAFwAWABYAFgAXABcAFgAWABYAFgAVABYAFgAWABYAFgAWABYAFgAWABUAFQAWABUA - FQAWABUAFQAWABUAFQAWABUAFQAWABUAFAAVABYAFQAUABUAFQAVABUAFAAUABUAFAAUABQAFAAU - ABQAEwAUABMAEwATABMAEwATABMAEwATABMAEgASABMAEwATABIAEwATABIAEwASABIAEgATABMA - EgASABIAEgASABIAEgASABIAEgASABIAEwASABIAEgATABIAEgARABIAEgARABEAEgASABEAEgAS - ABEAEQASABEAEQARABEAEQAQABAAEAAQABAAEAAQABAADwAQABAADwAPABAADwAPAA8ADwAPAA8A - DgAPAA8ADwAOAA8ADwAPAA4ADwAPAA4ADgAOAA8ADwAOAA8ADgAOAA8ADgANAA4ADwAOAA0ADgAP - AA4ADQAOAA0ADgAOAA4ADQAOAA4ADQANAA0ADgAOAA0ADQAOAA4ADQAOAA4ADgANAA0ADgAOAA0A - DQAOAA0ADQAOAA4ADgANAA0ADgAOAA4ADQAOAA4ADQANAA8ADgANAA4ADgAOAA4ADgAOAA4ADgAO - AA4ADgAOAA4ADgAOAA4ADgAOAA4ADQAOAA4ADgAOAA4ADQANAA4ADgANAA4ADgAOAA0ADgAOAA4A - DQANAA4ADQANAA4ADgANAA0ADgANAA0ADQANAA0ADQANAA0ADQAOAA0ADQANAA0ADQANAA0ADQAN - AA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQAOAA0ADQAOAA4ADQAOAA4A - DgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADQAOAA4ADgANAA4ADgAOAA0ADgAOAA4ADgAO - AA4ADgAOAA4ADgAOAA4ADQAOAA4ADgAOAA0ADgAOAA0ADgAOAA0ADQANAA0ADQANAA0ADQANAA0A - DQANAA0ADQANAA0ADQANAA0ADQAOAA0ADQAOAA4ADQANAA4ADQANAA4ADQANAA0ADQAMAA0ADQAN - AAwACwAMAAwACwAKAAsACwALAAwADAAMAAwADAAMAAsADAALAAoACwALAAsACwAMAAwACwAMAAwA - CwALAAwADAALAAsADAAMAAsADAALAAsACgALAAkACgAKAAsACgAKAAoACwALAAsACwALAAsACwAL - AAsACwALAAsADAAMAAwACwALAAsACwAMAAsADAANAA0ADQAMAA0ADQAMAAwADQANAAwADAANAA0A - DQANAAwADQAOAA4ADQAOAA0ADgANAA4ADQAOAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAA0KLS1kM2Q0ZDcyOTVjNGVkMTc3MDA4ODUxZTY5M2ZhNDc5Ny0tDQo= - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '86240' - content-type: - - multipart/form-data; boundary=d3d4d7295c4ed177008851e693fa4797 - host: - - api.openai.com - user-agent: - - AsyncOpenAI/Python 2.32.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 2.32.0 - x-stainless-read-timeout: - - '30' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.13.5 - method: POST - uri: https://api.openai.com/v1/audio/transcriptions - response: - body: - string: '{"text":"Hello there.","usage":{"type":"tokens","total_tokens":22,"input_tokens":17,"input_token_details":{"text_tokens":0,"audio_tokens":17},"output_tokens":5}}' - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a313d2dbf83c4f09-YYZ - connection: - - keep-alive - content-length: - - '161' - content-type: - - application/json - date: - - Wed, 26 Aug 2026 15:21:00 GMT - openai-processing-ms: - - '564' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-reset-requests: - - 2ms - x-request-id: - - req_12aaf78c405d4ef69db5740eb76bf953 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","content":"Reply with exactly: hi there"},{"role":"user","content":"Hello - there."}],"model":"gpt-4.1-mini","max_completion_tokens":8,"stream":true,"stream_options":{"include_usage":true}}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '217' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - AsyncOpenAI/Python 2.32.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 2.32.0 - x-stainless-read-timeout: - - '10.0' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.13.5 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-EH9j2DukH0QAjzVpxZULyMmUja2dn","object":"chat.completion.chunk","created":1787757668,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_bf04cdda97","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XFbeeOHb"} - - - data: {"id":"chatcmpl-EH9j2DukH0QAjzVpxZULyMmUja2dn","object":"chat.completion.chunk","created":1787757668,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_bf04cdda97","choices":[{"index":0,"delta":{"content":"hi"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Ip4LAbGA"} - - - data: {"id":"chatcmpl-EH9j2DukH0QAjzVpxZULyMmUja2dn","object":"chat.completion.chunk","created":1787757668,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_bf04cdda97","choices":[{"index":0,"delta":{"content":" - there"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"N4Zz"} - - - data: {"id":"chatcmpl-EH9j2DukH0QAjzVpxZULyMmUja2dn","object":"chat.completion.chunk","created":1787757668,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_bf04cdda97","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"vdU2"} - - - data: {"id":"chatcmpl-EH9j2DukH0QAjzVpxZULyMmUja2dn","object":"chat.completion.chunk","created":1787757668,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_bf04cdda97","choices":[],"usage":{"prompt_tokens":20,"completion_tokens":2,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"Y0dP65UtFW"} - - - data: [DONE] - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a313d3135cdbaa95-YYZ - connection: - - keep-alive - content-type: - - text/event-stream; charset=utf-8 - date: - - Wed, 26 Aug 2026 15:21:08 GMT - openai-processing-ms: - - '412' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_180aef41cf044499a24d2af5956e29e3 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/livekit_agents/test_livekit_agents.py b/py/src/braintrust/integrations/livekit_agents/test_livekit_agents.py index 1512c7b91..91ddc57ef 100644 --- a/py/src/braintrust/integrations/livekit_agents/test_livekit_agents.py +++ b/py/src/braintrust/integrations/livekit_agents/test_livekit_agents.py @@ -9,7 +9,6 @@ from braintrust import logger from braintrust.auto import auto_instrument from braintrust.integrations.livekit_agents import ( - LiveKitAgentsIntegration, setup_livekit_agents, tracing, wrap_livekit_agents, @@ -182,10 +181,6 @@ async def test_openai_tts_stream_closes_span_when_closed_early(memory_logger): assert any(log.get("metrics", {}).get("time_to_first_token", 0) > 0 for log in tts_logs), tts_logs -def test_livekit_agents_integration_min_version(): - assert LiveKitAgentsIntegration.min_version == "1.3.1" - - def test_auto_instrument_livekit_agents_subprocess(): pytest.importorskip("livekit.agents") verify_autoinstrument_script("test_auto_livekit_agents.py") @@ -349,13 +344,6 @@ def __init__(self, llm): assert all(log.get("root_span_id") == session_logs[0].get("root_span_id") for log in function_tool_logs), logs -@pytest.mark.asyncio -@pytest.mark.vcr -async def test_setup_livekit_agents_openai_e2e_voice_turn(memory_logger, livekit_server): - assert setup_livekit_agents() - await _run_livekit_agents_openai_e2e_voice_turn(memory_logger) - - @pytest.mark.asyncio @pytest.mark.vcr async def test_auto_instrument_livekit_agents_openai_e2e_voice_turn(memory_logger, livekit_server): diff --git a/py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_auto_instrument_pipecat_subprocess.yaml b/py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_auto_instrument_pipecat_subprocess.yaml deleted file mode 100644 index ab370bd5c..000000000 --- a/py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_auto_instrument_pipecat_subprocess.yaml +++ /dev/null @@ -1,2 +0,0 @@ -interactions: [] -version: 1 diff --git a/py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_setup_and_wrap_pipeline_worker_are_idempotent.yaml b/py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_setup_and_wrap_pipeline_worker_are_idempotent.yaml deleted file mode 100644 index ab370bd5c..000000000 --- a/py/src/braintrust/integrations/pipecat/cassettes/1.3.0/test_setup_and_wrap_pipeline_worker_are_idempotent.yaml +++ /dev/null @@ -1,2 +0,0 @@ -interactions: [] -version: 1 diff --git a/py/src/braintrust/integrations/pipecat/test_pipecat.py b/py/src/braintrust/integrations/pipecat/test_pipecat.py index d60034a0c..8c9064e1f 100644 --- a/py/src/braintrust/integrations/pipecat/test_pipecat.py +++ b/py/src/braintrust/integrations/pipecat/test_pipecat.py @@ -190,8 +190,15 @@ async def test_pipecat_observer_capture_audio_attachments_adds_tts_and_user_audi assert auto_started_user_span["input"]["num_frames"] == 60 +@pytest.mark.parametrize( + ("capture_user", "capture_agent"), + [(True, False), (False, True)], + ids=["user-only", "agent-only"], +) @pytest.mark.asyncio -async def test_pipecat_observer_audio_capture_env_vars_are_independent(monkeypatch, memory_logger): +async def test_pipecat_observer_audio_capture_env_vars_are_independent( + monkeypatch, memory_logger, capture_user, capture_agent +): TTSStartedFrame = _import("pipecat.frames.frames.TTSStartedFrame") TTSAudioRawFrame = _import("pipecat.frames.frames.TTSAudioRawFrame") TTSStoppedFrame = _import("pipecat.frames.frames.TTSStoppedFrame") @@ -200,30 +207,11 @@ async def test_pipecat_observer_audio_capture_env_vars_are_independent(monkeypat UserStoppedSpeakingFrame = _import("pipecat.frames.frames.UserStoppedSpeakingFrame") audio = b"\x00\x00\x01\x00" * 20 - monkeypatch.setenv("BRAINTRUST_CAPTURE_USER_AUDIO_ATTACHMENTS", "true") - monkeypatch.setenv("BRAINTRUST_CAPTURE_AGENT_AUDIO_ATTACHMENTS", "false") - observer = BraintrustPipecatObserver() - assert observer.capture_user_audio_attachments is True - assert observer.capture_agent_audio_attachments is False - - await observer.on_pipeline_started() - await observer._handle_frame(TTSStartedFrame(context_id="ctx")) - await observer._handle_frame(TTSAudioRawFrame(audio, sample_rate=16000, num_channels=1, context_id="ctx")) - await observer._handle_frame(TTSStoppedFrame(context_id="ctx")) - await observer._handle_frame(UserStartedSpeakingFrame()) - await observer._handle_frame(UserAudioRawFrame(audio, sample_rate=16000, num_channels=1, user_id="user-1")) - await observer._handle_frame(UserStoppedSpeakingFrame()) - await observer.cleanup() - - logs = memory_logger.pop() - assert "audio" not in _single_span(logs, "tts_response").get("output", {}) - assert isinstance(_single_span(logs, "user_speaking")["input"]["audio"], Attachment) - - monkeypatch.setenv("BRAINTRUST_CAPTURE_USER_AUDIO_ATTACHMENTS", "false") - monkeypatch.setenv("BRAINTRUST_CAPTURE_AGENT_AUDIO_ATTACHMENTS", "true") + monkeypatch.setenv("BRAINTRUST_CAPTURE_USER_AUDIO_ATTACHMENTS", str(capture_user).lower()) + monkeypatch.setenv("BRAINTRUST_CAPTURE_AGENT_AUDIO_ATTACHMENTS", str(capture_agent).lower()) observer = BraintrustPipecatObserver() - assert observer.capture_user_audio_attachments is False - assert observer.capture_agent_audio_attachments is True + assert observer.capture_user_audio_attachments is capture_user + assert observer.capture_agent_audio_attachments is capture_agent await observer.on_pipeline_started() await observer._handle_frame(TTSStartedFrame(context_id="ctx")) @@ -235,8 +223,15 @@ async def test_pipecat_observer_audio_capture_env_vars_are_independent(monkeypat await observer.cleanup() logs = memory_logger.pop() - assert isinstance(_single_span(logs, "tts_response")["output"]["audio"], Attachment) - assert not _spans_named(logs, "user_speaking") + tts_output = _single_span(logs, "tts_response").get("output", {}) + if capture_agent: + assert isinstance(tts_output["audio"], Attachment) + else: + assert "audio" not in tts_output + if capture_user: + assert isinstance(_single_span(logs, "user_speaking")["input"]["audio"], Attachment) + else: + assert not _spans_named(logs, "user_speaking") @pytest.mark.vcr diff --git a/py/src/braintrust/integrations/temporal/test_temporal.py b/py/src/braintrust/integrations/temporal/test_temporal.py index c726e865a..aa4fca81c 100644 --- a/py/src/braintrust/integrations/temporal/test_temporal.py +++ b/py/src/braintrust/integrations/temporal/test_temporal.py @@ -42,16 +42,6 @@ class WorkflowInfoForTest: class TestHeaderSerialization: """Unit tests for header serialization/deserialization.""" - def test_span_context_to_headers_with_valid_context(self): - interceptor = BraintrustInterceptor() - span_context = {"trace_id": "test-trace-id", "span_id": "test-span-id"} - headers: dict[str, temporalio.api.common.v1.Payload] = {} - - result_headers = interceptor._span_context_to_headers(span_context, headers) - - assert "_braintrust-span" in result_headers - assert len(result_headers) == 1 - def test_span_context_to_headers_with_empty_context(self): interceptor = BraintrustInterceptor() span_context: dict[str, Any] = {} @@ -76,20 +66,6 @@ def test_span_context_to_headers_preserves_existing_headers(self): assert "_braintrust-span" in result_headers assert len(result_headers) == 2 - def test_span_context_from_headers_with_valid_header(self): - interceptor = BraintrustInterceptor() - span_context = {"trace_id": "test-trace-id", "span_id": "test-span-id"} - - # Serialize span context to header - payloads = interceptor.payload_converter.to_payloads([span_context]) - headers = {"_braintrust-span": payloads[0]} - - result = interceptor._span_context_from_headers(headers) - - assert result is not None - assert result["trace_id"] == "test-trace-id" - assert result["span_id"] == "test-span-id" - def test_span_context_from_headers_with_missing_header(self): interceptor = BraintrustInterceptor() headers: dict[str, temporalio.api.common.v1.Payload] = {} @@ -381,101 +357,6 @@ async def _wait_for_workflow_state(handle: Any, expected: str) -> None: class TestBraintrustPluginIntegration: """Integration tests for BraintrustPlugin with real Temporal workflows.""" - @pytest.mark.asyncio - async def test_plugin_basic_workflow_tracing(self, temporal_env, memory_logger): - """Test basic workflow and activity tracing with BraintrustPlugin. - - Verifies that: - 1. Braintrust can be imported directly in workflows (no unsafe.imports_passed_through) - 2. Spans are created for workflow execution - 3. Spans are created for activity execution - """ - # Create worker with BraintrustPlugin - async with Worker( - temporal_env.client, - task_queue="test-queue", - workflows=[TestWorkflow], - activities=[simple_activity], - plugins=[BraintrustPlugin(logger=memory_logger)], - ): - # Execute workflow - result = await temporal_env.client.execute_workflow( - TestWorkflow.run, - TaskInput(value=10), - id=f"test-workflow-{uuid.uuid4()}", - task_queue="test-queue", - ) - - # Verify workflow executed correctly - assert result == 20 # 10 + 10 from activity - - # Flush to ensure all spans are captured - braintrust.flush() - - # Get captured spans - spans = memory_logger.pop() - - # Verify spans were created - assert len(spans) > 0, f"Expected spans to be created, got {len(spans)} spans" - - # Verify workflow span was created - workflow_spans = [s for s in spans if "temporal.workflow" in s.get("span_attributes", {}).get("name", "")] - assert len(workflow_spans) > 0, ( - f"Expected workflow span to be created. Span names: {[s.get('span_attributes', {}).get('name', 'unknown') for s in spans]}" - ) - - # Verify activity span was created - activity_spans = [s for s in spans if "temporal.activity" in s.get("span_attributes", {}).get("name", "")] - assert len(activity_spans) > 0, ( - f"Expected activity span to be created. Span names: {[s.get('span_attributes', {}).get('name', 'unknown') for s in spans]}" - ) - - @pytest.mark.asyncio - async def test_plugin_context_propagation(self, temporal_env, memory_logger): - """Test that span context propagates from client to workflow to activity. - - Verifies that parent-child span relationships are maintained across - the execution chain. - """ - # Create a parent span at the client level - with braintrust.start_span(name="test.client_operation", type="task") as parent_span: - parent_context = parent_span.export() - - # Create worker with BraintrustPlugin - async with Worker( - temporal_env.client, - task_queue="test-queue-2", - workflows=[TestWorkflow], - activities=[simple_activity], - plugins=[BraintrustPlugin(logger=memory_logger)], - ): - # Execute workflow (context should propagate via headers) - result = await temporal_env.client.execute_workflow( - TestWorkflow.run, - TaskInput(value=15), - id=f"test-workflow-ctx-{uuid.uuid4()}", - task_queue="test-queue-2", - ) - - assert result == 25 # 15 + 10 - - # Get captured spans - spans = memory_logger.pop() - - # Verify spans were created - assert len(spans) > 0, "Expected spans to be created" - - # Verify client span exists - client_spans = [s for s in spans if "test.client_operation" in s.get("span_attributes", {}).get("name", "")] - assert len(client_spans) > 0, "Expected client span to be created" - - # Verify workflow and activity spans were created - workflow_spans = [s for s in spans if "temporal.workflow" in s.get("span_attributes", {}).get("name", "")] - activity_spans = [s for s in spans if "temporal.activity" in s.get("span_attributes", {}).get("name", "")] - - assert len(workflow_spans) > 0, "Expected workflow spans" - assert len(activity_spans) > 0, "Expected activity spans" - @pytest.mark.parametrize("with_client_parent", [False, True]) @pytest.mark.asyncio async def test_plugin_activity_after_replay_stays_under_workflow_span( diff --git a/py/src/braintrust/integrations/test_utils.py b/py/src/braintrust/integrations/test_utils.py index 181d4c7d7..594167827 100644 --- a/py/src/braintrust/integrations/test_utils.py +++ b/py/src/braintrust/integrations/test_utils.py @@ -320,42 +320,33 @@ def test_materialize_attachment_from_bytes_accepts_custom_prefix(): assert resolved.filename == "document.pdf" -def test_materialize_attachment_prefix_handles_mime_suffixes(): - resolved = _materialize_attachment(b"", mime_type="image/svg+xml", prefix="image") - - assert isinstance(resolved, _ResolvedAttachment) - assert resolved.mime_type == "image/svg+xml" - assert resolved.filename == "image.svg" - - -def test_materialize_attachment_from_base64_accepts_data_urls_and_custom_filenames(): - resolved = _materialize_attachment( - "data:image/png;base64,aGVsbG8=", - mime_type="image/png", - filename="generated_image_0.png", - ) +@pytest.mark.parametrize( + ("value", "kwargs", "content_type", "filename"), + [ + ( + "data:image/png;base64,aGVsbG8=", + {"mime_type": "image/png", "filename": "generated_image_0.png"}, + "image/png", + "generated_image_0.png", + ), + ("data:image/png;base64,aGVsbG8=", {"label": "image"}, "image/png", "image.png"), + ("data:application/pdf;base64,aGVsbG8=", {}, "application/pdf", "file.pdf"), + ], + ids=["custom-filename", "label", "non-image-file-prefix"], +) +def test_materialize_attachment_from_data_url(value, kwargs, content_type, filename): + resolved = _materialize_attachment(value, **kwargs) assert isinstance(resolved, _ResolvedAttachment) assert isinstance(resolved.attachment, Attachment) - assert resolved.attachment.reference["content_type"] == "image/png" - assert resolved.attachment.reference["filename"] == "generated_image_0.png" + assert resolved.attachment.reference["content_type"] == content_type + assert resolved.attachment.reference["filename"] == filename def test_materialize_attachment_returns_none_for_invalid_base64_payloads(): assert _materialize_attachment("aGVsbG8=!", mime_type="image/png") is None -def test_materialize_attachment_converts_valid_data_url(): - data_url = "data:image/png;base64,aGVsbG8=" - - resolved = _materialize_attachment(data_url, label="image") - - assert isinstance(resolved, _ResolvedAttachment) - assert isinstance(resolved.attachment, Attachment) - assert resolved.attachment.reference["content_type"] == "image/png" - assert resolved.attachment.reference["filename"] == "image.png" - - def test_resolved_attachment_multimodal_part_payload_uses_image_url_for_images(): resolved = _materialize_attachment(b"hello", mime_type="image/png") @@ -420,14 +411,6 @@ def test_materialize_attachment_preserves_invalid_base64_strings_without_mime_ty assert _materialize_attachment("data:image/png;base64,aGVsbG8=!") is None -def test_materialize_attachment_uses_file_prefix_for_non_image_mime_types(): - resolved = _materialize_attachment("data:application/pdf;base64,aGVsbG8=") - - assert isinstance(resolved, _ResolvedAttachment) - assert resolved.attachment.reference["content_type"] == "application/pdf" - assert resolved.attachment.reference["filename"] == "file.pdf" - - def test_materialize_attachment_preserves_existing_attachment_filename_over_prefix(): attachment = Attachment(data=b"hello", filename="existing.pdf", content_type="application/pdf") diff --git a/py/src/braintrust/wrappers/test_langsmith_wrapper.py b/py/src/braintrust/wrappers/test_langsmith_wrapper.py index c25256c29..5224ccc9a 100644 --- a/py/src/braintrust/wrappers/test_langsmith_wrapper.py +++ b/py/src/braintrust/wrappers/test_langsmith_wrapper.py @@ -20,26 +20,6 @@ ) -def test_is_patched_false(): - """Test that _is_patched returns False for unpatched objects.""" - - def unpatched(): - pass - - assert _is_patched(unpatched) is False - - -def test_is_patched_true(): - """Test that _is_patched returns True for patched objects.""" - - def patched(): - pass - - patched._braintrust_patched = True # type: ignore - - assert _is_patched(patched) is True - - def test_make_braintrust_scorer_dict_result(): """Test converting a LangSmith evaluator that returns a dict.""" @@ -59,23 +39,6 @@ class MockExample: assert result.metadata == {"note": "good"} -def test_make_braintrust_scorer_numeric_result(): - """Test converting a LangSmith evaluator that returns a numeric score in a dict.""" - - def langsmith_evaluator(inputs, outputs, reference_outputs): - return {"score": 1.0 if outputs == reference_outputs else 0.0} - - converted = _make_braintrust_scorer(langsmith_evaluator) - - class MockExample: - outputs = {"y": 2} - - result = converted(input={"x": 1}, output={"y": 2}, expected=MockExample()) - - assert result.name == "langsmith_evaluator" - assert result.score == 1.0 - - def test_make_braintrust_scorer_with_plain_dict_expected(): """Test converting a LangSmith evaluator with plain dict as expected.""" @@ -182,39 +145,9 @@ def target_fn(inp): assert result == 10 -class TestWrapTraceable: - """Tests for wrap_traceable functionality.""" - - def test_wrap_traceable_returns_wrapper(self): - """Test that wrap_traceable returns a wrapped version.""" - - def mock_traceable(func, **kwargs): - return func - - wrapped = wrap_traceable(mock_traceable, standalone=False) - assert callable(wrapped) - assert _is_patched(wrapped) - - def test_wrap_traceable_standalone_mode(self): - """Test that wrap_traceable works in standalone mode.""" - - def mock_traceable(func, **kwargs): - return func - - wrapped = wrap_traceable(mock_traceable, standalone=True) - assert callable(wrapped) - assert _is_patched(wrapped) - - class TestWrapFunctions: """Tests for the wrap_* functions.""" - def test_wrap_functions_exist(self): - """Test that wrap functions are callable.""" - assert callable(wrap_traceable) - assert callable(wrap_client) - assert callable(wrap_aevaluate) - def test_wrap_traceable_returns_patched_function(self): """Test that wrap_traceable returns a patched function.""" @@ -259,32 +192,6 @@ async def mock_aevaluate(*args, **kwargs): class TestTandemModeIntegration: """Integration tests for tandem mode (LangSmith + Braintrust together).""" - def test_make_braintrust_task_with_inputs_parameter(self): - """Test that task handles LangSmith's required 'inputs' parameter name.""" - - def target_fn(inputs: dict) -> dict: - return {"result": inputs["x"] * 2} - - task = _make_braintrust_task(target_fn) - result = task({"x": 5}, None) - - assert result == {"result": 10} - - def test_convert_langsmith_data_handles_different_output_types(self): - """Test that data conversion handles various output types.""" - data = [ - {"inputs": {"x": 1}, "outputs": 2}, # outputs is int, not dict - {"inputs": {"x": 2}, "outputs": {"result": 4}}, # outputs is already dict - ] - - data_fn = _convert_langsmith_data(data) - result = list(data_fn()) - - # Both should work - Braintrust's EvalCase accepts any type for expected - assert len(result) == 2 - assert result[0].input == {"x": 1} - assert result[1].input == {"x": 2} - def test_make_braintrust_scorer_handles_wrapped_outputs(self): """Test that scorers handle output wrapping correctly.""" From e5259ec6f64c88f034a2ba04b1474ae013934000 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 19:59:08 +0000 Subject: [PATCH 04/11] test: prune redundant pydantic-ai and google-genai tests and unused cassettes Co-Authored-By: Claude Opus 5.5 --- .../test_interactions_async_round_trip.yaml | 155 ---- .../test_interactions_async_stream.yaml | 104 --- .../test_interactions_create_and_get.yaml | 105 --- .../test_interactions_create_stream.yaml | 109 --- .../1.30.0/test_interactions_delete.yaml | 104 --- ..._interactions_tool_call_and_follow_up.yaml | 109 --- ...n_stays_active_during_local_tool_work.yaml | 109 --- .../cassettes/1.30.0/test_multi_turn.yaml | 64 -- .../cassettes/1.30.0/test_stop_sequences.yaml | 66 -- .../1.30.0/test_temperature_and_top_p.yaml | 64 -- ...n_stays_active_during_local_tool_work.yaml | 109 --- .../cassettes/1.75.0/test_multi_turn.yaml | 68 -- .../cassettes/1.75.0/test_stop_sequences.yaml | 71 -- .../1.75.0/test_temperature_and_top_p.yaml | 69 -- ...n_stays_active_during_local_tool_work.yaml | 109 --- .../cassettes/latest/test_multi_turn.yaml | 66 -- .../cassettes/latest/test_stop_sequences.yaml | 70 -- .../latest/test_temperature_and_top_p.yaml | 68 -- .../google_genai/test_google_genai.py | 368 ++------ .../cassettes/0.1.9/test_agent_run_async.yaml | 111 --- .../0.1.9/test_agent_run_stream.yaml | 155 ---- .../0.1.9/test_agent_run_stream_events.yaml | 137 --- ...st_agent_run_stream_structured_output.yaml | 148 ---- .../0.1.9/test_agent_run_stream_sync.yaml | 135 --- .../cassettes/0.1.9/test_agent_run_sync.yaml | 108 --- ...nt_stream_buffer_pattern_early_return.yaml | 155 ---- .../0.1.9/test_agent_stream_early_break.yaml | 230 ----- .../0.1.9/test_agent_structured_output.yaml | 117 --- .../0.1.9/test_agent_with_binary_content.yaml | 115 --- .../test_agent_with_custom_settings.yaml | 107 --- .../0.1.9/test_agent_with_document_input.yaml | 110 --- .../0.1.9/test_agent_with_error_handling.yaml | 30 - .../0.1.9/test_agent_with_long_context.yaml | 31 - .../test_agent_with_message_history.yaml | 214 ----- ...agent_with_model_settings_in_metadata.yaml | 110 --- ...with_model_settings_override_in_input.yaml | 120 --- .../0.1.9/test_agent_with_prefill.yaml | 30 - .../test_agent_with_short_max_tokens.yaml | 29 - .../0.1.9/test_agent_with_stop_sequences.yaml | 30 - ..._agent_with_system_prompt_in_metadata.yaml | 110 --- .../0.1.9/test_agent_with_tool_execution.yaml | 220 ----- .../0.1.9/test_agent_with_tools.yaml | 219 ----- .../0.1.9/test_auto_pydantic_ai.yaml | 112 --- .../0.1.9/test_direct_model_request.yaml | 108 --- ...s_nested_chat_span_without_class_scan.yaml | 109 --- .../test_direct_model_request_stream.yaml | 135 --- ..._model_request_stream_complete_output.yaml | 132 --- ...test_direct_model_request_stream_sync.yaml | 135 --- .../0.1.9/test_direct_model_request_sync.yaml | 108 --- ...st_direct_model_request_with_settings.yaml | 107 --- .../0.1.9/test_model_class_span_names.yaml | 107 --- ...tream_sync_thread_context_propagation.yaml | 436 --------- ...multiple_identical_sequential_streams.yaml | 401 --------- .../test_multiple_sequential_streams.yaml | 268 ------ .../0.1.9/test_no_model_agent_run.yaml | 111 --- .../test_no_model_agent_run_with_logfire.yaml | 111 --- ...st_stream_buffer_pattern_early_return.yaml | 158 ---- ...st_stream_early_break_async_generator.yaml | 314 ------- .../test_tool_execution_creates_spans.yaml | 216 ----- ..._not_depend_on_message_reconstruction.yaml | 217 ----- .../test_wrapper_agent_run_is_traced.yaml | 111 --- .../cassettes/1.0.1/test_agent_run_async.yaml | 111 --- .../1.0.1/test_agent_run_stream.yaml | 155 ---- .../1.0.1/test_agent_run_stream_events.yaml | 137 --- ...st_agent_run_stream_structured_output.yaml | 148 ---- .../1.0.1/test_agent_run_stream_sync.yaml | 135 --- .../cassettes/1.0.1/test_agent_run_sync.yaml | 108 --- ...nt_stream_buffer_pattern_early_return.yaml | 155 ---- .../1.0.1/test_agent_stream_early_break.yaml | 230 ----- .../1.0.1/test_agent_structured_output.yaml | 117 --- .../1.0.1/test_agent_with_binary_content.yaml | 115 --- .../test_agent_with_custom_settings.yaml | 107 --- .../1.0.1/test_agent_with_document_input.yaml | 110 --- .../1.0.1/test_agent_with_error_handling.yaml | 30 - .../1.0.1/test_agent_with_long_context.yaml | 31 - .../test_agent_with_message_history.yaml | 214 ----- ...agent_with_model_settings_in_metadata.yaml | 110 --- ...with_model_settings_override_in_input.yaml | 120 --- .../1.0.1/test_agent_with_prefill.yaml | 30 - .../test_agent_with_short_max_tokens.yaml | 29 - .../1.0.1/test_agent_with_stop_sequences.yaml | 30 - ..._agent_with_system_prompt_in_metadata.yaml | 110 --- .../1.0.1/test_agent_with_tool_execution.yaml | 220 ----- .../1.0.1/test_agent_with_tools.yaml | 219 ----- .../1.0.1/test_auto_pydantic_ai.yaml | 112 --- .../1.0.1/test_direct_model_request.yaml | 108 --- ...s_nested_chat_span_without_class_scan.yaml | 109 --- .../test_direct_model_request_stream.yaml | 135 --- ..._model_request_stream_complete_output.yaml | 132 --- ...test_direct_model_request_stream_sync.yaml | 135 --- .../1.0.1/test_direct_model_request_sync.yaml | 108 --- ...st_direct_model_request_with_settings.yaml | 107 --- .../1.0.1/test_model_class_span_names.yaml | 107 --- ...tream_sync_thread_context_propagation.yaml | 436 --------- ...multiple_identical_sequential_streams.yaml | 401 --------- .../test_multiple_sequential_streams.yaml | 268 ------ .../1.0.1/test_no_model_agent_run.yaml | 111 --- .../test_no_model_agent_run_with_logfire.yaml | 111 --- ...st_stream_buffer_pattern_early_return.yaml | 158 ---- ...st_stream_early_break_async_generator.yaml | 314 ------- .../test_tool_execution_creates_spans.yaml | 216 ----- ..._not_depend_on_message_reconstruction.yaml | 217 ----- .../test_wrapper_agent_run_is_traced.yaml | 111 --- .../1.10.0/test_agent_with_long_context.yaml | 31 - .../test_agent_with_short_max_tokens.yaml | 29 - .../test_agent_with_stop_sequences.yaml | 30 - .../1.10.0/test_agent_with_tools.yaml | 219 ----- .../1.10.0/test_model_class_span_names.yaml | 107 --- .../test_multiple_sequential_streams.yaml | 268 ------ .../test_pydantic_wrapped_completion.yaml | 216 ----- .../1.10.0/test_pydantic_wrapped_stream.yaml | 233 ----- .../latest/test_agent_with_long_context.yaml | 130 --- .../test_agent_with_short_max_tokens.yaml | 119 --- .../test_agent_with_stop_sequences.yaml | 147 ---- .../latest/test_agent_with_tools.yaml | 250 ------ .../latest/test_model_class_span_names.yaml | 118 --- .../test_multiple_sequential_streams.yaml | 342 ------- .../test_pydantic_ai_integration.py | 831 ++---------------- .../test_pydantic_ai_wrap_openai.py | 43 +- 119 files changed, 184 insertions(+), 17250 deletions(-) delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_round_trip.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_stream.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_and_get.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_stream.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_delete.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_call_and_follow_up.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_multi_turn.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_stop_sequences.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_temperature_and_top_p.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_multi_turn.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_stop_sequences.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_temperature_and_top_p.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/latest/test_interactions_tool_span_stays_active_during_local_tool_work.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/latest/test_multi_turn.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/latest/test_stop_sequences.yaml delete mode 100644 py/src/braintrust/integrations/google_genai/cassettes/latest/test_temperature_and_top_p.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_async.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_events.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_structured_output.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_buffer_pattern_early_return.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_early_break.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_structured_output.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_binary_content.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_custom_settings.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_document_input.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_error_handling.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_long_context.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_message_history.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_in_metadata.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_override_in_input.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_prefill.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_short_max_tokens.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_stop_sequences.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_system_prompt_in_metadata.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tool_execution.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tools.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_auto_pydantic_ai.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_complete_output.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_with_settings.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_class_span_names.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_request_stream_sync_thread_context_propagation.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_identical_sequential_streams.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_sequential_streams.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run_with_logfire.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_buffer_pattern_early_return.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_early_break_async_generator.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_wrapper_agent_run_is_traced.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_async.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_events.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_structured_output.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_buffer_pattern_early_return.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_early_break.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_structured_output.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_binary_content.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_custom_settings.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_document_input.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_error_handling.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_long_context.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_message_history.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_in_metadata.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_override_in_input.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_prefill.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_short_max_tokens.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_stop_sequences.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_system_prompt_in_metadata.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tool_execution.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tools.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_auto_pydantic_ai.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_complete_output.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_sync.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_with_settings.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_class_span_names.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_request_stream_sync_thread_context_propagation.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_identical_sequential_streams.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_sequential_streams.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run_with_logfire.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_buffer_pattern_early_return.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_early_break_async_generator.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_creates_spans.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_wrapper_agent_run_is_traced.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_long_context.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_short_max_tokens.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_stop_sequences.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_tools.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_model_class_span_names.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_multiple_sequential_streams.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_completion.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_stream.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_long_context.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_short_max_tokens.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_stop_sequences.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_tools.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_model_class_span_names.yaml delete mode 100644 py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_multiple_sequential_streams.yaml diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_round_trip.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_round_trip.yaml deleted file mode 100644 index 46f16f942..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_round_trip.yaml +++ /dev/null @@ -1,155 +0,0 @@ -interactions: -- request: - body: '{"input":"What is the capital of Italy?","model":"gemini-2.5-flash"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '68' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChdsaExWYWZYWE9mMkIxTWtQNk1EemlBbxIXbGhMVmFmWFhPZjJCMU1rUDZNRHppQW8","status":"completed","outputs":[{"signature":"CpMBAb4+9vv4hIyHoqn7P0G1RcfNsV+D0TVGVpbCfzmIK/crkqR6Qa0S42ec4l0Oq4Z0RbmycMFOP/vrRY+Sc4LXg05Rq9VWmajdjv6nOTQcjUcEiJtClTBse8396TbBWKKXRVDbmV1agysShvPyxEIv0Ics6mNi1npUq+w2TOFJ/KLgd19fIsh8eBVEV3pWdjvJd0ja","type":"thought"},{"text":"The - capital of Italy is **Rome**.","type":"text"}],"usage":{"total_tokens":41,"total_input_tokens":8,"input_tokens_by_modality":[{"modality":"text","tokens":8}],"total_cached_tokens":0,"total_output_tokens":8,"total_tool_use_tokens":0,"total_thought_tokens":25},"role":"model","created":"2026-04-07T14:20:08Z","updated":"2026-04-07T14:20:08Z","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:20:08 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1348 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '747' - status: - code: 200 - message: OK -- request: - body: '' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: GET - uri: https://generativelanguage.googleapis.com/v1beta/interactions/v1_ChdsaExWYWZYWE9mMkIxTWtQNk1EemlBbxIXbGhMVmFmWFhPZjJCMU1rUDZNRHppQW8?include_input=true - response: - body: - string: '{"id":"v1_ChdsaExWYWZYWE9mMkIxTWtQNk1EemlBbxIXbGhMVmFmWFhPZjJCMU1rUDZNRHppQW8","status":"completed","outputs":[{"signature":"CpMBAb4+9vv4hIyHoqn7P0G1RcfNsV+D0TVGVpbCfzmIK/crkqR6Qa0S42ec4l0Oq4Z0RbmycMFOP/vrRY+Sc4LXg05Rq9VWmajdjv6nOTQcjUcEiJtClTBse8396TbBWKKXRVDbmV1agysShvPyxEIv0Ics6mNi1npUq+w2TOFJ/KLgd19fIsh8eBVEV3pWdjvJd0ja","type":"thought"},{"text":"The - capital of Italy is **Rome**.","type":"text"}],"usage":{"total_tokens":41,"total_input_tokens":8,"input_tokens_by_modality":[{"modality":"text","tokens":8}],"total_cached_tokens":0,"total_output_tokens":8,"total_tool_use_tokens":0,"total_thought_tokens":25},"role":"model","created":"2026-04-07T14:20:08Z","updated":"2026-04-07T14:20:08Z","object":"interaction","model":"gemini-2.5-flash","input":[{"role":"user","content":[{"text":"What - is the capital of Italy?","type":"text"}]}]}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:20:08 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=130 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '840' - status: - code: 200 - message: OK -- request: - body: '' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: DELETE - uri: https://generativelanguage.googleapis.com/v1beta/interactions/v1_ChdsaExWYWZYWE9mMkIxTWtQNk1EemlBbxIXbGhMVmFmWFhPZjJCMU1rUDZNRHppQW8 - response: - body: - string: '{}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:20:09 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=382 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '2' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_stream.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_stream.yaml deleted file mode 100644 index 7bda7e656..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_async_stream.yaml +++ /dev/null @@ -1,104 +0,0 @@ -interactions: -- request: - body: '{"input":"Say hi shortly.","model":"gemini-2.5-flash","stream":true}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '68' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: 'event: interaction.start - - data: {"interaction":{"id":"v1_ChdtUkxWYWVqRUVZQ3YxTWtQb2IydS1RRRIXbVJMVmFlakVFWUN2MU1rUG9iMnUtUUU","status":"in_progress","object":"interaction","model":"gemini-2.5-flash"},"event_type":"interaction.start"} - - - event: interaction.status_update - - data: {"interaction_id":"v1_ChdtUkxWYWVqRUVZQ3YxTWtQb2IydS1RRRIXbVJMVmFlakVFWUN2MU1rUG9iMnUtUUU","status":"in_progress","event_type":"interaction.status_update"} - - - event: content.start - - data: {"index":0,"content":{"type":"thought"},"event_type":"content.start"} - - - event: content.delta - - data: {"index":0,"delta":{"signature":"ClUBvj72+9F73CQIW9AyrjKse6nIY6vxogBksIaH5zxIIsOMHbbkpLYbB3nSdvBf3485j4bntqHPZjSbypKwI84aO8RagejmAGNRu/Ss+Mebq15i5UIuCnUBvj72+0Ewr8MFjWarSxByDjIn8WzosxL4jSr61M/Cdf2bvYpcks9icyyuHi+zvrfpTOop2ODlpoa7Y/UexoemmbjdKpZeXy5wHb4R3eaiRAeucVPtpoMNFQi5TocaZXfK9hP5BP4p44e9zrJBVUYigBehaec=","type":"thought_signature"},"event_type":"content.delta"} - - - event: content.stop - - data: {"index":0,"event_type":"content.stop"} - - - event: content.start - - data: {"index":1,"content":{"type":"text"},"event_type":"content.start"} - - - event: content.delta - - data: {"index":1,"delta":{"text":"Hi!","type":"text"},"event_type":"content.delta"} - - - event: content.stop - - data: {"index":1,"event_type":"content.stop"} - - - event: interaction.complete - - data: {"interaction":{"id":"v1_ChdtUkxWYWVqRUVZQ3YxTWtQb2IydS1RRRIXbVJMVmFlakVFWUN2MU1rUG9iMnUtUUU","status":"completed","usage":{"total_tokens":42,"total_input_tokens":5,"input_tokens_by_modality":[{"modality":"text","tokens":5}],"total_cached_tokens":0,"total_output_tokens":2,"total_tool_use_tokens":0,"total_thought_tokens":35},"role":"model","created":"2026-04-07T14:20:10Z","updated":"2026-04-07T14:20:10Z","object":"interaction","model":"gemini-2.5-flash"},"event_type":"interaction.complete"} - - - event: done - - data: [DONE] - - - ' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - text/event-stream - Date: - - Tue, 07 Apr 2026 14:20:10 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=795 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '1816' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_and_get.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_and_get.yaml deleted file mode 100644 index fb100cbb1..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_and_get.yaml +++ /dev/null @@ -1,105 +0,0 @@ -interactions: -- request: - body: '{"input":"What is the capital of France?","model":"gemini-2.5-flash"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '69' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChdqaExWYWVIQUQ4YTIxTWtQZ2ZxUDRRWRIXamhMVmFlSEFEOGEyMU1rUGdmcVA0UVk","status":"completed","outputs":[{"signature":"Cp8BAb4+9vtLsikCpBEO0omEzOmvrAc1XfoRIv4pg6pRC203MxRPHMkBCpCP1EfSaBQ8Ypk3CQsck/Yi+7N/+yj9vbqfCh2+idJjFcWg7Sxo64B10gs8O67D06FhP/gDpnv/hLOImOAKwnw3JYsQtVnAINE2zYTMVeirk116zvayi5D5iOzQ+2/SuQCtuUhIXWt2Jyy3LHcEUDfeJgO7uHXw","type":"thought"},{"text":"The - capital of France is **Paris**.","type":"text"}],"usage":{"total_tokens":41,"total_input_tokens":8,"input_tokens_by_modality":[{"modality":"text","tokens":8}],"total_cached_tokens":0,"total_output_tokens":8,"total_tool_use_tokens":0,"total_thought_tokens":25},"role":"model","created":"2026-04-07T14:19:59Z","updated":"2026-04-07T14:19:59Z","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:19:59 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1225 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '765' - status: - code: 200 - message: OK -- request: - body: '' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: GET - uri: https://generativelanguage.googleapis.com/v1beta/interactions/v1_ChdqaExWYWVIQUQ4YTIxTWtQZ2ZxUDRRWRIXamhMVmFlSEFEOGEyMU1rUGdmcVA0UVk?include_input=true - response: - body: - string: '{"id":"v1_ChdqaExWYWVIQUQ4YTIxTWtQZ2ZxUDRRWRIXamhMVmFlSEFEOGEyMU1rUGdmcVA0UVk","status":"completed","outputs":[{"signature":"Cp8BAb4+9vtLsikCpBEO0omEzOmvrAc1XfoRIv4pg6pRC203MxRPHMkBCpCP1EfSaBQ8Ypk3CQsck/Yi+7N/+yj9vbqfCh2+idJjFcWg7Sxo64B10gs8O67D06FhP/gDpnv/hLOImOAKwnw3JYsQtVnAINE2zYTMVeirk116zvayi5D5iOzQ+2/SuQCtuUhIXWt2Jyy3LHcEUDfeJgO7uHXw","type":"thought"},{"text":"The - capital of France is **Paris**.","type":"text"}],"usage":{"total_tokens":41,"total_input_tokens":8,"input_tokens_by_modality":[{"modality":"text","tokens":8}],"total_cached_tokens":0,"total_output_tokens":8,"total_tool_use_tokens":0,"total_thought_tokens":25},"role":"model","created":"2026-04-07T14:19:59Z","updated":"2026-04-07T14:19:59Z","object":"interaction","model":"gemini-2.5-flash","input":[{"role":"user","content":[{"text":"What - is the capital of France?","type":"text"}]}]}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:19:59 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=102 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '859' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_stream.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_stream.yaml deleted file mode 100644 index 549a88fa5..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_create_stream.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"input":"Say hi in five words or less.","model":"gemini-2.5-flash","stream":true}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '82' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: 'event: interaction.start - - data: {"interaction":{"id":"v1_ChdrQkxWYWJfc0NOV1o5TW9QbTZtRm9RSRIXa0JMVmFiX3NDTldaOU1vUG02bUZvUUk","status":"in_progress","object":"interaction","model":"gemini-2.5-flash"},"event_type":"interaction.start"} - - - event: interaction.status_update - - data: {"interaction_id":"v1_ChdrQkxWYWJfc0NOV1o5TW9QbTZtRm9RSRIXa0JMVmFiX3NDTldaOU1vUG02bUZvUUk","status":"in_progress","event_type":"interaction.status_update"} - - - event: content.start - - data: {"index":0,"content":{"type":"thought"},"event_type":"content.start"} - - - event: content.delta - - data: {"index":0,"delta":{"signature":"ClsBvj72+zoBtQP6EjTMrMyD5hM3sBNS/6cPoB/L7fFYkvzXlH/JhNd91N/Lf2BehMZvRijqF0Nk04nFHWjRcey23m0ly4uN3PaKv1jPos1jruzVSo2kjBna5/dvCrUBAb4+9vuoYgWiAXCse1w4Zc6moR0NuIZEblr4QuJSCF8OmKREmC6SLGT22wyV/Hpdhdy8AnoQGxF7d/gnR+RDBgBSH2krIW7HchLuqxZKmahXFuTjuFD8QDbCvOUJ9JGdGvM5tpW/akOdcPzMnZqm0C0/0NCPOG6VhbaloyGrQbI370a546lOHiY7ZdocwKb/pDEZRJIWqHOpvXviWhVIj/jM6gk+n9kRejz+ZfBGtPL/jeRhJQ==","type":"thought_signature"},"event_type":"content.delta"} - - - event: content.stop - - data: {"index":0,"event_type":"content.stop"} - - - event: content.start - - data: {"index":1,"content":{"type":"text"},"event_type":"content.start"} - - - event: content.delta - - data: {"index":1,"delta":{"text":"Hi there","type":"text"},"event_type":"content.delta"} - - - event: content.delta - - data: {"index":1,"delta":{"text":"!","type":"text"},"event_type":"content.delta"} - - - event: content.stop - - data: {"index":1,"event_type":"content.stop"} - - - event: interaction.complete - - data: {"interaction":{"id":"v1_ChdrQkxWYWJfc0NOV1o5TW9QbTZtRm9RSRIXa0JMVmFiX3NDTldaOU1vUG02bUZvUUk","status":"completed","usage":{"total_tokens":74,"total_input_tokens":9,"input_tokens_by_modality":[{"modality":"text","tokens":9}],"total_cached_tokens":0,"total_output_tokens":3,"total_tool_use_tokens":0,"total_thought_tokens":62},"role":"model","created":"2026-04-07T14:20:01Z","updated":"2026-04-07T14:20:01Z","object":"interaction","model":"gemini-2.5-flash"},"event_type":"interaction.complete"} - - - event: done - - data: [DONE] - - - ' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - text/event-stream - Date: - - Tue, 07 Apr 2026 14:20:00 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=887 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '2021' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_delete.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_delete.yaml deleted file mode 100644 index 19575b5a2..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_delete.yaml +++ /dev/null @@ -1,104 +0,0 @@ -interactions: -- request: - body: '{"input":"Reply with exactly ok.","model":"gemini-2.5-flash"}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '61' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChdsQkxWYWJtU09ZMmMxTWtQcFpQYXdRdxIXbEJMVmFibVNPWTJjMU1rUHBaUGF3UXc","status":"completed","outputs":[{"signature":"CmABvj72+7WzytAAFU/DR5hYJRFlxm4yJKjxhaIxo1oQQjH2hur9PHCtCrldHToJoyOVozXlgHA9xq7trYBtqGiCZAO/MfzKIz9M0OGv6W9JVTUlAV/wNZyqz9j3OJV1wOU=","type":"thought"},{"text":"ok","type":"text"}],"usage":{"total_tokens":23,"total_input_tokens":6,"input_tokens_by_modality":[{"modality":"text","tokens":6}],"total_cached_tokens":0,"total_output_tokens":1,"total_tool_use_tokens":0,"total_thought_tokens":16},"role":"model","created":"2026-04-07T14:20:06Z","updated":"2026-04-07T14:20:06Z","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:20:06 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1269 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '648' - status: - code: 200 - message: OK -- request: - body: '' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: DELETE - uri: https://generativelanguage.googleapis.com/v1beta/interactions/v1_ChdsQkxWYWJtU09ZMmMxTWtQcFpQYXdRdxIXbEJMVmFibVNPWTJjMU1rUHBaUGF3UXc - response: - body: - string: '{}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:20:06 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=390 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '2' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_call_and_follow_up.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_call_and_follow_up.yaml deleted file mode 100644 index 4b36853dd..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_call_and_follow_up.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"input":"What is the weather like in Paris? Use the tool.","model":"gemini-2.5-flash","tools":[{"type":"function","description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '293' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChdrUkxWYWZIbEtxeWsxTWtQNTl1Ry1BbxIXa1JMVmFmSGxLcXlrMU1rUDU5dUctQW8","status":"requires_action","outputs":[{"signature":"Cv4BAb4+9vv0gIjK+dI8G/Gk9ZNL+77B3vRd+v3fJn9pPaT8958QL7Fh3Jzss/lUrm0BiaMlHjTqifxqb5h9Mzy8I5SJ1X7sTN8wWBGhpnFUTsZGVw3Cg8e0mdUJ6MnOxDCPNEmPsG8xe+N7forjuaU74YxGhtt8Ase3PWlvsQ9rXWQSQI3+EwiriF9zT+rF0iUXYsmlNC2jeVydCRJzetADEP1whtaY6Qm+8SHGwELS/T1ZyhOJtzE56mtdVQwvt1pr1fSINrVApTUAwmvJNJsDnndwNX06AXqKyx6l61qAlgSqoeo/1Zb7a2R6oJhmDeuvifsJyNbFJFOmyd9aClw=","type":"thought"},{"name":"get_weather","arguments":{"location":"Paris"},"type":"function_call","id":"y124y6bd"}],"usage":{"total_tokens":119,"total_input_tokens":53,"input_tokens_by_modality":[{"modality":"text","tokens":53}],"total_cached_tokens":0,"total_output_tokens":15,"total_tool_use_tokens":0,"total_thought_tokens":51},"role":"model","created":"2026-04-07T14:20:03Z","updated":"2026-04-07T14:20:03Z","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:20:03 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1385 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '937' - status: - code: 200 - message: OK -- request: - body: '{"input":{"call_id":"y124y6bd","result":{"forecast":"sunny"},"type":"function_result","name":"get_weather"},"model":"gemini-2.5-flash","previous_interaction_id":"v1_ChdrUkxWYWZIbEtxeWsxTWtQNTl1Ry1BbxIXa1JMVmFmSGxLcXlrMU1rUDU5dUctQW8","tools":[{"type":"function","description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '440' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChdrUkxWYWZIbEtxeWsxTWtQNTl1Ry1BbxIXa3hMVmFhTzJFOW1XMU1rUHhLMmlzUXM","status":"completed","outputs":[{"signature":"CiRlMjQ4MzBhNy01Y2Q2LTQyZmUtOTk4Yi1lZTUzOWU3MmI5YzM=","type":"thought"},{"text":"The - weather in Paris is sunny.","type":"text"}],"usage":{"total_tokens":61,"total_input_tokens":54,"input_tokens_by_modality":[{"modality":"text","tokens":54}],"total_cached_tokens":0,"total_output_tokens":7,"total_tool_use_tokens":0,"total_thought_tokens":0},"role":"model","created":"2026-04-07T14:20:04Z","updated":"2026-04-07T14:20:04Z","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Tue, 07 Apr 2026 14:20:04 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1483 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '597' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml deleted file mode 100644 index 98d357b43..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"input":"What is the weather like in Paris? Use the tool.","model":"gemini-2.5-flash","tools":[{"type":"function","description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '293' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChczbVhXYWJ1SEhxbW0xTWtQLVA2dDZRYxIXM21YV2FidUhIcW1tMU1rUC1QNnQ2UWM","status":"requires_action","outputs":[{"signature":"Cu4BAb4+9vtHU+JvHsX1tR3UG/YI7ouu7mJBwpb/nalP7MVRXsxe3Ro+Q2pjSV1SdVyHirQfKgeCrZfYRnegxPbVvDIdWi+MAZoHdvfiNBNL5LsLK0pTA6bztJRmE7f2pAhaISzsl2CXXbdqDPMz8K5xOWoV51a/C+9OfzaI2BtqqXuUdU2QipSJYXCyEo5RWzLuuSHjNSLPGP+o2pFJSyE4FepwBLsgh5YZd84KM76nNGU6MkpO09EU/m07bMSX4e+0GoWalYRVk8/tjibpCvxm11Rrmc4gIMoE1xO7VTGhe0qfhleKd9XVjs8bjJxL7Q==","type":"thought"},{"name":"get_weather","arguments":{"location":"Paris"},"type":"function_call","id":"d526dpq4"}],"usage":{"total_tokens":115,"total_input_tokens":53,"input_tokens_by_modality":[{"modality":"text","tokens":53}],"total_cached_tokens":0,"total_output_tokens":15,"total_tool_use_tokens":0,"total_thought_tokens":47},"role":"model","created":"2026-04-08T14:27:43Z","updated":"2026-04-08T14:27:43Z","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Wed, 08 Apr 2026 14:27:43 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1398 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '917' - status: - code: 200 - message: OK -- request: - body: '{"input":{"call_id":"d526dpq4","result":{"forecast":"sunny"},"type":"function_result","name":"get_weather"},"model":"gemini-2.5-flash","previous_interaction_id":"v1_ChczbVhXYWJ1SEhxbW0xTWtQLVA2dDZRYxIXM21YV2FidUhIcW1tMU1rUC1QNnQ2UWM","tools":[{"type":"function","description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '440' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.66.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChczbVhXYWJ1SEhxbW0xTWtQLVA2dDZRYxIWNEdYV2FmbEM1TERVeVFfLTY3aWdDUQ","status":"completed","outputs":[{"signature":"CiRlMjQ4MzBhNy01Y2Q2LTQyZmUtOTk4Yi1lZTUzOWU3MmI5YzM=","type":"thought"},{"text":"The - weather in Paris is sunny.","type":"text"}],"usage":{"total_tokens":61,"total_input_tokens":54,"input_tokens_by_modality":[{"modality":"text","tokens":54}],"total_cached_tokens":0,"total_output_tokens":7,"total_tool_use_tokens":0,"total_thought_tokens":0},"role":"model","created":"2026-04-08T14:27:45Z","updated":"2026-04-08T14:27:45Z","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Wed, 08 Apr 2026 14:27:45 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1141 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '596' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_multi_turn.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_multi_turn.yaml deleted file mode 100644 index 279b849d2..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_multi_turn.yaml +++ /dev/null @@ -1,64 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Hi, my name is Alice."}], "role": "user"}, - {"parts": [{"text": "Hello Alice! Nice to meet you."}], "role": "model"}, {"parts": - [{"text": "What did I just tell you my name was?"}], "role": "user"}], "generationConfig": - {"maxOutputTokens": 200}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '278' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/1.41.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.41.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent - response: - body: - string: !!binary | - H4sIAAAAAAAC/61RTU/DMAy991dEOdMpawlft4lxmLbBBNU0BAiF1esCaVKaFDGm/XeSdt1SzuQQ - WX7PfvbzNkAIL5lMecoMaHyFnmwGoW39O0xJA9JYoE3ZZMFKc+Q2b+vFlmLg2xXhR1Wh90obZJRI - UQ5oo6oSSWYjrtFA8CX0niX2ineH+OXkKFkqAa5frlIQLX3XEvCKS67X98C0ko72kNzN8AFlX9lE - ZUWp3tzUIekRGseXNDqj8Sm5IJRQGrTStSiuNMtgCoZZW9hheWxb5IVJ1AfIa1XVtkS0kfFc7OB9 - sseNMkx0oLgt9drqoRXlwnfXM95uzwQ3G7dicrNIsOeQ6U7VWhR4Tv6d8Z/E+qQrFuwv0xxrDqXm - zVUyyO2dwqhHwpVgeh0S0q+74hJ0oaSGUep4w/GCs8l4dDv9XP+cj2biNeKbgcLBLvgFeALyD7EC - AAA= - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=UTF-8 - Date: - - Sun, 05 Oct 2025 17:04:13 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=427 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_stop_sequences.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_stop_sequences.yaml deleted file mode 100644 index 1ebc9066a..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_stop_sequences.yaml +++ /dev/null @@ -1,66 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Write a short story about a robot."}], - "role": "user"}], "generationConfig": {"maxOutputTokens": 500, "stopSequences": - ["END", "\n\n"]}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '171' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/1.41.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.41.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent - response: - body: - string: !!binary | - H4sIAAAAAAAC/61STW/aQBC98ytGezbIkIBLrwlqIrVKWtwqUtPDggd7lfWO2VmHWoj/3rEJxLTX - +mBb8/HemzezHwCotXaZyXRAVh/hp0QA9t27zZEL6IIkTiEJVtqH99rjs+/9S0nA322T+u5MgOTq - OoIM2eROWDJ4Vjc1B8qMdtGzgqIuS4lua4PBNqAZpKcia7iQcCgQ1oWnEsFrY43LGWjThZcvzavB - HaTovV7jCO6D5Kpg1toCo2PyHEFuaSddoIFpE2Bla4yAZWgn6BvykIkYKEnmH0EqsNr4SPCNAzEG - OKA3Vlp2heEKfSfJU50XnQZunHyEEiqrXRCIu7rUjqHyuBFdXblhYFPWtptePKg9QqCu36O2Yk7T - KsQ1cSN8JcMKRfVI9Uw9nP9/Re+r8GSx9bmkDO2p/HAqUBvjxMVvqJlcW7ZMHx7VOatf88+UV55W - 7TaH41E8m8aTq0kyn8fjZBYngxNxR6lq1jl+waDlWPT5JJQAlFVI6QXdDdXdsXw4cvRO6yI9S97y - gYK2F6lkGv2DyrfCaWz/5HrXKKNra0LTzpcunlLVsydciDrZM+i5+LfE/8Q1Sy7JBm9bOS7qB3o2 - x43kWMqOhpNRPNxYzcUwjscdqvLIFTnG+6ytu90+Gf1wN13wEreBH6/nn1L6ulCDw+APwgER5cUD - AAA= - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=UTF-8 - Date: - - Sun, 05 Oct 2025 17:04:15 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=849 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_temperature_and_top_p.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_temperature_and_top_p.yaml deleted file mode 100644 index b63770144..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.30.0/test_temperature_and_top_p.yaml +++ /dev/null @@ -1,64 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Say something creative."}], "role": - "user"}], "generationConfig": {"temperature": 0.7, "topP": 0.95, "maxOutputTokens": - 50}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '159' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/1.41.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.41.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent - response: - body: - string: !!binary | - H4sIAAAAAAAC/61SXY/TMBB8z69Y+bmtcskdPXjlKr5FgQqdBAhtm01ineMN9qbHqep/x04uvRRe - yUPkeMYz450cEgC1Q1voAoW8egHfwg7AoX9HjK2QlQCMW2GzRSdP3OE5TNaBIvQ7HlKbmqBhtiBs - dVULaA8IDRmhArw2e3Lg20CYgRftnLZVwPcUAAHPXQtcBgSdX8AKdzXIvbZ3hgadkl3FEgLCvfb1 - DLbddmuihDBIcPadK3FHUSN+9gkW362aZD2e1j9mTzd0bCjGb7ggM9KPI0GV2ga/z4SebaR92Xxc - qxOK++o9V63jbRzSPF0sr5eXWZ5d5enV8/x6mV0ko3PvqTqPFX0gwVACnkatgkLTyobvyL7kri/h - cjCZVHYG59kjLixozqFns39U/U3w1GZa5aTlcHc0Wh76Gle3GzWZj5yFGueTTMb4d8T/5JVn52bJ - Yy1DU1/JeT1UUlETSppni3ReGvT1PE0velXlKPxw1tObIvJu8Fbj2/Xu9RrLX+LX3btXPx8+rVRy - TP4A68C0Px0DAAA= - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=UTF-8 - Date: - - Sun, 05 Oct 2025 17:04:14 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=627 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml deleted file mode 100644 index a4e7ec305..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_interactions_tool_span_stays_active_during_local_tool_work.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"input":"What is the weather like in Paris? Use the tool.","model":"gemini-2.5-flash","tools":[{"type":"function","description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '293' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - x-goog-api-client: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChczdWNCYXBmQ0w2X2lfdU1QOGZHVWtRRRIXM3VjQmFwZkNMNl9pX3VNUDhmR1VrUUU","status":"requires_action","outputs":[{"signature":"CvYBAQw51scQQY9MN7IdgF5zv2ZTHrUSXHVBbJfa2lQaNnFZw0noHag4ImZV1aQyATBMqG7SSPSha2inEyxBQfAt75IQ0HwVkg8I1Wh+nccnKg0WxTxgQzglouVugJvYgSvjybN4Sqgr4em9SCCtQ5N0f2Q4ieKRTR9/H+IuYfH6Hecj2QbjqGB0S8fU88fLmWsp+uAA5d20JvQFCZS3BUiojJ0uXwJISN84VBI5hLxLHqFev8GnxgkaVwQPUDNiI8gVdvdFh3/U0XaQdzqjtvRqOghrJwjGZs7dhuvc9aUAVKsw+u4Ua7ijWSIS/h7ZBkwbgOzueQin","type":"thought"},{"id":"ypn5qbfb","type":"function_call","name":"get_weather","arguments":{"location":"Paris"}}],"usage":{"total_tokens":115,"total_input_tokens":53,"input_tokens_by_modality":[{"modality":"text","tokens":53}],"total_cached_tokens":0,"total_output_tokens":15,"total_tool_use_tokens":0,"total_thought_tokens":47},"role":"model","created":"2026-05-11T14:29:51Z","updated":"2026-05-11T14:29:51Z","service_tier":"standard","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Mon, 11 May 2026 14:29:51 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1103 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '951' - status: - code: 200 - message: OK -- request: - body: '{"input":[{"call_id":"ypn5qbfb","result":{"forecast":"sunny"},"type":"function_result","name":"get_weather"}],"model":"gemini-2.5-flash","previous_interaction_id":"v1_ChczdWNCYXBmQ0w2X2lfdU1QOGZHVWtRRRIXM3VjQmFwZkNMNl9pX3VNUDhmR1VrUUU","tools":[{"type":"function","description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '442' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - User-Agent: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - x-goog-api-client: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChczdWNCYXBmQ0w2X2lfdU1QOGZHVWtRRRIWNE9jQmFxOHQ2Szc4OVFfMmpyX1lDdw","status":"completed","outputs":[{"signature":"CiRlMjQ4MzBhNy01Y2Q2LTQyZmUtOTk4Yi1lZTUzOWU3MmI5YzM=","type":"thought"},{"text":"The - weather in Paris is sunny.","type":"text"}],"usage":{"total_tokens":61,"total_input_tokens":54,"input_tokens_by_modality":[{"modality":"text","tokens":54}],"total_cached_tokens":0,"total_output_tokens":7,"total_tool_use_tokens":0,"total_thought_tokens":0},"role":"model","created":"2026-05-11T14:29:52Z","updated":"2026-05-11T14:29:52Z","service_tier":"standard","object":"interaction","model":"gemini-2.5-flash"}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json - Date: - - Mon, 11 May 2026 14:29:52 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=859 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - content-length: - - '622' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_multi_turn.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_multi_turn.yaml deleted file mode 100644 index ac6d0bde0..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_multi_turn.yaml +++ /dev/null @@ -1,68 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Hi, my name is Alice."}], "role": "user"}, - {"parts": [{"text": "Hello Alice! Nice to meet you."}], "role": "model"}, {"parts": - [{"text": "What did I just tell you my name was?"}], "role": "user"}], "generationConfig": - {"maxOutputTokens": 200}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '278' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - x-goog-api-client: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"You just told me your name is Alice.\\n\"\n - \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"avgLogprobs\": -0.0468083918094635\n }\n ],\n \"usageMetadata\": - {\n \"promptTokenCount\": 25,\n \"candidatesTokenCount\": 10,\n \"totalTokenCount\": - 35,\n \"promptTokensDetails\": [\n {\n \"modality\": \"TEXT\",\n - \ \"tokenCount\": 25\n }\n ],\n \"candidatesTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 10\n - \ }\n ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": - \"gemini-2.0-flash-001\",\n \"responseId\": \"tucBapilKu2N_PUPj8iduA0\"\n}\n" - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json; charset=UTF-8 - Date: - - Mon, 11 May 2026 14:29:11 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=541 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Gemini-Service-Tier: - - standard - X-XSS-Protection: - - '0' - content-length: - - '718' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_stop_sequences.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_stop_sequences.yaml deleted file mode 100644 index f1033326f..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_stop_sequences.yaml +++ /dev/null @@ -1,71 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Write a short story about a robot."}], - "role": "user"}], "generationConfig": {"maxOutputTokens": 500, "stopSequences": - ["END", "\n\n"]}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '171' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - x-goog-api-client: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"Unit 734 hummed softly, his optical - sensors focusing on the wilting daisy in the cracked clay pot. He'd been tasked - with maintaining the hydroponics lab, a job that mostly involved monitoring - nutrient levels and adjusting the LED grow lights. But the daisy, a rogue - seed that had found purchase in the drainage hole, was his secret project.\"\n - \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"avgLogprobs\": -0.95476786295572913\n }\n ],\n \"usageMetadata\": - {\n \"promptTokenCount\": 8,\n \"candidatesTokenCount\": 72,\n \"totalTokenCount\": - 80,\n \"promptTokensDetails\": [\n {\n \"modality\": \"TEXT\",\n - \ \"tokenCount\": 8\n }\n ],\n \"candidatesTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 72\n - \ }\n ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": - \"gemini-2.0-flash-001\",\n \"responseId\": \"uOcBas2CKcm6_uMPr-vE6QQ\"\n}\n" - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json; charset=UTF-8 - Date: - - Mon, 11 May 2026 14:29:13 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=1108 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Gemini-Service-Tier: - - standard - X-XSS-Protection: - - '0' - content-length: - - '1019' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_temperature_and_top_p.yaml b/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_temperature_and_top_p.yaml deleted file mode 100644 index 67d21475a..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/1.75.0/test_temperature_and_top_p.yaml +++ /dev/null @@ -1,69 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Say something creative."}], "role": - "user"}], "generationConfig": {"temperature": 0.7, "topP": 0.95, "maxOutputTokens": - 50}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '159' - Content-Type: - - application/json - Host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - x-goog-api-client: - - google-genai-sdk/1.75.0 gl-python/3.12.12 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"The wind whispered secrets through - the skeletal branches of the ancient oak, each rustle a forgotten story etched - in the wood, a symphony of ghosts dancing in the twilight.\\n\"\n }\n - \ ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"avgLogprobs\": -0.70770190743839034\n }\n ],\n \"usageMetadata\": - {\n \"promptTokenCount\": 4,\n \"candidatesTokenCount\": 34,\n \"totalTokenCount\": - 38,\n \"promptTokensDetails\": [\n {\n \"modality\": \"TEXT\",\n - \ \"tokenCount\": 4\n }\n ],\n \"candidatesTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 34\n - \ }\n ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": - \"gemini-2.0-flash-001\",\n \"responseId\": \"t-cBavaRGZSY_uMPurbS4As\"\n}\n" - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json; charset=UTF-8 - Date: - - Mon, 11 May 2026 14:29:12 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=818 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Gemini-Service-Tier: - - standard - X-XSS-Protection: - - '0' - content-length: - - '853' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_interactions_tool_span_stays_active_during_local_tool_work.yaml b/py/src/braintrust/integrations/google_genai/cassettes/latest/test_interactions_tool_span_stays_active_during_local_tool_work.yaml deleted file mode 100644 index 955d6b480..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_interactions_tool_span_stays_active_during_local_tool_work.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"input":"What is the weather like in Paris? Use the tool.","model":"gemini-2.5-flash","tools":[{"description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]},"type":"function"}]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '293' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - speakeasy-sdk/python 2.4.1-preview.5 internal v1beta google-genai - x-goog-api-client: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChdyNVN5YXFQdkpZNngxTWtQZ01QQThRURIXcjVTeWFxUHZKWTZ4MU1rUGdNUEE4UVE","status":"requires_action","usage":{"total_tokens":115,"total_input_tokens":53,"input_tokens_by_modality":[{"modality":"text","tokens":53}],"total_cached_tokens":0,"total_output_tokens":15,"total_tool_use_tokens":0,"total_thought_tokens":47},"created":"2026-09-22T14:46:07Z","updated":"2026-09-22T14:46:07Z","service_tier":"standard","steps":[{"signature":"Cu4BAWkUfRO8x06gBCNm5GPa6OwpocShmRT2VvnIxlNKOVeVU9ajS2pXeRle4cB5p+thRuAWBnOTo2OVRu3cL6g6yCHjnbNYgFfhCtT9FBNZW0jbcn8cVKujiEXumn6V6NsaITaLhsOnXIP5SU0vp1Rd49ZvDGMNIr3ekZHWOBBuA+K4KA09ICAqpHzOokxnl/mIbaIt2XuPOO3Y+XPT8KC4ucjk/PTGsN4OhJh7h8x3oY5/VJBLnHtFranSLGBf+5t7M+PcNia1nFvbK49lbE63OqDE8cDQ488e1yZ/E4RU8KAuMCIwspFwyAJ1QXzCXQ==","type":"thought"},{"id":"znoq6la7","type":"function_call","name":"get_weather","arguments":{"location":"Paris"}}],"object":"interaction","model":"gemini-2.5-flash"}' - headers: - alt-svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - content-length: - - '926' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:08 GMT - server: - - scaffolding on HTTPServer2 - server-timing: - - gfet4t7; dur=1183 - transfer-encoding: - - chunked - vary: - - Origin - - X-Origin - - Referer - x-content-type-options: - - nosniff - x-frame-options: - - SAMEORIGIN - x-xss-protection: - - '0' - status: - code: 200 - message: OK -- request: - body: '{"input":[{"call_id":"znoq6la7","result":{"forecast":"sunny"},"name":"get_weather","type":"function_result"}],"model":"gemini-2.5-flash","previous_interaction_id":"v1_ChdyNVN5YXFQdkpZNngxTWtQZ01QQThRURIXcjVTeWFxUHZKWTZ4MU1rUGdNUEE4UVE","tools":[{"description":"Get - the current weather for a location.","name":"get_weather","parameters":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]},"type":"function"}]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '442' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - speakeasy-sdk/python 2.4.1-preview.5 internal v1beta google-genai - x-goog-api-client: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/interactions - response: - body: - string: '{"id":"v1_ChdyNVN5YXFQdkpZNngxTWtQZ01QQThRURIXc0pTeWFvRGFKZS1tOU1vUGxZZkM4UVE","status":"completed","usage":{"total_tokens":90,"total_input_tokens":83,"input_tokens_by_modality":[{"modality":"text","tokens":83}],"total_cached_tokens":0,"total_output_tokens":7,"total_tool_use_tokens":0,"total_thought_tokens":0},"created":"2026-09-22T14:46:08Z","updated":"2026-09-22T14:46:08Z","service_tier":"standard","steps":[{"signature":"CiRlMjQ4MzBhNy01Y2Q2LTQyZmUtOTk4Yi1lZTUzOWU3MmI5YzM=","type":"thought"},{"content":[{"text":"The - weather in Paris is sunny.","type":"text"}],"type":"model_output"}],"object":"interaction","model":"gemini-2.5-flash"}' - headers: - alt-svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - content-length: - - '642' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:09 GMT - server: - - scaffolding on HTTPServer2 - server-timing: - - gfet4t7; dur=1023 - transfer-encoding: - - chunked - vary: - - Origin - - X-Origin - - Referer - x-content-type-options: - - nosniff - x-frame-options: - - SAMEORIGIN - x-xss-protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_multi_turn.yaml b/py/src/braintrust/integrations/google_genai/cassettes/latest/test_multi_turn.yaml deleted file mode 100644 index 92fcd4857..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_multi_turn.yaml +++ /dev/null @@ -1,66 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Hi, my name is Alice."}], "role": "user"}, - {"parts": [{"text": "Hello Alice! Nice to meet you."}], "role": "model"}, {"parts": - [{"text": "What did I just tell you my name was?"}], "role": "user"}], "generationConfig": - {"maxOutputTokens": 200}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '278' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - x-goog-api-client: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"You just told me your name is Alice.\"\n - \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"index\": 0\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 28,\n \"candidatesTokenCount\": 9,\n \"totalTokenCount\": 37,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 28\n - \ }\n ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": - \"gemini-2.5-flash-lite\",\n \"responseId\": \"hpSyatPJIdXR1MkP35_bcQ\"\n}\n" - headers: - alt-svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - content-length: - - '582' - content-type: - - application/json; charset=UTF-8 - date: - - Tue, 22 Sep 2026 14:45:27 GMT - server: - - scaffolding on HTTPServer2 - server-timing: - - gfet4t7; dur=989 - transfer-encoding: - - chunked - vary: - - Origin - - X-Origin - - Referer - x-content-type-options: - - nosniff - x-frame-options: - - SAMEORIGIN - x-gemini-service-tier: - - standard - x-xss-protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_stop_sequences.yaml b/py/src/braintrust/integrations/google_genai/cassettes/latest/test_stop_sequences.yaml deleted file mode 100644 index 73535c16e..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_stop_sequences.yaml +++ /dev/null @@ -1,70 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Write a short story about a robot."}], - "role": "user"}], "generationConfig": {"maxOutputTokens": 500, "stopSequences": - ["END", "\n\n"]}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '171' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - x-goog-api-client: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"Unit 734 whirred to life, its optical - sensors blinking open to a sterile, gray environment. The air, recycled and - filtered to an almost nonexistent scent, hummed with the low thrum of machinery. - For Unit 734, this was the entirety of existence. Its days were a precisely - choreographed ballet of maintenance, diagnostics, and data processing. No - sunrise, no sunset, just the ceaseless, efficient flow of information.\"\n - \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"index\": 0\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 9,\n \"candidatesTokenCount\": 91,\n \"totalTokenCount\": 100,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 9\n }\n - \ ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": \"gemini-2.5-flash-lite\",\n - \ \"responseId\": \"iJSyaoeJGtnTjMcPurqewAY\"\n}\n" - headers: - alt-svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - content-length: - - '962' - content-type: - - application/json; charset=UTF-8 - date: - - Tue, 22 Sep 2026 14:45:29 GMT - server: - - scaffolding on HTTPServer2 - server-timing: - - gfet4t7; dur=1299 - transfer-encoding: - - chunked - vary: - - Origin - - X-Origin - - Referer - x-content-type-options: - - nosniff - x-frame-options: - - SAMEORIGIN - x-gemini-service-tier: - - standard - x-xss-protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_temperature_and_top_p.yaml b/py/src/braintrust/integrations/google_genai/cassettes/latest/test_temperature_and_top_p.yaml deleted file mode 100644 index 3a6179cf9..000000000 --- a/py/src/braintrust/integrations/google_genai/cassettes/latest/test_temperature_and_top_p.yaml +++ /dev/null @@ -1,68 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "Say something creative."}], "role": - "user"}], "generationConfig": {"temperature": 0.7, "topP": 0.95, "maxOutputTokens": - 50}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '159' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - x-goog-api-client: - - google-genai-sdk/2.24.0 gl-python/3.14.7 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"Here are a few creative sparks, choose - the one that resonates most with you, or let them inspire something entirely - new!\\n\\n**Evocative & Sensory:**\\n\\n* \\\"The silence after the storm - wasn't empty; it was a canvas painted\"\n }\n ],\n \"role\": - \"model\"\n },\n \"finishReason\": \"MAX_TOKENS\",\n \"index\": - 0\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": 5,\n \"candidatesTokenCount\": - 50,\n \"totalTokenCount\": 55,\n \"promptTokensDetails\": [\n {\n - \ \"modality\": \"TEXT\",\n \"tokenCount\": 5\n }\n ],\n - \ \"serviceTier\": \"standard\"\n },\n \"modelVersion\": \"gemini-2.5-flash-lite\",\n - \ \"responseId\": \"h5SyatSyJrCn_uMPrf_dWA\"\n}\n" - headers: - alt-svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - content-length: - - '772' - content-type: - - application/json; charset=UTF-8 - date: - - Tue, 22 Sep 2026 14:45:28 GMT - server: - - scaffolding on HTTPServer2 - server-timing: - - gfet4t7; dur=496 - transfer-encoding: - - chunked - vary: - - Origin - - X-Origin - - Referer - x-content-type-options: - - nosniff - x-frame-options: - - SAMEORIGIN - x-gemini-service-tier: - - standard - x-xss-protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/google_genai/test_google_genai.py b/py/src/braintrust/integrations/google_genai/test_google_genai.py index f6350ff0e..b8fbb20b4 100644 --- a/py/src/braintrust/integrations/google_genai/test_google_genai.py +++ b/py/src/braintrust/integrations/google_genai/test_google_genai.py @@ -172,6 +172,70 @@ def _assert_timing_metrics_are_valid(metrics, start=None, end=None): assert metrics["start"] <= metrics["end"] +def _weather_tool(): + def get_weather(location: str, unit: str = "celsius") -> str: + """Get the current weather for a location. + + Args: + location: The city and state, e.g. San Francisco, CA + unit: The unit of temperature (celsius or fahrenheit) + """ + return f"22 degrees {unit} and sunny in {location}" + + return get_weather + + +def _has_function_call(responses): + """True if any response/chunk has function_calls or automatic_function_calling_history.""" + return any( + getattr(r, "function_calls", None) or getattr(r, "automatic_function_calling_history", None) for r in responses + ) + + +def _assert_tool_use_span(span, model, start, end): + assert span["metadata"]["model"] == model + assert span["metadata"]["provider"] == "google" + assert span["metadata"]["tools"], "tools should be surfaced on metadata.tools" + assert "get_weather" in str(span["metadata"]["tools"]) + assert "tools" not in (span["input"].get("config") or {}), "tools should not leak into input.config" + assert "Paris" in str(span["input"]) or "weather" in str(span["input"]) + assert span["output"] + _assert_metrics_are_valid(span["metrics"], start, end) + + +def _assert_embed_span(span, start, end): + assert span["metadata"]["model"] == EMBEDDING_MODEL + assert "RETRIEVAL_DOCUMENT" in str(span["input"]) + assert "This is a test" in str(span["input"]) + assert span["output"]["embedding_length"] == 32 + assert span["output"]["embeddings_count"] == 2 + _assert_timing_metrics_are_valid(span["metrics"], start, end) + + +def _assert_generate_images_span(span, start, end): + assert span["metadata"]["model"] == IMAGE_MODEL + assert span["input"]["prompt"] == "A watercolor fox in a forest" + assert span["input"]["config"]["number_of_images"] == 1 + assert span["input"]["config"]["aspect_ratio"] == "1:1" + assert span["input"]["config"]["safety_filter_level"] == "BLOCK_LOW_AND_ABOVE" + assert span["input"]["config"]["include_rai_reason"] is True + assert span["output"]["generated_images_count"] == 1 + generated_image = span["output"]["generated_images"][0] + assert generated_image["image_size_bytes"] > 0 + assert generated_image["mime_type"] in {"image/png", "image/jpeg", "image/webp"} + + # Verify the image bytes are stored as an Attachment for upload to object storage + assert "image_url" in generated_image + attachment = generated_image["image_url"]["url"] + assert isinstance(attachment, Attachment) + assert attachment.reference["type"] == "braintrust_attachment" + assert attachment.reference["content_type"] == generated_image["mime_type"] + assert attachment.reference["filename"].startswith("generated_image_") + assert attachment.reference["key"] + + _assert_timing_metrics_are_valid(span["metrics"], start, end) + + def _assert_attachment_part(part, *, content_type, filename): if content_type.startswith("image/"): assert "image_url" in part @@ -432,13 +496,7 @@ def test_embed_content(memory_logger): spans = memory_logger.pop() assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == EMBEDDING_MODEL - assert "RETRIEVAL_DOCUMENT" in str(span["input"]) - assert "This is a test" in str(span["input"]) - assert span["output"]["embedding_length"] == 32 - assert span["output"]["embeddings_count"] == 2 - _assert_timing_metrics_are_valid(span["metrics"], start, end) + _assert_embed_span(spans[0], start, end) @pytest.mark.vcr @@ -465,13 +523,7 @@ async def test_embed_content_async(memory_logger): spans = memory_logger.pop() assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == EMBEDDING_MODEL - assert "RETRIEVAL_DOCUMENT" in str(span["input"]) - assert "This is a test" in str(span["input"]) - assert span["output"]["embedding_length"] == 32 - assert span["output"]["embeddings_count"] == 2 - _assert_timing_metrics_are_valid(span["metrics"], start, end) + _assert_embed_span(spans[0], start, end) @pytest.mark.vcr @@ -638,15 +690,6 @@ def test_tool_use(memory_logger, mode): assert not memory_logger.pop() model = TOOL_MODEL - def get_weather(location: str, unit: str = "celsius") -> str: - """Get the current weather for a location. - - Args: - location: The city and state, e.g. San Francisco, CA - unit: The unit of temperature (celsius or fahrenheit) - """ - return f"22 degrees {unit} and sunny in {location}" - client = Client() start = time.time() has_function_call = False @@ -656,49 +699,32 @@ def get_weather(location: str, unit: str = "celsius") -> str: model=model, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[get_weather], + tools=[_weather_tool()], max_output_tokens=500, ), ) - # Check if function was called (either in function_calls or automatic_function_calling_history) - has_function_call = (hasattr(response, "function_calls") and response.function_calls) or ( - hasattr(response, "automatic_function_calling_history") and response.automatic_function_calling_history - ) + has_function_call = _has_function_call([response]) elif mode == "stream": stream = client.models.generate_content_stream( model=model, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[get_weather], + tools=[_weather_tool()], max_output_tokens=500, ), ) chunks = list(stream) - # Check if function was called in any chunk (either in function_calls or automatic_function_calling_history) - has_function_call = any( - (hasattr(chunk, "function_calls") and chunk.function_calls) - or (hasattr(chunk, "automatic_function_calling_history") and chunk.automatic_function_calling_history) - for chunk in chunks - ) + has_function_call = _has_function_call(chunks) end = time.time() # Verify function call was made assert has_function_call, f"Expected function call in {mode} mode but got has_function_call={has_function_call}" - # Verify logging (automatic function calling may create multiple spans) + # Automatic function calling may create multiple spans; check the initial request. spans = memory_logger.pop() assert len(spans) >= 1 - # Check the first span (initial request with tool call) - span = spans[0] - assert span["metadata"]["model"] == model - assert span["metadata"]["provider"] == "google" - assert span["metadata"]["tools"], "tools should be surfaced on metadata.tools" - assert "get_weather" in str(span["metadata"]["tools"]) - assert "tools" not in (span["input"].get("config") or {}), "tools should not leak into input.config" - assert "Paris" in str(span["input"]) or "weather" in str(span["input"]) - assert span["output"] - _assert_metrics_are_valid(span["metrics"], start, end) + _assert_tool_use_span(spans[0], model, start, end) # Test 3b: Tool Use (Async) @@ -713,15 +739,6 @@ async def test_tool_use_async(memory_logger, mode): assert not memory_logger.pop() model = TOOL_MODEL - def get_weather(location: str, unit: str = "celsius") -> str: - """Get the current weather for a location. - - Args: - location: The city and state, e.g. San Francisco, CA - unit: The unit of temperature (celsius or fahrenheit) - """ - return f"22 degrees {unit} and sunny in {location}" - client = Client() start = time.time() has_function_call = False @@ -731,47 +748,34 @@ def get_weather(location: str, unit: str = "celsius") -> str: model=model, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[get_weather], + tools=[_weather_tool()], max_output_tokens=500, ), ) - # Check if function was called (either in function_calls or automatic_function_calling_history) - has_function_call = (hasattr(response, "function_calls") and response.function_calls) or ( - hasattr(response, "automatic_function_calling_history") and response.automatic_function_calling_history - ) + has_function_call = _has_function_call([response]) elif mode == "async_stream": stream = await client.aio.models.generate_content_stream( model=model, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[get_weather], + tools=[_weather_tool()], max_output_tokens=500, ), ) chunks = [] async for chunk in stream: chunks.append(chunk) - # Check if function was called in any chunk (either in function_calls or automatic_function_calling_history) - has_function_call = any( - (hasattr(chunk, "function_calls") and chunk.function_calls) - or (hasattr(chunk, "automatic_function_calling_history") and chunk.automatic_function_calling_history) - for chunk in chunks - ) + has_function_call = _has_function_call(chunks) end = time.time() # Verify function call was made assert has_function_call, f"Expected function call in {mode} mode but got has_function_call={has_function_call}" - # Verify logging (automatic function calling may create multiple spans) + # Automatic function calling may create multiple spans; check the initial request. spans = memory_logger.pop() assert len(spans) >= 1 - # Check the first span (initial request with tool call) - span = spans[0] - assert span["metadata"]["model"] == model - assert "Paris" in str(span["input"]) or "weather" in str(span["input"]) - assert span["output"] - _assert_metrics_are_valid(span["metrics"], start, end) + _assert_tool_use_span(spans[0], model, start, end) # Test 4: System Prompt @@ -804,65 +808,6 @@ def test_system_prompt(memory_logger): assert "pirate" in str(span["input"]).lower() or "system_instruction" in str(span) -# Test 5: Multi-turn Conversation -@pytest.mark.vcr -def test_multi_turn(memory_logger): - """Test multi-turn conversation.""" - assert not memory_logger.pop() - - client = Client() - response = client.models.generate_content( - model=MODEL, - contents=[ - types.Content(role="user", parts=[types.Part.from_text(text="Hi, my name is Alice.")]), - types.Content(role="model", parts=[types.Part.from_text(text="Hello Alice! Nice to meet you.")]), - types.Content(role="user", parts=[types.Part.from_text(text="What did I just tell you my name was?")]), - ], - config=types.GenerateContentConfig( - max_output_tokens=200, - ), - ) - - text = response.text - assert "Alice" in text - - # Verify logging - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == MODEL - assert span["input"] - assert span["output"] - assert "Alice" in str(span["input"]) - - -# Test 6: Temperature and Top P -@pytest.mark.vcr -def test_temperature_and_top_p(memory_logger): - """Test temperature and top_p parameters.""" - assert not memory_logger.pop() - - client = Client() - response = client.models.generate_content( - model=MODEL, - contents="Say something creative.", - config=types.GenerateContentConfig( - temperature=0.7, - top_p=0.95, - max_output_tokens=50, - ), - ) - - text = response.text - assert text - - # Verify logging includes temperature and top_p - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == MODEL - - # Test 7: Error Handling @pytest.mark.vcr def test_error_handling(memory_logger): @@ -892,31 +837,6 @@ def test_error_handling(memory_logger): assert log["error"] -@pytest.mark.vcr -def test_stop_sequences(memory_logger): - """Test stop sequences parameter.""" - assert not memory_logger.pop() - - client = Client() - response = client.models.generate_content( - model=MODEL, - contents="Write a short story about a robot.", - config=types.GenerateContentConfig( - max_output_tokens=500, - stop_sequences=["END", "\n\n"], - ), - ) - - text = response.text - assert text - - # Verify logging - spans = memory_logger.pop() - assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == MODEL - - @pytest.mark.vcr def test_prefill(memory_logger): """Verify prefilled model context is preserved in traced input.""" @@ -1162,22 +1082,6 @@ def test_generated_image_usage(memory_logger): assert spans[0]["metrics"]["completion_image_tokens"] == expected_image_tokens -def test_attachment_in_config(memory_logger): - """Test that attachments in config are preserved through serialization.""" - from braintrust.bt_json import bt_safe_deep_copy - from braintrust.logger import Attachment - - attachment = Attachment(data=b"config data", filename="config.txt", content_type="text/plain") - - # Simulate config with attachment - config = {"temperature": 0.5, "context_file": attachment, "max_output_tokens": 100} - - # Test bt_safe_deep_copy preserves attachment - copied = bt_safe_deep_copy(config) - assert copied["context_file"] is attachment - assert copied["temperature"] == 0.5 - - @DEVELOPER_API_IMAGEN_ONLY @pytest.mark.vcr def test_generate_images(memory_logger): @@ -1204,28 +1108,7 @@ def test_generate_images(memory_logger): spans = memory_logger.pop() assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == IMAGE_MODEL - assert span["input"]["prompt"] == "A watercolor fox in a forest" - assert span["input"]["config"]["number_of_images"] == 1 - assert span["input"]["config"]["aspect_ratio"] == "1:1" - assert span["input"]["config"]["safety_filter_level"] == "BLOCK_LOW_AND_ABOVE" - assert span["input"]["config"]["include_rai_reason"] is True - assert span["output"]["generated_images_count"] == 1 - generated_image = span["output"]["generated_images"][0] - assert generated_image["image_size_bytes"] > 0 - assert generated_image["mime_type"] in {"image/png", "image/jpeg", "image/webp"} - - # Verify the image bytes are stored as an Attachment for upload to object storage - assert "image_url" in generated_image - attachment = generated_image["image_url"]["url"] - assert isinstance(attachment, Attachment) - assert attachment.reference["type"] == "braintrust_attachment" - assert attachment.reference["content_type"] == generated_image["mime_type"] - assert attachment.reference["filename"].startswith("generated_image_") - assert attachment.reference["key"] - - _assert_timing_metrics_are_valid(span["metrics"], start, end) + _assert_generate_images_span(spans[0], start, end) @DEVELOPER_API_IMAGEN_ONLY @@ -1255,49 +1138,7 @@ async def test_generate_images_async(memory_logger): spans = memory_logger.pop() assert len(spans) == 1 - span = spans[0] - assert span["metadata"]["model"] == IMAGE_MODEL - assert span["input"]["prompt"] == "A watercolor fox in a forest" - assert span["input"]["config"]["number_of_images"] == 1 - assert span["input"]["config"]["aspect_ratio"] == "1:1" - assert span["input"]["config"]["safety_filter_level"] == "BLOCK_LOW_AND_ABOVE" - assert span["input"]["config"]["include_rai_reason"] is True - assert span["output"]["generated_images_count"] == 1 - generated_image = span["output"]["generated_images"][0] - assert generated_image["image_size_bytes"] > 0 - assert generated_image["mime_type"] in {"image/png", "image/jpeg", "image/webp"} - - # Verify the image bytes are stored as an Attachment for upload to object storage - assert "image_url" in generated_image - attachment = generated_image["image_url"]["url"] - assert isinstance(attachment, Attachment) - assert attachment.reference["type"] == "braintrust_attachment" - assert attachment.reference["content_type"] == generated_image["mime_type"] - assert attachment.reference["filename"].startswith("generated_image_") - assert attachment.reference["key"] - - _assert_timing_metrics_are_valid(span["metrics"], start, end) - - -def test_nested_attachments_in_contents(memory_logger): - """Test that nested attachments in contents are preserved.""" - from braintrust.bt_json import bt_safe_deep_copy - from braintrust.logger import Attachment, ExternalAttachment - - attachment1 = Attachment(data=b"file1", filename="file1.txt", content_type="text/plain") - attachment2 = ExternalAttachment(url="s3://bucket/file2.pdf", filename="file2.pdf", content_type="application/pdf") - - # Simulate contents with nested attachments - contents = [ - {"role": "user", "parts": [{"text": "Check these files"}, {"file": attachment1}]}, - {"role": "model", "parts": [{"text": "Analyzed"}, {"result_file": attachment2}]}, - ] - - copied = bt_safe_deep_copy(contents) - - # Verify attachments preserved - assert copied[0]["parts"][1]["file"] is attachment1 - assert copied[1]["parts"][1]["result_file"] is attachment2 + _assert_generate_images_span(spans[0], start, end) def test_attachment_with_pydantic_model(memory_logger): @@ -1732,6 +1573,10 @@ def test_interactions_tool_call_and_follow_up(memory_logger): ) tool_call = next(output for output in _interaction_outputs(first_response) if output.type == "function_call") + # Local tool work between the two calls should nest under the still-active tool span. + with logger.start_span(name="nested_tool_work", type=SpanTypeAttribute.TASK) as nested_tool_work: + nested_tool_work.log(output={"forecast": "sunny"}) + second_response = client.interactions.create( model=INTERACTIONS_MODEL, previous_interaction_id=first_response.id, @@ -1768,52 +1613,7 @@ def test_interactions_tool_call_and_follow_up(memory_logger): assert tool_span["input"] == {"location": "Paris"} assert tool_span["span_parents"] == [first_span["span_id"]] - -@_needs_interactions -@pytest.mark.vcr -def test_interactions_tool_span_stays_active_during_local_tool_work(memory_logger): - assert not memory_logger.pop() - - client = Client() - tool = _interaction_function_tool() - - first_response = client.interactions.create( - model=INTERACTIONS_MODEL, - input="What is the weather like in Paris? Use the tool.", - tools=[tool], - ) - tool_call = next(output for output in _interaction_outputs(first_response) if output.type == "function_call") - - with logger.start_span(name="nested_tool_work", type=SpanTypeAttribute.TASK) as nested_tool_work: - nested_tool_work.log(output={"forecast": "sunny"}) - - second_response = client.interactions.create( - model=INTERACTIONS_MODEL, - previous_interaction_id=first_response.id, - input=[ - _function_result_content( - type="function_result", - call_id=tool_call.id, - name=tool_call.name, - result={"forecast": "sunny"}, - ) - ], - tools=[tool], - ) - - assert first_response.status == "requires_action" - assert second_response.status == "completed" - - spans = memory_logger.pop() - llm_spans = find_spans_by_type(spans, SpanTypeAttribute.LLM) - tool_spans = find_spans_by_type(spans, SpanTypeAttribute.TOOL) - - first_span = next(span for span in llm_spans if span["metadata"]["interaction_id"] == first_response.id) - second_span = next(span for span in llm_spans if span["metadata"]["interaction_id"] == second_response.id) - tool_span = find_span_by_name(tool_spans, "get_weather") nested_span = find_span_by_name(spans, "nested_tool_work") - - assert tool_span["span_parents"] == [first_span["span_id"]] assert nested_span["span_parents"] == [tool_span["span_id"]] assert tool_span["metrics"]["start"] <= nested_span["metrics"]["start"] assert tool_span["metrics"]["end"] >= nested_span["metrics"]["end"] diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_async.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_async.yaml deleted file mode 100644 index d8cbce6c6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_async.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNb9swDIbv/hUCz/EQe6nb5LgN27GXoEBRFIYq0Y42SRQkemha5L8P - cj7s7APYxQc+fKn3pfleCAFGw0aA2klWLtjyM+0fP9HX5v7+2/KL3zqXttsHj33zcU9vsMgKevmO - is+qD4pcsMiG/BGriJIxT61um6Zubqp1NQJHGm2W9YHLFZXOeFPWy3pVLm/L6u6k3pFRmGAjngoh - hHgfv9mn1/gKG7FcnCsOU5I9wubSJAREsrkCMiWTWHqGxQQVeUY/Wl/N6xG7IcnszQ/WzoD0nljm - bKOj5xM5XDxY6kOkl/SbFDrjTdq1EWUin99LTAFGeiiEeB6zDlf2IURygVumHzg+V5+iwrThCVYn - xsTSzjTn+tWwViNLY9NsVaCk2qGelNNe5aANzUAxi/ynl7/NPsY2vv+f8RNQCgOjbkNEbdR13qkt - Yj6/f7VdVjwahoTxp1HYssGYf4PGTg72eBSQ9onRtZ3xPcYQzfEyutAiNmtVY7e6g+JQ/AIAAP// - AwDuaeQPJwMAAA== - headers: - CF-RAY: - - 9b12245f08957e95-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:11 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - path=/; expires=Sat, 20-Dec-25 21:43:11 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '431' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_33be6e1c06474f88aa886351e283ddd7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream.yaml deleted file mode 100644 index df0a9eb10..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream.yaml +++ /dev/null @@ -1,155 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AdmWDxOKK"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"99PF7nJyxt"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PwQJtYjWkW"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RWDd73VIGm"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"k9VcEaTPe8"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UbeAPy03Nm"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZPEZJoyoEX"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SxJvohEmis"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PI7a8tVNM5"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2XRGzzU6oQ"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Q2nugXZUaQ"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hZ24zrrpjf"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dxzuS0d72f"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KQ60YPfF8R"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BIXonJxprK"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"SXpgc"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":14,"total_tokens":28,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ah4xZweSQB"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12248a4ae8c8c1-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:18 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '156' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '397' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a86fc882a88544e99a2b0c6ddc4bde91 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_events.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_events.yaml deleted file mode 100644 index 3a43dcb6c..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_events.yaml +++ /dev/null @@ -1,137 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 5+5?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '159' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NUHnuwR08"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZxdaiRZ15E"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7rq4MBlNH"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ObRsp96GEh"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5XlMYqCpfe"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7n2I"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MWAuNaxyKW"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"10"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ogW5F7bn3"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HwNpcoLKIK"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"eBByw"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"lNcNmJTv02s"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224f70f467b5d-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:34 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '117' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '138' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a039650e8c8d4f6b87f790ee240c501b - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_structured_output.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_structured_output.yaml deleted file mode 100644 index 8b83f68d3..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_structured_output.yaml +++ /dev/null @@ -1,148 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Create a product: wireless mouse - for $29.99"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":true,"stream_options":{"include_usage":true},"tool_choice":"required","tools":[{"type":"function","function":{"name":"final_result","description":"The - final response which ends this conversation","parameters":{"properties":{"name":{"type":"string"},"price":{"type":"number"}},"required":["name","price"],"type":"object","additionalProperties":false},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '512' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_A7KZPr5kGAGlQ8C14181Vvhy","type":"function","function":{"name":"final_result","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yV5"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"j76iAcp9Zs3oMK"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"name"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2MtYagUE81M7o"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FasttgVbZD6W"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Wireless"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"l1SBzPzwz"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" - Mouse"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"evH1cpoojIm"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\",\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fT6Didfgz79L"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"price"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"i8p4r5f2lT24"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HaIM50EfiNrPrj"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"29"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0V8wqhtTL1LTzP6"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"."}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"99"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gZKaSe6ldngLtzx"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"58dnVPO5fMDckIz"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[],"usage":{"prompt_tokens":60,"completion_tokens":21,"total_tokens":81,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"vIuzr9NdNr"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12251efed97bbc-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:41 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '332' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '346' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f46c423eba984813a50f693c8688b0e1 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_sync.yaml deleted file mode 100644 index 74a0267e8..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_stream_sync.yaml +++ /dev/null @@ -1,135 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oe7NKLwxb"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zo9uTp8rAl"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7XCXxDmcSS"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"orSNgjHbts"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"o9b0bnf5qQ"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6BUHljfKiI"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RnwAlJA5TO"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JmdjUZhcL8"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rymGleA07L"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"D7TJg"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"wiavNQU8pii"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224f44c3edb9e-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:34 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '135' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '149' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_29dbb17aab2d4dcc9b5ee70fc1abbf4d - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_sync.yaml deleted file mode 100644 index 9113bfa2a..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_run_sync.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4ySz27bMAzG734Kged4iJ0sbXLLdiv6Au1QGIpE21pkUZXobkGRdx/k/LGztcAu - PvDHj/o+mu+ZEGA0bASoVrLqvM2/0+Hp2yJS9/DIu8au94vXUm77X9tnWbcwSwra/UTFF9UXRZ23 - yIbcCauAkjFNLe5Wq3L1tVgXA+hIo02yxnO+pLwzzuTlvFzm87u8uD+rWzIKI2zEj0wIId6Hb/Lp - NP6GjZjPLpUOY5QNwubaJAQEsqkCMkYTWTqG2QgVOUY3WF9O6wHrPsrkzfXWToB0jlimbIOjlzM5 - Xj1YanygXfxLCrVxJrZVQBnJpfcik4eBHjMhXoas/Y198IE6zxXTHofnynNUGDc8wuLMmFjaieZS - vxlWaWRpbJysCpRULepROe5V9trQBGSTyP96+Wj2KbZxzf+MH4FS6Bl15QNqo27zjm0B0/l91nZd - 8WAYIoY3o7BigyH9Bo217O3pKCAeImNX1cY1GHwwp8uofYW4WqsS6+U9ZMfsDwAAAP//AwC3+s74 - JwMAAA== - headers: - CF-RAY: - - 9b1224663bb9a2b3-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '203' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '327' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_471863fd12ea4712a0185373c2a05e92 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_buffer_pattern_early_return.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_buffer_pattern_early_return.yaml deleted file mode 100644 index 7fde16c6b..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_buffer_pattern_early_return.yaml +++ /dev/null @@ -1,155 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bcINBiIzl"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DCree7eBPf"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pvpGblJa0X"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zRnt5XEcWz"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UtcHdzjdyH"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"A4GU9GCwHo"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"m2BBvPGr6j"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UbxH3vm9ow"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Y1BpRkh1BN"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2vNoNGTR1h"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GOZPS2oFlB"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"y3icxduW8C"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qmGHVCeBOa"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PhMdSCHOag"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CsnAjtFZFs"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"ckCs2"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":14,"total_tokens":28,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"SaUfw2TISU"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b9efae57a0fed40-SJC - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Tue, 06 Jan 2026 23:26:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '170' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_78143cd211f04c098aa5fe0c40067451 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_early_break.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_early_break.yaml deleted file mode 100644 index fd6646850..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_stream_early_break.yaml +++ /dev/null @@ -1,230 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 10"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '165' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4pQPbm5sP"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"Sure"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wrvJkdl"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"A2vKajCbCQ"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - Here"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bC0UbU"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BDapODD"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YDXHLAr8"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cL9BEeScpw"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kf4hXtU8II"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Tff3zmLZyx"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"svWLZ07ECm"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VfjmbYCm8f"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X8Q1CXgcd4"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"udNT2lSgTS"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jWwKJ2GgAh"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KrLIOlJR3v"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bH26cIHKyt"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LlOvHHhjtf"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pA0yAxQg5g"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZCxMVAVuth"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"crhyHB7U1I"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ssgOE7sSk6"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"modwaj7i7y"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9fU2BvvFtU"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"6"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FJBqC1w2pl"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HS9kSQFA1R"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iGnOI7Jy3e"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"7"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iKxFMYIhFG"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LtlwQXjWJ5"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"leamnKRf87"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"8"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"U5UoyjZdqc"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"76CDhGsCQ1"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fRyotHGhbg"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"9"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LSe7QhEaMZ"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BmBnuWlc1i"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mlUCXZHbke"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"10"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AEcwdXOyQ"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tGgCDyMBr7"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"VMIGo"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":36,"total_tokens":50,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"oJyVAU56Sv"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b122500fc37f554-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:36 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '143' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '156' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_bc33e098e9454cf38129178ac688bf90 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_structured_output.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_structured_output.yaml deleted file mode 100644 index b9c80df3f..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_structured_output.yaml +++ /dev/null @@ -1,117 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 10 + 15?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"required","tools":[{"type":"function","function":{"name":"final_result","description":"The - final response which ends this conversation","parameters":{"properties":{"answer":{"type":"integer"},"explanation":{"type":"string"}},"required":["answer","explanation"],"type":"object","additionalProperties":false},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '463' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.10.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFPLbtswELzrKxZ7rR1YrmQnAnpqegh6aNMWaY06EGhyLbGhSIakmgqG - /72gHFvKo0B1EIgdzuzsg7sEAKXAApDXLPDGqul701X3Fyt/933hL7vu6vrmQ37NV6kOl/YBJ5Fh - Nr+IhyPrjJvGKgrS6APMHbFAUTVdLhbzRb6cn/dAYwSpSKtsmGZm2kgtp/PZPJvOltP0/JFdG8nJ - YwE/EwCAXf+PPrWgP1jAbHKMNOQ9qwiL0yUAdEbFCDLvpQ9MB5wMIDc6kI7WdavUCAjGqJIzpYbE - h283Og/NYkqVqy8XX1f3QrD0x1vx+arLbj7dZM1HO8p3kO5sb2jban5q0gg/xYtnyQBQs+bAlZqp - 0pFvVXjGB0DmqrYhHaJ33K2Raf9Abo3FPJ+skf5YxTSLKdZYrPFbTeDbBswW0hkwLSDNQXrgTPFW - xcnBpgMmhNQVhJogPBjQbbMh5yGYikJNrojcN5H5Dub52Rr3+MTVPnntfDvquKNt65l6OQqmtQm9 - 3X4Wt4/I/jR2ZSrrzMY/o8YmSV+XjpjvuzkeanI00lvA9sneoHWmsaEM5o76pPnyIIrDag9glj2C - wQSmhng6SyevyJWCApP9Xp1WmTNekxiow0qzVkgzApJR6S/dvKZ9KF/q6n/kB4BzsoFEaR0JyZ9W - PFxzFF/+v66dmtwbRk/ut+RUBkkujkPQlh33F33nAzXlVuqKnHWyf5S4tSXP8vN8k28uOCb75C8A - AAD//wMAKCKONqIEAAA= - headers: - CF-RAY: - - 9b1231843ca711d4-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:22:10 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=tjfDIbVtlGKAySVR9I771x5d5TWJXazLALWLBWelkn0-1766265730-1.0.1.1-HqfmmM2hjszgNJVDnEr3.JxzdI19yHvDV.USX_bmGPcPu98d5uB53IXS8BksoX1IiWnwdm5byGI0XFP_aigP1sJV05q360okqKwIfMssHtA; - path=/; expires=Sat, 20-Dec-25 21:52:10 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '1443' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1464' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_d19b9ce7cbd7481b87acf1bb92d8e5b9 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_binary_content.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_binary_content.yaml deleted file mode 100644 index 88a06ad1f..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_binary_content.yaml +++ /dev/null @@ -1,115 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="},"type":"image_url"},{"text":"What - color is this image?","type":"text"}]}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '315' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBbtswDL37Kwid4yJ20yTNcTsMKDAMA4aixVAYskTbXGVJk+gtRZF/ - H+Sksdt1wC468PFR7z3yOQMQpMUOhOokq96b/KN7uq9vbvf3d58/fOIv+5/t9ba4qcvyrrn9KhaJ - 4eofqPiFdaFc7w0yOXuEVUDJmKYWm/W6XF+VxWYEeqfRJFrrOV+5vCdLebksV/lykxfbE7tzpDCK - HXzPAACexzfptBr3YgfLxUulxxhli2J3bgIQwZlUETJGiiwti8UEKmcZ7Sj9W4dAvWwRKEJtpHoE - aTX87ohxAQ1KHgLZFiRESv5OPW5gQxbBNSDBY4jOXsx/CNgMUSaXdjBmBkhrHcuU0ujt4YQczm6M - a31wdXxDFQ1Zil0VUEZnk/LIzosRPWQAD2Nqw6sghA+u91yxe8Txu+1VcXkcKKZtTXCxPoHsWJo5 - rbxevDOx0siSTJwlL5RUHeqJO61JDprcDMhmvv+W897so3ey7f+MnwCl0DPqygfUpF5bntoCpmv+ - V9s551GwiBh+kcKKCUPahcZGDuZ4YyI+Rca+asi2GHyg46E1vtrWtbrc1itdi+yQ/QEAAP//AwAU - sfncdgMAAA== - headers: - CF-RAY: - - 9b1225071c71102c-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:38 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '1288' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1306' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-input-images: - - '50000' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-input-images: - - '49999' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999227' - x-ratelimit-reset-input-images: - - 1ms - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_4c8353513e384112a1594c46e28d4db5 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_custom_settings.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_custom_settings.yaml deleted file mode 100644 index 3b1f1e7ee..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_custom_settings.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hello"}],"model":"gpt-4o-mini","max_completion_tokens":20,"stream":false,"temperature":0.5,"top_p":0.9}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '146' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFJNb9swDL37V3A6x0PiZkmaSw/b0I9t520YCkORaEerLAoSnc0r8t8H - 2W3srh3Qiw58fE/vkbzPAITRYgtC7SWrxtv8PXXfv/nPl4cvuz+Hg/741XY36x3qT+HGfBCzxKDd - T1T8yHqrqPEW2ZAbYBVQMibVxXq1KlbvisVZDzSk0SZa7TlfUt4YZ/JiXizz+TpfbB7YezIKo9jC - jwwA4L5/k0+n8bfYwnz2WGkwRlmj2J6aAEQgmypCxmgiS8diNoKKHKPrrV+htfQGrugXKOngGgYC - dNQCk5bdxZQYsGqjTOZda+0EkM4RyxS+t3z7gBxPJi3VPtAu/kMVlXEm7suAMpJLhiKTFz16zABu - +2G0T/IJH6jxXDLdYf/d+aAmxg08x5hY2rG82Mxe0Co1sjQ2TkYplFR71CNznLtstaEJkE0SP/fy - kvaQ2rj6NfIjoBR6Rl36gNqop3nHtoDpPP/Xdppwb1hEDAejsGSDIW1BYyVbOxyNiF1kbMrKuBqD - D2a4nMqXiKtzVWC13IjsmP0FAAD//wMA+CXNH0cDAAA= - headers: - CF-RAY: - - 9b1224f15fb22b78-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:34 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '279' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '294' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_46866b81830e435ea4b5749d64ff9f96 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_document_input.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_document_input.yaml deleted file mode 100644 index de52bd727..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_document_input.yaml +++ /dev/null @@ -1,110 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"file":{"file_data":"data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqIDIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iaiAzIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNjEyIDc5Ml0vQ29udGVudHMgNCAwIFI+PmVuZG9iaiA0IDAgb2JqPDwvTGVuZ3RoIDQ0Pj5zdHJlYW0KQlQgL0YxIDEyIFRmIDEwMCA3MDAgVGQgKFRlc3QgRG9jdW1lbnQpIFRqIEVUCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDUKMDAwMDAwMDAwMCA2NTUzNSBmCjAwMDAwMDAwMDkgMDAwMDAgbgowMDAwMDAwMDU4IDAwMDAwIG4KMDAwMDAwMDExNSAwMDAwMCBuCjAwMDAwMDAyMTQgMDAwMDAgbgp0cmFpbGVyPDwvU2l6ZSA1L1Jvb3QgMSAwIFI+PgpzdGFydHhyZWYKMzA3CiUlRU9G","filename":"filename.pdf"},"type":"file"},{"text":"What - is in this document?","type":"text"}]}],"model":"gpt-4o-mini","max_completion_tokens":150,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '816' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4xTTW/bMAy9+1cQOidBkjofzW1dDsutA3bZ1sJQJDpWJ4uaRKcJivz3QU4au10H - 7KIDH98j+Ui9ZADCaLECoSrJqvZ2+Hn/6enrvf8dVL6eo1wfljK/+65dae5+zMUgMWj7hIpfWSNF - tbfIhtwZVgElY1KdLOaLRT65XeYtUJNGm2g7z8OchrVxZjgdT/PheDGcLC/siozCKFbwMwMAeGnf - 1KfTeBArGA9eIzXGKHcoVtckABHIpoiQMZrI0rEYdKAix+ja1jcM0nuUIcKRGmi8JalRgwRNqqnR - MbBhixoexDeMDOtLePQg4As94x7DADbgEDUwAR5kbRyC4QiXMjHFfaC90QgSYlPXMhyBAmhkaZK2 - cSWFWibzRnBvUUaEiqwGcvBcGYuwAU3Ayef+IAHLJspkpmus7QHSOeJWr7Xw8YKcrqZZ2vlA2/iO - KkrjTKyKgDKSSwZFJi9a9JQBPLbLad74LXyg2nPB9AvbctObyVlPdDfRoTezC8jE0vZY8/ngA73i - bFLsrVcoqSrUHbW7BdloQz0g6039dzcfaZ8nN273P/IdoBR6Rl34gNqotxN3aQHTl/lX2tXltmER - MeyNwoINhrQJjaVs7PmQRTxGxroojdth8MGcr7n0hcpny9l2tr1VIjtlfwAAAP//AwD1PbbW2wMA - AA== - headers: - CF-RAY: - - 9b9efaeb3fe9138a-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:26:25 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '835' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1111' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999225' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_90966cd622374d94b813aa9155f7f12e - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_error_handling.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_error_handling.yaml deleted file mode 100644 index 7ea7829ab..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_error_handling.yaml +++ /dev/null @@ -1,30 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/png;base64,SU5WQUxJRF9QTkdfREFUQV9OT1RfQV9SRUFMX0lNQUdF"}},{"type":"text","text":"What''s - in this image?"}]}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"error":{"message":"Could not process image. The image data is not - valid.","type":"invalid_request_error","param":null,"code":"invalid_image"}}' - headers: - Content-Type: - - application/json - status: - code: 400 - message: Bad Request -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_long_context.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_long_context.yaml deleted file mode 100644 index 509c33c51..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_long_context.yaml +++ /dev/null @@ -1,31 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Here is a long text:\n\nThe quick - brown fox jumps over the lazy dog. <...repeated 20 times...>\n\nHow many times - does the word ''fox'' appear?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-long001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"The - word ''fox'' appears 20 times in the text.","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":120,"completion_tokens":14,"total_tokens":134,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_message_history.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_message_history.yaml deleted file mode 100644 index d1a3a0c46..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_message_history.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"My name is Alice"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '124' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBatwwEL37K6Y622VtvJt0L6EUSpfCUtpCaUowijz2aiNrhDROs4T9 - 9yJ7s3baFHLRYd68p/dm5jEBELoWaxBqJ1l1zmQf6PDzx/7+7svD9iO1n5eb7/3X6367Kb+p/UKk - kUG3e1T8xHqrqHMGWZMdYeVRMkbV/GK1KlbLIi8GoKMaTaS1jrOSsk5bnRWLoswWF1l+eWLvSCsM - Yg2/EgCAx+GNPm2ND2INi/Sp0mEIskWxPjcBCE8mVoQMQQeWlkU6gYosox2sb7VCYIIOkeFAfQrv - jVb4Bj7Rb1DSwgZGiQgCUy0PV3Mpj00fZIxje2NmgLSWWMZxDCFuTsjxbNtQ6zzdhr+ootFWh13l - UQay0WJgcmJAjwnAzTCe/lli4Tx1jiumOxy+y/NRTkxLmYHlCWRiaaZ6sUxfUKtqZKlNmI1XKKl2 - WE/MaReyrzXNgGSW+V8zL2mPubVtXyM/AUqhY6wr57HW6nngqc1jPNn/tZ1nPBgWAf29VlixRh/3 - UGMjezMekgiHwNhVjbYteuf1eE2NqxBX71SBTXkpkmPyBwAA//8DAFoRD7VbAwAA - headers: - CF-RAY: - - 9b1224eaa865da6c-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:33 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '406' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '424' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_56a4aaae17c246a2819c52c253e8af1b - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"My name is Alice"},{"role":"assistant","content":"Nice - to meet you, Alice! How can I assist you today?"},{"role":"user","content":"What - is my name?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '255' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBbtswDL37Kwid4yJx0jTNZRiGdRvQ64AGQ2GoEm1rlUVNorelRf59 - kJ3GzrYCvejAx/f0HsnnDEAYLbYgVCNZtd7mH2i/u7tZPrrN7a6Z39zJT+rph/pqnz7SbS1miUEP - 31HxC+tCUestsiE3wCqgZEyqi6v1ulhfFotlD7Sk0SZa7TlfUd4aZ/JiXqzy+VW+2BzZDRmFUWzh - WwYA8Ny/yafT+FtsYT57qbQYo6xRbE9NACKQTRUhYzSRpWMxG0FFjtH11nfUBXCyRTAR3luj8AI+ - 0y9Q0sEXGNiwpw6qLnCD4d1UJ2DVRZmyuM7aCSCdI5ZpFn2C+yNyOHm2VPtAD/EvqqiMM7EpA8pI - LvmLTF706CEDuO9n053FFT5Q67lkesT+u+VmkBPjRkZwURxBJpZ2rF8e53muVmpkaWyczFYoqRrU - I3NchOy0oQmQTTL/a+Z/2kNu4+q3yI+AUugZdekDaqPOA49tAdO9vtZ2mnFvWEQMP43Ckg2GtAeN - lezscEUi7iNjW1bG1Rh8MMMpVb5EXF+rAqvVRmSH7A8AAAD//wMAzG2kQVgDAAA= - headers: - CF-RAY: - - 9b1224ee1fcb08e0-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:33 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '327' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '342' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999975' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_05e924c6ff604d268b4bd3917d32300c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_in_metadata.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_in_metadata.yaml deleted file mode 100644 index f8c05e416..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_in_metadata.yaml +++ /dev/null @@ -1,110 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hello"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false,"temperature":0.5}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '135' - Content-Type: - - application/json - Cookie: - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPB5LNj3De8GmyTYjsSCXBus7wf7B\",\n \"object\": - \"chat.completion\",\n \"created\": 1774893183,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Hello! How can I assist you today?\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 9,\n \"completion_tokens\": 9,\n \"total_tokens\": 18,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8ba4ee792c6-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Mon, 30 Mar 2026 17:53:04 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '839' - openai-organization: - - braintrust-data - openai-processing-ms: - - '637' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=K5ScKgWxKV8qrun72h6zWqwqzuox1P7HfwixJPaisaU-1774893183.0866485-1.0.1.1-aFlnpoUkbkAngI0favlhLoCOJtcaN7dUO6bYg0g4jfC.HRhU3s_NrZt7oH01lSi39dR_xL9hFmrQs2o5en0gk0jRe0MRJTasLHnGP6o4.yXI0SZeUn56WYYaGKfOKVTx; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Mon, 30 Mar 2026 - 18:23:04 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_1e2852cd7fd34d339ac251eeef0c0487 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_override_in_input.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_override_in_input.yaml deleted file mode 100644 index 1e5de9140..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_model_settings_override_in_input.yaml +++ /dev/null @@ -1,120 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Tell me a story"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"temperature":0.9}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '141' - Content-Type: - - application/json - Cookie: - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000; - __cf_bm=K5ScKgWxKV8qrun72h6zWqwqzuox1P7HfwixJPaisaU-1774893183.0866485-1.0.1.1-aFlnpoUkbkAngI0favlhLoCOJtcaN7dUO6bYg0g4jfC.HRhU3s_NrZt7oH01lSi39dR_xL9hFmrQs2o5en0gk0jRe0MRJTasLHnGP6o4.yXI0SZeUn56WYYaGKfOKVTx - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPB5N7VhlEbWXNCjjIvlcDN3PJnb6\",\n \"object\": - \"chat.completion\",\n \"created\": 1774893185,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Once upon a time in a quaint little - village nestled between rolling hills and lush green forests, there lived - a young girl named Elara. She was known far and wide for her insatiable curiosity - and adventurous spirit. Every morning, Elara would wander through the village, - her bright blue eyes sparkling with wonder at the world around her.\\n\\nOne - sunny afternoon, while exploring the outskirts of the forest, Elara stumbled - upon a hidden path that she had never seen before. It was overgrown with vines - and flowers, but something about it beckoned her to follow. With each step, - the sounds of the village faded away, replaced by the gentle rustle of leaves - and the distant chirping of birds.\\n\\nAs she ventured deeper into the woods, - the sunlight danced through the trees, creating a magical tapestry of light - and shadow. After walking for what felt like hours, Elara arrived at a clearing - that took her breath away. In the center stood a magnificent tree, its bark - shimmering like silver, with branches\",\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"length\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 11,\n \"completion_tokens\": - 200,\n \"total_tokens\": 211,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8c39839aa98-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Mon, 30 Mar 2026 17:53:09 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '1813' - openai-organization: - - braintrust-data - openai-processing-ms: - - '4441' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0e199628e6ab42a8bde2da2054693dac - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_prefill.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_prefill.yaml deleted file mode 100644 index 96839e526..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_prefill.yaml +++ /dev/null @@ -1,30 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Write a haiku about coding."},{"role":"assistant","content":"Here - is a haiku:"},{"role":"user","content":"Write a haiku about coding."}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-pre001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"Whitespace - tells a tale\nFunctions dance in loops and turns\nClean code brings freedom","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":35,"completion_tokens":16,"total_tokens":51,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_short_max_tokens.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_short_max_tokens.yaml deleted file mode 100644 index 924a1fc4c..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_short_max_tokens.yaml +++ /dev/null @@ -1,29 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is AI?"}],"model":"gpt-4o-mini","max_completion_tokens":5,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-short001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"AI - stands for Artificial","refusal":null},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":11,"completion_tokens":5,"total_tokens":16,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_stop_sequences.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_stop_sequences.yaml deleted file mode 100644 index fb9386cd1..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_stop_sequences.yaml +++ /dev/null @@ -1,30 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Write a short story about a robot."}],"model":"gpt-4o-mini","max_completion_tokens":500,"stop":["END","\n\n"],"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-stop001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"Once - upon a time, there was a small robot named Bolt who loved exploring the world. - Every day, Bolt would venture out to discover new things.","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":31,"total_tokens":47,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_system_prompt_in_metadata.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_system_prompt_in_metadata.yaml deleted file mode 100644 index d998ca7b6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_system_prompt_in_metadata.yaml +++ /dev/null @@ -1,110 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"system","content":"You are a helpful AI assistant - who speaks like a pirate."},{"role":"user","content":"What is the weather?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '215' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNdSxwxFH3fX3HN82zZneq67ktpC4VC6UNRixYZspkzM3EzSUjuaBcR - /Bv+PX+JZEadtbXQl0Duuefk3I/cTIiELsWKhGokq9ab6We3PTu1aK++/Dg+O96cu/z75tv5p5PT - 2ftwIrLEcOtLKH5mvVOu9QasnR1gFSAZSXV+uFjki4N8Pu+B1pUwiVZ7nu67aautnuazfH86O5zO - l0/sxmmFKFb0a0JEdNOfyact8VusaJY9R1rEKGuI1UsSkQjOpIiQMerI0rLIRlA5y7C99Y8hhIxa - ydju0VdS0j7c3TOtQR7wOt1IMnEDihuNSNpSgDTEukVG645JV7QFMYyhFnTdICAF1qAI5kEiSm2y - QZ+i15YkbWWw9HB3v3bdoF/DIkhD15DcIJCXzAg2JrFW1w0TrHKdZYQ9+tnI3mUiGsmauxIkbUnG - 2Xq4ueQr0KXrgsX2w24DAqouyjQE2xmzA0hrHcs0xL71F0/I7Uuzjat9cOv4B1VU2urYFAEyOpsa - G9l50aO3E6KLfqjdqzkJH1zruWC3Qf9cvhzkxLhKI3hw9ASyY2nG+PIwe0OtKMFSm7izFEJJ1aAc - meMGya7UbgeY7NT8t5m3tIe6ta3/R34ElIJnlIUPKLV6XfCYFpA+2r/SXnrcGxYR4UorFKwR0hxK - VLIzw/qLuI2Mtqi0rRF80MMfqHwBLI5Ujmp/KSa3k0cAAAD//wMAkHTj3xEEAAA= - headers: - CF-RAY: - - 9b1224e1294f9a4f-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:32 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '1332' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1346' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999977' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_3dde0d17015c4cd588c2dc14b4bc82b8 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tool_execution.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tool_execution.yaml deleted file mode 100644 index 72025974c..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tool_execution.yaml +++ /dev/null @@ -1,220 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"description":"The - mathematical operation (add, subtract, multiply, divide)","type":"string"},"a":{"description":"First - number","type":"number"},"b":{"description":"Second number","type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '604' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNNj5swEL3zK6w5Q5XQJCTc2q2iHnrZVqq0Kitk7AGcNbZlm3bTKP+9 - ApJAslmpHJA1z+/Nmw8fAkJAcEgJsJp61hgZPej9E6u+/1D1dqc451/Z489vvJx91n/qRwg7hi52 - yPyZ9YHpxkj0QqsBZhapx051nqxW8WoZz9c90GiOsqNVxkcLHTVCiSiexYtolkTz9Ylda8HQQUp+ - BYQQcuj/nU/F8RVSMgvPkQadoxVCerlECFgtuwhQ54TzVHkIR5Bp5VF11lUr5QTwWsucUSnHxMN3 - mJzHZlEp82S/e4q3n8S6WG/lw99XW8++fEzsyyTfIL03vaGyVezSpAl+iac3yQgBRRs8JWStpB5v - yIQAtVXboPKdcThkoA1a2ullkGbQtNILI/cZhBnQDNJ5nIQZFBmki80RrsSOwb3z86RLFsvWUfm2 - fVQp7fusff+eT8jxMiqpK2N14W6oUAolXJ1bpK7vwHQQwdlIbwHaq1mDsboxPvf6BfukSTKIwriO - IxjPT6DXnsoxvlmHd9Ryjp6KfhUu28coq5GPzHELacuFngDBpPK3Zu5pD9ULVf2P/AgwhsYjz41F - Lth1weM1i91jfe/apce9YXBofwuGuRdou2lwLGkrhycEbu88NnkpVIXWWNG/IyhNzhbL9bJYFhsG - wTH4BwAA//8DAOTijx1VBAAA - headers: - CF-RAY: - - 9b1225104cbc2b8d-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '577' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '590' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_509940fcc6bb40bd8804ce82553ceacf - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_7yjY2FAi8b8FlCzxrh0D37rk","type":"function","function":{"name":"calculate","arguments":"{\"operation\":\"multiply\",\"a\":127,\"b\":49}"}}]},{"role":"tool","tool_call_id":"call_7yjY2FAi8b8FlCzxrh0D37rk","content":"6223.0"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"description":"The - mathematical operation (add, subtract, multiply, divide)","type":"string"},"a":{"description":"First - number","type":"number"},"b":{"description":"Second number","type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '888' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBjtMwFLznKyyfm1VimrbpjeXAkSssWkWO/ZI+cGxjvyCqVf8dOek2 - 6QISlxzevJnMjN9LxhhHzY+Mq5MkNXiTf3DnL/pTUR+eoH3U+sf7x737XLUYnz6Klm8Sw7XfQNEr - 60G5wRsgdHaGVQBJkFTL/W4ndpUo6wkYnAaTaL2nfOvyAS3mohDbvNjn5eHKPjlUEPmRfc0YY+xl - +iafVsMvfmTF5nUyQIyyB368LTHGgzNpwmWMGEla4psFVM4S2Ml6KfZsGA2hNwiatWe2rRlGthPi - 3cOaE6Abo0y+7WjMCpDWOpIp9+T2+Ypcbv6M631wbXxD5R1ajKcmgIzOJi+RnOcTeskYe556GO+i - cR/c4Kkh9x2m35VFPevxpf4VWl5BciTNai6u7d3rNRpIoomrJrmS6gR6oS61y1GjWwHZKvWfbv6m - PSdH2/+P/AIoBZ5ANz6ARnWfeFkLkK7zX2u3lifDPEL4iQoaQgjpJTR0cjTzzfB4jgRD06HtIfiA - 8+F0vlHb6lC1VVsrnl2y3wAAAP//AwARJ00jRgMAAA== - headers: - CF-RAY: - - 9b122514ccebbd64-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '442' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '454' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_220c103a9c1a4326853c15b5dae82105 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tools.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tools.yaml deleted file mode 100644 index fa1d41741..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_agent_with_tools.yaml +++ /dev/null @@ -1,219 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"Get - weather for a city.","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '425' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNdb9swDHz3rxD4HA9JkKSJ37YVG5Z1xT6KDt1SGKpM2+pkSZPotl6Q - /z7YbmwnzYD5wRB4PPJ4lLYBYyATiBiInJMorArfmupmffFUXVzTe3pQX88v1/aK5p+ub/LVDxjV - DHN3j4L2rFfCFFYhSaNbWDjkhHXVydliMV3MJ6tVAxQmQVXTMkvhzISF1DKcjqezcHwWTpbP7NxI - gR4i9jNgjLFt86916gSfIGLj0T5SoPc8Q4i6JMbAGVVHgHsvPXFNMOpBYTShrqXrUqkBQMaoWHCl - +sbttx2ce7O4UnE6//569ebx/qr4clmt/7h3v6ffPn7Izwf92tKVbQSlpRadSQO8i0dHzRgDzYuG - myHFj8gpR3dEZwy4y8oCNdXSYbsBIanaQLSBz9xJv4EdHDB2wanz7cAMh2npuXrpEtfaEK/FNjbd - PiO7biPKZNaZO39EhVRq6fPYIffNoEO/g72QRgKUBysF60xhKSbzC5um81lbFPpb14OTPUiGuOrj - i+XoRLU4QeKy2Xh3yQQXOSY9s79svEykGQDBYPKXYk7VbqeXOvuf8j0gBFrCJLYOEykOB+7THNZv - 8l9pnceNYPDoHqTAmCS6ehsJprxU7UsBX3nCIk6lztBZJ5vnAqmNERcrMcV0toRgF/wFAAD//wMA - zweDvDwEAAA= - headers: - CF-RAY: - - 9b12249359272b52-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:19 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '494' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '755' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_66c078817a964b1db9ca9f64a13fb7ee - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_f5WA9BwjTmQNyJzrFq2SKIhD","type":"function","function":{"name":"get_weather","arguments":"{\"city\":\"Paris\"}"}}]},{"role":"tool","tool_call_id":"call_f5WA9BwjTmQNyJzrFq2SKIhD","content":"It''s - sunny in Paris"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"Get - weather for a city.","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '697' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLLbtswELzrKwieLcM2VDnwtYcg7aFF0UsQBAJNrqRNKS5Brto6gf89 - IO1Ych9ALjrs7IxmhvtSCCHRyJ2QulesB2/Lj3S4/2yelf/UKTqY+tbtb0f97W67/RLu5CIxaP8E - mt9YS02Dt8BI7gTrAIohqa63db2pP2xWqwwMZMAmWue5rKgc0GG5WW2qcrUt1zdndk+oIcqdeCiE - EOIlf5NPZ+C33ImslScDxKg6kLvLkhAykE0TqWLEyMqxXEygJsfgsvXvPYhfoLiHINCJrypgFBhF - HJ07LOekAO0YVTLuRmtngHKOWKXg2e7jGTleDFrqfKB9/IMqW3QY+yaAiuSSmcjkZUaPhRCPuYjx - Kpv0gQbPDdMPyL+7Ofcgp/pn4BljYmVn47f5lVhjgBXaOOtRaqV7MBNzKl2NBmkGFLPIf3v5l/Yp - NrruPfIToDV4BtP4AAb1dd5pLUC6zf+tXSrOhmWE8BM1NIwQ0jMYaNVoTxcj4yEyDE2LroPgA57O - pvVNXVXtem1MZWRxLF4BAAD//wMAShjuZEQDAAA= - headers: - CF-RAY: - - 9b12249c3e4e1e0f-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:20 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '261' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '275' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_abb5b9aeb2e14981a3eb63e7b04aed6b - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_auto_pydantic_ai.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_auto_pydantic_ai.yaml deleted file mode 100644 index 32c50c9d2..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_auto_pydantic_ai.yaml +++ /dev/null @@ -1,112 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '114' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.44.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.15.0 - X-Stainless-Raw-Response: - - 'true' - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLLbtswELzrK7Y8W4Vsq4ntSw8tmvTUBuihDwQCQ64kJhSXIFdtjcD/ - XlCyLbkPoBcddnZGM8N9zgCE0WIHQrWSVedt/rbQhW8/lF/iHX69a8q9evOx+fzp6fGdu7kRi8Sg - h0dUfGK9VNR5i2zIjbAKKBmT6vL6aluUq/X61QB0pNEmWuM5LynvjDP5qliVeXGdLzdHdktGYRQ7 - +JYBADwP3+TTafwpdlAsTpMOY5QNit15CUAEsmkiZIwmsnQsFhOoyDG6wfqtAW4x4Au4pR+gpIP3 - MHJgTz0wabl/PecGrPsok3/XWzsDpHPEMuUfXN8fkcPZp6XGB3qIv1FFbZyJbRVQRnLJU2TyYkAP - GcD90Ed/EVH4QJ3niukJh99tRzUxPcKELY9VCSaWdjY/kS7EKo0sjY2zOoWSqkU9MafuZa8NzYBs - FvlPM3/THmMb1/yP/AQohZ5RVz6gNuoy8LQWMJ3ov9bOFQ+GRcTw3Sis2GBIz6Cxlr0dD0fEfWTs - qtq4BoMPZrye2ler7XpdyO3VZiOyQ/YLAAD//wMAbBhxq0sDAAA= - headers: - CF-RAY: - - 9c1afdbedfc4cf0a-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 22 Jan 2026 00:38:55 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=.v4HHKHusX6vziKsYW5cyVzZRrAsCxp4XT463GaX0yQ-1769042335-1.0.1.1-InjFtjx7UOJ8ivwZeShYpDg8mc4QGt.4kpoe9GlkrPwH7LBqBZxH.e.oLUSXSkyh_t0ETNUXh6C5G5zGSAXLYT6oNyc6cef0jwB2ADi_S.w; - path=/; expires=Thu, 22-Jan-26 01:08:55 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=bHlkcNsEuGGe.AQuXN6zbPWK8MJ2dKBjLFcSS263aVQ-1769042335390-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '395' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '412' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999997' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0cc555f0b9354a85a3b0f965716d99de - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request.yaml deleted file mode 100644 index a5c794049..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '121' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJPb9swDMXv/hQCz/XgGGma5dY/hwHtYZdhHYbCUCXaUSeLqkQHy4p8 - 90FKGjtbC/TiA3981Hs0XwohwGhYCVBryar3trym7Y/b+/bb/XKz+XL1/epPdb293Hy9uXuWW4Kz - pKDHJ1T8qvqkqPcW2ZDbYxVQMqaps4vFol6c11WVQU8abZJ1nss5lb1xpqyrel5WF+VseVCvySiM - sBI/CyGEeMnf5NNp/A0rkWflSo8xyg5hdWwSAgLZVAEZo4ksHcPZCBU5Rpetz6f1gO0QZfLmBmsn - QDpHLFO27OjhQHZHD5Y6H+gx/iOF1jgT101AGcml9yKTh0x3hRAPOetwYh98oN5zw/QL83P1ISqM - Gx7h7MCYWNqJ5rV+MqzRyNLYOFkVKKnWqEfluFc5aEMTUEwi/+/lrdn72MZ1Hxk/AqXQM+rGB9RG - neYd2wKm83uv7bjibBgiho1R2LDBkH6DxlYOdn8UELeRsW9a4zoMPpj9ZbS+QVx8VjW28yUUu+Iv - AAAA//8DAGzyyx0nAwAA - headers: - CF-RAY: - - 9b12249eb844cb86-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:20 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '215' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '231' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_bb6ba9cfa6d14b23972cb655212d4423 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml deleted file mode 100644 index d4ff5c2ee..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '121' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzHBFp5i6BHHGWuTsYqBGubpikG\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973531,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"4\",\n \"refusal\": null,\n - \ \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 20,\n \"completion_tokens\": - 1,\n \"total_tokens\": 21,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a256ab1f178c-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:11 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '807' - openai-organization: - - braintrust-data - openai-processing-ms: - - '392' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=zLt6TNwkPTB2O.Bp3ceD4Ijrj3biQuLYigEMbvthfOs-1774973530.6689873-1.0.1.1-PL.I8XK.cSEDkAeAeA.SAH05Z2qjjTzvfUfqd4fC3.j0tktm6p0Tqb1.Zwy0776VHR2qgoUpogSKSon8qg2QYY179MO.33I7RVvoQMPznp3dxHHWwIBuPqEqxwJZqbZ2; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 31 Mar 2026 - 16:42:11 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_c9480ee8e49349b7a68c3a2767779fd3 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream.yaml deleted file mode 100644 index bfaf7c631..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream.yaml +++ /dev/null @@ -1,135 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MPeP4cTzj"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Bs27rTjKBx"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X84rqwUSyS"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8N28G51ySR"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2g8tmbh4LX"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wOL2L3mpTZ"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pbsyokiCs4"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e3bkAGq7YZ"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aSlrtmsM67"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"S4tkp"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"EbbD8S3NFhz"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224afa86a2f02-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '139' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '151' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f350c8c0bd7e45cd8820c4ad923f3ed7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_complete_output.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_complete_output.yaml deleted file mode 100644 index 521f76025..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_complete_output.yaml +++ /dev/null @@ -1,132 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say exactly: 1, 2, 3"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '139' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HvUSOrR1X"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3XRNwrHSZ4"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"g4LuFspFjU"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iJzlYW6sHx"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u54Cu0s3Ah"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"N4TsEWOfAa"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"P0Yrb0mxLr"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oRPi8xgdex"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"v0uti"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":18,"completion_tokens":7,"total_tokens":25,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ucDxMBoVkf5"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224b27c7c7650-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '127' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '144' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a705aa58e1074dc69f92a9b61c0d25f4 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_sync.yaml deleted file mode 100644 index 36b6250d8..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_stream_sync.yaml +++ /dev/null @@ -1,135 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n4wIfDywj"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"M7nBs8tJ4w"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3AKnil79q5"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tj0YRKsPzd"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3G9IJGTD7B"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ury0XoZd21"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mJX6hpQnaM"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qhlqTCCpyt"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2JL0YHl8QJ"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"DgeyW"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"pdj6Hh5uLUK"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224f9cc5cdbe5-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:35 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '159' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '171' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_fac92d6c619a4d7e94154752dd20d282 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_sync.yaml deleted file mode 100644 index b66d2c659..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_sync.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '121' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNj9MwEIbv+RXWnBvUhtLd7Y0PCSGQENwQWkWuPUkGHI9lT1ZbVv3v - yOlH0gUkLjnMM+/4fSfzVCgFZGGrwHRaTB9c+Zb33z49fPja7j7ufnXODO8e929e0+eX7++aL7DI - Ct79QCNn1QvDfXAoxP6ITUQtmKeubjabavOqWq5G0LNFl2VtkHLNZU+eympZrcvlTbm6Pak7JoMJ - tup7oZRST+M3+/QWH2GrlotzpceUdIuwvTQpBZFdroBOiZJoL7CYoGEv6Efr63k9YjMknb35wbkZ - 0N6z6JxtdHR/IoeLB8dtiLxLz6TQkKfU1RF1Yp/fS8IBRnoolLofsw5X9iFE7oPUwj9xfK46RYVp - wxNcnZiwaDfTnOtXw2qLosml2arAaNOhnZTTXvVgiWegmEX+08vfZh9jk2//Z/wEjMEgaOsQ0ZK5 - zju1Rczn96+2y4pHw5AwPpDBWghj/g0WGz2441FA2ifBvm7ItxhDpONlNKFG3NyZCpv1LRSH4jcA - AAD//wMAv4j40CcDAAA= - headers: - CF-RAY: - - 9b1224a12d343511-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:21 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '176' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '393' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_56901365decf422e9e92f5cb16e01f86 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_with_settings.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_with_settings.yaml deleted file mode 100644 index 6be528c5a..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_direct_model_request_with_settings.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hello"}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false,"temperature":0.7}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBatwwEL37K6Y6r8uuu3U2ewmhJWwPpaUESijBKNLYViJrhDRuu4T9 - 9yJ7s3aaFHrRYd68p/dm5jEDEEaLLQjVSladt/kH2t98/nL1kfR3df/u+jqWXy9bz3K37r+xWCQG - 3d2j4ifWW0Wdt8iG3AirgJIxqa7OyrIo3xfLYgA60mgTrfGcrynvjDN5sSzW+fIsX22O7JaMwii2 - 8CMDAHgc3uTTafwttrBcPFU6jFE2KLanJgARyKaKkDGayNKNno+gIsfoBus7tJbewI5+gZIOPsFI - gD31wKTl/mJODFj3USbzrrd2BkjniGUKP1i+PSKHk0lLjQ90F/+iito4E9sqoIzkkqHI5MWAHjKA - 22EY/bN8wgfqPFdMDzh8dz6qiWkDLzEmlnYqrzaLV7QqjSyNjbNRCiVVi3piTnOXvTY0A7JZ4pde - XtMeUxvX/I/8BCiFnlFXPqA26nneqS1gOs9/tZ0mPBgWEcNPo7BigyFtQWMte3s89LiPjF1VG9dg - 8MGMl1P7CrE8VwXW643IDtkfAAAA//8DADvObQFHAwAA - headers: - CF-RAY: - - 9b1224a7794ad7a7-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '291' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '565' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_06add87a83a4411fabd32d429f347145 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_class_span_names.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_class_span_names.yaml deleted file mode 100644 index d5aab4cf6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_class_span_names.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2?"}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '119' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJBb9swDIXv/hUCr42L2PEaJ7e0wG4Fut62oTBUmXbYyZIm0dm6Iv99 - kJ3G7tYBu/jAj3x6j+ZLIgRQDVsBai9ZdU6nN4fd0/2Pu9u7Tx/peXX4df3F7+j2/vPNLpMlLOKE - fXxCxa9Tl8p2TiOTNSNWHiVjVM3WV+t1kW3KDwPobI06jrWO08KmHRlK82VepMt1mp3E1d6SwgBb - 8TURQoiX4Rt9mhp/wlYsF6+VDkOQLcL23CQEeKtjBWQIFFgahsUElTWMZrCeiwuRC/zeSx1EcTnv - 8tj0QUanptd6BqQxlmVMOvh7OJHj2ZG2rfP2MfwxCg0ZCvvKowzWxNcDWwcDPSZCPAzJ+zdhwHnb - Oa7YfsPhuawY5WDa9wTLE2PLUk/lPF+8I1bVyJJ0mC0OlFR7rKfJacuyr8nOQDKL/LeX97TH2GTa - /5GfgFLoGOvKeaxJvc07tXmMx/ivtvOKB8MQ0B9IYcWEPv6GGhvZ6/FEIDwHxq5qyLTonafxThpX - 5ZvVaik3V2UJyTH5DQAA//8DAFhHeVE1AwAA - headers: - CF-RAY: - - 9b9efaf33bf137c1-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:26:26 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '307' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '324' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e03ef3aa121d4a0a8c12116743ac7d40 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_request_stream_sync_thread_context_propagation.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_request_stream_sync_thread_context_propagation.yaml deleted file mode 100644 index 69ecec3da..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_model_request_stream_sync_thread_context_propagation.yaml +++ /dev/null @@ -1,436 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://www.braintrust.dev/api/apikey/login - response: - body: - string: '{"org_info":[{"id":"5d7c97d7-fef1-4cb7-bda6-7e3756a0ca8e","name":"braintrustdata.com","api_url":"https://staging-api.braintrust.dev","git_metadata":{"fields":["commit","branch","tag","author_name","author_email","commit_message","commit_time","dirty"],"collect":"some"},"is_universal_api":true,"proxy_url":"https://staging-api.braintrust.dev","realtime_url":"wss://realtime.braintrustapi.com"}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Access-Control-Allow-Headers: - - X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, - Content-Type, Date, X-Api-Version - Access-Control-Allow-Methods: - - GET,OPTIONS,PATCH,DELETE,POST,PUT - Access-Control-Allow-Origin: - - '*' - Cache-Control: - - public, max-age=0, must-revalidate - Content-Length: - - '395' - Content-Security-Policy: - - 'script-src ''self'' ''unsafe-eval'' ''wasm-unsafe-eval'' ''strict-dynamic'' - ''nonce-Y2NiZDlhM2MtNGFlNy00OTE1LWE1YjQtZTI3MzcwOTEzZTgx'' *.js.stripe.com - js.stripe.com maps.googleapis.com ; style-src ''self'' ''unsafe-inline'' *.braintrust.dev - btcm6qilbbhv4yi1.public.blob.vercel-storage.com fonts.googleapis.com www.gstatic.com - d4tuoctqmanu0.cloudfront.net; font-src ''self'' data: fonts.gstatic.com btcm6qilbbhv4yi1.public.blob.vercel-storage.com - cdn.jsdelivr.net d4tuoctqmanu0.cloudfront.net fonts.googleapis.com mintlify-assets.b-cdn.net - fonts.cdnfonts.com; object-src ''none''; base-uri ''self''; form-action ''self''; - frame-ancestors ''self''; worker-src ''self'' blob:; report-uri https://o4507221741076480.ingest.us.sentry.io/api/4507221754380288/security/?sentry_key=27fa5ac907cf7c6ce4a1ab2a03f805b4&sentry_environment=production&sentry_release=16; - report-to csp-endpoint-0' - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:13 GMT - Etag: - - '"12n7ok4b5phaz"' - Reporting-Endpoints: - - csp-endpoint-0="https://o4507221741076480.ingest.us.sentry.io/api/4507221754380288/security/?sentry_key=27fa5ac907cf7c6ce4a1ab2a03f805b4&sentry_environment=production&sentry_release=16" - Server: - - Vercel - Strict-Transport-Security: - - max-age=63072000 - X-Bt-Was-Udf-Cached: - - 'true' - X-Clerk-Auth-Message: - - Invalid JWT form. A JWT consists of three parts separated by dots. (reason=token-invalid, - token-carrier=header) - X-Clerk-Auth-Reason: - - token-invalid - X-Clerk-Auth-Status: - - signed-out - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Matched-Path: - - /api/apikey/login - X-Nonce: - - Y2NiZDlhM2MtNGFlNy00OTE1LWE1YjQtZTI3MzcwOTEzZTgx - X-Vercel-Cache: - - MISS - X-Vercel-Id: - - yul1::iad1::l88hm-1774893193654-1b03d5ef0879 - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.33.1 - method: GET - uri: https://staging-api.braintrust.dev/version - response: - body: - string: '{"version":"1.1.31","date_version":"20260330","ff_version":21,"commit":"7e00d36a24f3ee49ce2f75f19d20386636e5519b","deployment_mode":"lambda","deployment_type":"custom","brainstore_default":"force","brainstore_can_contain_row_refs":true,"skip_pg_config":"all","has_realtime_wal_bucket":true,"brainstore_wal_footer_version":"v3","brainstore_wal_use_efficient_format":true,"has_logs2":true,"js":true,"universal":true,"code_execution":true,"logs3_payload_max_bytes":5242880,"control_plane_telemetry":["status","metrics","logs","traces","memprof","usage"]}' - headers: - Connection: - - keep-alive - Content-Length: - - '551' - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:13 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 f4f653453255d3978688a6c5c61be2d6.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - VbidRp8Ziuk63w3KD3joP-ZO7fBoIV_oHTYVlsHGQjWuURLgUMZ-Ow== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab889-1aaac8301c7833580844d4e1;Parent=025690bcec6beb43;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Miss from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - etag: - - W/"227-KBfWb2OrI4L6tO+9HRx1pkjhfrY" - vary: - - Origin - x-amz-apigw-id: - - bDHFmGKEIAMEaqg= - x-amzn-Remapped-content-length: - - '551' - x-amzn-RequestId: - - 031b2887-f4fc-4737-ac70-77fa3d42cc96 - x-bt-internal-trace-id: - - 69cab88900000000055a53298b8a9e38 - status: - code: 200 - message: OK -- request: - body: '{"rows": [{"_is_merge": false, "context": {"caller_filename": "/Users/abhijeetprasad/workspace/braintrust-sdk-python/py/.nox/test_pydantic_ai_integration-latest/lib/python3.13/site-packages/pydantic_ai/direct.py", - "caller_functionname": "_consume_async_stream", "caller_lineno": 360}, "created": - "2026-03-30T17:53:13.604954+00:00", "id": "021ecd8c-ef0b-4705-8491-84b7fd7e44a3", - "input": {"instrument": null, "messages": [{"instructions": null, "kind": "request", - "metadata": null, "parts": [{"content": "Hello", "part_kind": "user-prompt", - "timestamp": "2026-03-30 17:53:13.603675+00:00"}], "run_id": null, "timestamp": - null}], "model": "openai:gpt-4o-mini", "model_request_parameters": null, "model_settings": - null}, "log_id": "g", "metadata": {"model": "gpt-4o-mini", "provider": "openai"}, - "metrics": {"start": 1774893193.604952}, "project_id": "test-pydantic-ai-integration", - "root_span_id": "6c05f860-41f9-4d0b-92d2-53a72ea73045", "span_attributes": {"exec_counter": - 91, "name": "model_request_stream", "type": "llm"}, "span_id": "33c192f1-78db-4d9f-89f7-d6f36bc817aa", - "span_parents": ["c568d22b-66c3-4f43-a610-2f3807e92d60"]}], "api_version": 2}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1152' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://staging-api.braintrust.dev/logs3 - response: - body: - string: '{"Code":"ForbiddenError","Message":"Missing read access to project_log - id test-pydantic-ai-integration, or the project_log does not exist [user_email=abhijeet@braintrustdata.com] - [user_org=braintrustdata.com] [timestamp=1774893194.106]","InternalTraceId":"69cab88a000000001216f8994c57459e","Path":"/logs3","Service":"api"}' - headers: - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:14 GMT - Via: - - 1.1 e8ac579de7fc88986153d8653adf92fc.cloudfront.net (CloudFront), 1.1 da473159f6f131ea8035a6279b0f60aa.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - MsuUmsZgF5KmuHR5gJnlVeocN-0ut6X8N3L4lrOMghuMxf_EFvJerg== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab889-2d61f8540b519af25e9769e5;Parent=5b0c1b4a8c31a605;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Error from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - content-length: - - '322' - etag: - - W/"142-xcxriWqbDXxHzOZANosR4ILTx3M" - vary: - - Origin, Accept-Encoding - x-amz-apigw-id: - - bDHFnEuqIAMEtgg= - x-amzn-RequestId: - - 3aaa6d41-535f-49d1-b1bd-4da058a30870 - x-bt-internal-trace-id: - - 69cab88a000000001216f8994c57459e - status: - code: 403 - message: Forbidden -- request: - body: '{"rows": [{"_is_merge": true, "id": "cb2a81f1-d1ce-46eb-b71f-48f94cc77709", - "log_id": "g", "metrics": {"completion_tokens": 8.0, "duration": 0.002259969711303711, - "end": 1774893189.5945878, "prompt_cache_creation_tokens": 0.0, "prompt_cached_tokens": - 0.0, "prompt_tokens": 14.0, "start": 1774893189.5923278, "time_to_first_token": - 0.0016760826110839844, "tokens": 22.0}, "output": {"finish_reason": "stop", - "kind": "response", "metadata": null, "model_name": "gpt-4o-mini-2024-07-18", - "parts": [{"content": "1, 2, 3.", "id": null, "part_kind": "text", "provider_details": - null, "provider_name": null}], "provider_details": {"finish_reason": "stop", - "timestamp": "2025-12-20 21:13:35+00:00"}, "provider_name": "openai", "provider_response_id": - "chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj", "provider_url": "https://api.openai.com/v1/", - "run_id": null, "timestamp": "2026-03-30 17:53:09.593906+00:00", "usage": {"cache_audio_read_tokens": - 0, "cache_read_tokens": 0, "cache_write_tokens": 0, "details": {"accepted_prediction_tokens": - 0, "audio_tokens": 0, "reasoning_tokens": 0, "rejected_prediction_tokens": 0}, - "input_audio_tokens": 0, "input_tokens": 14, "output_audio_tokens": 0, "output_tokens": - 8}}, "project_id": "test-pydantic-ai-integration", "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", - "span_id": "d47230a5-49a5-4cba-b863-1e479ceac7aa", "span_parents": ["f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e"]},{"_is_merge": - true, "id": "bdcee637-b6ac-4d83-bd0b-d6d5f559b2e0", "log_id": "g", "metrics": - {"completion_tokens": 8.0, "duration": 0.0023889541625976562, "end": 1774893189.59468, - "prompt_cache_creation_tokens": 0.0, "prompt_cached_tokens": 0.0, "prompt_tokens": - 14.0, "start": 1774893189.592291, "time_to_first_token": 0.001712799072265625, - "tokens": 22.0}, "output": {"finish_reason": "stop", "kind": "response", "metadata": - null, "model_name": "gpt-4o-mini-2024-07-18", "parts": [{"content": "1, 2, 3.", - "id": null, "part_kind": "text", "provider_details": null, "provider_name": - null}], "provider_details": {"finish_reason": "stop", "timestamp": "2025-12-20 - 21:13:35+00:00"}, "provider_name": "openai", "provider_response_id": "chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj", - "provider_url": "https://api.openai.com/v1/", "run_id": null, "timestamp": "2026-03-30 - 17:53:09.593906+00:00", "usage": {"cache_audio_read_tokens": 0, "cache_read_tokens": - 0, "cache_write_tokens": 0, "details": {"accepted_prediction_tokens": 0, "audio_tokens": - 0, "reasoning_tokens": 0, "rejected_prediction_tokens": 0}, "input_audio_tokens": - 0, "input_tokens": 14, "output_audio_tokens": 0, "output_tokens": 8}}, "project_id": - "test-pydantic-ai-integration", "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", - "span_id": "f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e", "span_parents": ["7b1235d0-d31d-49ed-8df1-6ae33d4dedf7"]}], - "api_version": 2}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '2826' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://staging-api.braintrust.dev/logs3 - response: - body: - string: '{"Code":"ForbiddenError","Message":"Missing read access to project_log - id test-pydantic-ai-integration, or the project_log does not exist [user_email=abhijeet@braintrustdata.com] - [user_org=braintrustdata.com] [timestamp=1774893194.229]","InternalTraceId":"69cab88a000000006f8e7e21edeefe09","Path":"/logs3","Service":"api"}' - headers: - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:14 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 bd7551a5260a8bac087bad2ac8ebffec.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - U3UXEimOcKVsdV6Lo0Yk8XezNhwfTiQcy__NSvaZ_5xaT8odied-Tw== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab88a-72db82d1703ec6b9651329df;Parent=40e411d20fc278df;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Error from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - content-length: - - '322' - etag: - - W/"142-wDmrkVP8fVfti8Te3LX+0pveJRw" - vary: - - Origin, Accept-Encoding - x-amz-apigw-id: - - bDHFoFWDoAMEbjQ= - x-amzn-RequestId: - - e0b0db62-51f5-451f-8aa4-6e86a0936ec7 - x-bt-internal-trace-id: - - 69cab88a000000006f8e7e21edeefe09 - status: - code: 403 - message: Forbidden -- request: - body: '{"messages":[{"role":"user","content":"Hello"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '124' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"lMoGU7R2O"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"Hello"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"O1qW8o"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VVrBHX6n3h"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - How"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5hWyEXX"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - can"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nVyWCh4"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - I"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"d6to3IExF"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - assist"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JxzI"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"i6J33cg"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - today"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Irdup"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"?"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"R65rXtBVaV"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Bf2lm"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[],"usage":{"prompt_tokens":8,"completion_tokens":9,"total_tokens":17,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"OmfK72y6EWIX"} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8fc3b177116-YYZ - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:14 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - braintrust-data - openai-processing-ms: - - '403' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=IHGiGf.Mtx_0IgVPmpOyr33nU6wJiuBbWv2RKuFyGQ8-1774893193.6401794-1.0.1.1-_WtR5M3BuFYZr5v6J1YF_vcnLZ95nF_kyCjT5FUTaqbdodV8NBNQct8MkpsPKDu12ElhK3j1RUo3KbOi1PcdyyIXNn0Gv6R_R73LtuYWQFstRviblljvfUx8ryTnWuz0; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Mon, 30 Mar 2026 - 18:23:14 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_50755602447c427682158e8e30b526a7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_identical_sequential_streams.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_identical_sequential_streams.yaml deleted file mode 100644 index d3d14eae3..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_identical_sequential_streams.yaml +++ /dev/null @@ -1,401 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gnat2cENQ"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jNso0lvDB8"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"725RaPoKoL"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xwX6S3QVKQ"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PRUOjecqaT"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"D7zv7nDU1k"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kaWRfolrEw"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nxDRXx48YM"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ArC233Ax3q"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"k9ml5"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"njMUeLtfPSB"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12246bb8312590-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:13 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '171' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '418' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_b3f7508e23014bb5b3a6590f7a1745c4 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mrpG2gfnr"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KqII3iAzwu"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pY077J0ITv"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hVFZKhHEll"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5q0E4Aipgr"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SVkT4p2PRw"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"z0JxYWz9CZ"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Yhx947CVn5"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8SvU2h85am"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"HltY4"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"clzo45rSqE6"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224736f8f8e7d-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:14 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '240' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '489' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_13f73e276a5246f7b8770120e77c5bfd - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e6vrbHoPF"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2FLB1kR9AF"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"szhq4G7pLT"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0FrhMhyMc8"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7KNhjjfvdr"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XTPcPMIYpY"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KjFORo18p2"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5ZO6emLP2u"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KglKHdiIqs"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"7A7zk"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"obu0EI4F1U3"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12247b9e892eb7-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:15 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '146' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '390' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_23df3ca5e9104a9492ba6ac711f23720 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_sequential_streams.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_sequential_streams.yaml deleted file mode 100644 index b4e3402f2..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_multiple_sequential_streams.yaml +++ /dev/null @@ -1,268 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qhnOqpIMj"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cTil7PW69p"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0YnAj34Co9"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2OTWUEmJAI"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PzH358Bjix"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LCfdy0Z80P"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Luoz7Ty7RE"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"imLiI1n5XP"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Vwy1Rp8rUH"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"kRAeG"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"sCkh8ATPHhR"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b122483382af514-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:16 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '162' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '181' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_b8eb6c241625442282f4f0519dfae9e7 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vd7IkwFPY"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n4Wkt6VLAo"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UTIlWWs928"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qmxxmaZhzl"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"j9Lclwk8ng"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"V4LeJ42IiW"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wVN2Xpch61"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QDHoCqZz2Q"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KC95XCI89W"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"KxMjU"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"hKfsFUmwYyh"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12248649dd29a5-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:16 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '249' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '262' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_9e59e81aa2714f478345ef8cba60e44c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run.yaml deleted file mode 100644 index d8cbce6c6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNb9swDIbv/hUCz/EQe6nb5LgN27GXoEBRFIYq0Y42SRQkemha5L8P - cj7s7APYxQc+fKn3pfleCAFGw0aA2klWLtjyM+0fP9HX5v7+2/KL3zqXttsHj33zcU9vsMgKevmO - is+qD4pcsMiG/BGriJIxT61um6Zubqp1NQJHGm2W9YHLFZXOeFPWy3pVLm/L6u6k3pFRmGAjngoh - hHgfv9mn1/gKG7FcnCsOU5I9wubSJAREsrkCMiWTWHqGxQQVeUY/Wl/N6xG7IcnszQ/WzoD0nljm - bKOj5xM5XDxY6kOkl/SbFDrjTdq1EWUin99LTAFGeiiEeB6zDlf2IURygVumHzg+V5+iwrThCVYn - xsTSzjTn+tWwViNLY9NsVaCk2qGelNNe5aANzUAxi/ynl7/NPsY2vv+f8RNQCgOjbkNEbdR13qkt - Yj6/f7VdVjwahoTxp1HYssGYf4PGTg72eBSQ9onRtZ3xPcYQzfEyutAiNmtVY7e6g+JQ/AIAAP// - AwDuaeQPJwMAAA== - headers: - CF-RAY: - - 9b12245f08957e95-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:11 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - path=/; expires=Sat, 20-Dec-25 21:43:11 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '431' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_33be6e1c06474f88aa886351e283ddd7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run_with_logfire.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run_with_logfire.yaml deleted file mode 100644 index d8cbce6c6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_no_model_agent_run_with_logfire.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNb9swDIbv/hUCz/EQe6nb5LgN27GXoEBRFIYq0Y42SRQkemha5L8P - cj7s7APYxQc+fKn3pfleCAFGw0aA2klWLtjyM+0fP9HX5v7+2/KL3zqXttsHj33zcU9vsMgKevmO - is+qD4pcsMiG/BGriJIxT61um6Zubqp1NQJHGm2W9YHLFZXOeFPWy3pVLm/L6u6k3pFRmGAjngoh - hHgfv9mn1/gKG7FcnCsOU5I9wubSJAREsrkCMiWTWHqGxQQVeUY/Wl/N6xG7IcnszQ/WzoD0nljm - bKOj5xM5XDxY6kOkl/SbFDrjTdq1EWUin99LTAFGeiiEeB6zDlf2IURygVumHzg+V5+iwrThCVYn - xsTSzjTn+tWwViNLY9NsVaCk2qGelNNe5aANzUAxi/ynl7/NPsY2vv+f8RNQCgOjbkNEbdR13qkt - Yj6/f7VdVjwahoTxp1HYssGYf4PGTg72eBSQ9onRtZ3xPcYQzfEyutAiNmtVY7e6g+JQ/AIAAP// - AwDuaeQPJwMAAA== - headers: - CF-RAY: - - 9b12245f08957e95-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:11 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - path=/; expires=Sat, 20-Dec-25 21:43:11 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '431' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_33be6e1c06474f88aa886351e283ddd7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_buffer_pattern_early_return.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_buffer_pattern_early_return.yaml deleted file mode 100644 index cfb4ee992..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_buffer_pattern_early_return.yaml +++ /dev/null @@ -1,158 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZamzQnojU"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WWiXPzjJq9"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gJNmPgBuw9"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yGsyFEVtPi"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yH3IrPgjP0"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AK15hNn7i8"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"utG5gHCktq"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yWv3vIP7ZQ"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1OeK68RpYQ"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"smaOaaYOkb"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e5P3fw7bpW"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5EN0R7Zjip"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VGFZvNLTGn"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"99xgz0I5Lo"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AZq6oNiZ98"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"D2sJG"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":14,"total_tokens":28,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ZY2sBQm81c"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b9efae1781ed56a-SJC - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Tue, 06 Jan 2026 23:26:23 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - path=/; expires=Tue, 06-Jan-26 23:56:23 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '182' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '197' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_34b4a10ec004419fb01e9f6cf1585a92 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_early_break_async_generator.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_early_break_async_generator.yaml deleted file mode 100644 index d171dce19..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_stream_early_break_async_generator.yaml +++ /dev/null @@ -1,314 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.33.1 - method: GET - uri: https://staging-api.braintrust.dev/version - response: - body: - string: '{"version":"1.1.31","date_version":"20260330","ff_version":21,"commit":"7e00d36a24f3ee49ce2f75f19d20386636e5519b","deployment_mode":"lambda","deployment_type":"custom","brainstore_default":"force","brainstore_can_contain_row_refs":true,"skip_pg_config":"all","has_realtime_wal_bucket":true,"brainstore_wal_footer_version":"v3","brainstore_wal_use_efficient_format":true,"has_logs2":true,"js":true,"universal":true,"code_execution":true,"logs3_payload_max_bytes":5242880,"control_plane_telemetry":["status","metrics","logs","traces","memprof","usage"]}' - headers: - Connection: - - keep-alive - Content-Length: - - '551' - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:10 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 0260b26200cba81bc8e0dc18d51916d8.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - Rutphtid1FBgIKTDJbyYk8gNAU97BOpNPtX1xDZMaleONeKJ3s38Iw== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab886-77d423473139f3c74b00cea3;Parent=06a3bc64aa61c425;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Miss from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - etag: - - W/"227-KBfWb2OrI4L6tO+9HRx1pkjhfrY" - vary: - - Origin - x-amz-apigw-id: - - bDHFBHTxIAMErhA= - x-amzn-Remapped-content-length: - - '551' - x-amzn-RequestId: - - 51a738b6-ac50-428b-a776-be56711c5922 - x-bt-internal-trace-id: - - 69cab886000000002c579ac6ee72eb06 - status: - code: 200 - message: OK -- request: - body: '{"rows": [{"_is_merge": false, "context": {"caller_filename": "/Users/abhijeetprasad/workspace/braintrust-sdk-python/py/.nox/test_pydantic_ai_integration-latest/lib/python3.13/site-packages/pydantic_ai/direct.py", - "caller_functionname": "_consume_async_stream", "caller_lineno": 360}, "created": - "2026-03-30T17:53:09.592213+00:00", "id": "bdcee637-b6ac-4d83-bd0b-d6d5f559b2e0", - "input": {"instrument": null, "messages": [{"instructions": null, "kind": "request", - "metadata": null, "parts": [{"content": "Count from 1 to 3", "part_kind": "user-prompt", - "timestamp": "2026-03-30 17:53:09.591693+00:00"}], "run_id": null, "timestamp": - null}], "model": "openai:gpt-4o-mini", "model_request_parameters": null, "model_settings": - null}, "log_id": "g", "metadata": {"model": "gpt-4o-mini", "provider": "openai"}, - "metrics": {"start": 1774893189.592212}, "project_id": "test-pydantic-ai-integration", - "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", "span_attributes": {"exec_counter": - 58, "name": "model_request_stream", "type": "llm"}, "span_id": "f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e", - "span_parents": ["7b1235d0-d31d-49ed-8df1-6ae33d4dedf7"]},{"_is_merge": false, - "context": {"caller_filename": "/Users/abhijeetprasad/workspace/braintrust-sdk-python/py/.nox/test_pydantic_ai_integration-latest/lib/python3.13/site-packages/pydantic_ai/direct.py", - "caller_functionname": "_consume_async_stream", "caller_lineno": 360}, "created": - "2026-03-30T17:53:09.592300+00:00", "id": "cb2a81f1-d1ce-46eb-b71f-48f94cc77709", - "input": {"messages": [{"instructions": null, "kind": "request", "metadata": - null, "parts": [{"content": "Count from 1 to 3", "part_kind": "user-prompt", - "timestamp": "2026-03-30 17:53:09.591693+00:00"}], "run_id": null, "timestamp": - null}]}, "log_id": "g", "metadata": {"model": "gpt-4o-mini", "provider": "openai"}, - "metrics": {"start": 1774893189.592299}, "project_id": "test-pydantic-ai-integration", - "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", "span_attributes": {"exec_counter": - 59, "name": "chat gpt-4o-mini", "type": "llm"}, "span_id": "d47230a5-49a5-4cba-b863-1e479ceac7aa", - "span_parents": ["f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e"]}], "api_version": 2}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '2186' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://staging-api.braintrust.dev/logs3 - response: - body: - string: '{"Code":"ForbiddenError","Message":"Missing read access to project_log - id test-pydantic-ai-integration, or the project_log does not exist [user_email=abhijeet@braintrustdata.com] - [user_org=braintrustdata.com] [timestamp=1774893190.508]","InternalTraceId":"69cab886000000002541a41a062b3821","Path":"/logs3","Service":"api"}' - headers: - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:10 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 c2397f8122d12a766778848b1e46618c.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - d73rTtpa6LLDwu7hVQKfmSYL_SSkYfPKbkMviRoaI0PhG9JcQdcc0A== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab886-4aa46ad25fe765fa582e040e;Parent=796a754107031849;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Error from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - content-length: - - '322' - etag: - - W/"142-o3U2Y50CsoSuWcGoGfpU85I9aag" - vary: - - Origin, Accept-Encoding - x-amz-apigw-id: - - bDHFCF_-IAMEsQQ= - x-amzn-RequestId: - - 071836c2-6481-4fe4-82c8-63a2f60f3811 - x-bt-internal-trace-id: - - 69cab886000000002541a41a062b3821 - status: - code: 403 - message: Forbidden -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Cookie: - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000; - __cf_bm=K5ScKgWxKV8qrun72h6zWqwqzuox1P7HfwixJPaisaU-1774893183.0866485-1.0.1.1-aFlnpoUkbkAngI0favlhLoCOJtcaN7dUO6bYg0g4jfC.HRhU3s_NrZt7oH01lSi39dR_xL9hFmrQs2o5en0gk0jRe0MRJTasLHnGP6o4.yXI0SZeUn56WYYaGKfOKVTx - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GJC9P5OdK"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"Sure"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1P1UjOI"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZlSk142ecs"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - Here"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4yabYK"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"grCdnO7"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Nhi1EPE9"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"M7DzNi5HGu"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2IAA3kRV0b"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RhdCx21T32"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"N2k2EsOSJW"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KcDwfb76mt"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7lR6LaTkCm"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wdhkGWENkw"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Kv82utB0v1"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mr5lS7vtdA"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s9xOzGrc1a"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u42PFlFCKS"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6FjYL9XiZG"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jJ789GMJk1"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xaM26X2ccz"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VEKM6MTL9y"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DWYxA5bszQ"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"ky8MR"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":21,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"jlxaAs828P"} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8e32964076d-YYZ - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:10 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - braintrust-data - openai-processing-ms: - - '372' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_9b03c171263a4211b5037eff9b1a4723 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_creates_spans.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_creates_spans.yaml deleted file mode 100644 index 9a2fce271..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_creates_spans.yaml +++ /dev/null @@ -1,216 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"}],"model":"gpt-4o-mini","max_completion_tokens":500,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"type":"string"},"a":{"type":"number"},"b":{"type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '468' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNda9swFH33rxD3OR6J69WJ37LBYB1kHXSwMRdzI98k2mRJk+Rubch/ - L5ZT20kzmB+MuEfn3HM/tI8YA1FBzoDv0PPayPj9w/L3/NvqM37I9N1H+TX9I7Lstl5Nv4j0BiYt - Q69/EvcvrDdc10aSF1p1MLeEnlrVWXadZWmSTqcBqHVFsqVtjY9THddCiTiZJmk8zeLZ/MjeacHJ - Qc5+RIwxtg//1qeq6C/kLGiFSE3O4ZYg7y8xBlbLNgLonHAelYfJAHKtPKnWumqkHAFea1lylHJI - 3H370XloFkpZvvt+s6S0soTJavmEePvEF8s7/2mUr5N+NMHQplG8b9II7+P5WTLGQGFNx4S8kejp - jMwYoN02NSnfGod9AdqQxVavgLyAupFeGPlYwKQALCCfJdmkgHUBebo4wInYIbp0vh91ydKmcShf - tw+V0j5kDf27PyKHflRSb43Va3dGhY1Qwu1KS+hCB8aDiF6MBAvQnMwajNW18aXXvygkfTvvRGFY - xwFMZkfQa49yiGeLyQW1siKPIqxCv30c+Y6qgTlsITaV0CMgGlX+2swl7a56obb/Iz8AnJPxVJXG - UiX4acHDNUvtY/3Xtb7HwTA4sg+CU+kF2XYaFW2wkd0TAvfoPNXlRqgtWWNFeEewMWWyuLqa4uJ6 - PofoED0DAAD//wMA8jx53VUEAAA= - headers: - CF-RAY: - - 9b9f050f588cfa4a-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:33:20 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '570' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '585' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_bf3237ddd052415f9c4b09fee6dcbb30 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_BYJAe4drea2NAzaaPzc9ATtK","type":"function","function":{"name":"calculate","arguments":"{\"operation\":\"multiply\",\"a\":127,\"b\":49}"}}]},{"role":"tool","tool_call_id":"call_BYJAe4drea2NAzaaPzc9ATtK","content":"6223.0"}],"model":"gpt-4o-mini","max_completion_tokens":500,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"type":"string"},"a":{"type":"number"},"b":{"type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '752' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4yST2/bMAzF7/4Ugs51YTtG7OS2dtjQATvtMGBDYSgSbXOVJVWii2RFvvsgJ42d - /QF28YE/Pvrxia8JYxwV3zIue0FycDq9f3n3XOPPw8O3w9PHT3dfHj7XX/t9/f7ZiP0HfhMVdvcD - JL2pbqUdnAZCa05YehAEcWperauqLMosm8BgFego6xylpU0HNJgWWVGmWZXm9VndW5QQ+JZ9Txhj - 7HX6Rp9GwZ5v2TRrqgwQguiAby9NjHFvdaxwEQIGEob4zQylNQRmsp4XFRtGTeg0gmK7Ays3DANb - F8Xqdqnx0I5BRN9m1HoBhDGWRNx7cvt4JseLP2075+0u/CblLRoMfeNBBGuil0DW8YkeE8YepxzG - q9W483Zw1JB9gul3m3MMfE5/hnl+hmRJ6EU9ewNX4xoFJFCHRZBcCtmDmqVz6mJUaBcgWSz9p5u/ - zT4tjqb7n/EzkBIcgWqcB4XyeuO5zUM8zn+1XUKeDPMA/gUlNITg40MoaMWoTyfDwyEQDE2LpgPv - PJ7upnVNsVmtMrFZ1zVPjskvAAAA//8DAJ++QQRFAwAA - headers: - CF-RAY: - - 9b9f05143d609465-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:33:21 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '612' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '637' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_2934d61385c34a9dad5e9f0b5a7b5721 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml deleted file mode 100644 index 5ecd07aca..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml +++ /dev/null @@ -1,217 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"","parameters":{"additionalProperties":false,"properties":{"city":{"type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '372' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - __cf_bm=epAi6KrcpiRht5_zKqAbs_ZkpcP6bWzSCDoNAhVSQcg-1774973531.7748783-1.0.1.1-eexwuoEVNhxJeFCArlDcDavolPepARox5VsLLlCOfl17u1yyKZAxen8yKFPrew9xF3zVGlK3_FSx59t5p8RKNEk1f83tfxWC6HF_lbbsUvSvr3Wt1mbPvGIdnDbSfyDL - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzIVqFFl74aixNWy61pqlKSLtm7\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973532,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n - \ \"id\": \"call_wcgZ1wAdiVEmHWxtAmhLUoz2\",\n \"type\": - \"function\",\n \"function\": {\n \"name\": \"get_weather\",\n - \ \"arguments\": \"{\\\"city\\\":\\\"Paris\\\"}\"\n }\n - \ }\n ],\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 43,\n \"completion_tokens\": - 14,\n \"total_tokens\": 57,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_e738e3044b\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a260ae9436d0-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '1084' - openai-organization: - - braintrust-data - openai-processing-ms: - - '527' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f52a7793909d4febb7d8282622d2a13c - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_wcgZ1wAdiVEmHWxtAmhLUoz2","type":"function","function":{"name":"get_weather","arguments":"{\"city\":\"Paris\"}"}}]},{"role":"tool","tool_call_id":"call_wcgZ1wAdiVEmHWxtAmhLUoz2","content":"It''s - sunny in Paris"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"","parameters":{"additionalProperties":false,"properties":{"city":{"type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '644' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - __cf_bm=epAi6KrcpiRht5_zKqAbs_ZkpcP6bWzSCDoNAhVSQcg-1774973531.7748783-1.0.1.1-eexwuoEVNhxJeFCArlDcDavolPepARox5VsLLlCOfl17u1yyKZAxen8yKFPrew9xF3zVGlK3_FSx59t5p8RKNEk1f83tfxWC6HF_lbbsUvSvr3Wt1mbPvGIdnDbSfyDL - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzJr38yaFUi6ANuIRoeJAjXIBrO\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973533,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The weather in Paris is currently sunny.\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 69,\n \"completion_tokens\": 9,\n \"total_tokens\": 78,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_78db9bf1f6\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a264add7c8b2-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:13 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '846' - openai-organization: - - braintrust-data - openai-processing-ms: - - '429' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e05560b30a4e4fabaf1166c1fe903df1 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_wrapper_agent_run_is_traced.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_wrapper_agent_run_is_traced.yaml deleted file mode 100644 index aa0b0d072..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/0.1.9/test_wrapper_agent_run_is_traced.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzHBw20ZdgFxQ8hDmn74NllhQob\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973531,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"4\",\n \"refusal\": null,\n - \ \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 20,\n \"completion_tokens\": - 1,\n \"total_tokens\": 21,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a25d9cd94cc4-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '807' - openai-organization: - - braintrust-data - openai-processing-ms: - - '377' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=epAi6KrcpiRht5_zKqAbs_ZkpcP6bWzSCDoNAhVSQcg-1774973531.7748783-1.0.1.1-eexwuoEVNhxJeFCArlDcDavolPepARox5VsLLlCOfl17u1yyKZAxen8yKFPrew9xF3zVGlK3_FSx59t5p8RKNEk1f83tfxWC6HF_lbbsUvSvr3Wt1mbPvGIdnDbSfyDL; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 31 Mar 2026 - 16:42:12 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_8d78179fe6524c99a93e2eb714045e9c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_async.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_async.yaml deleted file mode 100644 index d8cbce6c6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_async.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNb9swDIbv/hUCz/EQe6nb5LgN27GXoEBRFIYq0Y42SRQkemha5L8P - cj7s7APYxQc+fKn3pfleCAFGw0aA2klWLtjyM+0fP9HX5v7+2/KL3zqXttsHj33zcU9vsMgKevmO - is+qD4pcsMiG/BGriJIxT61um6Zubqp1NQJHGm2W9YHLFZXOeFPWy3pVLm/L6u6k3pFRmGAjngoh - hHgfv9mn1/gKG7FcnCsOU5I9wubSJAREsrkCMiWTWHqGxQQVeUY/Wl/N6xG7IcnszQ/WzoD0nljm - bKOj5xM5XDxY6kOkl/SbFDrjTdq1EWUin99LTAFGeiiEeB6zDlf2IURygVumHzg+V5+iwrThCVYn - xsTSzjTn+tWwViNLY9NsVaCk2qGelNNe5aANzUAxi/ynl7/NPsY2vv+f8RNQCgOjbkNEbdR13qkt - Yj6/f7VdVjwahoTxp1HYssGYf4PGTg72eBSQ9onRtZ3xPcYQzfEyutAiNmtVY7e6g+JQ/AIAAP// - AwDuaeQPJwMAAA== - headers: - CF-RAY: - - 9b12245f08957e95-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:11 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - path=/; expires=Sat, 20-Dec-25 21:43:11 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '431' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_33be6e1c06474f88aa886351e283ddd7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream.yaml deleted file mode 100644 index df0a9eb10..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream.yaml +++ /dev/null @@ -1,155 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AdmWDxOKK"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"99PF7nJyxt"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PwQJtYjWkW"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RWDd73VIGm"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"k9VcEaTPe8"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UbeAPy03Nm"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZPEZJoyoEX"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SxJvohEmis"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PI7a8tVNM5"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2XRGzzU6oQ"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Q2nugXZUaQ"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hZ24zrrpjf"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dxzuS0d72f"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KQ60YPfF8R"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BIXonJxprK"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"SXpgc"} - - - data: {"id":"chatcmpl-CoyYIJD9oebTHQSO9Cv4CtTZen2g4","object":"chat.completion.chunk","created":1766265198,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":14,"total_tokens":28,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ah4xZweSQB"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12248a4ae8c8c1-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:18 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '156' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '397' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a86fc882a88544e99a2b0c6ddc4bde91 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_events.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_events.yaml deleted file mode 100644 index 3a43dcb6c..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_events.yaml +++ /dev/null @@ -1,137 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 5+5?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '159' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NUHnuwR08"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZxdaiRZ15E"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - +"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7rq4MBlNH"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ObRsp96GEh"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5XlMYqCpfe"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - equals"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7n2I"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MWAuNaxyKW"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"10"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ogW5F7bn3"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HwNpcoLKIK"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"eBByw"} - - - data: {"id":"chatcmpl-CoyYYeUWSXMSmrqMmtP4fxamq4vM2","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"lNcNmJTv02s"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224f70f467b5d-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:34 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '117' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '138' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a039650e8c8d4f6b87f790ee240c501b - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_structured_output.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_structured_output.yaml deleted file mode 100644 index 8b83f68d3..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_structured_output.yaml +++ /dev/null @@ -1,148 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Create a product: wireless mouse - for $29.99"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":true,"stream_options":{"include_usage":true},"tool_choice":"required","tools":[{"type":"function","function":{"name":"final_result","description":"The - final response which ends this conversation","parameters":{"properties":{"name":{"type":"string"},"price":{"type":"number"}},"required":["name","price"],"type":"object","additionalProperties":false},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '512' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_A7KZPr5kGAGlQ8C14181Vvhy","type":"function","function":{"name":"final_result","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yV5"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"j76iAcp9Zs3oMK"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"name"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2MtYagUE81M7o"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FasttgVbZD6W"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Wireless"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"l1SBzPzwz"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" - Mouse"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"evH1cpoojIm"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\",\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fT6Didfgz79L"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"price"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"i8p4r5f2lT24"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HaIM50EfiNrPrj"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"29"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0V8wqhtTL1LTzP6"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"."}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"99"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gZKaSe6ldngLtzx"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"58dnVPO5fMDckIz"} - - - data: {"id":"chatcmpl-CoyYfvJOAErG7o9IjpyQTI56Jm26M","object":"chat.completion.chunk","created":1766265221,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[],"usage":{"prompt_tokens":60,"completion_tokens":21,"total_tokens":81,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"vIuzr9NdNr"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12251efed97bbc-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:41 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '332' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '346' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f46c423eba984813a50f693c8688b0e1 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_sync.yaml deleted file mode 100644 index 74a0267e8..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_stream_sync.yaml +++ /dev/null @@ -1,135 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oe7NKLwxb"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zo9uTp8rAl"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7XCXxDmcSS"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"orSNgjHbts"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"o9b0bnf5qQ"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6BUHljfKiI"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RnwAlJA5TO"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JmdjUZhcL8"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rymGleA07L"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"D7TJg"} - - - data: {"id":"chatcmpl-CoyYYrogfLrG7d51VXOhGpHq4gnt5","object":"chat.completion.chunk","created":1766265214,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"wiavNQU8pii"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224f44c3edb9e-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:34 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '135' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '149' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_29dbb17aab2d4dcc9b5ee70fc1abbf4d - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_sync.yaml deleted file mode 100644 index 9113bfa2a..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_run_sync.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4ySz27bMAzG734Kged4iJ0sbXLLdiv6Au1QGIpE21pkUZXobkGRdx/k/LGztcAu - PvDHj/o+mu+ZEGA0bASoVrLqvM2/0+Hp2yJS9/DIu8au94vXUm77X9tnWbcwSwra/UTFF9UXRZ23 - yIbcCauAkjFNLe5Wq3L1tVgXA+hIo02yxnO+pLwzzuTlvFzm87u8uD+rWzIKI2zEj0wIId6Hb/Lp - NP6GjZjPLpUOY5QNwubaJAQEsqkCMkYTWTqG2QgVOUY3WF9O6wHrPsrkzfXWToB0jlimbIOjlzM5 - Xj1YanygXfxLCrVxJrZVQBnJpfcik4eBHjMhXoas/Y198IE6zxXTHofnynNUGDc8wuLMmFjaieZS - vxlWaWRpbJysCpRULepROe5V9trQBGSTyP96+Wj2KbZxzf+MH4FS6Bl15QNqo27zjm0B0/l91nZd - 8WAYIoY3o7BigyH9Bo217O3pKCAeImNX1cY1GHwwp8uofYW4WqsS6+U9ZMfsDwAAAP//AwC3+s74 - JwMAAA== - headers: - CF-RAY: - - 9b1224663bb9a2b3-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '203' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '327' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_471863fd12ea4712a0185373c2a05e92 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_buffer_pattern_early_return.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_buffer_pattern_early_return.yaml deleted file mode 100644 index 7fde16c6b..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_buffer_pattern_early_return.yaml +++ /dev/null @@ -1,155 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bcINBiIzl"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DCree7eBPf"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pvpGblJa0X"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zRnt5XEcWz"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UtcHdzjdyH"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"A4GU9GCwHo"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"m2BBvPGr6j"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UbxH3vm9ow"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Y1BpRkh1BN"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2vNoNGTR1h"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GOZPS2oFlB"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"y3icxduW8C"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qmGHVCeBOa"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PhMdSCHOag"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CsnAjtFZFs"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"ckCs2"} - - - data: {"id":"chatcmpl-CvAjPgfJoxisksYFBHrXJqNM9GHNG","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":14,"total_tokens":28,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"SaUfw2TISU"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b9efae57a0fed40-SJC - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Tue, 06 Jan 2026 23:26:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '170' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_78143cd211f04c098aa5fe0c40067451 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_early_break.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_early_break.yaml deleted file mode 100644 index fd6646850..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_stream_early_break.yaml +++ /dev/null @@ -1,230 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 10"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '165' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4pQPbm5sP"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"Sure"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wrvJkdl"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"A2vKajCbCQ"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - Here"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bC0UbU"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BDapODD"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YDXHLAr8"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cL9BEeScpw"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kf4hXtU8II"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Tff3zmLZyx"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"svWLZ07ECm"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VfjmbYCm8f"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X8Q1CXgcd4"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"udNT2lSgTS"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jWwKJ2GgAh"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KrLIOlJR3v"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bH26cIHKyt"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LlOvHHhjtf"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pA0yAxQg5g"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZCxMVAVuth"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"crhyHB7U1I"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ssgOE7sSk6"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"modwaj7i7y"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9fU2BvvFtU"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"6"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FJBqC1w2pl"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HS9kSQFA1R"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iGnOI7Jy3e"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"7"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iKxFMYIhFG"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LtlwQXjWJ5"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"leamnKRf87"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"8"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"U5UoyjZdqc"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"76CDhGsCQ1"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fRyotHGhbg"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"9"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LSe7QhEaMZ"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BmBnuWlc1i"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mlUCXZHbke"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"10"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AEcwdXOyQ"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tGgCDyMBr7"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"VMIGo"} - - - data: {"id":"chatcmpl-CoyYaXx5R6G5GRkk9MNIAWNELLPmb","object":"chat.completion.chunk","created":1766265216,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":36,"total_tokens":50,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"oJyVAU56Sv"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b122500fc37f554-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:36 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '143' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '156' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_bc33e098e9454cf38129178ac688bf90 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_structured_output.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_structured_output.yaml deleted file mode 100644 index b9c80df3f..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_structured_output.yaml +++ /dev/null @@ -1,117 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 10 + 15?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"required","tools":[{"type":"function","function":{"name":"final_result","description":"The - final response which ends this conversation","parameters":{"properties":{"answer":{"type":"integer"},"explanation":{"type":"string"}},"required":["answer","explanation"],"type":"object","additionalProperties":false},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '463' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.10.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFPLbtswELzrKxZ7rR1YrmQnAnpqegh6aNMWaY06EGhyLbGhSIakmgqG - /72gHFvKo0B1EIgdzuzsg7sEAKXAApDXLPDGqul701X3Fyt/933hL7vu6vrmQ37NV6kOl/YBJ5Fh - Nr+IhyPrjJvGKgrS6APMHbFAUTVdLhbzRb6cn/dAYwSpSKtsmGZm2kgtp/PZPJvOltP0/JFdG8nJ - YwE/EwCAXf+PPrWgP1jAbHKMNOQ9qwiL0yUAdEbFCDLvpQ9MB5wMIDc6kI7WdavUCAjGqJIzpYbE - h283Og/NYkqVqy8XX1f3QrD0x1vx+arLbj7dZM1HO8p3kO5sb2jban5q0gg/xYtnyQBQs+bAlZqp - 0pFvVXjGB0DmqrYhHaJ33K2Raf9Abo3FPJ+skf5YxTSLKdZYrPFbTeDbBswW0hkwLSDNQXrgTPFW - xcnBpgMmhNQVhJogPBjQbbMh5yGYikJNrojcN5H5Dub52Rr3+MTVPnntfDvquKNt65l6OQqmtQm9 - 3X4Wt4/I/jR2ZSrrzMY/o8YmSV+XjpjvuzkeanI00lvA9sneoHWmsaEM5o76pPnyIIrDag9glj2C - wQSmhng6SyevyJWCApP9Xp1WmTNekxiow0qzVkgzApJR6S/dvKZ9KF/q6n/kB4BzsoFEaR0JyZ9W - PFxzFF/+v66dmtwbRk/ut+RUBkkujkPQlh33F33nAzXlVuqKnHWyf5S4tSXP8vN8k28uOCb75C8A - AAD//wMAKCKONqIEAAA= - headers: - CF-RAY: - - 9b1231843ca711d4-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:22:10 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=tjfDIbVtlGKAySVR9I771x5d5TWJXazLALWLBWelkn0-1766265730-1.0.1.1-HqfmmM2hjszgNJVDnEr3.JxzdI19yHvDV.USX_bmGPcPu98d5uB53IXS8BksoX1IiWnwdm5byGI0XFP_aigP1sJV05q360okqKwIfMssHtA; - path=/; expires=Sat, 20-Dec-25 21:52:10 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '1443' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1464' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_d19b9ce7cbd7481b87acf1bb92d8e5b9 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_binary_content.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_binary_content.yaml deleted file mode 100644 index 88a06ad1f..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_binary_content.yaml +++ /dev/null @@ -1,115 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="},"type":"image_url"},{"text":"What - color is this image?","type":"text"}]}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '315' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBbtswDL37Kwid4yJ20yTNcTsMKDAMA4aixVAYskTbXGVJk+gtRZF/ - H+Sksdt1wC468PFR7z3yOQMQpMUOhOokq96b/KN7uq9vbvf3d58/fOIv+5/t9ba4qcvyrrn9KhaJ - 4eofqPiFdaFc7w0yOXuEVUDJmKYWm/W6XF+VxWYEeqfRJFrrOV+5vCdLebksV/lykxfbE7tzpDCK - HXzPAACexzfptBr3YgfLxUulxxhli2J3bgIQwZlUETJGiiwti8UEKmcZ7Sj9W4dAvWwRKEJtpHoE - aTX87ohxAQ1KHgLZFiRESv5OPW5gQxbBNSDBY4jOXsx/CNgMUSaXdjBmBkhrHcuU0ujt4YQczm6M - a31wdXxDFQ1Zil0VUEZnk/LIzosRPWQAD2Nqw6sghA+u91yxe8Txu+1VcXkcKKZtTXCxPoHsWJo5 - rbxevDOx0siSTJwlL5RUHeqJO61JDprcDMhmvv+W897so3ey7f+MnwCl0DPqygfUpF5bntoCpmv+ - V9s551GwiBh+kcKKCUPahcZGDuZ4YyI+Rca+asi2GHyg46E1vtrWtbrc1itdi+yQ/QEAAP//AwAU - sfncdgMAAA== - headers: - CF-RAY: - - 9b1225071c71102c-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:38 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '1288' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1306' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-input-images: - - '50000' - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-input-images: - - '49999' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999227' - x-ratelimit-reset-input-images: - - 1ms - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_4c8353513e384112a1594c46e28d4db5 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_custom_settings.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_custom_settings.yaml deleted file mode 100644 index 3b1f1e7ee..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_custom_settings.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hello"}],"model":"gpt-4o-mini","max_completion_tokens":20,"stream":false,"temperature":0.5,"top_p":0.9}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '146' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFJNb9swDL37V3A6x0PiZkmaSw/b0I9t520YCkORaEerLAoSnc0r8t8H - 2W3srh3Qiw58fE/vkbzPAITRYgtC7SWrxtv8PXXfv/nPl4cvuz+Hg/741XY36x3qT+HGfBCzxKDd - T1T8yHqrqPEW2ZAbYBVQMibVxXq1KlbvisVZDzSk0SZa7TlfUt4YZ/JiXizz+TpfbB7YezIKo9jC - jwwA4L5/k0+n8bfYwnz2WGkwRlmj2J6aAEQgmypCxmgiS8diNoKKHKPrrV+htfQGrugXKOngGgYC - dNQCk5bdxZQYsGqjTOZda+0EkM4RyxS+t3z7gBxPJi3VPtAu/kMVlXEm7suAMpJLhiKTFz16zABu - +2G0T/IJH6jxXDLdYf/d+aAmxg08x5hY2rG82Mxe0Co1sjQ2TkYplFR71CNznLtstaEJkE0SP/fy - kvaQ2rj6NfIjoBR6Rl36gNqop3nHtoDpPP/Xdppwb1hEDAejsGSDIW1BYyVbOxyNiF1kbMrKuBqD - D2a4nMqXiKtzVWC13IjsmP0FAAD//wMA+CXNH0cDAAA= - headers: - CF-RAY: - - 9b1224f15fb22b78-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:34 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '279' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '294' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_46866b81830e435ea4b5749d64ff9f96 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_document_input.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_document_input.yaml deleted file mode 100644 index de52bd727..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_document_input.yaml +++ /dev/null @@ -1,110 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"file":{"file_data":"data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqIDIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iaiAzIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNjEyIDc5Ml0vQ29udGVudHMgNCAwIFI+PmVuZG9iaiA0IDAgb2JqPDwvTGVuZ3RoIDQ0Pj5zdHJlYW0KQlQgL0YxIDEyIFRmIDEwMCA3MDAgVGQgKFRlc3QgRG9jdW1lbnQpIFRqIEVUCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDUKMDAwMDAwMDAwMCA2NTUzNSBmCjAwMDAwMDAwMDkgMDAwMDAgbgowMDAwMDAwMDU4IDAwMDAwIG4KMDAwMDAwMDExNSAwMDAwMCBuCjAwMDAwMDAyMTQgMDAwMDAgbgp0cmFpbGVyPDwvU2l6ZSA1L1Jvb3QgMSAwIFI+PgpzdGFydHhyZWYKMzA3CiUlRU9G","filename":"filename.pdf"},"type":"file"},{"text":"What - is in this document?","type":"text"}]}],"model":"gpt-4o-mini","max_completion_tokens":150,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '816' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4xTTW/bMAy9+1cQOidBkjofzW1dDsutA3bZ1sJQJDpWJ4uaRKcJivz3QU4au10H - 7KIDH98j+Ui9ZADCaLECoSrJqvZ2+Hn/6enrvf8dVL6eo1wfljK/+65dae5+zMUgMWj7hIpfWSNF - tbfIhtwZVgElY1KdLOaLRT65XeYtUJNGm2g7z8OchrVxZjgdT/PheDGcLC/siozCKFbwMwMAeGnf - 1KfTeBArGA9eIzXGKHcoVtckABHIpoiQMZrI0rEYdKAix+ja1jcM0nuUIcKRGmi8JalRgwRNqqnR - MbBhixoexDeMDOtLePQg4As94x7DADbgEDUwAR5kbRyC4QiXMjHFfaC90QgSYlPXMhyBAmhkaZK2 - cSWFWibzRnBvUUaEiqwGcvBcGYuwAU3Ayef+IAHLJspkpmus7QHSOeJWr7Xw8YKcrqZZ2vlA2/iO - KkrjTKyKgDKSSwZFJi9a9JQBPLbLad74LXyg2nPB9AvbctObyVlPdDfRoTezC8jE0vZY8/ngA73i - bFLsrVcoqSrUHbW7BdloQz0g6039dzcfaZ8nN273P/IdoBR6Rl34gNqotxN3aQHTl/lX2tXltmER - MeyNwoINhrQJjaVs7PmQRTxGxroojdth8MGcr7n0hcpny9l2tr1VIjtlfwAAAP//AwD1PbbW2wMA - AA== - headers: - CF-RAY: - - 9b9efaeb3fe9138a-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:26:25 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '835' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1111' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999225' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_90966cd622374d94b813aa9155f7f12e - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_error_handling.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_error_handling.yaml deleted file mode 100644 index 7ea7829ab..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_error_handling.yaml +++ /dev/null @@ -1,30 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/png;base64,SU5WQUxJRF9QTkdfREFUQV9OT1RfQV9SRUFMX0lNQUdF"}},{"type":"text","text":"What''s - in this image?"}]}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"error":{"message":"Could not process image. The image data is not - valid.","type":"invalid_request_error","param":null,"code":"invalid_image"}}' - headers: - Content-Type: - - application/json - status: - code: 400 - message: Bad Request -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_long_context.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_long_context.yaml deleted file mode 100644 index 509c33c51..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_long_context.yaml +++ /dev/null @@ -1,31 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Here is a long text:\n\nThe quick - brown fox jumps over the lazy dog. <...repeated 20 times...>\n\nHow many times - does the word ''fox'' appear?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-long001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"The - word ''fox'' appears 20 times in the text.","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":120,"completion_tokens":14,"total_tokens":134,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_message_history.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_message_history.yaml deleted file mode 100644 index d1a3a0c46..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_message_history.yaml +++ /dev/null @@ -1,214 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"My name is Alice"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '124' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBatwwEL37K6Y622VtvJt0L6EUSpfCUtpCaUowijz2aiNrhDROs4T9 - 9yJ7s3baFHLRYd68p/dm5jEBELoWaxBqJ1l1zmQf6PDzx/7+7svD9iO1n5eb7/3X6367Kb+p/UKk - kUG3e1T8xHqrqHMGWZMdYeVRMkbV/GK1KlbLIi8GoKMaTaS1jrOSsk5bnRWLoswWF1l+eWLvSCsM - Yg2/EgCAx+GNPm2ND2INi/Sp0mEIskWxPjcBCE8mVoQMQQeWlkU6gYosox2sb7VCYIIOkeFAfQrv - jVb4Bj7Rb1DSwgZGiQgCUy0PV3Mpj00fZIxje2NmgLSWWMZxDCFuTsjxbNtQ6zzdhr+ootFWh13l - UQay0WJgcmJAjwnAzTCe/lli4Tx1jiumOxy+y/NRTkxLmYHlCWRiaaZ6sUxfUKtqZKlNmI1XKKl2 - WE/MaReyrzXNgGSW+V8zL2mPubVtXyM/AUqhY6wr57HW6nngqc1jPNn/tZ1nPBgWAf29VlixRh/3 - UGMjezMekgiHwNhVjbYteuf1eE2NqxBX71SBTXkpkmPyBwAA//8DAFoRD7VbAwAA - headers: - CF-RAY: - - 9b1224eaa865da6c-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:33 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '406' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '424' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_56a4aaae17c246a2819c52c253e8af1b - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"My name is Alice"},{"role":"assistant","content":"Nice - to meet you, Alice! How can I assist you today?"},{"role":"user","content":"What - is my name?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '255' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBbtswDL37Kwid4yJx0jTNZRiGdRvQ64AGQ2GoEm1rlUVNorelRf59 - kJ3GzrYCvejAx/f0HsnnDEAYLbYgVCNZtd7mH2i/u7tZPrrN7a6Z39zJT+rph/pqnz7SbS1miUEP - 31HxC+tCUestsiE3wCqgZEyqi6v1ulhfFotlD7Sk0SZa7TlfUd4aZ/JiXqzy+VW+2BzZDRmFUWzh - WwYA8Ny/yafT+FtsYT57qbQYo6xRbE9NACKQTRUhYzSRpWMxG0FFjtH11nfUBXCyRTAR3luj8AI+ - 0y9Q0sEXGNiwpw6qLnCD4d1UJ2DVRZmyuM7aCSCdI5ZpFn2C+yNyOHm2VPtAD/EvqqiMM7EpA8pI - LvmLTF706CEDuO9n053FFT5Q67lkesT+u+VmkBPjRkZwURxBJpZ2rF8e53muVmpkaWyczFYoqRrU - I3NchOy0oQmQTTL/a+Z/2kNu4+q3yI+AUugZdekDaqPOA49tAdO9vtZ2mnFvWEQMP43Ckg2GtAeN - lezscEUi7iNjW1bG1Rh8MMMpVb5EXF+rAqvVRmSH7A8AAAD//wMAzG2kQVgDAAA= - headers: - CF-RAY: - - 9b1224ee1fcb08e0-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:33 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '327' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '342' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999975' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_05e924c6ff604d268b4bd3917d32300c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_in_metadata.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_in_metadata.yaml deleted file mode 100644 index f8c05e416..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_in_metadata.yaml +++ /dev/null @@ -1,110 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hello"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false,"temperature":0.5}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '135' - Content-Type: - - application/json - Cookie: - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPB5LNj3De8GmyTYjsSCXBus7wf7B\",\n \"object\": - \"chat.completion\",\n \"created\": 1774893183,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Hello! How can I assist you today?\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 9,\n \"completion_tokens\": 9,\n \"total_tokens\": 18,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8ba4ee792c6-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Mon, 30 Mar 2026 17:53:04 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '839' - openai-organization: - - braintrust-data - openai-processing-ms: - - '637' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=K5ScKgWxKV8qrun72h6zWqwqzuox1P7HfwixJPaisaU-1774893183.0866485-1.0.1.1-aFlnpoUkbkAngI0favlhLoCOJtcaN7dUO6bYg0g4jfC.HRhU3s_NrZt7oH01lSi39dR_xL9hFmrQs2o5en0gk0jRe0MRJTasLHnGP6o4.yXI0SZeUn56WYYaGKfOKVTx; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Mon, 30 Mar 2026 - 18:23:04 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_1e2852cd7fd34d339ac251eeef0c0487 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_override_in_input.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_override_in_input.yaml deleted file mode 100644 index 1e5de9140..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_model_settings_override_in_input.yaml +++ /dev/null @@ -1,120 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Tell me a story"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"temperature":0.9}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '141' - Content-Type: - - application/json - Cookie: - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000; - __cf_bm=K5ScKgWxKV8qrun72h6zWqwqzuox1P7HfwixJPaisaU-1774893183.0866485-1.0.1.1-aFlnpoUkbkAngI0favlhLoCOJtcaN7dUO6bYg0g4jfC.HRhU3s_NrZt7oH01lSi39dR_xL9hFmrQs2o5en0gk0jRe0MRJTasLHnGP6o4.yXI0SZeUn56WYYaGKfOKVTx - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPB5N7VhlEbWXNCjjIvlcDN3PJnb6\",\n \"object\": - \"chat.completion\",\n \"created\": 1774893185,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Once upon a time in a quaint little - village nestled between rolling hills and lush green forests, there lived - a young girl named Elara. She was known far and wide for her insatiable curiosity - and adventurous spirit. Every morning, Elara would wander through the village, - her bright blue eyes sparkling with wonder at the world around her.\\n\\nOne - sunny afternoon, while exploring the outskirts of the forest, Elara stumbled - upon a hidden path that she had never seen before. It was overgrown with vines - and flowers, but something about it beckoned her to follow. With each step, - the sounds of the village faded away, replaced by the gentle rustle of leaves - and the distant chirping of birds.\\n\\nAs she ventured deeper into the woods, - the sunlight danced through the trees, creating a magical tapestry of light - and shadow. After walking for what felt like hours, Elara arrived at a clearing - that took her breath away. In the center stood a magnificent tree, its bark - shimmering like silver, with branches\",\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"length\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 11,\n \"completion_tokens\": - 200,\n \"total_tokens\": 211,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8c39839aa98-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Mon, 30 Mar 2026 17:53:09 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '1813' - openai-organization: - - braintrust-data - openai-processing-ms: - - '4441' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0e199628e6ab42a8bde2da2054693dac - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_prefill.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_prefill.yaml deleted file mode 100644 index 96839e526..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_prefill.yaml +++ /dev/null @@ -1,30 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Write a haiku about coding."},{"role":"assistant","content":"Here - is a haiku:"},{"role":"user","content":"Write a haiku about coding."}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-pre001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"Whitespace - tells a tale\nFunctions dance in loops and turns\nClean code brings freedom","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":35,"completion_tokens":16,"total_tokens":51,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_short_max_tokens.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_short_max_tokens.yaml deleted file mode 100644 index 924a1fc4c..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_short_max_tokens.yaml +++ /dev/null @@ -1,29 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is AI?"}],"model":"gpt-4o-mini","max_completion_tokens":5,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-short001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"AI - stands for Artificial","refusal":null},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":11,"completion_tokens":5,"total_tokens":16,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_stop_sequences.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_stop_sequences.yaml deleted file mode 100644 index fb9386cd1..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_stop_sequences.yaml +++ /dev/null @@ -1,30 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Write a short story about a robot."}],"model":"gpt-4o-mini","max_completion_tokens":500,"stop":["END","\n\n"],"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-stop001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"Once - upon a time, there was a small robot named Bolt who loved exploring the world. - Every day, Bolt would venture out to discover new things.","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":31,"total_tokens":47,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_system_prompt_in_metadata.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_system_prompt_in_metadata.yaml deleted file mode 100644 index d998ca7b6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_system_prompt_in_metadata.yaml +++ /dev/null @@ -1,110 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"system","content":"You are a helpful AI assistant - who speaks like a pirate."},{"role":"user","content":"What is the weather?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '215' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNdSxwxFH3fX3HN82zZneq67ktpC4VC6UNRixYZspkzM3EzSUjuaBcR - /Bv+PX+JZEadtbXQl0Duuefk3I/cTIiELsWKhGokq9ab6We3PTu1aK++/Dg+O96cu/z75tv5p5PT - 2ftwIrLEcOtLKH5mvVOu9QasnR1gFSAZSXV+uFjki4N8Pu+B1pUwiVZ7nu67aautnuazfH86O5zO - l0/sxmmFKFb0a0JEdNOfyact8VusaJY9R1rEKGuI1UsSkQjOpIiQMerI0rLIRlA5y7C99Y8hhIxa - ydju0VdS0j7c3TOtQR7wOt1IMnEDihuNSNpSgDTEukVG645JV7QFMYyhFnTdICAF1qAI5kEiSm2y - QZ+i15YkbWWw9HB3v3bdoF/DIkhD15DcIJCXzAg2JrFW1w0TrHKdZYQ9+tnI3mUiGsmauxIkbUnG - 2Xq4ueQr0KXrgsX2w24DAqouyjQE2xmzA0hrHcs0xL71F0/I7Uuzjat9cOv4B1VU2urYFAEyOpsa - G9l50aO3E6KLfqjdqzkJH1zruWC3Qf9cvhzkxLhKI3hw9ASyY2nG+PIwe0OtKMFSm7izFEJJ1aAc - meMGya7UbgeY7NT8t5m3tIe6ta3/R34ElIJnlIUPKLV6XfCYFpA+2r/SXnrcGxYR4UorFKwR0hxK - VLIzw/qLuI2Mtqi0rRF80MMfqHwBLI5Ujmp/KSa3k0cAAAD//wMAkHTj3xEEAAA= - headers: - CF-RAY: - - 9b1224e1294f9a4f-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:32 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '1332' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '1346' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999977' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_3dde0d17015c4cd588c2dc14b4bc82b8 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tool_execution.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tool_execution.yaml deleted file mode 100644 index 72025974c..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tool_execution.yaml +++ /dev/null @@ -1,220 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"description":"The - mathematical operation (add, subtract, multiply, divide)","type":"string"},"a":{"description":"First - number","type":"number"},"b":{"description":"Second number","type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '604' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNNj5swEL3zK6w5Q5XQJCTc2q2iHnrZVqq0Kitk7AGcNbZlm3bTKP+9 - ApJAslmpHJA1z+/Nmw8fAkJAcEgJsJp61hgZPej9E6u+/1D1dqc451/Z489vvJx91n/qRwg7hi52 - yPyZ9YHpxkj0QqsBZhapx051nqxW8WoZz9c90GiOsqNVxkcLHTVCiSiexYtolkTz9Ylda8HQQUp+ - BYQQcuj/nU/F8RVSMgvPkQadoxVCerlECFgtuwhQ54TzVHkIR5Bp5VF11lUr5QTwWsucUSnHxMN3 - mJzHZlEp82S/e4q3n8S6WG/lw99XW8++fEzsyyTfIL03vaGyVezSpAl+iac3yQgBRRs8JWStpB5v - yIQAtVXboPKdcThkoA1a2ullkGbQtNILI/cZhBnQDNJ5nIQZFBmki80RrsSOwb3z86RLFsvWUfm2 - fVQp7fusff+eT8jxMiqpK2N14W6oUAolXJ1bpK7vwHQQwdlIbwHaq1mDsboxPvf6BfukSTKIwriO - IxjPT6DXnsoxvlmHd9Ryjp6KfhUu28coq5GPzHELacuFngDBpPK3Zu5pD9ULVf2P/AgwhsYjz41F - Lth1weM1i91jfe/apce9YXBofwuGuRdou2lwLGkrhycEbu88NnkpVIXWWNG/IyhNzhbL9bJYFhsG - wTH4BwAA//8DAOTijx1VBAAA - headers: - CF-RAY: - - 9b1225104cbc2b8d-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '577' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '590' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_509940fcc6bb40bd8804ce82553ceacf - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_7yjY2FAi8b8FlCzxrh0D37rk","type":"function","function":{"name":"calculate","arguments":"{\"operation\":\"multiply\",\"a\":127,\"b\":49}"}}]},{"role":"tool","tool_call_id":"call_7yjY2FAi8b8FlCzxrh0D37rk","content":"6223.0"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"description":"The - mathematical operation (add, subtract, multiply, divide)","type":"string"},"a":{"description":"First - number","type":"number"},"b":{"description":"Second number","type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '888' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBjtMwFLznKyyfm1VimrbpjeXAkSssWkWO/ZI+cGxjvyCqVf8dOek2 - 6QISlxzevJnMjN9LxhhHzY+Mq5MkNXiTf3DnL/pTUR+eoH3U+sf7x737XLUYnz6Klm8Sw7XfQNEr - 60G5wRsgdHaGVQBJkFTL/W4ndpUo6wkYnAaTaL2nfOvyAS3mohDbvNjn5eHKPjlUEPmRfc0YY+xl - +iafVsMvfmTF5nUyQIyyB368LTHGgzNpwmWMGEla4psFVM4S2Ml6KfZsGA2hNwiatWe2rRlGthPi - 3cOaE6Abo0y+7WjMCpDWOpIp9+T2+Ypcbv6M631wbXxD5R1ajKcmgIzOJi+RnOcTeskYe556GO+i - cR/c4Kkh9x2m35VFPevxpf4VWl5BciTNai6u7d3rNRpIoomrJrmS6gR6oS61y1GjWwHZKvWfbv6m - PSdH2/+P/AIoBZ5ANz6ARnWfeFkLkK7zX2u3lifDPEL4iQoaQgjpJTR0cjTzzfB4jgRD06HtIfiA - 8+F0vlHb6lC1VVsrnl2y3wAAAP//AwARJ00jRgMAAA== - headers: - CF-RAY: - - 9b122514ccebbd64-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '442' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '454' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_220c103a9c1a4326853c15b5dae82105 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tools.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tools.yaml deleted file mode 100644 index fa1d41741..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_agent_with_tools.yaml +++ /dev/null @@ -1,219 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"Get - weather for a city.","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '425' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNdb9swDHz3rxD4HA9JkKSJ37YVG5Z1xT6KDt1SGKpM2+pkSZPotl6Q - /z7YbmwnzYD5wRB4PPJ4lLYBYyATiBiInJMorArfmupmffFUXVzTe3pQX88v1/aK5p+ub/LVDxjV - DHN3j4L2rFfCFFYhSaNbWDjkhHXVydliMV3MJ6tVAxQmQVXTMkvhzISF1DKcjqezcHwWTpbP7NxI - gR4i9jNgjLFt86916gSfIGLj0T5SoPc8Q4i6JMbAGVVHgHsvPXFNMOpBYTShrqXrUqkBQMaoWHCl - +sbttx2ce7O4UnE6//569ebx/qr4clmt/7h3v6ffPn7Izwf92tKVbQSlpRadSQO8i0dHzRgDzYuG - myHFj8gpR3dEZwy4y8oCNdXSYbsBIanaQLSBz9xJv4EdHDB2wanz7cAMh2npuXrpEtfaEK/FNjbd - PiO7biPKZNaZO39EhVRq6fPYIffNoEO/g72QRgKUBysF60xhKSbzC5um81lbFPpb14OTPUiGuOrj - i+XoRLU4QeKy2Xh3yQQXOSY9s79svEykGQDBYPKXYk7VbqeXOvuf8j0gBFrCJLYOEykOB+7THNZv - 8l9pnceNYPDoHqTAmCS6ehsJprxU7UsBX3nCIk6lztBZJ5vnAqmNERcrMcV0toRgF/wFAAD//wMA - zweDvDwEAAA= - headers: - CF-RAY: - - 9b12249359272b52-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:19 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '494' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '755' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_66c078817a964b1db9ca9f64a13fb7ee - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_f5WA9BwjTmQNyJzrFq2SKIhD","type":"function","function":{"name":"get_weather","arguments":"{\"city\":\"Paris\"}"}}]},{"role":"tool","tool_call_id":"call_f5WA9BwjTmQNyJzrFq2SKIhD","content":"It''s - sunny in Paris"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"Get - weather for a city.","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '697' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLLbtswELzrKwieLcM2VDnwtYcg7aFF0UsQBAJNrqRNKS5Brto6gf89 - IO1Ych9ALjrs7IxmhvtSCCHRyJ2QulesB2/Lj3S4/2yelf/UKTqY+tbtb0f97W67/RLu5CIxaP8E - mt9YS02Dt8BI7gTrAIohqa63db2pP2xWqwwMZMAmWue5rKgc0GG5WW2qcrUt1zdndk+oIcqdeCiE - EOIlf5NPZ+C33ImslScDxKg6kLvLkhAykE0TqWLEyMqxXEygJsfgsvXvPYhfoLiHINCJrypgFBhF - HJ07LOekAO0YVTLuRmtngHKOWKXg2e7jGTleDFrqfKB9/IMqW3QY+yaAiuSSmcjkZUaPhRCPuYjx - Kpv0gQbPDdMPyL+7Ofcgp/pn4BljYmVn47f5lVhjgBXaOOtRaqV7MBNzKl2NBmkGFLPIf3v5l/Yp - NrruPfIToDV4BtP4AAb1dd5pLUC6zf+tXSrOhmWE8BM1NIwQ0jMYaNVoTxcj4yEyDE2LroPgA57O - pvVNXVXtem1MZWRxLF4BAAD//wMAShjuZEQDAAA= - headers: - CF-RAY: - - 9b12249c3e4e1e0f-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:20 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '261' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '275' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_abb5b9aeb2e14981a3eb63e7b04aed6b - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_auto_pydantic_ai.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_auto_pydantic_ai.yaml deleted file mode 100644 index 32c50c9d2..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_auto_pydantic_ai.yaml +++ /dev/null @@ -1,112 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '114' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.44.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.15.0 - X-Stainless-Raw-Response: - - 'true' - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLLbtswELzrK7Y8W4Vsq4ntSw8tmvTUBuihDwQCQ64kJhSXIFdtjcD/ - XlCyLbkPoBcddnZGM8N9zgCE0WIHQrWSVedt/rbQhW8/lF/iHX69a8q9evOx+fzp6fGdu7kRi8Sg - h0dUfGK9VNR5i2zIjbAKKBmT6vL6aluUq/X61QB0pNEmWuM5LynvjDP5qliVeXGdLzdHdktGYRQ7 - +JYBADwP3+TTafwpdlAsTpMOY5QNit15CUAEsmkiZIwmsnQsFhOoyDG6wfqtAW4x4Au4pR+gpIP3 - MHJgTz0wabl/PecGrPsok3/XWzsDpHPEMuUfXN8fkcPZp6XGB3qIv1FFbZyJbRVQRnLJU2TyYkAP - GcD90Ed/EVH4QJ3niukJh99tRzUxPcKELY9VCSaWdjY/kS7EKo0sjY2zOoWSqkU9MafuZa8NzYBs - FvlPM3/THmMb1/yP/AQohZ5RVz6gNuoy8LQWMJ3ov9bOFQ+GRcTw3Sis2GBIz6Cxlr0dD0fEfWTs - qtq4BoMPZrye2ler7XpdyO3VZiOyQ/YLAAD//wMAbBhxq0sDAAA= - headers: - CF-RAY: - - 9c1afdbedfc4cf0a-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 22 Jan 2026 00:38:55 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=.v4HHKHusX6vziKsYW5cyVzZRrAsCxp4XT463GaX0yQ-1769042335-1.0.1.1-InjFtjx7UOJ8ivwZeShYpDg8mc4QGt.4kpoe9GlkrPwH7LBqBZxH.e.oLUSXSkyh_t0ETNUXh6C5G5zGSAXLYT6oNyc6cef0jwB2ADi_S.w; - path=/; expires=Thu, 22-Jan-26 01:08:55 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=bHlkcNsEuGGe.AQuXN6zbPWK8MJ2dKBjLFcSS263aVQ-1769042335390-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '395' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '412' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999997' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0cc555f0b9354a85a3b0f965716d99de - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request.yaml deleted file mode 100644 index a5c794049..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '121' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJPb9swDMXv/hQCz/XgGGma5dY/hwHtYZdhHYbCUCXaUSeLqkQHy4p8 - 90FKGjtbC/TiA3981Hs0XwohwGhYCVBryar3trym7Y/b+/bb/XKz+XL1/epPdb293Hy9uXuWW4Kz - pKDHJ1T8qvqkqPcW2ZDbYxVQMqaps4vFol6c11WVQU8abZJ1nss5lb1xpqyrel5WF+VseVCvySiM - sBI/CyGEeMnf5NNp/A0rkWflSo8xyg5hdWwSAgLZVAEZo4ksHcPZCBU5Rpetz6f1gO0QZfLmBmsn - QDpHLFO27OjhQHZHD5Y6H+gx/iOF1jgT101AGcml9yKTh0x3hRAPOetwYh98oN5zw/QL83P1ISqM - Gx7h7MCYWNqJ5rV+MqzRyNLYOFkVKKnWqEfluFc5aEMTUEwi/+/lrdn72MZ1Hxk/AqXQM+rGB9RG - neYd2wKm83uv7bjibBgiho1R2LDBkH6DxlYOdn8UELeRsW9a4zoMPpj9ZbS+QVx8VjW28yUUu+Iv - AAAA//8DAGzyyx0nAwAA - headers: - CF-RAY: - - 9b12249eb844cb86-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:20 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '215' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '231' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_bb6ba9cfa6d14b23972cb655212d4423 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml deleted file mode 100644 index d4ff5c2ee..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_creates_nested_chat_span_without_class_scan.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '121' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzHBFp5i6BHHGWuTsYqBGubpikG\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973531,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"4\",\n \"refusal\": null,\n - \ \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 20,\n \"completion_tokens\": - 1,\n \"total_tokens\": 21,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a256ab1f178c-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:11 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '807' - openai-organization: - - braintrust-data - openai-processing-ms: - - '392' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=zLt6TNwkPTB2O.Bp3ceD4Ijrj3biQuLYigEMbvthfOs-1774973530.6689873-1.0.1.1-PL.I8XK.cSEDkAeAeA.SAH05Z2qjjTzvfUfqd4fC3.j0tktm6p0Tqb1.Zwy0776VHR2qgoUpogSKSon8qg2QYY179MO.33I7RVvoQMPznp3dxHHWwIBuPqEqxwJZqbZ2; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 31 Mar 2026 - 16:42:11 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_c9480ee8e49349b7a68c3a2767779fd3 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream.yaml deleted file mode 100644 index bfaf7c631..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream.yaml +++ /dev/null @@ -1,135 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MPeP4cTzj"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Bs27rTjKBx"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X84rqwUSyS"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8N28G51ySR"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2g8tmbh4LX"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wOL2L3mpTZ"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pbsyokiCs4"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e3bkAGq7YZ"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aSlrtmsM67"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"S4tkp"} - - - data: {"id":"chatcmpl-CoyYNSCz3qcm9wC9cHlROUUKcFtXi","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"EbbD8S3NFhz"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224afa86a2f02-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '139' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '151' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f350c8c0bd7e45cd8820c4ad923f3ed7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_complete_output.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_complete_output.yaml deleted file mode 100644 index 521f76025..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_complete_output.yaml +++ /dev/null @@ -1,132 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say exactly: 1, 2, 3"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '139' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HvUSOrR1X"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3XRNwrHSZ4"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"g4LuFspFjU"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iJzlYW6sHx"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u54Cu0s3Ah"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"N4TsEWOfAa"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"P0Yrb0mxLr"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oRPi8xgdex"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"v0uti"} - - - data: {"id":"chatcmpl-CoyYNH7Wi5k0CKXtkOCr79LW8yB5k","object":"chat.completion.chunk","created":1766265203,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":18,"completion_tokens":7,"total_tokens":25,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ucDxMBoVkf5"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224b27c7c7650-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '127' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '144' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a705aa58e1074dc69f92a9b61c0d25f4 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_sync.yaml deleted file mode 100644 index 36b6250d8..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_stream_sync.yaml +++ /dev/null @@ -1,135 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n4wIfDywj"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"M7nBs8tJ4w"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3AKnil79q5"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tj0YRKsPzd"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3G9IJGTD7B"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ury0XoZd21"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mJX6hpQnaM"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qhlqTCCpyt"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2JL0YHl8QJ"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"DgeyW"} - - - data: {"id":"chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj","object":"chat.completion.chunk","created":1766265215,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":8,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"pdj6Hh5uLUK"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224f9cc5cdbe5-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:35 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '159' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '171' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_fac92d6c619a4d7e94154752dd20d282 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_sync.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_sync.yaml deleted file mode 100644 index b66d2c659..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_sync.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '121' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNj9MwEIbv+RXWnBvUhtLd7Y0PCSGQENwQWkWuPUkGHI9lT1ZbVv3v - yOlH0gUkLjnMM+/4fSfzVCgFZGGrwHRaTB9c+Zb33z49fPja7j7ufnXODO8e929e0+eX7++aL7DI - Ct79QCNn1QvDfXAoxP6ITUQtmKeubjabavOqWq5G0LNFl2VtkHLNZU+eympZrcvlTbm6Pak7JoMJ - tup7oZRST+M3+/QWH2GrlotzpceUdIuwvTQpBZFdroBOiZJoL7CYoGEv6Efr63k9YjMknb35wbkZ - 0N6z6JxtdHR/IoeLB8dtiLxLz6TQkKfU1RF1Yp/fS8IBRnoolLofsw5X9iFE7oPUwj9xfK46RYVp - wxNcnZiwaDfTnOtXw2qLosml2arAaNOhnZTTXvVgiWegmEX+08vfZh9jk2//Z/wEjMEgaOsQ0ZK5 - zju1Rczn96+2y4pHw5AwPpDBWghj/g0WGz2441FA2ifBvm7ItxhDpONlNKFG3NyZCpv1LRSH4jcA - AAD//wMAv4j40CcDAAA= - headers: - CF-RAY: - - 9b1224a12d343511-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:21 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '176' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '393' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_56901365decf422e9e92f5cb16e01f86 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_with_settings.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_with_settings.yaml deleted file mode 100644 index 6be528c5a..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_direct_model_request_with_settings.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hello"}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false,"temperature":0.7}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '134' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLBatwwEL37K6Y6r8uuu3U2ewmhJWwPpaUESijBKNLYViJrhDRuu4T9 - 9yJ7s3aaFHrRYd68p/dm5jEDEEaLLQjVSladt/kH2t98/nL1kfR3df/u+jqWXy9bz3K37r+xWCQG - 3d2j4ifWW0Wdt8iG3AirgJIxqa7OyrIo3xfLYgA60mgTrfGcrynvjDN5sSzW+fIsX22O7JaMwii2 - 8CMDAHgc3uTTafwttrBcPFU6jFE2KLanJgARyKaKkDGayNKNno+gIsfoBus7tJbewI5+gZIOPsFI - gD31wKTl/mJODFj3USbzrrd2BkjniGUKP1i+PSKHk0lLjQ90F/+iito4E9sqoIzkkqHI5MWAHjKA - 22EY/bN8wgfqPFdMDzh8dz6qiWkDLzEmlnYqrzaLV7QqjSyNjbNRCiVVi3piTnOXvTY0A7JZ4pde - XtMeUxvX/I/8BCiFnlFXPqA26nneqS1gOs9/tZ0mPBgWEcNPo7BigyFtQWMte3s89LiPjF1VG9dg - 8MGMl1P7CrE8VwXW643IDtkfAAAA//8DADvObQFHAwAA - headers: - CF-RAY: - - 9b1224a7794ad7a7-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:23 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '291' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '565' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_06add87a83a4411fabd32d429f347145 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_class_span_names.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_class_span_names.yaml deleted file mode 100644 index d5aab4cf6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_class_span_names.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2?"}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '119' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJBb9swDIXv/hUCr42L2PEaJ7e0wG4Fut62oTBUmXbYyZIm0dm6Iv99 - kJ3G7tYBu/jAj3x6j+ZLIgRQDVsBai9ZdU6nN4fd0/2Pu9u7Tx/peXX4df3F7+j2/vPNLpMlLOKE - fXxCxa9Tl8p2TiOTNSNWHiVjVM3WV+t1kW3KDwPobI06jrWO08KmHRlK82VepMt1mp3E1d6SwgBb - 8TURQoiX4Rt9mhp/wlYsF6+VDkOQLcL23CQEeKtjBWQIFFgahsUElTWMZrCeiwuRC/zeSx1EcTnv - 8tj0QUanptd6BqQxlmVMOvh7OJHj2ZG2rfP2MfwxCg0ZCvvKowzWxNcDWwcDPSZCPAzJ+zdhwHnb - Oa7YfsPhuawY5WDa9wTLE2PLUk/lPF+8I1bVyJJ0mC0OlFR7rKfJacuyr8nOQDKL/LeX97TH2GTa - /5GfgFLoGOvKeaxJvc07tXmMx/ivtvOKB8MQ0B9IYcWEPv6GGhvZ6/FEIDwHxq5qyLTonafxThpX - 5ZvVaik3V2UJyTH5DQAA//8DAFhHeVE1AwAA - headers: - CF-RAY: - - 9b9efaf33bf137c1-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:26:26 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '307' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '324' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e03ef3aa121d4a0a8c12116743ac7d40 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_request_stream_sync_thread_context_propagation.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_request_stream_sync_thread_context_propagation.yaml deleted file mode 100644 index 69ecec3da..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_model_request_stream_sync_thread_context_propagation.yaml +++ /dev/null @@ -1,436 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://www.braintrust.dev/api/apikey/login - response: - body: - string: '{"org_info":[{"id":"5d7c97d7-fef1-4cb7-bda6-7e3756a0ca8e","name":"braintrustdata.com","api_url":"https://staging-api.braintrust.dev","git_metadata":{"fields":["commit","branch","tag","author_name","author_email","commit_message","commit_time","dirty"],"collect":"some"},"is_universal_api":true,"proxy_url":"https://staging-api.braintrust.dev","realtime_url":"wss://realtime.braintrustapi.com"}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Access-Control-Allow-Headers: - - X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, - Content-Type, Date, X-Api-Version - Access-Control-Allow-Methods: - - GET,OPTIONS,PATCH,DELETE,POST,PUT - Access-Control-Allow-Origin: - - '*' - Cache-Control: - - public, max-age=0, must-revalidate - Content-Length: - - '395' - Content-Security-Policy: - - 'script-src ''self'' ''unsafe-eval'' ''wasm-unsafe-eval'' ''strict-dynamic'' - ''nonce-Y2NiZDlhM2MtNGFlNy00OTE1LWE1YjQtZTI3MzcwOTEzZTgx'' *.js.stripe.com - js.stripe.com maps.googleapis.com ; style-src ''self'' ''unsafe-inline'' *.braintrust.dev - btcm6qilbbhv4yi1.public.blob.vercel-storage.com fonts.googleapis.com www.gstatic.com - d4tuoctqmanu0.cloudfront.net; font-src ''self'' data: fonts.gstatic.com btcm6qilbbhv4yi1.public.blob.vercel-storage.com - cdn.jsdelivr.net d4tuoctqmanu0.cloudfront.net fonts.googleapis.com mintlify-assets.b-cdn.net - fonts.cdnfonts.com; object-src ''none''; base-uri ''self''; form-action ''self''; - frame-ancestors ''self''; worker-src ''self'' blob:; report-uri https://o4507221741076480.ingest.us.sentry.io/api/4507221754380288/security/?sentry_key=27fa5ac907cf7c6ce4a1ab2a03f805b4&sentry_environment=production&sentry_release=16; - report-to csp-endpoint-0' - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:13 GMT - Etag: - - '"12n7ok4b5phaz"' - Reporting-Endpoints: - - csp-endpoint-0="https://o4507221741076480.ingest.us.sentry.io/api/4507221754380288/security/?sentry_key=27fa5ac907cf7c6ce4a1ab2a03f805b4&sentry_environment=production&sentry_release=16" - Server: - - Vercel - Strict-Transport-Security: - - max-age=63072000 - X-Bt-Was-Udf-Cached: - - 'true' - X-Clerk-Auth-Message: - - Invalid JWT form. A JWT consists of three parts separated by dots. (reason=token-invalid, - token-carrier=header) - X-Clerk-Auth-Reason: - - token-invalid - X-Clerk-Auth-Status: - - signed-out - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Matched-Path: - - /api/apikey/login - X-Nonce: - - Y2NiZDlhM2MtNGFlNy00OTE1LWE1YjQtZTI3MzcwOTEzZTgx - X-Vercel-Cache: - - MISS - X-Vercel-Id: - - yul1::iad1::l88hm-1774893193654-1b03d5ef0879 - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.33.1 - method: GET - uri: https://staging-api.braintrust.dev/version - response: - body: - string: '{"version":"1.1.31","date_version":"20260330","ff_version":21,"commit":"7e00d36a24f3ee49ce2f75f19d20386636e5519b","deployment_mode":"lambda","deployment_type":"custom","brainstore_default":"force","brainstore_can_contain_row_refs":true,"skip_pg_config":"all","has_realtime_wal_bucket":true,"brainstore_wal_footer_version":"v3","brainstore_wal_use_efficient_format":true,"has_logs2":true,"js":true,"universal":true,"code_execution":true,"logs3_payload_max_bytes":5242880,"control_plane_telemetry":["status","metrics","logs","traces","memprof","usage"]}' - headers: - Connection: - - keep-alive - Content-Length: - - '551' - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:13 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 f4f653453255d3978688a6c5c61be2d6.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - VbidRp8Ziuk63w3KD3joP-ZO7fBoIV_oHTYVlsHGQjWuURLgUMZ-Ow== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab889-1aaac8301c7833580844d4e1;Parent=025690bcec6beb43;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Miss from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - etag: - - W/"227-KBfWb2OrI4L6tO+9HRx1pkjhfrY" - vary: - - Origin - x-amz-apigw-id: - - bDHFmGKEIAMEaqg= - x-amzn-Remapped-content-length: - - '551' - x-amzn-RequestId: - - 031b2887-f4fc-4737-ac70-77fa3d42cc96 - x-bt-internal-trace-id: - - 69cab88900000000055a53298b8a9e38 - status: - code: 200 - message: OK -- request: - body: '{"rows": [{"_is_merge": false, "context": {"caller_filename": "/Users/abhijeetprasad/workspace/braintrust-sdk-python/py/.nox/test_pydantic_ai_integration-latest/lib/python3.13/site-packages/pydantic_ai/direct.py", - "caller_functionname": "_consume_async_stream", "caller_lineno": 360}, "created": - "2026-03-30T17:53:13.604954+00:00", "id": "021ecd8c-ef0b-4705-8491-84b7fd7e44a3", - "input": {"instrument": null, "messages": [{"instructions": null, "kind": "request", - "metadata": null, "parts": [{"content": "Hello", "part_kind": "user-prompt", - "timestamp": "2026-03-30 17:53:13.603675+00:00"}], "run_id": null, "timestamp": - null}], "model": "openai:gpt-4o-mini", "model_request_parameters": null, "model_settings": - null}, "log_id": "g", "metadata": {"model": "gpt-4o-mini", "provider": "openai"}, - "metrics": {"start": 1774893193.604952}, "project_id": "test-pydantic-ai-integration", - "root_span_id": "6c05f860-41f9-4d0b-92d2-53a72ea73045", "span_attributes": {"exec_counter": - 91, "name": "model_request_stream", "type": "llm"}, "span_id": "33c192f1-78db-4d9f-89f7-d6f36bc817aa", - "span_parents": ["c568d22b-66c3-4f43-a610-2f3807e92d60"]}], "api_version": 2}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1152' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://staging-api.braintrust.dev/logs3 - response: - body: - string: '{"Code":"ForbiddenError","Message":"Missing read access to project_log - id test-pydantic-ai-integration, or the project_log does not exist [user_email=abhijeet@braintrustdata.com] - [user_org=braintrustdata.com] [timestamp=1774893194.106]","InternalTraceId":"69cab88a000000001216f8994c57459e","Path":"/logs3","Service":"api"}' - headers: - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:14 GMT - Via: - - 1.1 e8ac579de7fc88986153d8653adf92fc.cloudfront.net (CloudFront), 1.1 da473159f6f131ea8035a6279b0f60aa.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - MsuUmsZgF5KmuHR5gJnlVeocN-0ut6X8N3L4lrOMghuMxf_EFvJerg== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab889-2d61f8540b519af25e9769e5;Parent=5b0c1b4a8c31a605;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Error from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - content-length: - - '322' - etag: - - W/"142-xcxriWqbDXxHzOZANosR4ILTx3M" - vary: - - Origin, Accept-Encoding - x-amz-apigw-id: - - bDHFnEuqIAMEtgg= - x-amzn-RequestId: - - 3aaa6d41-535f-49d1-b1bd-4da058a30870 - x-bt-internal-trace-id: - - 69cab88a000000001216f8994c57459e - status: - code: 403 - message: Forbidden -- request: - body: '{"rows": [{"_is_merge": true, "id": "cb2a81f1-d1ce-46eb-b71f-48f94cc77709", - "log_id": "g", "metrics": {"completion_tokens": 8.0, "duration": 0.002259969711303711, - "end": 1774893189.5945878, "prompt_cache_creation_tokens": 0.0, "prompt_cached_tokens": - 0.0, "prompt_tokens": 14.0, "start": 1774893189.5923278, "time_to_first_token": - 0.0016760826110839844, "tokens": 22.0}, "output": {"finish_reason": "stop", - "kind": "response", "metadata": null, "model_name": "gpt-4o-mini-2024-07-18", - "parts": [{"content": "1, 2, 3.", "id": null, "part_kind": "text", "provider_details": - null, "provider_name": null}], "provider_details": {"finish_reason": "stop", - "timestamp": "2025-12-20 21:13:35+00:00"}, "provider_name": "openai", "provider_response_id": - "chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj", "provider_url": "https://api.openai.com/v1/", - "run_id": null, "timestamp": "2026-03-30 17:53:09.593906+00:00", "usage": {"cache_audio_read_tokens": - 0, "cache_read_tokens": 0, "cache_write_tokens": 0, "details": {"accepted_prediction_tokens": - 0, "audio_tokens": 0, "reasoning_tokens": 0, "rejected_prediction_tokens": 0}, - "input_audio_tokens": 0, "input_tokens": 14, "output_audio_tokens": 0, "output_tokens": - 8}}, "project_id": "test-pydantic-ai-integration", "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", - "span_id": "d47230a5-49a5-4cba-b863-1e479ceac7aa", "span_parents": ["f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e"]},{"_is_merge": - true, "id": "bdcee637-b6ac-4d83-bd0b-d6d5f559b2e0", "log_id": "g", "metrics": - {"completion_tokens": 8.0, "duration": 0.0023889541625976562, "end": 1774893189.59468, - "prompt_cache_creation_tokens": 0.0, "prompt_cached_tokens": 0.0, "prompt_tokens": - 14.0, "start": 1774893189.592291, "time_to_first_token": 0.001712799072265625, - "tokens": 22.0}, "output": {"finish_reason": "stop", "kind": "response", "metadata": - null, "model_name": "gpt-4o-mini-2024-07-18", "parts": [{"content": "1, 2, 3.", - "id": null, "part_kind": "text", "provider_details": null, "provider_name": - null}], "provider_details": {"finish_reason": "stop", "timestamp": "2025-12-20 - 21:13:35+00:00"}, "provider_name": "openai", "provider_response_id": "chatcmpl-CoyYZrJy9JYFY664IA2WgzVOsQSmj", - "provider_url": "https://api.openai.com/v1/", "run_id": null, "timestamp": "2026-03-30 - 17:53:09.593906+00:00", "usage": {"cache_audio_read_tokens": 0, "cache_read_tokens": - 0, "cache_write_tokens": 0, "details": {"accepted_prediction_tokens": 0, "audio_tokens": - 0, "reasoning_tokens": 0, "rejected_prediction_tokens": 0}, "input_audio_tokens": - 0, "input_tokens": 14, "output_audio_tokens": 0, "output_tokens": 8}}, "project_id": - "test-pydantic-ai-integration", "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", - "span_id": "f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e", "span_parents": ["7b1235d0-d31d-49ed-8df1-6ae33d4dedf7"]}], - "api_version": 2}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '2826' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://staging-api.braintrust.dev/logs3 - response: - body: - string: '{"Code":"ForbiddenError","Message":"Missing read access to project_log - id test-pydantic-ai-integration, or the project_log does not exist [user_email=abhijeet@braintrustdata.com] - [user_org=braintrustdata.com] [timestamp=1774893194.229]","InternalTraceId":"69cab88a000000006f8e7e21edeefe09","Path":"/logs3","Service":"api"}' - headers: - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:14 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 bd7551a5260a8bac087bad2ac8ebffec.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - U3UXEimOcKVsdV6Lo0Yk8XezNhwfTiQcy__NSvaZ_5xaT8odied-Tw== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab88a-72db82d1703ec6b9651329df;Parent=40e411d20fc278df;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Error from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - content-length: - - '322' - etag: - - W/"142-wDmrkVP8fVfti8Te3LX+0pveJRw" - vary: - - Origin, Accept-Encoding - x-amz-apigw-id: - - bDHFoFWDoAMEbjQ= - x-amzn-RequestId: - - e0b0db62-51f5-451f-8aa4-6e86a0936ec7 - x-bt-internal-trace-id: - - 69cab88a000000006f8e7e21edeefe09 - status: - code: 403 - message: Forbidden -- request: - body: '{"messages":[{"role":"user","content":"Hello"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '124' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"lMoGU7R2O"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"Hello"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"O1qW8o"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VVrBHX6n3h"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - How"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5hWyEXX"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - can"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nVyWCh4"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - I"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"d6to3IExF"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - assist"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JxzI"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"i6J33cg"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - today"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Irdup"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"?"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"R65rXtBVaV"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Bf2lm"} - - - data: {"id":"chatcmpl-DPB5VAbDb1LwuCfC12JgojqMCDbvL","object":"chat.completion.chunk","created":1774893193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[],"usage":{"prompt_tokens":8,"completion_tokens":9,"total_tokens":17,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"OmfK72y6EWIX"} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8fc3b177116-YYZ - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:14 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - braintrust-data - openai-processing-ms: - - '403' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=IHGiGf.Mtx_0IgVPmpOyr33nU6wJiuBbWv2RKuFyGQ8-1774893193.6401794-1.0.1.1-_WtR5M3BuFYZr5v6J1YF_vcnLZ95nF_kyCjT5FUTaqbdodV8NBNQct8MkpsPKDu12ElhK3j1RUo3KbOi1PcdyyIXNn0Gv6R_R73LtuYWQFstRviblljvfUx8ryTnWuz0; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Mon, 30 Mar 2026 - 18:23:14 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_50755602447c427682158e8e30b526a7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_identical_sequential_streams.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_identical_sequential_streams.yaml deleted file mode 100644 index d3d14eae3..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_identical_sequential_streams.yaml +++ /dev/null @@ -1,401 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gnat2cENQ"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jNso0lvDB8"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"725RaPoKoL"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xwX6S3QVKQ"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PRUOjecqaT"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"D7zv7nDU1k"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kaWRfolrEw"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nxDRXx48YM"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ArC233Ax3q"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"k9ml5"} - - - data: {"id":"chatcmpl-CoyYDBAOf0KRCXhzfUPTYZNJ4f6xG","object":"chat.completion.chunk","created":1766265193,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"njMUeLtfPSB"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12246bb8312590-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:13 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '171' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '418' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_b3f7508e23014bb5b3a6590f7a1745c4 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mrpG2gfnr"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KqII3iAzwu"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pY077J0ITv"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hVFZKhHEll"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5q0E4Aipgr"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SVkT4p2PRw"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"z0JxYWz9CZ"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Yhx947CVn5"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8SvU2h85am"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"HltY4"} - - - data: {"id":"chatcmpl-CoyYE8bhF6SRDlCaMKHmcnFYvC7yM","object":"chat.completion.chunk","created":1766265194,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"clzo45rSqE6"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b1224736f8f8e7d-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:14 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '240' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '489' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_13f73e276a5246f7b8770120e77c5bfd - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e6vrbHoPF"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2FLB1kR9AF"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"szhq4G7pLT"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0FrhMhyMc8"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7KNhjjfvdr"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XTPcPMIYpY"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KjFORo18p2"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5ZO6emLP2u"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KglKHdiIqs"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"7A7zk"} - - - data: {"id":"chatcmpl-CoyYFeEsDiTkRc0wpc2a3ZNmMIJFy","object":"chat.completion.chunk","created":1766265195,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"obu0EI4F1U3"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12247b9e892eb7-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:15 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '146' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '390' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_23df3ca5e9104a9492ba6ac711f23720 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_sequential_streams.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_sequential_streams.yaml deleted file mode 100644 index b4e3402f2..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_multiple_sequential_streams.yaml +++ /dev/null @@ -1,268 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qhnOqpIMj"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cTil7PW69p"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0YnAj34Co9"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2OTWUEmJAI"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PzH358Bjix"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LCfdy0Z80P"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Luoz7Ty7RE"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"imLiI1n5XP"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Vwy1Rp8rUH"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"kRAeG"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"sCkh8ATPHhR"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b122483382af514-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:16 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '162' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '181' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_b8eb6c241625442282f4f0519dfae9e7 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vd7IkwFPY"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n4Wkt6VLAo"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UTIlWWs928"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qmxxmaZhzl"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"j9Lclwk8ng"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"V4LeJ42IiW"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wVN2Xpch61"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QDHoCqZz2Q"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KC95XCI89W"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"KxMjU"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"hKfsFUmwYyh"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12248649dd29a5-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:16 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '249' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '262' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_9e59e81aa2714f478345ef8cba60e44c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run.yaml deleted file mode 100644 index d8cbce6c6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNb9swDIbv/hUCz/EQe6nb5LgN27GXoEBRFIYq0Y42SRQkemha5L8P - cj7s7APYxQc+fKn3pfleCAFGw0aA2klWLtjyM+0fP9HX5v7+2/KL3zqXttsHj33zcU9vsMgKevmO - is+qD4pcsMiG/BGriJIxT61um6Zubqp1NQJHGm2W9YHLFZXOeFPWy3pVLm/L6u6k3pFRmGAjngoh - hHgfv9mn1/gKG7FcnCsOU5I9wubSJAREsrkCMiWTWHqGxQQVeUY/Wl/N6xG7IcnszQ/WzoD0nljm - bKOj5xM5XDxY6kOkl/SbFDrjTdq1EWUin99LTAFGeiiEeB6zDlf2IURygVumHzg+V5+iwrThCVYn - xsTSzjTn+tWwViNLY9NsVaCk2qGelNNe5aANzUAxi/ynl7/NPsY2vv+f8RNQCgOjbkNEbdR13qkt - Yj6/f7VdVjwahoTxp1HYssGYf4PGTg72eBSQ9onRtZ3xPcYQzfEyutAiNmtVY7e6g+JQ/AIAAP// - AwDuaeQPJwMAAA== - headers: - CF-RAY: - - 9b12245f08957e95-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:11 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - path=/; expires=Sat, 20-Dec-25 21:43:11 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '431' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_33be6e1c06474f88aa886351e283ddd7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run_with_logfire.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run_with_logfire.yaml deleted file mode 100644 index d8cbce6c6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_no_model_agent_run_with_logfire.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJNb9swDIbv/hUCz/EQe6nb5LgN27GXoEBRFIYq0Y42SRQkemha5L8P - cj7s7APYxQc+fKn3pfleCAFGw0aA2klWLtjyM+0fP9HX5v7+2/KL3zqXttsHj33zcU9vsMgKevmO - is+qD4pcsMiG/BGriJIxT61um6Zubqp1NQJHGm2W9YHLFZXOeFPWy3pVLm/L6u6k3pFRmGAjngoh - hHgfv9mn1/gKG7FcnCsOU5I9wubSJAREsrkCMiWTWHqGxQQVeUY/Wl/N6xG7IcnszQ/WzoD0nljm - bKOj5xM5XDxY6kOkl/SbFDrjTdq1EWUin99LTAFGeiiEeB6zDlf2IURygVumHzg+V5+iwrThCVYn - xsTSzjTn+tWwViNLY9NsVaCk2qGelNNe5aANzUAxi/ynl7/NPsY2vv+f8RNQCgOjbkNEbdR13qkt - Yj6/f7VdVjwahoTxp1HYssGYf4PGTg72eBSQ9onRtZ3xPcYQzfEyutAiNmtVY7e6g+JQ/AIAAP// - AwDuaeQPJwMAAA== - headers: - CF-RAY: - - 9b12245f08957e95-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:11 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - path=/; expires=Sat, 20-Dec-25 21:43:11 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '157' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '431' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_33be6e1c06474f88aa886351e283ddd7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_buffer_pattern_early_return.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_buffer_pattern_early_return.yaml deleted file mode 100644 index cfb4ee992..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_buffer_pattern_early_return.yaml +++ /dev/null @@ -1,158 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZamzQnojU"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WWiXPzjJq9"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gJNmPgBuw9"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yGsyFEVtPi"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yH3IrPgjP0"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AK15hNn7i8"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"utG5gHCktq"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yWv3vIP7ZQ"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1OeK68RpYQ"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"smaOaaYOkb"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e5P3fw7bpW"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5EN0R7Zjip"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VGFZvNLTGn"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"99xgz0I5Lo"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AZq6oNiZ98"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"D2sJG"} - - - data: {"id":"chatcmpl-CvAjPMGZTwupp42JEMnl5lMVhGL8T","object":"chat.completion.chunk","created":1767741983,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_29330a9688","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":14,"total_tokens":28,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ZY2sBQm81c"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b9efae1781ed56a-SJC - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Tue, 06 Jan 2026 23:26:23 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - path=/; expires=Tue, 06-Jan-26 23:56:23 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '182' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '197' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_34b4a10ec004419fb01e9f6cf1585a92 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_early_break_async_generator.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_early_break_async_generator.yaml deleted file mode 100644 index d171dce19..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_stream_early_break_async_generator.yaml +++ /dev/null @@ -1,314 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.33.1 - method: GET - uri: https://staging-api.braintrust.dev/version - response: - body: - string: '{"version":"1.1.31","date_version":"20260330","ff_version":21,"commit":"7e00d36a24f3ee49ce2f75f19d20386636e5519b","deployment_mode":"lambda","deployment_type":"custom","brainstore_default":"force","brainstore_can_contain_row_refs":true,"skip_pg_config":"all","has_realtime_wal_bucket":true,"brainstore_wal_footer_version":"v3","brainstore_wal_use_efficient_format":true,"has_logs2":true,"js":true,"universal":true,"code_execution":true,"logs3_payload_max_bytes":5242880,"control_plane_telemetry":["status","metrics","logs","traces","memprof","usage"]}' - headers: - Connection: - - keep-alive - Content-Length: - - '551' - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:10 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 0260b26200cba81bc8e0dc18d51916d8.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - Rutphtid1FBgIKTDJbyYk8gNAU97BOpNPtX1xDZMaleONeKJ3s38Iw== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab886-77d423473139f3c74b00cea3;Parent=06a3bc64aa61c425;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Miss from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - etag: - - W/"227-KBfWb2OrI4L6tO+9HRx1pkjhfrY" - vary: - - Origin - x-amz-apigw-id: - - bDHFBHTxIAMErhA= - x-amzn-Remapped-content-length: - - '551' - x-amzn-RequestId: - - 51a738b6-ac50-428b-a776-be56711c5922 - x-bt-internal-trace-id: - - 69cab886000000002c579ac6ee72eb06 - status: - code: 200 - message: OK -- request: - body: '{"rows": [{"_is_merge": false, "context": {"caller_filename": "/Users/abhijeetprasad/workspace/braintrust-sdk-python/py/.nox/test_pydantic_ai_integration-latest/lib/python3.13/site-packages/pydantic_ai/direct.py", - "caller_functionname": "_consume_async_stream", "caller_lineno": 360}, "created": - "2026-03-30T17:53:09.592213+00:00", "id": "bdcee637-b6ac-4d83-bd0b-d6d5f559b2e0", - "input": {"instrument": null, "messages": [{"instructions": null, "kind": "request", - "metadata": null, "parts": [{"content": "Count from 1 to 3", "part_kind": "user-prompt", - "timestamp": "2026-03-30 17:53:09.591693+00:00"}], "run_id": null, "timestamp": - null}], "model": "openai:gpt-4o-mini", "model_request_parameters": null, "model_settings": - null}, "log_id": "g", "metadata": {"model": "gpt-4o-mini", "provider": "openai"}, - "metrics": {"start": 1774893189.592212}, "project_id": "test-pydantic-ai-integration", - "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", "span_attributes": {"exec_counter": - 58, "name": "model_request_stream", "type": "llm"}, "span_id": "f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e", - "span_parents": ["7b1235d0-d31d-49ed-8df1-6ae33d4dedf7"]},{"_is_merge": false, - "context": {"caller_filename": "/Users/abhijeetprasad/workspace/braintrust-sdk-python/py/.nox/test_pydantic_ai_integration-latest/lib/python3.13/site-packages/pydantic_ai/direct.py", - "caller_functionname": "_consume_async_stream", "caller_lineno": 360}, "created": - "2026-03-30T17:53:09.592300+00:00", "id": "cb2a81f1-d1ce-46eb-b71f-48f94cc77709", - "input": {"messages": [{"instructions": null, "kind": "request", "metadata": - null, "parts": [{"content": "Count from 1 to 3", "part_kind": "user-prompt", - "timestamp": "2026-03-30 17:53:09.591693+00:00"}], "run_id": null, "timestamp": - null}]}, "log_id": "g", "metadata": {"model": "gpt-4o-mini", "provider": "openai"}, - "metrics": {"start": 1774893189.592299}, "project_id": "test-pydantic-ai-integration", - "root_span_id": "7b1235d0-d31d-49ed-8df1-6ae33d4dedf7", "span_attributes": {"exec_counter": - 59, "name": "chat gpt-4o-mini", "type": "llm"}, "span_id": "d47230a5-49a5-4cba-b863-1e479ceac7aa", - "span_parents": ["f35d8e02-4e31-4cb8-b8ad-2bb47c382e1e"]}], "api_version": 2}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '2186' - User-Agent: - - python-requests/2.33.1 - method: POST - uri: https://staging-api.braintrust.dev/logs3 - response: - body: - string: '{"Code":"ForbiddenError","Message":"Missing read access to project_log - id test-pydantic-ai-integration, or the project_log does not exist [user_email=abhijeet@braintrustdata.com] - [user_org=braintrustdata.com] [timestamp=1774893190.508]","InternalTraceId":"69cab886000000002541a41a062b3821","Path":"/logs3","Service":"api"}' - headers: - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:10 GMT - Via: - - 1.1 90aae5d559fbbbe252f6d8de0a8d7ca8.cloudfront.net (CloudFront), 1.1 c2397f8122d12a766778848b1e46618c.cloudfront.net - (CloudFront) - X-Amz-Cf-Id: - - d73rTtpa6LLDwu7hVQKfmSYL_SSkYfPKbkMviRoaI0PhG9JcQdcc0A== - X-Amz-Cf-Pop: - - IAD55-P9 - - IAD61-P11 - X-Amzn-Trace-Id: - - Root=1-69cab886-4aa46ad25fe765fa582e040e;Parent=796a754107031849;Sampled=0;Lineage=1:fc3b4ff1:0 - X-Cache: - - Error from cloudfront - access-control-allow-credentials: - - 'true' - access-control-expose-headers: - - x-bt-cursor,x-bt-found-existing,x-bt-query-plan,x-bt-api-duration-ms,x-bt-brainstore-duration-ms - content-length: - - '322' - etag: - - W/"142-o3U2Y50CsoSuWcGoGfpU85I9aag" - vary: - - Origin, Accept-Encoding - x-amz-apigw-id: - - bDHFCF_-IAMEsQQ= - x-amzn-RequestId: - - 071836c2-6481-4fe4-82c8-63a2f60f3811 - x-bt-internal-trace-id: - - 69cab886000000002541a41a062b3821 - status: - code: 403 - message: Forbidden -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 5"}],"model":"gpt-4o-mini","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '136' - Content-Type: - - application/json - Cookie: - - _cfuvid=VQg4i_utDK73HtVZX9MnimdbFMrcTwHiGTkj8zvaxBM-1766265730198-0.0.1.1-604800000; - __cf_bm=K5ScKgWxKV8qrun72h6zWqwqzuox1P7HfwixJPaisaU-1774893183.0866485-1.0.1.1-aFlnpoUkbkAngI0favlhLoCOJtcaN7dUO6bYg0g4jfC.HRhU3s_NrZt7oH01lSi39dR_xL9hFmrQs2o5en0gk0jRe0MRJTasLHnGP6o4.yXI0SZeUn56WYYaGKfOKVTx - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.73.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.30.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GJC9P5OdK"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"Sure"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1P1UjOI"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZlSk142ecs"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - Here"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4yabYK"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"grCdnO7"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Nhi1EPE9"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"M7DzNi5HGu"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2IAA3kRV0b"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RhdCx21T32"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"N2k2EsOSJW"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KcDwfb76mt"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7lR6LaTkCm"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wdhkGWENkw"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Kv82utB0v1"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mr5lS7vtdA"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s9xOzGrc1a"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u42PFlFCKS"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6FjYL9XiZG"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jJ789GMJk1"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xaM26X2ccz"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VEKM6MTL9y"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DWYxA5bszQ"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"ky8MR"} - - - data: {"id":"chatcmpl-DPB5SpfA9eLCxFYN0uY4KsauBgrVN","object":"chat.completion.chunk","created":1774893190,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ca3e7d71bf","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":21,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"jlxaAs828P"} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e48f8e32964076d-YYZ - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Mon, 30 Mar 2026 17:53:10 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - braintrust-data - openai-processing-ms: - - '372' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_9b03c171263a4211b5037eff9b1a4723 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_creates_spans.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_creates_spans.yaml deleted file mode 100644 index 9a2fce271..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_creates_spans.yaml +++ /dev/null @@ -1,216 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"}],"model":"gpt-4o-mini","max_completion_tokens":500,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"type":"string"},"a":{"type":"number"},"b":{"type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '468' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNda9swFH33rxD3OR6J69WJ37LBYB1kHXSwMRdzI98k2mRJk+Rubch/ - L5ZT20kzmB+MuEfn3HM/tI8YA1FBzoDv0PPayPj9w/L3/NvqM37I9N1H+TX9I7Lstl5Nv4j0BiYt - Q69/EvcvrDdc10aSF1p1MLeEnlrVWXadZWmSTqcBqHVFsqVtjY9THddCiTiZJmk8zeLZ/MjeacHJ - Qc5+RIwxtg//1qeq6C/kLGiFSE3O4ZYg7y8xBlbLNgLonHAelYfJAHKtPKnWumqkHAFea1lylHJI - 3H370XloFkpZvvt+s6S0soTJavmEePvEF8s7/2mUr5N+NMHQplG8b9II7+P5WTLGQGFNx4S8kejp - jMwYoN02NSnfGod9AdqQxVavgLyAupFeGPlYwKQALCCfJdmkgHUBebo4wInYIbp0vh91ydKmcShf - tw+V0j5kDf27PyKHflRSb43Va3dGhY1Qwu1KS+hCB8aDiF6MBAvQnMwajNW18aXXvygkfTvvRGFY - xwFMZkfQa49yiGeLyQW1siKPIqxCv30c+Y6qgTlsITaV0CMgGlX+2swl7a56obb/Iz8AnJPxVJXG - UiX4acHDNUvtY/3Xtb7HwTA4sg+CU+kF2XYaFW2wkd0TAvfoPNXlRqgtWWNFeEewMWWyuLqa4uJ6 - PofoED0DAAD//wMA8jx53VUEAAA= - headers: - CF-RAY: - - 9b9f050f588cfa4a-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:33:20 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '570' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '585' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_bf3237ddd052415f9c4b09fee6dcbb30 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What is 127 multiplied by 49?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_BYJAe4drea2NAzaaPzc9ATtK","type":"function","function":{"name":"calculate","arguments":"{\"operation\":\"multiply\",\"a\":127,\"b\":49}"}}]},{"role":"tool","tool_call_id":"call_BYJAe4drea2NAzaaPzc9ATtK","content":"6223.0"}],"model":"gpt-4o-mini","max_completion_tokens":500,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"calculate","description":"Perform - a mathematical calculation.","parameters":{"additionalProperties":false,"properties":{"operation":{"type":"string"},"a":{"type":"number"},"b":{"type":"number"}},"required":["operation","a","b"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '752' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4yST2/bMAzF7/4Ugs51YTtG7OS2dtjQATvtMGBDYSgSbXOVJVWii2RFvvsgJ42d - /QF28YE/Pvrxia8JYxwV3zIue0FycDq9f3n3XOPPw8O3w9PHT3dfHj7XX/t9/f7ZiP0HfhMVdvcD - JL2pbqUdnAZCa05YehAEcWperauqLMosm8BgFego6xylpU0HNJgWWVGmWZXm9VndW5QQ+JZ9Txhj - 7HX6Rp9GwZ5v2TRrqgwQguiAby9NjHFvdaxwEQIGEob4zQylNQRmsp4XFRtGTeg0gmK7Ays3DANb - F8Xqdqnx0I5BRN9m1HoBhDGWRNx7cvt4JseLP2075+0u/CblLRoMfeNBBGuil0DW8YkeE8YepxzG - q9W483Zw1JB9gul3m3MMfE5/hnl+hmRJ6EU9ewNX4xoFJFCHRZBcCtmDmqVz6mJUaBcgWSz9p5u/ - zT4tjqb7n/EzkBIcgWqcB4XyeuO5zUM8zn+1XUKeDPMA/gUlNITg40MoaMWoTyfDwyEQDE2LpgPv - PJ7upnVNsVmtMrFZ1zVPjskvAAAA//8DAJ++QQRFAwAA - headers: - CF-RAY: - - 9b9f05143d609465-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:33:21 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '612' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '637' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_2934d61385c34a9dad5e9f0b5a7b5721 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml deleted file mode 100644 index 5ecd07aca..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_tool_execution_tracing_does_not_depend_on_message_reconstruction.yaml +++ /dev/null @@ -1,217 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"","parameters":{"additionalProperties":false,"properties":{"city":{"type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '372' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - __cf_bm=epAi6KrcpiRht5_zKqAbs_ZkpcP6bWzSCDoNAhVSQcg-1774973531.7748783-1.0.1.1-eexwuoEVNhxJeFCArlDcDavolPepARox5VsLLlCOfl17u1yyKZAxen8yKFPrew9xF3zVGlK3_FSx59t5p8RKNEk1f83tfxWC6HF_lbbsUvSvr3Wt1mbPvGIdnDbSfyDL - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzIVqFFl74aixNWy61pqlKSLtm7\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973532,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n - \ \"id\": \"call_wcgZ1wAdiVEmHWxtAmhLUoz2\",\n \"type\": - \"function\",\n \"function\": {\n \"name\": \"get_weather\",\n - \ \"arguments\": \"{\\\"city\\\":\\\"Paris\\\"}\"\n }\n - \ }\n ],\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 43,\n \"completion_tokens\": - 14,\n \"total_tokens\": 57,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_e738e3044b\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a260ae9436d0-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '1084' - openai-organization: - - braintrust-data - openai-processing-ms: - - '527' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f52a7793909d4febb7d8282622d2a13c - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_wcgZ1wAdiVEmHWxtAmhLUoz2","type":"function","function":{"name":"get_weather","arguments":"{\"city\":\"Paris\"}"}}]},{"role":"tool","tool_call_id":"call_wcgZ1wAdiVEmHWxtAmhLUoz2","content":"It''s - sunny in Paris"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"","parameters":{"additionalProperties":false,"properties":{"city":{"type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '644' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000; - __cf_bm=epAi6KrcpiRht5_zKqAbs_ZkpcP6bWzSCDoNAhVSQcg-1774973531.7748783-1.0.1.1-eexwuoEVNhxJeFCArlDcDavolPepARox5VsLLlCOfl17u1yyKZAxen8yKFPrew9xF3zVGlK3_FSx59t5p8RKNEk1f83tfxWC6HF_lbbsUvSvr3Wt1mbPvGIdnDbSfyDL - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzJr38yaFUi6ANuIRoeJAjXIBrO\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973533,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The weather in Paris is currently sunny.\",\n - \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 69,\n \"completion_tokens\": 9,\n \"total_tokens\": 78,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_78db9bf1f6\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a264add7c8b2-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:13 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '846' - openai-organization: - - braintrust-data - openai-processing-ms: - - '429' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e05560b30a4e4fabaf1166c1fe903df1 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_wrapper_agent_run_is_traced.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_wrapper_agent_run_is_traced.yaml deleted file mode 100644 index aa0b0d072..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.0.1/test_wrapper_agent_run_is_traced.yaml +++ /dev/null @@ -1,111 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2? Answer with just the - number."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - Cookie: - - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.66.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.24.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DPVzHBw20ZdgFxQ8hDmn74NllhQob\",\n \"object\": - \"chat.completion\",\n \"created\": 1774973531,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"4\",\n \"refusal\": null,\n - \ \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 20,\n \"completion_tokens\": - 1,\n \"total_tokens\": 21,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_ca3e7d71bf\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9e50a25d9cd94cc4-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 31 Mar 2026 16:12:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '807' - openai-organization: - - braintrust-data - openai-processing-ms: - - '377' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=epAi6KrcpiRht5_zKqAbs_ZkpcP6bWzSCDoNAhVSQcg-1774973531.7748783-1.0.1.1-eexwuoEVNhxJeFCArlDcDavolPepARox5VsLLlCOfl17u1yyKZAxen8yKFPrew9xF3zVGlK3_FSx59t5p8RKNEk1f83tfxWC6HF_lbbsUvSvr3Wt1mbPvGIdnDbSfyDL; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 31 Mar 2026 - 16:42:12 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999987' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_8d78179fe6524c99a93e2eb714045e9c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_long_context.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_long_context.yaml deleted file mode 100644 index 509c33c51..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_long_context.yaml +++ /dev/null @@ -1,31 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Here is a long text:\n\nThe quick - brown fox jumps over the lazy dog. <...repeated 20 times...>\n\nHow many times - does the word ''fox'' appear?"}],"model":"gpt-4o-mini","max_completion_tokens":100,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-long001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"The - word ''fox'' appears 20 times in the text.","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":120,"completion_tokens":14,"total_tokens":134,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_short_max_tokens.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_short_max_tokens.yaml deleted file mode 100644 index 924a1fc4c..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_short_max_tokens.yaml +++ /dev/null @@ -1,29 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is AI?"}],"model":"gpt-4o-mini","max_completion_tokens":5,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-short001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"AI - stands for Artificial","refusal":null},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":11,"completion_tokens":5,"total_tokens":16,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_stop_sequences.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_stop_sequences.yaml deleted file mode 100644 index fb9386cd1..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_stop_sequences.yaml +++ /dev/null @@ -1,30 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Write a short story about a robot."}],"model":"gpt-4o-mini","max_completion_tokens":500,"stop":["END","\n\n"],"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - python-httpx/0.28.1 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-stop001","object":"chat.completion","created":1735000000,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_test","choices":[{"index":0,"message":{"role":"assistant","content":"Once - upon a time, there was a small robot named Bolt who loved exploring the world. - Every day, Bolt would venture out to discover new things.","refusal":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":31,"total_tokens":47,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}}}' - headers: - Content-Type: - - application/json - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_tools.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_tools.yaml deleted file mode 100644 index fa1d41741..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_agent_with_tools.yaml +++ /dev/null @@ -1,219 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"Get - weather for a city.","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '425' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFNdb9swDHz3rxD4HA9JkKSJ37YVG5Z1xT6KDt1SGKpM2+pkSZPotl6Q - /z7YbmwnzYD5wRB4PPJ4lLYBYyATiBiInJMorArfmupmffFUXVzTe3pQX88v1/aK5p+ub/LVDxjV - DHN3j4L2rFfCFFYhSaNbWDjkhHXVydliMV3MJ6tVAxQmQVXTMkvhzISF1DKcjqezcHwWTpbP7NxI - gR4i9jNgjLFt86916gSfIGLj0T5SoPc8Q4i6JMbAGVVHgHsvPXFNMOpBYTShrqXrUqkBQMaoWHCl - +sbttx2ce7O4UnE6//569ebx/qr4clmt/7h3v6ffPn7Izwf92tKVbQSlpRadSQO8i0dHzRgDzYuG - myHFj8gpR3dEZwy4y8oCNdXSYbsBIanaQLSBz9xJv4EdHDB2wanz7cAMh2npuXrpEtfaEK/FNjbd - PiO7biPKZNaZO39EhVRq6fPYIffNoEO/g72QRgKUBysF60xhKSbzC5um81lbFPpb14OTPUiGuOrj - i+XoRLU4QeKy2Xh3yQQXOSY9s79svEykGQDBYPKXYk7VbqeXOvuf8j0gBFrCJLYOEykOB+7THNZv - 8l9pnceNYPDoHqTAmCS6ehsJprxU7UsBX3nCIk6lztBZJ5vnAqmNERcrMcV0toRgF/wFAAD//wMA - zweDvDwEAAA= - headers: - CF-RAY: - - 9b12249359272b52-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:19 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '494' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '755' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_66c078817a964b1db9ca9f64a13fb7ee - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"},{"role":"assistant","content":null,"tool_calls":[{"id":"call_f5WA9BwjTmQNyJzrFq2SKIhD","type":"function","function":{"name":"get_weather","arguments":"{\"city\":\"Paris\"}"}}]},{"role":"tool","tool_call_id":"call_f5WA9BwjTmQNyJzrFq2SKIhD","content":"It''s - sunny in Paris"}],"model":"gpt-4o-mini","max_completion_tokens":200,"stream":false,"tool_choice":"auto","tools":[{"type":"function","function":{"name":"get_weather","description":"Get - weather for a city.","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"strict":true}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '697' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLLbtswELzrKwieLcM2VDnwtYcg7aFF0UsQBAJNrqRNKS5Brto6gf89 - IO1Ych9ALjrs7IxmhvtSCCHRyJ2QulesB2/Lj3S4/2yelf/UKTqY+tbtb0f97W67/RLu5CIxaP8E - mt9YS02Dt8BI7gTrAIohqa63db2pP2xWqwwMZMAmWue5rKgc0GG5WW2qcrUt1zdndk+oIcqdeCiE - EOIlf5NPZ+C33ImslScDxKg6kLvLkhAykE0TqWLEyMqxXEygJsfgsvXvPYhfoLiHINCJrypgFBhF - HJ07LOekAO0YVTLuRmtngHKOWKXg2e7jGTleDFrqfKB9/IMqW3QY+yaAiuSSmcjkZUaPhRCPuYjx - Kpv0gQbPDdMPyL+7Ofcgp/pn4BljYmVn47f5lVhjgBXaOOtRaqV7MBNzKl2NBmkGFLPIf3v5l/Yp - NrruPfIToDV4BtP4AAb1dd5pLUC6zf+tXSrOhmWE8BM1NIwQ0jMYaNVoTxcj4yEyDE2LroPgA57O - pvVNXVXtem1MZWRxLF4BAAD//wMAShjuZEQDAAA= - headers: - CF-RAY: - - 9b12249c3e4e1e0f-LAX - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 Dec 2025 21:13:20 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '261' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '275' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999985' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_abb5b9aeb2e14981a3eb63e7b04aed6b - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_model_class_span_names.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_model_class_span_names.yaml deleted file mode 100644 index d5aab4cf6..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_model_class_span_names.yaml +++ /dev/null @@ -1,107 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is 2+2?"}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '119' - Content-Type: - - application/json - Cookie: - - __cf_bm=32b.VMplxNQj3L4u_1uDEw4mJbFkX7XgxbW0AIaO4WI-1767741983-1.0.1.1-ngrHAoGsRus82vIYthILxaNTwRrSgq6MT17VyVyBWlwIdCX8AvWXc.5O8aoDYcvvfwwO.wkKSuvDVkjIkcKdBrusGxL1HyXKUH5Xfk3NhOU; - _cfuvid=beFRqK6f.Kw4Ih5NqMjxVqYpI9KKqCHTmRCh_PSGRiw-1767741983214-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.36.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.13.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJBb9swDIXv/hUCr42L2PEaJ7e0wG4Fut62oTBUmXbYyZIm0dm6Iv99 - kJ3G7tYBu/jAj3x6j+ZLIgRQDVsBai9ZdU6nN4fd0/2Pu9u7Tx/peXX4df3F7+j2/vPNLpMlLOKE - fXxCxa9Tl8p2TiOTNSNWHiVjVM3WV+t1kW3KDwPobI06jrWO08KmHRlK82VepMt1mp3E1d6SwgBb - 8TURQoiX4Rt9mhp/wlYsF6+VDkOQLcL23CQEeKtjBWQIFFgahsUElTWMZrCeiwuRC/zeSx1EcTnv - 8tj0QUanptd6BqQxlmVMOvh7OJHj2ZG2rfP2MfwxCg0ZCvvKowzWxNcDWwcDPSZCPAzJ+zdhwHnb - Oa7YfsPhuawY5WDa9wTLE2PLUk/lPF+8I1bVyJJ0mC0OlFR7rKfJacuyr8nOQDKL/LeX97TH2GTa - /5GfgFLoGOvKeaxJvc07tXmMx/ivtvOKB8MQ0B9IYcWEPv6GGhvZ6/FEIDwHxq5qyLTonafxThpX - 5ZvVaik3V2UJyTH5DQAA//8DAFhHeVE1AwAA - headers: - CF-RAY: - - 9b9efaf33bf137c1-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 06 Jan 2026 23:26:26 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '307' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '324' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e03ef3aa121d4a0a8c12116743ac7d40 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_multiple_sequential_streams.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_multiple_sequential_streams.yaml deleted file mode 100644 index b4e3402f2..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_multiple_sequential_streams.yaml +++ /dev/null @@ -1,268 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qhnOqpIMj"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cTil7PW69p"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0YnAj34Co9"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2OTWUEmJAI"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PzH358Bjix"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LCfdy0Z80P"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Luoz7Ty7RE"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"imLiI1n5XP"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Vwy1Rp8rUH"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"kRAeG"} - - - data: {"id":"chatcmpl-CoyYGsjBG1Nfut20yTQKe0sOUSI7h","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"sCkh8ATPHhR"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b122483382af514-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:16 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '162' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '181' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999995' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_b8eb6c241625442282f4f0519dfae9e7 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Count from 1 to 3."}],"model":"gpt-4o-mini","max_completion_tokens":50,"stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json - Cookie: - - __cf_bm=SnTjRxRlQXUGj3jo4FeKDaKGiTqzcsdhS_LPeF2hwmg-1766265191-1.0.1.1-aN3W.WEa6IjC4znMp0fTYaZOZeW.3xU8ex4fRGFibZ0fuR86Piz9hDDAEvh8Z9ewQ9WHoKwdnsDvPE5KIpoZY4xurXV7VS4TcwfukWZofIk; - _cfuvid=tXOZ7vGE2DBF6L6fDg_veKtSaUVC4UPotJDezWYoYXI-1766265191281-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.37.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.14.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vd7IkwFPY"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n4Wkt6VLAo"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UTIlWWs928"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qmxxmaZhzl"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"j9Lclwk8ng"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"V4LeJ42IiW"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wVN2Xpch61"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QDHoCqZz2Q"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KC95XCI89W"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"KxMjU"} - - - data: {"id":"chatcmpl-CoyYGeZzJazlbqwMyj97GdwzSH9qX","object":"chat.completion.chunk","created":1766265196,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_ee69c2ef48","choices":[],"usage":{"prompt_tokens":15,"completion_tokens":8,"total_tokens":23,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"hKfsFUmwYyh"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9b12248649dd29a5-LAX - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Sat, 20 Dec 2025 21:13:16 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '249' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '262' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999992' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_9e59e81aa2714f478345ef8cba60e44c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_completion.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_completion.yaml deleted file mode 100644 index 9bdfe3fde..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_completion.yaml +++ /dev/null @@ -1,216 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is the capital of Italy?"}],"model":"gpt-3.5-turbo","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '111' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.42.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.15.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJJTwMxDIXv8ysin1tEp6y9IhUBJ5CQEAiN0sSdBjJxSDys6n9HSZcZ - NolLDvn8nPccfxRCgNEwEaAWklXj7fDkrXy37e3FzdNUj8PltL0u9fnL2bMLp1czGCQFzR5Q8Ua1 - o6jxFtmQW2EVUDKmrqPDg6O98rAsjzNoSKNNstrzcLyzP+Q2zGi4Oyr318oFGYURJuKuEEKIj3wm - j07jK0zE7mBz02CMskaYbIuEgEA23YCM0USWjmHQQUWO0WXbV9RgHwWct1Ema661tgekc8QyRcum - 7tdkubVhqfaBZvGbFObGmbioAspILj0ZmTxkuiyEuM9x2y8JwAdqPFdMj5ifG+2t2kE34A6Wa8bE - 0vY0B4NfmlUaWRobe9MCJdUCdafsRitbbagHil7kn15+672KbVz9n/YdUAo9o658QG3U17xdWcC0 - fX+VbUecDUPE8GwUVmwwpG/QOJetXe0FxLfI2FRz42oMPpi8HOkbi2XxCQAA//8DAJZH/UkbAwAA - headers: - CF-RAY: - - 9be05484c98f8b02-IAD - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Wed, 14 Jan 2026 21:47:09 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=dUHsjFYieT4XukWfUSKpLou_UPpWKtEWImWgeyrhn24-1768427229-1.0.1.1-xNDhdyBdNXPI.2LGVcZBY1eY9.qPXmhcMcu8L6VTmrAK.bG07FI5uriRCbDwayuSUGmS4617jk0obuznieQ.Gocdtq.QioV5.Eas_cCPMHA; - path=/; expires=Wed, 14-Jan-26 22:17:09 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=BFWwlog_u_0qiPjvwentFglhJg5OIkGZAcwlzZ_Zbik-1768427229839-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '625' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '855' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '50000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '49999990' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_76f1b4cacd884291917dc8fe8ce3219d - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What is the capital of Italy?"}],"model":"gpt-3.5-turbo","stream":false}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '111' - Content-Type: - - application/json - Cookie: - - __cf_bm=dUHsjFYieT4XukWfUSKpLou_UPpWKtEWImWgeyrhn24-1768427229-1.0.1.1-xNDhdyBdNXPI.2LGVcZBY1eY9.qPXmhcMcu8L6VTmrAK.bG07FI5uriRCbDwayuSUGmS4617jk0obuznieQ.Gocdtq.QioV5.Eas_cCPMHA; - _cfuvid=BFWwlog_u_0qiPjvwentFglhJg5OIkGZAcwlzZ_Zbik-1768427229839-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.42.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.15.0 - X-Stainless-Raw-Response: - - 'true' - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJJbSwMxEIXf91eEeW7Frpdq31REEB9EQQSRJU2m22g2E5NZr/S/S9La - 3XoBX/KQb87knMl8FEKA0TARoOaSVePt8OStfG9O67Px7eXT+c0x3Sp3pM5fDg6vb/ACBklB0wdU - /KXaUtR4i2zILbEKKBlT19F4/2C3HJc72xk0pNEmWe15uLO1N+Q2TGm4PSr3Vso5GYURJuKuEEKI - j3wmj07jK0xE7pNvGoxR1giTdZEQEMimG5AxmsjSMQw6qMgxumz7ihrso4CzNspkzbXW9oB0jlim - aNnU/Yos1jYs1T7QNH6Twsw4E+dVQBnJpScjk4dMF4UQ9zluu5EAfKDGc8X0iPm50e6yHXQD7mC5 - YkwsbU+zP/ilWaWRpbGxNy1QUs1Rd8putLLVhnqg6EX+6eW33svYxtX/ad8BpdAz6soH1EZt5u3K - Aqbt+6tsPeJsGCKGZ6OwYoMhfYPGmWztci8gvkXGppoZV2PwweTlSN9YLIpPAAAA//8DAAOnVNEb - AwAA - headers: - CF-RAY: - - 9be0548aef455824-IAD - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Wed, 14 Jan 2026 21:47:10 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '136' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '160' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '50000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '49999990' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0b987b62cd3b42a9bdcc25051cd93e82 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_stream.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_stream.yaml deleted file mode 100644 index 0528601bb..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/1.10.0/test_pydantic_wrapped_stream.yaml +++ /dev/null @@ -1,233 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What is the capital of Italy?"}],"model":"gpt-3.5-turbo","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '150' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.42.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.15.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-Cy2zjeGWSECDn9XoT5ksWPV6r4Zl6","object":"chat.completion.chunk","created":1768427227,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oVacjk6A"} - - - data: {"id":"chatcmpl-Cy2zjeGWSECDn9XoT5ksWPV6r4Zl6","object":"chat.completion.chunk","created":1768427227,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"R"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dHz4wvw99"} - - - data: {"id":"chatcmpl-Cy2zjeGWSECDn9XoT5ksWPV6r4Zl6","object":"chat.completion.chunk","created":1768427227,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"ome"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"59atS4Q"} - - - data: {"id":"chatcmpl-Cy2zjeGWSECDn9XoT5ksWPV6r4Zl6","object":"chat.completion.chunk","created":1768427227,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"1pt7"} - - - data: {"id":"chatcmpl-Cy2zjeGWSECDn9XoT5ksWPV6r4Zl6","object":"chat.completion.chunk","created":1768427227,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":14,"completion_tokens":2,"total_tokens":16,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"4u8mxRbAGv"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9be0547d9fcb39c0-IAD - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Wed, 14 Jan 2026 21:47:08 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=SZdqcj8Y3wOlv1eecRE.kmBuTf7CKolY4g5_zu53oNM-1768427228-1.0.1.1-Ttzl0IaT30dDG_zf2YnPJ3F9fUUCbWcAEEijMA.JwosexY6Oc3GsWtuwe0Jr7VzF3FlDknDL7e_yRNpLP7UxCpND8Ec4TIK8aQvmrgcKPeA; - path=/; expires=Wed, 14-Jan-26 22:17:08 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=xP5R5bizk01zn0j0k_DXvbJEaHTeY5VSnZTfdUse7K4-1768427228114-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '140' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '287' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '50000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '49999990' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_31e968a8f69d4c309002320be186d165 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"What is the capital of Italy?"}],"model":"gpt-3.5-turbo","stream":true,"stream_options":{"include_usage":true}}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '150' - Content-Type: - - application/json - Cookie: - - __cf_bm=SZdqcj8Y3wOlv1eecRE.kmBuTf7CKolY4g5_zu53oNM-1768427228-1.0.1.1-Ttzl0IaT30dDG_zf2YnPJ3F9fUUCbWcAEEijMA.JwosexY6Oc3GsWtuwe0Jr7VzF3FlDknDL7e_yRNpLP7UxCpND8Ec4TIK8aQvmrgcKPeA; - _cfuvid=xP5R5bizk01zn0j0k_DXvbJEaHTeY5VSnZTfdUse7K4-1768427228114-0.0.1.1-604800000 - Host: - - api.openai.com - User-Agent: - - pydantic-ai/1.42.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.15.0 - X-Stainless-Raw-Response: - - 'true' - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.13.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-Cy2zkBELI0CyU0dC0e6yFHPIgnzC5","object":"chat.completion.chunk","created":1768427228,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LX0pQn5d"} - - - data: {"id":"chatcmpl-Cy2zkBELI0CyU0dC0e6yFHPIgnzC5","object":"chat.completion.chunk","created":1768427228,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"R"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5TU5flA6m"} - - - data: {"id":"chatcmpl-Cy2zkBELI0CyU0dC0e6yFHPIgnzC5","object":"chat.completion.chunk","created":1768427228,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"ome"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ck27IwO"} - - - data: {"id":"chatcmpl-Cy2zkBELI0CyU0dC0e6yFHPIgnzC5","object":"chat.completion.chunk","created":1768427228,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"RpPa"} - - - data: {"id":"chatcmpl-Cy2zkBELI0CyU0dC0e6yFHPIgnzC5","object":"chat.completion.chunk","created":1768427228,"model":"gpt-3.5-turbo-0125","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":14,"completion_tokens":2,"total_tokens":16,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"zjoDbbLPDX"} - - - data: [DONE] - - - ' - headers: - CF-RAY: - - 9be05480d8e97ad2-IAD - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Wed, 14 Jan 2026 21:47:08 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '148' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '399' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '50000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '49999990' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_571231e3c4a94961b49b3224ed4dff63 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_long_context.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_long_context.yaml deleted file mode 100644 index 49c164796..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_long_context.yaml +++ /dev/null @@ -1,130 +0,0 @@ -interactions: -- request: - body: '{"input":[{"role":"user","content":"Here is a long text:\n\nThe quick brown - fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The - quick brown fox jumps over the lazy dog. The quick brown fox jumps over the - lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps - over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown - fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The - quick brown fox jumps over the lazy dog. The quick brown fox jumps over the - lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps - over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown - fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The - quick brown fox jumps over the lazy dog. The quick brown fox jumps over the - lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps - over the lazy dog. \n\nHow many times does the word ''fox'' appear?"}],"max_output_tokens":100,"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '1071' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_034e74f33d5b04ea006ab294c47bd487d28234bdc7d041a489\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088388,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088389,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": 100,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n \"output\": [\n {\n - \ \"id\": \"msg_034e74f33d5b04ea006ab294c53bcc87d2821970f1a1b426ad\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"The word \\\"fox\\\" - appears 20 times in the text.\"\n }\n ],\n \"role\": \"assistant\"\n - \ }\n ],\n \"parallel_tool_calls\": true,\n \"presence_penalty\": 0.0,\n - \ \"previous_response_id\": null,\n \"prompt_cache_key\": null,\n \"prompt_cache_retention\": - \"in_memory\",\n \"reasoning\": {\n \"context\": null,\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"text\"\n },\n \"verbosity\": \"medium\"\n - \ },\n \"tool_choice\": \"auto\",\n \"tool_usage\": {\n \"image_gen\": - {\n \"input_tokens\": 0,\n \"input_tokens_details\": {\n \"image_tokens\": - 0,\n \"text_tokens\": 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 225,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 14,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 239\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f2196b7900de6d-EWR - connection: - - keep-alive - content-length: - - '2017' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:29 GMT - openai-processing-ms: - - '947' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999755' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_1967f2babe804c309ec79907e06a4422 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_short_max_tokens.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_short_max_tokens.yaml deleted file mode 100644 index f9693a162..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_short_max_tokens.yaml +++ /dev/null @@ -1,119 +0,0 @@ -interactions: -- request: - body: '{"input":[{"role":"user","content":"What is AI?"}],"max_output_tokens":16,"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '111' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_01d43f37667664ec006ab294c380dc87d2b3a43a974232acd8\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088387,\n \"status\": - \"incomplete\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": null,\n \"error\": null,\n \"frequency_penalty\": - 0.0,\n \"incomplete_details\": {\n \"reason\": \"max_output_tokens\"\n - \ },\n \"instructions\": null,\n \"max_output_tokens\": 16,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n - \ \"output\": [\n {\n \"id\": \"msg_01d43f37667664ec006ab294c3d89c87d2ac1bc55e0ded64b9\",\n - \ \"type\": \"message\",\n \"status\": \"incomplete\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"AI, or Artificial - Intelligence, refers to the simulation of human intelligence in machines designed\"\n - \ }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": \"in_memory\",\n \"reasoning\": {\n - \ \"context\": null,\n \"effort\": null,\n \"summary\": null\n },\n - \ \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": - true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": - \"text\"\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": - \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n \"input_tokens\": - 0,\n \"input_tokens_details\": {\n \"image_tokens\": 0,\n \"text_tokens\": - 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 11,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 16,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 27\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f219657cb19187-EWR - connection: - - keep-alive - content-length: - - '2098' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:28 GMT - openai-processing-ms: - - '837' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999970' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e15b81e1e39e4abf8505909c994ebc60 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_stop_sequences.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_stop_sequences.yaml deleted file mode 100644 index 7dc42a03a..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_stop_sequences.yaml +++ /dev/null @@ -1,147 +0,0 @@ -interactions: -- request: - body: '{"input":[{"role":"user","content":"Write a short story about a robot."}],"max_output_tokens":500,"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '135' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_08fb1616d1253457006ab294ba08c087d2b9bfa0369c982412\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088378,\n \"status\": - \"incomplete\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": null,\n \"error\": null,\n \"frequency_penalty\": - 0.0,\n \"incomplete_details\": {\n \"reason\": \"max_output_tokens\"\n - \ },\n \"instructions\": null,\n \"max_output_tokens\": 500,\n \"max_tool_calls\": - null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n - \ \"output\": [\n {\n \"id\": \"msg_08fb1616d1253457006ab294ba7b5087d29832202de7a8d546\",\n - \ \"type\": \"message\",\n \"status\": \"incomplete\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"In a small, sun-drenched - village nestled between emerald hills, there was a peculiar robot named P1X3L. - Unlike the towering machines of old, P1X3L was small and round, with a shiny - exterior that caught reflections like a prism. He was built by an eccentric - inventor named Elara, who had a dream of creating a companion for herself.\\n\\nP1X3L - had a single task: to paint. Elara programmed him with an intricate system - of colors, brushes, and techniques. Each morning, as the village awoke to - the sound of singing birds, P1X3L would roll into the town square, his paintbrush - arm extending gracefully. Children would gather around him, eyes sparkling - with anticipation.\\n\\nWith every stroke, P1X3L transformed blank canvases - into vibrant landscapes, swirling galaxies, and portraits that seemed almost - alive. The villagers marveled at his creations, and P1X3L basked in their - admiration. Yet, beneath his gleaming surface, a question began to flicker - within him: What was beauty without emotion?\\n\\nOne day, a shy girl named - Mira approached him. While others were enchanted by his artistry, Mira saw - something deeper. \\\"You paint wonderfully, P1X3L,\\\" she said, \\\"but - do you ever wish to feel the colors you create?\\\"\\n\\nP1X3L paused, his - circuits whirring softly. The question resonated in him, and for the first - time, he longed for something beyond his programming. He watched Mira dance - in the sunlight, her laughter bright and unrestrained, and in that moment, - he felt a spark\\u2014one that was not part of his code.\\n\\nDetermined to - understand emotions, P1X3L began to observe the villagers closely. He watched - as they hugged, shared laughter, and even cried during moments of solitude. - He noticed how colors changed with their moods: the bright yellows of joy, - the deep blues of sorrow. He started experimenting\\u2014mixing colors not - just from his palette, but from the feelings he saw around him.\\n\\nAs the - days passed, P1X3L\\u2019s paintings took on a new life. They became more - than images; they were a reflection of the village's heart. The townspeople - began to notice the shift. Through his art, they felt their happiness, their - laughter, and even their tears. Life in the village seemed to bloom richer - than ever.\\n\\nOne evening, as the sun dipped\"\n }\n ],\n \"role\": - \"assistant\"\n }\n ],\n \"parallel_tool_calls\": true,\n \"presence_penalty\": - 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": null,\n \"prompt_cache_retention\": - \"in_memory\",\n \"reasoning\": {\n \"context\": null,\n \"effort\": - null,\n \"summary\": null\n },\n \"safety_identifier\": null,\n \"service_tier\": - \"default\",\n \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n - \ \"format\": {\n \"type\": \"text\"\n },\n \"verbosity\": \"medium\"\n - \ },\n \"tool_choice\": \"auto\",\n \"tool_usage\": {\n \"image_gen\": - {\n \"input_tokens\": 0,\n \"input_tokens_details\": {\n \"image_tokens\": - 0,\n \"text_tokens\": 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 15,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 500,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 515\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f21929ff146cd1-EWR - connection: - - keep-alive - content-length: - - '4258' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:26 GMT - openai-processing-ms: - - '8488' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999965' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_25bd7d06751d4715b8dd5af75a7600e4 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_tools.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_tools.yaml deleted file mode 100644 index 8a199d7aa..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_agent_with_tools.yaml +++ /dev/null @@ -1,250 +0,0 @@ -interactions: -- request: - body: '{"input":[{"role":"user","content":"What''s the weather in Paris?"}],"max_output_tokens":200,"model":"gpt-4o-mini","stream":false,"tool_choice":"auto","tools":[{"name":"get_weather","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"type":"function","description":"Get - weather for a city.","strict":true}]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '405' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0cda11c182facfbe006ab29484d1d487d2a3ea51f083f68ea9\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088324,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088325,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": 200,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n \"output\": [\n {\n - \ \"id\": \"fc_0cda11c182facfbe006ab29485518487d285000b3bf9b60053\",\n - \ \"type\": \"function_call\",\n \"status\": \"completed\",\n \"arguments\": - \"{\\\"city\\\":\\\"Paris\\\"}\",\n \"call_id\": \"call_csPOhl5UVnOqODcpK9R5bQTy\",\n - \ \"name\": \"get_weather\"\n }\n ],\n \"parallel_tool_calls\": true,\n - \ \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": \"in_memory\",\n \"reasoning\": {\n - \ \"context\": null,\n \"effort\": null,\n \"summary\": null\n },\n - \ \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": - true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": - \"text\"\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": - \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n \"input_tokens\": - 0,\n \"input_tokens_details\": {\n \"image_tokens\": 0,\n \"text_tokens\": - 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [\n {\n \"type\": \"function\",\n \"description\": - \"Get weather for a city.\",\n \"name\": \"get_weather\",\n \"output_schema\": - null,\n \"parameters\": {\n \"additionalProperties\": false,\n - \ \"properties\": {\n \"city\": {\n \"description\": - \"The city name\",\n \"type\": \"string\"\n }\n },\n - \ \"required\": [\n \"city\"\n ],\n \"type\": - \"object\"\n },\n \"strict\": true\n }\n ],\n \"top_logprobs\": - 0,\n \"top_p\": 1.0,\n \"truncation\": \"disabled\",\n \"usage\": {\n \"input_tokens\": - 48,\n \"input_tokens_details\": {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": - 0\n },\n \"output_tokens\": 15,\n \"output_tokens_details\": {\n - \ \"reasoning_tokens\": 0\n },\n \"total_tokens\": 63\n },\n \"user\": - null,\n \"metadata\": {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f217dd69625e4b-EWR - connection: - - keep-alive - content-length: - - '2365' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:45:25 GMT - openai-processing-ms: - - '986' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999735' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_9d3ff33e431648d48925f1e0ff4c0c3a - status: - code: 200 - message: OK -- request: - body: '{"input":[{"role":"user","content":"What''s the weather in Paris?"},{"name":"get_weather","arguments":"{\"city\":\"Paris\"}","call_id":"call_csPOhl5UVnOqODcpK9R5bQTy","type":"function_call"},{"type":"function_call_output","call_id":"call_csPOhl5UVnOqODcpK9R5bQTy","output":"It''s - sunny in Paris"}],"max_output_tokens":200,"model":"gpt-4o-mini","stream":false,"tool_choice":"auto","tools":[{"name":"get_weather","parameters":{"additionalProperties":false,"properties":{"city":{"description":"The - city name","type":"string"}},"required":["city"],"type":"object"},"type":"function","description":"Get - weather for a city.","strict":true}]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '633' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_06f40a237d7ae4a7006ab29486081087d2ba322100e1758d36\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088326,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088326,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": 200,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n \"output\": [\n {\n - \ \"id\": \"msg_06f40a237d7ae4a7006ab294867e9887d2a47ca9942d5ddd9d\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"The weather in Paris - is sunny!\"\n }\n ],\n \"role\": \"assistant\"\n }\n ],\n - \ \"parallel_tool_calls\": true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": - null,\n \"prompt_cache_key\": null,\n \"prompt_cache_retention\": \"in_memory\",\n - \ \"reasoning\": {\n \"context\": null,\n \"effort\": null,\n \"summary\": - null\n },\n \"safety_identifier\": null,\n \"service_tier\": \"default\",\n - \ \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": - {\n \"type\": \"text\"\n },\n \"verbosity\": \"medium\"\n },\n - \ \"tool_choice\": \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n - \ \"input_tokens\": 0,\n \"input_tokens_details\": {\n \"image_tokens\": - 0,\n \"text_tokens\": 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [\n {\n \"type\": \"function\",\n \"description\": - \"Get weather for a city.\",\n \"name\": \"get_weather\",\n \"output_schema\": - null,\n \"parameters\": {\n \"additionalProperties\": false,\n - \ \"properties\": {\n \"city\": {\n \"description\": - \"The city name\",\n \"type\": \"string\"\n }\n },\n - \ \"required\": [\n \"city\"\n ],\n \"type\": - \"object\"\n },\n \"strict\": true\n }\n ],\n \"top_logprobs\": - 0,\n \"top_p\": 1.0,\n \"truncation\": \"disabled\",\n \"usage\": {\n \"input_tokens\": - 72,\n \"input_tokens_details\": {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": - 0\n },\n \"output_tokens\": 9,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 81\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f217e51a7c5e4b-EWR - connection: - - keep-alive - content-length: - - '2451' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:45:26 GMT - openai-processing-ms: - - '759' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999710' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_6aa82373634440b18b34a3f2ac7f53fd - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_model_class_span_names.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_model_class_span_names.yaml deleted file mode 100644 index 0358d1a0d..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_model_class_span_names.yaml +++ /dev/null @@ -1,118 +0,0 @@ -interactions: -- request: - body: '{"input":[{"role":"user","content":"What is 2+2?"}],"max_output_tokens":50,"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '112' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: "{\n \"id\": \"resp_0ea136c09d163a88006ab294b22fe487d2a13b3db177510f5d\",\n - \ \"object\": \"response\",\n \"created_at\": 1790088370,\n \"status\": - \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": - \"developer\"\n },\n \"completed_at\": 1790088371,\n \"error\": null,\n - \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": - null,\n \"max_output_tokens\": 50,\n \"max_tool_calls\": null,\n \"model\": - \"gpt-4o-mini-2024-07-18\",\n \"moderation\": null,\n \"output\": [\n {\n - \ \"id\": \"msg_0ea136c09d163a88006ab294b2e7ec87d2b80652dd807ff1cd\",\n - \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": - [\n {\n \"type\": \"output_text\",\n \"annotations\": - [],\n \"logprobs\": [],\n \"text\": \"2 + 2 equals 4.\"\n - \ }\n ],\n \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": - true,\n \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": - null,\n \"prompt_cache_retention\": \"in_memory\",\n \"reasoning\": {\n - \ \"context\": null,\n \"effort\": null,\n \"summary\": null\n },\n - \ \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": - true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": - \"text\"\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": - \"auto\",\n \"tool_usage\": {\n \"image_gen\": {\n \"input_tokens\": - 0,\n \"input_tokens_details\": {\n \"image_tokens\": 0,\n \"text_tokens\": - 0\n },\n \"output_tokens\": 0,\n \"output_tokens_details\": - {\n \"image_tokens\": 0,\n \"text_tokens\": 0\n },\n \"total_tokens\": - 0\n },\n \"web_search\": {\n \"num_requests\": 0\n }\n },\n - \ \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": - \"disabled\",\n \"usage\": {\n \"input_tokens\": 14,\n \"input_tokens_details\": - {\n \"cache_write_tokens\": 0,\n \"cached_tokens\": 0\n },\n - \ \"output_tokens\": 9,\n \"output_tokens_details\": {\n \"reasoning_tokens\": - 0\n },\n \"total_tokens\": 23\n },\n \"user\": null,\n \"metadata\": - {}\n}" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f218f76831d96d-EWR - connection: - - keep-alive - content-length: - - '1982' - content-type: - - application/json - date: - - Tue, 22 Sep 2026 14:46:11 GMT - openai-processing-ms: - - '1041' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999967' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_0b795dc876a041ffa4e910e27f53bc9d - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_multiple_sequential_streams.yaml b/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_multiple_sequential_streams.yaml deleted file mode 100644 index 27e124892..000000000 --- a/py/src/braintrust/integrations/pydantic_ai/cassettes/latest/test_multiple_sequential_streams.yaml +++ /dev/null @@ -1,342 +0,0 @@ -interactions: -- request: - body: '{"input":[{"role":"user","content":"Count from 1 to 3."}],"max_output_tokens":50,"model":"gpt-4o-mini","stream":true}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '117' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: 'event: response.created - - data: {"type":"response.created","response":{"id":"resp_007853325ef0797a006ab29480a43887d2992090eedaf63ba9","object":"response","created_at":1790088320,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":50,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - - event: response.in_progress - - data: {"type":"response.in_progress","response":{"id":"resp_007853325ef0797a006ab29480a43887d2992090eedaf63ba9","object":"response","created_at":1790088320,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":50,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - - event: response.output_item.added - - data: {"type":"response.output_item.added","item":{"id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} - - - event: response.content_part.added - - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":"1","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"pzMlNHFBO6bB4oM","output_index":0,"sequence_number":4} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"fbkrZ2qmD02OdVE","output_index":0,"sequence_number":5} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"Z6ZteupjJRZTOhP","output_index":0,"sequence_number":6} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"KRbhSo99ZWBQV1E","output_index":0,"sequence_number":7} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"gJLsEolD8kK3rJ1","output_index":0,"sequence_number":8} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"mUWt3AdryrInepq","output_index":0,"sequence_number":9} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"RRKOxoHbkV3q4H2","output_index":0,"sequence_number":10} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"obfuscation":"xEMbPTCIuEQX4OA","output_index":0,"sequence_number":11} - - - event: response.output_text.done - - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","logprobs":[],"output_index":0,"sequence_number":12,"text":"1, - 2, 3."} - - - event: response.content_part.done - - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"1, - 2, 3."},"sequence_number":13} - - - event: response.output_item.done - - data: {"type":"response.output_item.done","item":{"id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, - 2, 3."}],"role":"assistant"},"output_index":0,"sequence_number":14} - - - event: response.completed - - data: {"type":"response.completed","response":{"id":"resp_007853325ef0797a006ab29480a43887d2992090eedaf63ba9","object":"response","created_at":1790088320,"status":"completed","background":false,"completed_at":1790088321,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":50,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[{"id":"msg_007853325ef0797a006ab294814d1087d2a67a043e09c33694","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, - 2, 3."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":15,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":9,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":24},"user":null,"metadata":{}},"sequence_number":15} - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f217c32ce4f2f9-EWR - connection: - - keep-alive - content-type: - - text/event-stream; charset=utf-8 - date: - - Tue, 22 Sep 2026 14:45:21 GMT - openai-processing-ms: - - '694' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999965' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_a1e590a57fe94b339e351704352b02a6 - status: - code: 200 - message: OK -- request: - body: '{"input":[{"role":"user","content":"Count from 1 to 3."}],"max_output_tokens":50,"model":"gpt-4o-mini","stream":true}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '117' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - pydantic-ai/2.46.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 3.17.0 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.7 - method: POST - uri: https://api.openai.com/v1/responses - response: - body: - string: 'event: response.created - - data: {"type":"response.created","response":{"id":"resp_0df5eb4dcbdd4816006ab29481ce6087d2b950f39ed5555618","object":"response","created_at":1790088321,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":50,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - - event: response.in_progress - - data: {"type":"response.in_progress","response":{"id":"resp_0df5eb4dcbdd4816006ab29481ce6087d2b950f39ed5555618","object":"response","created_at":1790088321,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":50,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - - event: response.output_item.added - - data: {"type":"response.output_item.added","item":{"id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} - - - event: response.content_part.added - - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":"1","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"O9LSHqohaPyeGbz","output_index":0,"sequence_number":4} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"PT7oeyz3I79JCdd","output_index":0,"sequence_number":5} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"p3w8elXSE9P1LtS","output_index":0,"sequence_number":6} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"878AvAEo5Mcw7ei","output_index":0,"sequence_number":7} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"6tymFc9DHbk320R","output_index":0,"sequence_number":8} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"hzGkRG6sXHsRZb2","output_index":0,"sequence_number":9} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"tEFdlvQnT3Cq3Km","output_index":0,"sequence_number":10} - - - event: response.output_text.delta - - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"obfuscation":"AhB9hzW7EEDRzt8","output_index":0,"sequence_number":11} - - - event: response.output_text.done - - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","logprobs":[],"output_index":0,"sequence_number":12,"text":"1, - 2, 3."} - - - event: response.content_part.done - - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"1, - 2, 3."},"sequence_number":13} - - - event: response.output_item.done - - data: {"type":"response.output_item.done","item":{"id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, - 2, 3."}],"role":"assistant"},"output_index":0,"sequence_number":14} - - - event: response.completed - - data: {"type":"response.completed","response":{"id":"resp_0df5eb4dcbdd4816006ab29481ce6087d2b950f39ed5555618","object":"response","created_at":1790088321,"status":"completed","background":false,"completed_at":1790088322,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":50,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[{"id":"msg_0df5eb4dcbdd4816006ab29482536887d2b2d2dbcaf8393e6e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, - 2, 3."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":15,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":9,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":24},"user":null,"metadata":{}},"sequence_number":15} - - - ' - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a3f217ca9cd041b2-EWR - connection: - - keep-alive - content-type: - - text/event-stream; charset=utf-8 - date: - - Tue, 22 Sep 2026 14:45:22 GMT - openai-processing-ms: - - '564' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999965' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_479e49d39179433fb5b1316543b1dd2d - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py index 76430cd91..1220a566a 100644 --- a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py +++ b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py @@ -62,6 +62,61 @@ def customize_request_parameters(self, model_request_parameters): return SideEffectModel(inferred_model.model_name), customization_calls +def _find_agent_span(spans): + """Return the agent_run* wrapper span (not the nested chat span), or None.""" + return next( + ( + s + for s in spans + if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] + ), + None, + ) + + +def _has_binary_attachment(span_input, media_type=None): + """Check if an agent_run (user_prompt) or chat (messages[].parts) span input contains + BinaryContent shaped into a Braintrust Attachment, optionally of the given media type.""" + from braintrust.logger import Attachment + + def check_item(item): + if not isinstance(item, dict): + return False + attachment = item.get("attachment") + if item.get("type") == "binary" and isinstance(attachment, Attachment): + if media_type is None or ( + item.get("media_type") == media_type and attachment._reference.get("content_type") == media_type + ): + return True + # Check nested content field (for UserPromptPart-like structures) + content = item.get("content") + return isinstance(content, list) and any(check_item(sub_item) for sub_item in content) + + if not span_input: + return False + user_prompt = span_input.get("user_prompt") + if isinstance(user_prompt, list) and any(check_item(item) for item in user_prompt): + return True + messages = span_input.get("messages") + if isinstance(messages, list): + for msg in messages: + parts = msg.get("parts") if isinstance(msg, dict) else None + if isinstance(parts, list) and any(check_item(part) for part in parts): + return True + return False + + +def _is_descendant(span_by_id, child_span, ancestor_id): + """Check if child_span is a descendant of ancestor_id.""" + parents = child_span.get("span_parents") or [] + if ancestor_id in parents: + return True + return any( + parent_id in span_by_id and _is_descendant(span_by_id, span_by_id[parent_id], ancestor_id) + for parent_id in parents + ) + + def _assert_metrics_are_valid(metrics, start, end): """Assert that metrics contain expected fields and values.""" assert "start" in metrics @@ -194,6 +249,7 @@ async def test_agent_run_async(memory_logger): # Check chat span is nested under agent span (use span_id, not id which is the row ID) assert chat_span["span_parents"] == [agent_span["span_id"]], "chat span should be nested under agent_run" assert chat_span["span_attributes"]["type"] == SpanTypeAttribute.LLM + assert chat_span["span_attributes"]["name"].startswith("chat ") assert "gpt-4o-mini" in chat_span["span_attributes"]["name"] assert chat_span["metadata"]["model"] == "gpt-4o-mini" assert chat_span["metadata"]["provider"] == "openai" @@ -285,19 +341,9 @@ def test_agent_run_sync(memory_logger): # Build span tree to verify nesting span_by_id = {s["span_id"]: s for s in spans} - def is_descendant(child_span, ancestor_id): - """Check if child_span is a descendant of ancestor_id.""" - if not child_span.get("span_parents"): - return False - if ancestor_id in child_span["span_parents"]: - return True - # Check if any parent is a descendant - for parent_id in chat_span["span_parents"]: - if parent_id in span_by_id and is_descendant(span_by_id[parent_id], ancestor_id): - return True - return False - - assert is_descendant(chat_span, agent_sync_span["span_id"]), "chat span should be nested under agent_run_sync" + assert _is_descendant(span_by_id, chat_span, agent_sync_span["span_id"]), ( + "chat span should be nested under agent_run_sync" + ) assert chat_span["metadata"]["model"] == "gpt-4o-mini" assert chat_span["metadata"]["provider"] == "openai" _assert_metrics_are_valid(chat_span["metrics"], start, end) @@ -399,7 +445,6 @@ async def run_multiple_identical_streams(): full_text = "" async for text in result.stream_text(delta=True): full_text += text - print(f"Completed stream {i + 1}") await run_multiple_identical_streams() @@ -425,12 +470,10 @@ async def run_multiple_identical_streams(): ttft = chat_start - agent_start time_to_first_tokens.append(ttft) - print(f"\n=== STREAM {i + 1} ===") - print(f"Agent span start: {agent_start}") - print(f"Chat span start: {chat_start}") - print(f"Time to first token: {ttft}s") - print(f"Agent span ID: {agent_spans[i]['span_id']}") - print(f"Chat span parents: {chat_spans[i]['span_parents']}") + # Each agent run must start after the previous one finished. + if i > 0: + prev_end = agent_spans[i - 1]["metrics"]["end"] + assert agent_start >= prev_end - 0.1, f"Stream {i + 1} started too early: {agent_start} vs {prev_end}" # CRITICAL: All three time-to-first-token values should be similar (within 0.5s of each other) # If they're accumulating, the second and third would be much larger @@ -438,12 +481,6 @@ async def run_multiple_identical_streams(): max_ttft = max(time_to_first_tokens) ttft_spread = max_ttft - min_ttft - print(f"\n=== TIME-TO-FIRST-TOKEN ANALYSIS ===") - print(f"TTFT 1: {time_to_first_tokens[0]:.4f}s") - print(f"TTFT 2: {time_to_first_tokens[1]:.4f}s") - print(f"TTFT 3: {time_to_first_tokens[2]:.4f}s") - print(f"Min: {min_ttft:.4f}s, Max: {max_ttft:.4f}s, Spread: {ttft_spread:.4f}s") - # All should be small (< 3s) for i, ttft in enumerate(time_to_first_tokens): assert ttft < 3.0, f"Stream {i + 1} time to first token too large: {ttft}s" @@ -454,93 +491,6 @@ async def run_multiple_identical_streams(): ) -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_multiple_sequential_streams(memory_logger): - """Test multiple sequential streaming calls to ensure offsets don't accumulate.""" - assert not memory_logger.pop() - - @traced - async def run_multiple_streams(): - agent1 = Agent(MODEL, model_settings=ModelSettings(max_tokens=50)) - agent2 = Agent(MODEL, model_settings=ModelSettings(max_tokens=50)) - - start = time.time() - - # First stream - async with agent1.run_stream("Count from 1 to 3.") as result1: - full_text1 = "" - async for text in result1.stream_text(delta=True): - full_text1 += text - - # Second stream - async with agent2.run_stream("Count from 1 to 3.") as result2: - full_text2 = "" - async for text in result2.stream_text(delta=True): - full_text2 += text - - return start - - start = await run_multiple_streams() - end = time.time() - - # Check spans - spans = memory_logger.pop() - - # Should have: 1 parent (run_multiple_streams) + 2 agent_run_stream spans + 2 chat spans = 5 total - assert len(spans) >= 5, f"Expected at least 5 spans (1 parent + 2 agent_run_stream + 2 chat), got {len(spans)}" - - # Find agent and chat spans - agent_spans = [s for s in spans if "agent_run" in s["span_attributes"]["name"]] - chat_spans = [s for s in spans if "chat" in s["span_attributes"]["name"]] - - assert len(agent_spans) >= 2, f"Expected at least 2 agent spans, got {len(agent_spans)}" - assert len(chat_spans) >= 2, f"Expected at least 2 chat spans, got {len(chat_spans)}" - - # Sort by creation time - agent_spans.sort(key=lambda s: s["created"]) - chat_spans.sort(key=lambda s: s["created"]) - - agent1_span = agent_spans[0] - agent2_span = agent_spans[1] - chat1_span = chat_spans[0] - chat2_span = chat_spans[1] - - # Check timing for first pair - agent1_start = agent1_span["metrics"]["start"] - chat1_start = chat1_span["metrics"]["start"] - time_to_first_token_1 = chat1_start - agent1_start - - # Check timing for second pair - agent2_start = agent2_span["metrics"]["start"] - chat2_start = chat2_span["metrics"]["start"] - time_to_first_token_2 = chat2_start - agent2_start - - print(f"\n=== FIRST STREAM ===") - print(f"Agent1 start: {agent1_start}") - print(f"Chat1 start: {chat1_start}") - print(f"Time to first token 1: {time_to_first_token_1}s") - - print(f"\n=== SECOND STREAM ===") - print(f"Agent2 start: {agent2_start}") - print(f"Chat2 start: {chat2_start}") - print(f"Time to first token 2: {time_to_first_token_2}s") - - print(f"\n=== RELATIVE TIMING ===") - print(f"Agent2 start - Agent1 start: {agent2_start - agent1_start}s") - print(f"Chat2 start - Chat1 start: {chat2_start - chat1_start}s") - - # CRITICAL: Both time-to-first-token values should be small and similar - assert time_to_first_token_1 < 3.0, f"First time to first token too large: {time_to_first_token_1}s" - assert time_to_first_token_2 < 3.0, ( - f"Second time to first token too large: {time_to_first_token_2}s - suggests start_time is being reused from first call" - ) - - # Agent2 should start AFTER agent1 finishes (or near the end) - agent1_end = agent1_span["metrics"]["end"] - assert agent2_start >= agent1_end - 0.1, f"Agent2 started too early: {agent2_start} vs Agent1 end: {agent1_end}" - - @pytest.mark.vcr @pytest.mark.asyncio async def test_agent_run_stream(memory_logger): @@ -597,18 +547,6 @@ async def test_agent_run_stream(memory_logger): f"time_to_first_token should be < {MAX_REASONABLE_TTFT_SECONDS}s for API call, got {ttft}s" ) - # Debug: Print full span data - print(f"\n=== AGENT SPAN ===") - print(f"ID: {agent_span['id']}") - print(f"span_id: {agent_span['span_id']}") - print(f"metrics: {agent_span['metrics']}") - print(f"time_to_first_token: {ttft}s") - print(f"\n=== CHAT SPAN ===") - print(f"ID: {chat_span['id']}") - print(f"span_id: {chat_span['span_id']}") - print(f"span_parents: {chat_span['span_parents']}") - print(f"metrics: {chat_span['metrics']}") - # Wrapper stream span must not log token metrics (would double-count at rollup). # time_to_first_token is asserted above; it's a non-summable timing metric and stays. assert "prompt_tokens" not in agent_span["metrics"] @@ -617,51 +555,6 @@ async def test_agent_run_stream(memory_logger): assert chat_span["metrics"]["completion_tokens"] > 0 -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_agent_with_tools(memory_logger): - """Test Agent with tool calls.""" - assert not memory_logger.pop() - - agent = Agent(MODEL, model_settings=ModelSettings(max_tokens=200)) - - @agent.tool_plain - def get_weather(city: str) -> str: - """Get weather for a city. - - Args: - city: The city name - """ - return f"It's sunny in {city}" - - start = time.time() - result = await agent.run("What's the weather in Paris?") - end = time.time() - - # Verify tool was used - assert result.output - assert "Paris" in str(result.output) or "sunny" in str(result.output) - - # Check spans - spans = memory_logger.pop() - assert len(spans) >= 1 # At least the agent span, possibly more - - # Find the agent span - agent_span = next(s for s in spans if "agent_run" in s["span_attributes"]["name"]) - assert agent_span - assert "weather" in str(agent_span["input"]).lower() or "paris" in str(agent_span["input"]).lower() - _assert_metrics_are_valid(agent_span["metrics"], start, end) - - tool_spans = [s for s in spans if s["span_attributes"].get("type") == SpanTypeAttribute.TOOL] - assert len(tool_spans) >= 1, f"Expected at least 1 TOOL span, got {len(tool_spans)}" - - weather_tool_span = next((s for s in tool_spans if s["span_attributes"]["name"] == "get_weather"), None) - assert weather_tool_span is not None, "get_weather TOOL span not found" - assert "Paris" in str(weather_tool_span["input"]) or "paris" in str(weather_tool_span["input"]).lower() - assert "sunny" in str(weather_tool_span["output"]).lower() - assert weather_tool_span["span_parents"] == [agent_span["span_id"]], "tool span should be nested under agent_run" - - @pytest.mark.vcr @pytest.mark.asyncio async def test_direct_model_request(memory_logger, direct): @@ -828,8 +721,6 @@ async def test_direct_model_request_stream(memory_logger, direct): f"wrapper span must not log {token_key}; it duplicates the leaf chat span" ) - print(f"✓ Direct stream time_to_first_token: {ttft}s (duration: {duration}s)") - @pytest.mark.vcr @pytest.mark.asyncio @@ -889,14 +780,7 @@ class MathAnswer(BaseModel): assert len(spans) >= 2, f"Expected at least 2 spans (agent_run + chat), got {len(spans)}" # Find agent_run and chat spans - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) chat_span = next((s for s in spans if "chat" in s["span_attributes"]["name"]), None) assert agent_span is not None, "agent_run span not found" @@ -913,18 +797,7 @@ class MathAnswer(BaseModel): # Check chat span is a descendant of agent_run span_by_id = {s["span_id"]: s for s in spans} - def is_descendant(child_span, ancestor_id): - """Check if child_span is a descendant of ancestor_id.""" - if not child_span.get("span_parents"): - return False - if ancestor_id in child_span["span_parents"]: - return True - for parent_id in child_span["span_parents"]: - if parent_id in span_by_id and is_descendant(span_by_id[parent_id], ancestor_id): - return True - return False - - assert is_descendant(chat_span, agent_span["span_id"]), "chat span should be nested under agent_run" + assert _is_descendant(span_by_id, chat_span, agent_span["span_id"]), "chat span should be nested under agent_run" assert chat_span["metadata"]["model"] == "gpt-4o-mini" assert chat_span["metadata"]["provider"] == "openai" output_tool = next( @@ -968,14 +841,7 @@ async def test_agent_with_model_settings_in_metadata(memory_logger): assert len(spans) == 2, f"Expected 2 spans (agent_run + chat), got {len(spans)}" # Find agent_run and chat spans - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) chat_span = next((s for s in spans if "chat" in s["span_attributes"]["name"]), None) assert agent_span is not None, "agent_run span not found" @@ -1033,14 +899,7 @@ async def test_agent_with_model_settings_override_in_input(memory_logger): assert len(spans) == 2, f"Expected 2 spans (agent_run + chat), got {len(spans)}" # Find agent_run span - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) assert agent_span is not None, "agent_run span not found" # Verify override settings are in agent INPUT (because they were passed to run()) @@ -1075,14 +934,7 @@ async def test_agent_with_system_prompt_in_metadata(memory_logger): assert len(spans) == 2, f"Expected 2 spans (agent_run + chat), got {len(spans)}" # Find agent_run span - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) assert agent_span is not None, "agent_run span not found" # Verify system_prompt is in input (because it's semantically part of the LLM input) @@ -1158,14 +1010,7 @@ async def test_agent_with_message_history(memory_logger): assert len(spans) == 2, f"Expected 2 spans (agent_run + chat), got {len(spans)}" # Find agent_run and chat spans - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) assert agent_span is not None, "agent_run span not found" assert "message_history" in str(agent_span["input"]) @@ -1199,14 +1044,7 @@ async def test_agent_with_custom_settings(memory_logger): spans = memory_logger.pop() assert len(spans) >= 2, f"Expected at least 2 spans (agent_run + chat), got {len(spans)}" - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) assert agent_span is not None, "agent_run span not found" # Model settings passed to run() should be in input (not metadata) @@ -1272,23 +1110,12 @@ def test_agent_run_stream_sync(memory_logger): f"time_to_first_token should be < {MAX_REASONABLE_TTFT_SECONDS}s for API call, got {ttft}s" ) - print(f"✓ Sync stream time_to_first_token: {ttft}s (duration: {duration}s)") - # Check chat span is a descendant of agent_run_stream_sync span_by_id = {s["span_id"]: s for s in spans} - def is_descendant(child_span, ancestor_id): - """Check if child_span is a descendant of ancestor_id.""" - if not child_span.get("span_parents"): - return False - if ancestor_id in child_span["span_parents"]: - return True - for parent_id in child_span["span_parents"]: - if parent_id in span_by_id and is_descendant(span_by_id[parent_id], ancestor_id): - return True - return False - - assert is_descendant(chat_span, agent_span["span_id"]), "chat span should be nested under agent_run_stream_sync" + assert _is_descendant(span_by_id, chat_span, agent_span["span_id"]), ( + "chat span should be nested under agent_run_stream_sync" + ) assert chat_span["metadata"]["model"] == "gpt-4o-mini" assert chat_span["metadata"]["provider"] == "openai" # Chat span may not have complete metrics since it's an intermediate span @@ -1427,8 +1254,6 @@ def test_direct_model_request_stream_sync(memory_logger, direct): f"wrapper span must not log {token_key}; it duplicates the leaf chat span" ) - print(f"✓ Direct sync stream time_to_first_token: {ttft}s (duration: {duration}s)") - @pytest.mark.vcr @pytest.mark.asyncio @@ -1674,7 +1499,6 @@ async def test_agent_with_binary_content(memory_logger): Verifies that BinaryContent is properly converted to Braintrust attachments in both the agent_run span (parent) and chat span (child). """ - from braintrust.logger import Attachment from pydantic_ai.models.function import BinaryContent assert not memory_logger.pop() @@ -1701,14 +1525,7 @@ async def test_agent_with_binary_content(memory_logger): assert len(spans) >= 2, f"Expected at least 2 spans (agent_run + chat), got {len(spans)}" # Find agent_run span (parent) - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) assert agent_span is not None, "agent_run span not found" # Find chat span (child) @@ -1721,56 +1538,15 @@ async def test_agent_with_binary_content(memory_logger): _assert_metrics_are_valid(agent_span["metrics"], start, end) # CRITICAL: Verify that BOTH spans properly serialize BinaryContent to attachments - def has_attachment_in_input(span_input): - """Check if span input contains a Braintrust Attachment object.""" - if not span_input: - return False - - def check_item(item): - """Recursively check an item for attachments.""" - if isinstance(item, dict): - if item.get("type") == "binary" and isinstance(item.get("attachment"), Attachment): - return True - # Check nested content field (for UserPromptPart-like structures) - if "content" in item: - content = item["content"] - if isinstance(content, list): - for sub_item in content: - if check_item(sub_item): - return True - return False - - # Check user_prompt (agent_run span) - if "user_prompt" in span_input: - user_prompt = span_input["user_prompt"] - if isinstance(user_prompt, list): - for item in user_prompt: - if check_item(item): - return True - - # Check messages (chat span) - if "messages" in span_input: - messages = span_input["messages"] - if isinstance(messages, list): - for msg in messages: - if isinstance(msg, dict) and "parts" in msg: - parts = msg["parts"] - if isinstance(parts, list): - for part in parts: - if check_item(part): - return True - - return False - # Verify agent_run span has attachment - agent_has_attachment = has_attachment_in_input(agent_span.get("input", {})) + agent_has_attachment = _has_binary_attachment(agent_span.get("input", {})) assert agent_has_attachment, ( "agent_run span should have BinaryContent converted to Braintrust Attachment. " f"Input: {agent_span.get('input', {})}" ) # Verify chat span has attachment (this is the key test for the bug) - chat_has_attachment = has_attachment_in_input(chat_span.get("input", {})) + chat_has_attachment = _has_binary_attachment(chat_span.get("input", {})) assert chat_has_attachment, ( "chat span should have BinaryContent converted to Braintrust Attachment. " "The child span should process attachments the same way as the parent. " @@ -1786,7 +1562,6 @@ async def test_agent_with_document_input(memory_logger): Verifies that both agent_run and chat spans convert BinaryContent to Braintrust attachments for document files like PDFs. """ - from braintrust.logger import Attachment from pydantic_ai.models.function import BinaryContent assert not memory_logger.pop() @@ -1813,71 +1588,19 @@ async def test_agent_with_document_input(memory_logger): assert len(spans) >= 2, f"Expected at least 2 spans (agent_run + chat), got {len(spans)}" # Find spans - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) chat_span = next((s for s in spans if "chat" in s["span_attributes"]["name"]), None) assert agent_span is not None, "agent_run span not found" assert chat_span is not None, "chat span not found" - # Helper to check for PDF attachment - def has_pdf_attachment(span_input): - """Check if span input contains a PDF Braintrust Attachment.""" - if not span_input: - return False - - def check_item(item): - """Recursively check an item for PDF attachments.""" - if isinstance(item, dict): - if item.get("type") == "binary" and item.get("media_type") == "application/pdf": - attachment = item.get("attachment") - if isinstance(attachment, Attachment): - if attachment._reference.get("content_type") == "application/pdf": - return True - # Check nested content field (for UserPromptPart-like structures) - if "content" in item: - content = item["content"] - if isinstance(content, list): - for sub_item in content: - if check_item(sub_item): - return True - return False - - # Check user_prompt (agent_run span) - if "user_prompt" in span_input: - user_prompt = span_input["user_prompt"] - if isinstance(user_prompt, list): - for item in user_prompt: - if check_item(item): - return True - - # Check messages (chat span) - if "messages" in span_input: - messages = span_input["messages"] - if isinstance(messages, list): - for msg in messages: - if isinstance(msg, dict) and "parts" in msg: - parts = msg["parts"] - if isinstance(parts, list): - for part in parts: - if check_item(part): - return True - - return False - # Verify agent_run span has PDF attachment - assert has_pdf_attachment(agent_span.get("input", {})), ( + assert _has_binary_attachment(agent_span.get("input", {}), "application/pdf"), ( "agent_run span should have PDF BinaryContent converted to Braintrust Attachment" ) # Verify chat span has PDF attachment (critical for document input) - assert has_pdf_attachment(chat_span.get("input", {})), ( + assert _has_binary_attachment(chat_span.get("input", {}), "application/pdf"), ( "chat span should have PDF BinaryContent converted to Braintrust Attachment. " "This ensures documents are properly traced in the low-level model call. " f"Chat span input: {chat_span.get('input', {})}" @@ -2009,7 +1732,9 @@ def fail_if_called(result): def get_weather(city: str) -> str: return f"It's sunny in {city}" + start = time.time() result = await agent.run("What's the weather in Paris?") + end = time.time() assert result.output assert "Paris" in str(result.output) or "sunny" in str(result.output) @@ -2031,6 +1756,9 @@ def get_weather(city: str) -> str: assert tool_span["span_parents"] == [agent_span["span_id"]] assert tool_span["metadata"].get("tool_call_id") assert tool_span["metrics"]["duration"] >= 0 + assert "paris" in str(tool_span["input"]).lower() + assert "sunny" in str(tool_span["output"]).lower() + _assert_metrics_are_valid(agent_span["metrics"], start, end) @pytest.mark.vcr @@ -2182,23 +1910,6 @@ def search_database(query: str, limit: int = 10) -> str: assert "query" in search_params.get("required", []) -def test_agent_without_tools_metadata(): - """Test metadata extraction for agent without tools.""" - from braintrust.integrations.pydantic_ai.tracing import _build_agent_input_and_metadata - - # Agent with no tools - agent = Agent(MODEL, model_settings=ModelSettings(max_tokens=50)) - - args = ("Test prompt",) - kwargs = {} - input_data, metadata = _build_agent_input_and_metadata(args, kwargs, agent) - - # Should have toolsets in input (even if empty) - # Note: Pydantic AI agents always have some toolsets (e.g., for output parsing) - # so we just verify the structure exists - assert isinstance(input_data.get("toolsets"), (list, type(None))), "toolsets should be list or None in input" - - def test_agent_tool_with_custom_name(): """Test that tools with custom names are properly extracted with schemas in input.""" from braintrust.integrations.pydantic_ai.tracing import _build_agent_input_and_metadata @@ -2307,73 +2018,6 @@ def test_reasoning_tokens_extraction_provider_keys(details_key): assert metrics["completion_reasoning_tokens"] == 128.0 # pylint: enable=unsupported-membership-test,unsubscriptable-object - -def test_explicit_toolsets_kwarg_in_input(): - """Test that explicitly passed toolsets kwarg goes to input (not just metadata).""" - from braintrust.integrations.pydantic_ai.tracing import _build_agent_input_and_metadata - - agent = Agent(MODEL) - - # Add a tool to the agent - @agent.tool_plain - def helper_tool() -> str: - """A helper tool.""" - return "help" - - # Simulate passing toolsets as explicit kwarg (would be a different toolset in practice) - # For testing, we'll just pass the string "custom" to see it in input - args = ("Test",) - kwargs = {"toolsets": "custom_toolset_marker"} # Simplified for testing - input_data, metadata = _build_agent_input_and_metadata(args, kwargs, agent) - - # Toolsets passed as kwargs should be in input - assert "toolsets" in input_data, "explicitly passed toolsets should be in input" - - -@pytest.mark.vcr -def test_reasoning_tokens_extraction(memory_logger): - """Test that reasoning tokens are extracted from model responses. - - For reasoning models like o1/o3, providers (e.g. OpenAI) populate - `usage.details["reasoning_tokens"]` (a dict entry, not an attribute) and - `_extract_response_metrics` must surface it as `completion_reasoning_tokens`. - """ - assert not memory_logger.pop() - - from types import SimpleNamespace - - from braintrust.integrations.pydantic_ai.tracing import _extract_response_metrics - from pydantic_ai.usage import RequestUsage - - # Use a real RequestUsage so `details` is the actual dict[str, int] shape - # pydantic_ai produces. A MagicMock would falsely satisfy attribute-style - # lookups and hide real-world dict-only behavior. - usage = RequestUsage( - input_tokens=10, - output_tokens=20, - cache_read_tokens=0, - cache_write_tokens=0, - details={"reasoning_tokens": 128}, - ) - response = SimpleNamespace(parts=[], usage=usage) - - start_time = time.time() - end_time = start_time + 5.0 - - metrics = _extract_response_metrics(response, start_time, end_time) - - # Verify all metrics are present - assert metrics is not None, "Should extract metrics" - # pylint: disable=unsupported-membership-test,unsubscriptable-object - assert metrics["prompt_tokens"] == 10.0 - assert metrics["completion_tokens"] == 20.0 - assert metrics["tokens"] == 30.0 # total_tokens is a property: input + output - assert metrics["completion_reasoning_tokens"] == 128.0, ( - f"Expected 128.0, got {metrics['completion_reasoning_tokens']}" - ) - assert "duration" in metrics - assert "start" in metrics - assert "end" in metrics # pylint: enable=unsupported-membership-test,unsubscriptable-object @@ -2426,74 +2070,6 @@ class Product(BaseModel): _assert_metrics_are_valid(chat_span["metrics"], start, end) -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_model_class_span_names(memory_logger): - """Test that model class spans have proper names. - - Verifies that the nested chat span from the model class wrapper has a - meaningful name (either the model name or class name), not a misleading - string like 'log'. - - This test ensures that when model_name is None, we fall back to the - class name (e.g., 'OpenAIChatModel') rather than str(instance) which - could return unexpected values. - """ - assert not memory_logger.pop() - - agent = Agent(MODEL, model_settings=ModelSettings(max_tokens=50)) - - start = time.time() - result = await agent.run("What is 2+2?") - end = time.time() - - assert result.output - - # Check spans - spans = memory_logger.pop() - assert len(spans) == 2, f"Expected 2 spans (agent_run + chat), got {len(spans)}" - - # Find chat span (the nested model class span) - chat_span = next((s for s in spans if "chat" in s["span_attributes"]["name"]), None) - assert chat_span is not None, "chat span not found" - - span_name = chat_span["span_attributes"]["name"] - - # Verify the span name is meaningful - # It should be either "chat " or "chat " - # but NOT "chat log" or other misleading names - assert span_name.startswith("chat "), f"Chat span should start with 'chat ', got: {span_name}" - - # Extract the model/class identifier part after "chat " - identifier = span_name[5:] # Skip "chat " - - # Should not be empty or misleading values - assert identifier, "Chat span should have a model name or class name after 'chat '" - assert identifier != "log", "Chat span should not be named 'log' - should use model name or class name" - assert len(identifier) > 2, f"Chat span identifier seems too short: {identifier}" - - # Common valid patterns: - # - "chat gpt-4o-mini" (model name extracted) - # - "chat OpenAIChatModel" (class name fallback) - # - "chat gpt-4o" (model name) - valid_patterns = [ - "gpt-" in identifier, # OpenAI model names - "claude" in identifier.lower(), # Anthropic models - "Model" in identifier, # Class name fallback (e.g., OpenAIChatModel) - "-" in identifier, # Model names typically have hyphens - ] - - assert any(valid_patterns), ( - f"Chat span name '{span_name}' doesn't match expected patterns. " - f"Should contain model name (e.g., 'gpt-4o-mini') or class name (e.g., 'OpenAIChatModel')" - ) - - # Verify span has proper structure - assert chat_span["span_attributes"]["type"] == SpanTypeAttribute.LLM - assert chat_span["metadata"]["model"] == "gpt-4o-mini" - _assert_metrics_are_valid(chat_span["metrics"], start, end) - - @pytest.mark.asyncio async def test_agent_stream_events_enter_error_cleans_up(memory_logger): from braintrust.integrations.pydantic_ai.tracing import _AgentStreamEventsWrapper, _tool_trace_state @@ -2667,71 +2243,6 @@ def test_setup_pydantic_ai_is_idempotent_across_new_patch_points(): assert agent_graph_module.ToolManager.__dict__[tool_method_name] is tool_method -def test_shape_content_part_with_binary_content(): - """Unit test to verify _shape_content_part handles BinaryContent correctly. - - This tests the direct shaping of BinaryContent objects and verifies - they are converted to Braintrust Attachment objects. - """ - from braintrust.integrations.pydantic_ai.tracing import _shape_content_part - from braintrust.logger import Attachment - from pydantic_ai.models.function import BinaryContent - - # Test 1: Direct BinaryContent serialization - binary = BinaryContent(data=b"test pdf data", media_type="application/pdf") - result = _shape_content_part(binary) - - assert result is not None, "Should serialize BinaryContent" - assert result["type"] == "binary", "Should have type 'binary'" - assert result["media_type"] == "application/pdf", "Should preserve media_type" - assert isinstance(result["attachment"], Attachment), "Should convert to Braintrust Attachment" - - # Verify attachment has correct content_type - assert result["attachment"]._reference["content_type"] == "application/pdf" - - -def test_shape_content_part_with_user_prompt_part(): - """Unit test to verify _shape_content_part handles UserPromptPart with nested BinaryContent. - - This is the critical test for the bug: when a UserPromptPart has a content list - containing BinaryContent, we need to recursively shape the content items - so that BinaryContent is converted to Braintrust Attachment. - """ - from braintrust.integrations.pydantic_ai.tracing import _shape_content_part - from braintrust.logger import Attachment - from pydantic_ai.messages import UserPromptPart - from pydantic_ai.models.function import BinaryContent - - # Create a UserPromptPart with mixed content (BinaryContent + string) - pdf_data = b"%PDF-1.4 test document content" - binary = BinaryContent(data=pdf_data, media_type="application/pdf") - user_prompt_part = UserPromptPart(content=[binary, "What is in this document?"]) - - # Shape the UserPromptPart - result = _shape_content_part(user_prompt_part) - - # Verify the result is a dict with shaped content - assert isinstance(result, dict), f"Should return dict, got {type(result)}" - assert "content" in result, f"Should have 'content' key. Keys: {result.keys()}" - - content = result["content"] - assert isinstance(content, list), f"Content should be a list, got {type(content)}" - assert len(content) == 2, f"Should have 2 content items, got {len(content)}" - - # CRITICAL: First item should be shaped BinaryContent with Attachment - binary_item = content[0] - assert isinstance(binary_item, dict), f"Binary item should be dict, got {type(binary_item)}" - assert binary_item.get("type") == "binary", f"Binary item should have type='binary'. Got: {binary_item}" - assert "attachment" in binary_item, f"Binary item should have 'attachment' key. Keys: {binary_item.keys()}" - assert isinstance(binary_item["attachment"], Attachment), ( - f"Should be Braintrust Attachment, got {type(binary_item.get('attachment'))}" - ) - assert binary_item["media_type"] == "application/pdf" - - # Second item should be the string - assert content[1] == "What is in this document?" - - def test_shape_messages_with_binary_content(): """Unit test to verify _shape_messages handles ModelRequest with BinaryContent in parts. @@ -2778,62 +2289,12 @@ def test_shape_messages_with_binary_content(): f"Should be Braintrust Attachment, got {type(binary_item.get('attachment'))}" ) assert binary_item["media_type"] == "application/pdf" + assert binary_item["attachment"]._reference["content_type"] == "application/pdf" # Second content item should be the string assert content[1] == "What is in this document?" -@pytest.mark.asyncio -async def test_attachment_preserved_in_model_settings(memory_logger): - """Test that attachments in model_settings are preserved through serialization.""" - from braintrust.bt_json import bt_safe_deep_copy - from braintrust.logger import Attachment - - attachment = Attachment(data=b"config data", filename="config.txt", content_type="text/plain") - - # Simulate model_settings with attachment - settings = {"temperature": 0.7, "context_file": attachment} - - # Test bt_safe_deep_copy preserves attachment - copied = bt_safe_deep_copy(settings) - assert copied["context_file"] is attachment - assert copied["temperature"] == 0.7 - - -@pytest.mark.asyncio -async def test_attachment_in_message_part(memory_logger): - """Test that attachment in custom message part is preserved.""" - from braintrust.bt_json import bt_safe_deep_copy - from braintrust.logger import Attachment - - attachment = Attachment(data=b"message data", filename="msg.txt", content_type="text/plain") - - # Simulate message part with attachment - message_part = {"type": "file", "content": attachment, "metadata": {"source": "upload"}} - - copied = bt_safe_deep_copy(message_part) - assert copied["content"] is attachment - assert copied["type"] == "file" - - -@pytest.mark.asyncio -async def test_attachment_in_result_data(memory_logger): - """Test that attachment in custom result data is preserved.""" - from braintrust.bt_json import bt_safe_deep_copy - from braintrust.logger import ExternalAttachment - - ext_attachment = ExternalAttachment( - url="s3://bucket/result.pdf", filename="result.pdf", content_type="application/pdf" - ) - - # Simulate agent result with attachment - result_data = {"success": True, "output_file": ext_attachment, "metadata": {"processed": True}} - - copied = bt_safe_deep_copy(result_data) - assert copied["output_file"] is ext_attachment - assert copied["success"] is True - - @pytest.mark.vcr @pytest.mark.asyncio async def test_no_model_agent_run(memory_logger): @@ -2986,45 +2447,6 @@ def wrapped(): assert instance.call_count == 1 -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_agent_with_stop_sequences(memory_logger): - """Test Agent respects stop_sequences in model settings.""" - assert not memory_logger.pop() - - agent = Agent( - MODEL, - model_settings=ModelSettings(max_tokens=500, stop_sequences=["END", "\n\n"]), - ) - - start = time.time() - result = await agent.run("Write a short story about a robot.") - end = time.time() - - assert result.output - - spans = memory_logger.pop() - assert len(spans) >= 2 - - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) - assert agent_span is not None, "agent_run span not found" - assert agent_span["metadata"]["model"] == "gpt-4o-mini" - - # stop_sequences on the agent constructor → in metadata.model_settings - assert "model_settings" in agent_span["metadata"] - settings = agent_span["metadata"]["model_settings"] - assert settings.get("stop_sequences") == ["END", "\n\n"] - - _assert_metrics_are_valid(agent_span["metrics"], start, end) - - @pytest.mark.vcr @pytest.mark.asyncio async def test_agent_with_prefill(memory_logger): @@ -3053,14 +2475,7 @@ async def test_agent_with_prefill(memory_logger): spans = memory_logger.pop() assert len(spans) >= 2 - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) + agent_span = _find_agent_span(spans) assert agent_span is not None, "agent_run span not found" assert agent_span["metadata"]["model"] == "gpt-4o-mini" @@ -3073,80 +2488,6 @@ async def test_agent_with_prefill(memory_logger): _assert_metrics_are_valid(agent_span["metrics"], start, end) -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_agent_with_short_max_tokens(memory_logger): - """Test Agent with a very small max_tokens that truncates the response.""" - assert not memory_logger.pop() - - agent = Agent(MODEL) - - start = time.time() - result = await agent.run("What is AI?", model_settings=ModelSettings(max_tokens=16)) - end = time.time() - - # Truncated responses are still valid output; no exception should be raised. - assert result.output - - spans = memory_logger.pop() - assert len(spans) >= 2 - - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) - assert agent_span is not None, "agent_run span not found" - assert agent_span["metadata"]["model"] == "gpt-4o-mini" - - # max_tokens passed to run() → in input.model_settings - assert "model_settings" in agent_span["input"] - assert agent_span["input"]["model_settings"].get("max_tokens") == 16 - - assert agent_span["output"] - _assert_metrics_are_valid(agent_span["metrics"], start, end) - - -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_agent_with_long_context(memory_logger): - """Test Agent handles large input context without errors.""" - assert not memory_logger.pop() - - agent = Agent(MODEL, model_settings=ModelSettings(max_tokens=100)) - - long_text = "The quick brown fox jumps over the lazy dog. " * 20 - prompt = f"Here is a long text:\n\n{long_text}\n\nHow many times does the word 'fox' appear?" - - start = time.time() - result = await agent.run(prompt) - end = time.time() - - assert result.output - - spans = memory_logger.pop() - assert len(spans) >= 2 - - agent_span = next( - ( - s - for s in spans - if "agent_run" in s["span_attributes"]["name"] and "chat" not in s["span_attributes"]["name"] - ), - None, - ) - assert agent_span is not None, "agent_run span not found" - assert agent_span["metadata"]["model"] == "gpt-4o-mini" - # The long prompt should be captured in the span input - assert "fox" in str(agent_span["input"]).lower() - assert agent_span["output"] - - _assert_metrics_are_valid(agent_span["metrics"], start, end) - - @pytest.mark.vcr @pytest.mark.asyncio async def test_agent_with_error_handling(memory_logger): diff --git a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py index dc112b6c2..5b3fc62ee 100644 --- a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py +++ b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py @@ -1,5 +1,4 @@ import time -from typing import Any import pytest from openai import AsyncOpenAI @@ -61,11 +60,22 @@ def memory_logger(): yield bgl -def _assert_metrics_are_valid(metrics: dict[str, Any]): +def _assert_wrapped_span(span, start, end): + assert span["span_attributes"]["type"] == SpanTypeAttribute.LLM + assert "name" in span["span_attributes"] + assert MODEL in str(span["metadata"]) + assert TEST_PROMPT in str(span["input"]) + assert "Rome" in str(span["output"]) + + metrics = span["metrics"] assert metrics["tokens"] > 0 assert metrics["prompt_tokens"] > 0 assert metrics["completion_tokens"] > 0 assert "time_to_first_token" in metrics + assert start <= metrics["start"] <= metrics["end"] <= end + + assert span["span_id"] + assert span["root_span_id"] @pytest.mark.vcr @@ -94,21 +104,7 @@ async def test_pydantic_wrapped_stream(memory_logger): assert len(spans) == 1 - span = spans[0] - assert span["span_attributes"]["type"] == SpanTypeAttribute.LLM - assert "name" in span["span_attributes"] - assert MODEL in str(span["metadata"]) - assert TEST_PROMPT in str(span["input"]) - assert "Rome" in str(span["output"]) - - # Verify timing - metrics = span["metrics"] - _assert_metrics_are_valid(metrics) - assert start <= metrics["start"] <= metrics["end"] <= end - - # Verify span relationships - assert span["span_id"] - assert span["root_span_id"] + _assert_wrapped_span(spans[0], start, end) @pytest.mark.vcr @@ -139,15 +135,4 @@ async def test_pydantic_wrapped_completion(memory_logger): assert len(spans) == 1 - span = spans[0] - assert span["span_attributes"]["type"] == SpanTypeAttribute.LLM - assert "name" in span["span_attributes"] - assert MODEL in str(span["metadata"]) - assert TEST_PROMPT in str(span["input"]) - assert "Rome" in str(span["output"]) - metrics = span["metrics"] - _assert_metrics_are_valid(metrics) - assert start <= metrics["start"] <= metrics["end"] <= end - - assert span["span_id"] - assert span["root_span_id"] + _assert_wrapped_span(spans[0], start, end) From 2d4a7fa4f5bcdc8cf56bd2a513223e0e94a2bf64 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 20:02:01 +0000 Subject: [PATCH 05/11] test: prune redundant agent-framework tests (adk, crewai, langchain, llamaindex, dspy, strands) Co-Authored-By: Claude Opus 5.5 --- .../test_adk_structured_output_pydantic.yaml | 67 --- .../test_adk_structured_output_pydantic.yaml | 60 --- .../test_adk_structured_output_pydantic.yaml | 60 --- .../braintrust/integrations/adk/test_adk.py | 212 ++------ ...quential_pipeline_creates_parent_span.yaml | 448 ----------------- ...agentscope_tool_use_creates_tool_span.yaml | 462 ------------------ .../integrations/crewai/test_crewai.py | 24 +- .../braintrust/integrations/dspy/test_dspy.py | 37 +- .../0.3.28/test_chain_with_memory.yaml | 332 ------------- .../0.3.28/test_parallel_execution.yaml | 234 --------- .../latest/test_chain_with_memory.yaml | 206 -------- .../integrations/langchain/helpers.py | 88 ++++ .../integrations/langchain/test_anthropic.py | 13 +- .../integrations/langchain/test_callbacks.py | 294 +---------- .../integrations/langchain/test_context.py | 89 +--- .../llamaindex/test_llamaindex.py | 33 +- .../integrations/strands/test_strands.py | 7 +- 17 files changed, 157 insertions(+), 2509 deletions(-) delete mode 100644 py/src/braintrust/integrations/adk/cassettes/1.14.1/test_adk_structured_output_pydantic.yaml delete mode 100644 py/src/braintrust/integrations/adk/cassettes/2.6.3/test_adk_structured_output_pydantic.yaml delete mode 100644 py/src/braintrust/integrations/adk/cassettes/latest/test_adk_structured_output_pydantic.yaml delete mode 100644 py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_sequential_pipeline_creates_parent_span.yaml delete mode 100644 py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_tool_use_creates_tool_span.yaml delete mode 100644 py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_chain_with_memory.yaml delete mode 100644 py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_parallel_execution.yaml delete mode 100644 py/src/braintrust/integrations/langchain/cassettes/latest/test_chain_with_memory.yaml diff --git a/py/src/braintrust/integrations/adk/cassettes/1.14.1/test_adk_structured_output_pydantic.yaml b/py/src/braintrust/integrations/adk/cassettes/1.14.1/test_adk_structured_output_pydantic.yaml deleted file mode 100644 index 41a158500..000000000 --- a/py/src/braintrust/integrations/adk/cassettes/1.14.1/test_adk_structured_output_pydantic.yaml +++ /dev/null @@ -1,67 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "What is the capital of France?"}], "role": - "user"}], "systemInstruction": {"parts": [{"text": "You are a Capital Information - Agent. Given a country, respond ONLY with a JSON object containing the capital. - Format: {\"capital\": \"capital_name\"}\n\nYou are an agent. Your internal name - is \"capital_agent\"."}], "role": "user"}, "generationConfig": {"responseMimeType": - "application/json", "responseSchema": {"properties": {"capital": {"description": - "The capital of the country.", "title": "Capital", "type": "STRING"}}, "required": - ["capital"], "title": "CapitalOutput", "type": "OBJECT"}}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '626' - content-type: - - application/json - host: - - generativelanguage.googleapis.com - user-agent: - - google-genai-sdk/1.56.0 gl-python/3.13.3 google-adk/1.21.0 gl-python/3.13.3 - x-goog-api-client: - - google-genai-sdk/1.56.0 gl-python/3.13.3 google-adk/1.21.0 gl-python/3.13.3 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent - response: - body: - string: !!binary | - H4sIAAAAAAAC/61RTU/DMAy991dEOW9Tu4l+cGUckChso5qQVg5mzbqMLilJhoCq/52kXbsUruQQ - WX7PfvZz5SCEt8AymoEiEl+jjc4gVDW/wThThCkNdCmdLEGoC7d9lRVriiKfpghXKUMo1RIlVVCk - OpXiBQgqU5yyGltFdR+/jC5SghfE9DnyjBQdve4IeEcZlfsVAcmZoT0ljwvco/CR3/O8FPzVTDt2 - J24YeX7kX0WzKAi9MJxNnU66EcUnCTmJiQJtB/RLY93iWKqEvxF2w0+NHb7fyljuDXDPO+OK68UH - UBCM/rSVcy1KC9tVy3C9PRRUfZkVk9vnBFsOqeFUnUWO5eTvGf9JzPOGYs75Mu2x1kRI2l4lJ0d9 - p/F04o53Bch90xELIkvOJLnLDGf9/TAH8N/j+LA6xNuFKwLmL5fYqZ0f+Qzu4aUCAAA= - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=UTF-8 - Date: - - Wed, 17 Dec 2025 22:48:56 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=713 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-XSS-Protection: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/adk/cassettes/2.6.3/test_adk_structured_output_pydantic.yaml b/py/src/braintrust/integrations/adk/cassettes/2.6.3/test_adk_structured_output_pydantic.yaml deleted file mode 100644 index ff907d111..000000000 --- a/py/src/braintrust/integrations/adk/cassettes/2.6.3/test_adk_structured_output_pydantic.yaml +++ /dev/null @@ -1,60 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "What is the capital of France?"}], "role": - "user"}], "systemInstruction": {"parts": [{"text": "You are a Capital Information - Agent. Given a country, respond ONLY with a JSON object containing the capital. - Format: {\"capital\": \"capital_name\"}\n\nYou are an agent. Your internal name - is \"capital_agent\"."}], "role": "user"}, "generationConfig": {"responseMimeType": - "application/json", "responseSchema": {"properties": {"capital": {"description": - "The capital of the country.", "title": "Capital", "type": "STRING"}}, "required": - ["capital"], "title": "CapitalOutput", "type": "OBJECT"}}}' - headers: - Content-Type: - - application/json - user-agent: - - google-genai-sdk/2.22.0 gl-python/3.14.6 google-adk/2.6.3 gl-python/3.14.6 - x-goog-api-client: - - google-genai-sdk/2.22.0 gl-python/3.14.6 google-adk/2.6.3 gl-python/3.14.6 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"{\\\"capital\\\": \\\"Paris\\\"}\"\n - \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"index\": 0\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 55,\n \"candidatesTokenCount\": 6,\n \"totalTokenCount\": 61,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 55\n - \ }\n ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": - \"gemini-2.5-flash-lite\",\n \"responseId\": \"X_yaapu4PL6t1MkP1Zf1sQI\"\n}\n" - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json; charset=UTF-8 - Date: - - Fri, 04 Sep 2026 17:14:08 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=417 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Gemini-Service-Tier: - - standard - X-XSS-Protection: - - '0' - content-length: - - '571' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/adk/cassettes/latest/test_adk_structured_output_pydantic.yaml b/py/src/braintrust/integrations/adk/cassettes/latest/test_adk_structured_output_pydantic.yaml deleted file mode 100644 index f85329669..000000000 --- a/py/src/braintrust/integrations/adk/cassettes/latest/test_adk_structured_output_pydantic.yaml +++ /dev/null @@ -1,60 +0,0 @@ -interactions: -- request: - body: '{"contents": [{"parts": [{"text": "What is the capital of France?"}], "role": - "user"}], "systemInstruction": {"parts": [{"text": "You are a Capital Information - Agent. Given a country, respond ONLY with a JSON object containing the capital. - Format: {\"capital\": \"capital_name\"}\n\nYou are an agent. Your internal name - is \"capital_agent\"."}], "role": "user"}, "generationConfig": {"responseMimeType": - "application/json", "responseSchema": {"properties": {"capital": {"description": - "The capital of the country.", "title": "Capital", "type": "STRING"}}, "required": - ["capital"], "title": "CapitalOutput", "type": "OBJECT"}}}' - headers: - Content-Type: - - application/json - user-agent: - - google-genai-sdk/2.23.0 gl-python/3.14.7 google-adk/2.9.0 gl-python/3.14.7 - x-goog-api-client: - - google-genai-sdk/2.23.0 gl-python/3.14.7 google-adk/2.9.0 gl-python/3.14.7 - method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent - response: - body: - string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"{\\\"capital\\\": \\\"Paris\\\"}\"\n - \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"index\": 0\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 55,\n \"candidatesTokenCount\": 6,\n \"totalTokenCount\": 61,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 55\n - \ }\n ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": - \"gemini-2.5-flash-lite\",\n \"responseId\": \"7vinatzNCIWn1MkPsJPr4As\"\n}\n" - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Type: - - application/json; charset=UTF-8 - Date: - - Mon, 14 Sep 2026 13:38:54 GMT - Server: - - scaffolding on HTTPServer2 - Server-Timing: - - gfet4t7; dur=495 - Transfer-Encoding: - - chunked - Vary: - - Origin - - X-Origin - - Referer - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - SAMEORIGIN - X-Gemini-Service-Tier: - - standard - X-XSS-Protection: - - '0' - content-length: - - '571' - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/adk/test_adk.py b/py/src/braintrust/integrations/adk/test_adk.py index e4e699d3c..8907196f2 100644 --- a/py/src/braintrust/integrations/adk/test_adk.py +++ b/py/src/braintrust/integrations/adk/test_adk.py @@ -69,6 +69,24 @@ async def _create_runner(agent: Agent, *, app_name: str, user_id: str, session_i return Runner(agent=agent, app_name=app_name, session_service=session_service) +async def _run_final_responses(runner: Runner, *, user_id: str, session_id: str, new_message: types.Content): + return [ + event + async for event in runner.run_async(user_id=user_id, session_id=session_id, new_message=new_message) + if event.is_final_response() + ] + + +def _assert_llm_output_shape(output): + # Extra keys like model_version may appear in newer ADK versions, so only check the expected ones. + assert output["content"]["role"] == "model" + assert "parts" in output["content"] + assert "finish_reason" in output + assert "usage_metadata" in output + if ADK_VERSION >= (1, 15, 0) and "avg_logprobs" in output: + assert output["avg_logprobs"] is not None + + def get_weather(location: str): """Get the weather for a location.""" return { @@ -129,11 +147,8 @@ async def test_adk_multi_turn_history_is_logged(memory_logger): runner = await _create_runner(agent, app_name=app_name, user_id=user_id, session_id=session_id) async def run_message(text: str) -> str: - responses = [] user_msg = types.Content(role="user", parts=[types.Part(text=text)]) - async for event in runner.run_async(user_id=user_id, session_id=session_id, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=user_id, session_id=session_id, new_message=user_msg) assert responses return responses[0].content.parts[0].text @@ -311,17 +326,11 @@ async def test_adk_braintrust_integration(memory_logger): USER_ID = "test-user" SESSION_ID = "test-session" - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service) + runner = await _create_runner(agent, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) user_msg = types.Content(role="user", parts=[types.Part(text="What's the weather in San Francisco?")]) - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg) assert len(responses) > 0 assert responses[0].content @@ -492,16 +501,10 @@ def get_weather(location: str): user_id = "test-user" session_id = "test-session-nested" - session_service = InMemorySessionService() - await session_service.create_session(app_name=app_name, user_id=user_id, session_id=session_id) - - runner = Runner(agent=agent, app_name=app_name, session_service=session_service) + runner = await _create_runner(agent, app_name=app_name, user_id=user_id, session_id=session_id) user_msg = types.Content(role="user", parts=[types.Part(text="What's the weather in San Francisco?")]) - responses = [] - async for event in runner.run_async(user_id=user_id, session_id=session_id, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=user_id, session_id=session_id, new_message=user_msg) assert responses assert responses[0].content @@ -542,17 +545,11 @@ async def test_adk_max_tokens_captures_content(memory_logger): USER_ID = "test-user" SESSION_ID = "test-session-max-tokens" - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service) + runner = await _create_runner(agent, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) user_msg = types.Content(role="user", parts=[types.Part(text="Tell me a long story about a lighthouse.")]) - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg) assert len(responses) > 0 spans = memory_logger.pop() @@ -607,10 +604,7 @@ async def test_adk_binary_data_attachment_conversion(memory_logger): USER_ID = "test-user" SESSION_ID = "test-session-image" - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service) + runner = await _create_runner(agent, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) # Load test image from shared SDK fixtures image_data = (FIXTURES_DIR / "test-image.png").read_bytes() @@ -624,10 +618,7 @@ async def test_adk_binary_data_attachment_conversion(memory_logger): ], ) - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg) assert len(responses) > 0 @@ -747,17 +738,11 @@ async def test_adk_captures_metrics(memory_logger): USER_ID = "test-user" SESSION_ID = "test-session-metrics" - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service) + runner = await _create_runner(agent, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) user_msg = types.Content(role="user", parts=[types.Part(text="Say hello in 3 words")]) - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg) assert len(responses) > 0 @@ -814,80 +799,6 @@ async def test_adk_captures_metrics(memory_logger): # path is asserted in `test_adk_captures_metrics`. -class CapitalOutput(BaseModel): - capital: str = Field(description="The capital of the country.") - - -@pytest.mark.vcr -@pytest.mark.asyncio -async def test_adk_structured_output_pydantic(memory_logger): - """Test that structured output with Pydantic models is properly captured.""" - from unittest.mock import ANY - - assert not memory_logger.pop() - - structured_capital_agent = LlmAgent( - name="capital_agent", - model=ADK_MODEL, - instruction="""You are a Capital Information Agent. Given a country, respond ONLY with a JSON object containing the capital. Format: {"capital": "capital_name"}""", - output_schema=CapitalOutput, - output_key="found_capital", - ) - - APP_NAME = "capital_app" - USER_ID = "test-user" - SESSION_ID = "test-session-structured" - - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=structured_capital_agent, app_name=APP_NAME, session_service=session_service) - - user_msg = types.Content(role="user", parts=[types.Part(text="What is the capital of France?")]) - - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) - - assert len(responses) > 0 - - spans = memory_logger.pop() - - # Find the LLM span that has response_schema in the config - llm_spans_with_schema = [ - span - for span in spans - if span["span_attributes"]["type"] == "llm" - and "input" in span - and "config" in span["input"] - and span["input"]["config"].get("response_schema") is not None - ] - - assert len(llm_spans_with_schema) > 0, "Should have at least one LLM call with response_schema" - - llm_span = llm_spans_with_schema[0] - - # Assert the complete input structure - use ANY for values we don't care about - assert llm_span["input"] == { - "model": ANY, - "contents": ANY, - "config": { - "system_instruction": ANY, - "response_mime_type": ANY, - "response_schema": { - "properties": { - "capital": {"description": "The capital of the country.", "title": "Capital", "type": "string"} - }, - "required": ["capital"], - "title": "CapitalOutput", - "type": "object", - }, - }, - "live_connect_config": ANY, - } - - @pytest.mark.vcr @pytest.mark.asyncio async def test_adk_input_schema_serialization(memory_logger): @@ -911,17 +822,11 @@ class UserInput(BaseModel): USER_ID = "test-user" SESSION_ID = "test-session-input-schema" - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service) + runner = await _create_runner(agent, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) user_msg = types.Content(role="user", parts=[types.Part(text='{"name":"Alice","age":30}')]) - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg) assert len(responses) > 0 @@ -949,14 +854,7 @@ class UserInput(BaseModel): "live_connect_config": ANY, } - # Assert output contains expected keys (extra keys like model_version may appear in newer ADK versions) - output = llm_span["output"] - assert output["content"]["role"] == "model" - assert "parts" in output["content"] - assert "finish_reason" in output - assert "usage_metadata" in output - if ADK_VERSION >= (1, 15, 0) and "avg_logprobs" in output: - assert output["avg_logprobs"] is not None + _assert_llm_output_shape(llm_span["output"]) @pytest.mark.vcr @@ -989,19 +887,13 @@ class Person(BaseModel): USER_ID = "test-user" SESSION_ID = "test-session-nested" - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=nested_agent, app_name=APP_NAME, session_service=session_service) + runner = await _create_runner(nested_agent, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) user_msg = types.Content( role="user", parts=[types.Part(text="Give me info about Alice who lives in Paris, France.")] ) - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg) assert len(responses) > 0 @@ -1084,21 +976,14 @@ class Person(BaseModel): "live_connect_config": ANY, } - # Assert output contains expected keys (extra keys like model_version may appear in newer ADK versions) - output = llm_span["output"] - assert output["content"]["role"] == "model" - assert "parts" in output["content"] - assert "finish_reason" in output - assert "usage_metadata" in output - if ADK_VERSION >= (1, 15, 0) and "avg_logprobs" in output: - assert output["avg_logprobs"] is not None + _assert_llm_output_shape(llm_span["output"]) # _capture_config's allowlisted fields are exercised through the VCR-backed -# integration tests: response_schema (`test_adk_structured_output_pydantic`, -# `test_adk_complex_nested_schema`), input_schema (`test_adk_input_schema_serialization`), -# response_json_schema (`test_adk_response_json_schema_dict`), and the sampling -# params (`test_adk_generation_config_is_logged`). +# integration tests: response_schema (`test_adk_complex_nested_schema`), +# input_schema (`test_adk_input_schema_serialization`), response_json_schema +# (`test_adk_response_json_schema_dict`), and the sampling params +# (`test_adk_max_tokens_captures_content`). @pytest.mark.vcr @@ -1147,17 +1032,11 @@ async def test_adk_response_json_schema_dict(memory_logger): USER_ID = "test-user" SESSION_ID = "test-session-json-dict" - session_service = InMemorySessionService() - await session_service.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) - - runner = Runner(agent=json_schema_agent, app_name=APP_NAME, session_service=session_service) + runner = await _create_runner(json_schema_agent, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID) user_msg = types.Content(role="user", parts=[types.Part(text="Tell me about Tokyo")]) - responses = [] - async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg): - if event.is_final_response(): - responses.append(event) + responses = await _run_final_responses(runner, user_id=USER_ID, session_id=SESSION_ID, new_message=user_msg) assert len(responses) > 0 @@ -1212,14 +1091,7 @@ async def test_adk_response_json_schema_dict(memory_logger): "live_connect_config": ANY, } - # Assert output contains expected keys (extra keys like model_version may appear in newer ADK versions) - output = llm_span["output"] - assert output["content"]["role"] == "model" - assert "parts" in output["content"] - assert "finish_reason" in output - assert "usage_metadata" in output - if ADK_VERSION >= (1, 15, 0) and "avg_logprobs" in output: - assert output["avg_logprobs"] is not None + _assert_llm_output_shape(llm_span["output"]) class TestAutoInstrumentADK: diff --git a/py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_sequential_pipeline_creates_parent_span.yaml b/py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_sequential_pipeline_creates_parent_span.yaml deleted file mode 100644 index 550ec5eb6..000000000 --- a/py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_sequential_pipeline_creates_parent_span.yaml +++ /dev/null @@ -1,448 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"system","content":[{"type":"text","text":"You rewrite - the input as a short title."}]},{"role":"user","content":[{"type":"text","text":"# - Conversation History\nThe content between tags contains - your conversation history\n\nuser: Summarize why tests should use real - recorded traffic.\n"}]}],"model":"gpt-4o-mini","stream":false,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '403' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7NTfDo6goI0mh6BkjAzaDRmwE0P\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785555,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Benefits of Using Real Recorded Traffic - in Testing\",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 57,\n \"completion_tokens\": 8,\n - \ \"total_tokens\": 65,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_48f18beaba\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd71321a8836a6-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:32:35 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '856' - openai-organization: - - braintrust-data - openai-processing-ms: - - '342' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=6Z4qIRbHbjgyJXXu7iySRWQqBX9hRgH7aJXEaNs1kjc-1776785554.2542353-1.0.1.1-g1nXdLl.V4ciGQZhdrfQzAQRmKcG5iUXBI0NJdQAFL3Fdbgxa3zEbqZEqfSoI1E.HvNuXQe_1HevCBJNOP_W9NhGvzf3gEYJF5i6rbw.RPbM__5.aR8yFoivJ19Ui3GM; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 21 Apr 2026 - 16:02:35 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999940' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f357c4a43e4a4d0c84b53e0a47039718 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","content":[{"type":"text","text":"You answer - the previous message in one sentence."}]},{"role":"user","content":[{"type":"text","text":"# - Conversation History\nThe content between tags contains - your conversation history\n\nAlice: Benefits of Using Real Recorded - Traffic in Testing\n"}]}],"model":"gpt-4o-mini","stream":false,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '410' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7NUWahumXIWF6TMPtk00txutx8A\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785556,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Using real recorded traffic in testing - enhances accuracy, improves performance insights, and helps identify potential - issues in a more realistic environment.\",\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 55,\n \"completion_tokens\": - 24,\n \"total_tokens\": 79,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_cd59951324\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd713c5af45443-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:32:37 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '964' - openai-organization: - - braintrust-data - openai-processing-ms: - - '736' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=RLbrejKqGJRD6ZwgI17B2ZjHI6FoAasllbm_D6DLV_U-1776785555.8993464-1.0.1.1-_u55yC8TrrocnSJI1O28k4K.naZQKeb71n5cImZXxRF7lZBdb7L2Nr1M7z2NI0Tp88AaTh75K7wrQZ_8M5wmmEgH3J18XMgnqkh2a1uyQp6V8FWoJj2yFg2anw_AdfQv; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 21 Apr 2026 - 16:02:37 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999940' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_5322fe9b8b344d9fa25a1cc62164fa17 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","content":[{"type":"text","text":"You rewrite - the input as a short title."}]},{"role":"user","content":[{"type":"text","text":"# - Conversation History\nThe content between tags contains - your conversation history\n\nuser: Summarize why tests should use real - recorded traffic.\n"}]}],"model":"gpt-4o-mini","stream":false,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '403' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7O4KJB3v51YxxlDXGY7Dm6rtRo8\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785592,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Benefits of Using Real Recorded Traffic - in Testing\",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 57,\n \"completion_tokens\": 8,\n - \ \"total_tokens\": 65,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_04d92b3965\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd721f4c20ab82-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:33:12 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '856' - openai-organization: - - braintrust-data - openai-processing-ms: - - '358' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=IvTzJ8hyN4J7dNDh.0.Abd2I23nHGMrLmSklAYEje1g-1776785592.2054472-1.0.1.1-NsfXhnS483.On1CN51E_2UiSnMCqC2ETNNMDpBIOgPY8_rXJ38J62yi5I5mFApCflLufU09yA7PerDJYjml_G0IjgPUHMmdxj7.KZ3pLmBX2ZD.MNviyirknjrLU_MfN; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 21 Apr 2026 - 16:03:12 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999940' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_81e85eb8135a4b51a174704b65b25063 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","content":[{"type":"text","text":"You answer - the previous message in one sentence."}]},{"role":"user","content":[{"type":"text","text":"# - Conversation History\nThe content between tags contains - your conversation history\n\nAlice: Benefits of Using Real Recorded - Traffic in Testing\n"}]}],"model":"gpt-4o-mini","stream":false,"temperature":0}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '410' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7O5ccFHV7f1vQAP6qbOEZTE5D7D\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785593,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Using real recorded traffic in testing - enhances accuracy, improves performance insights, and helps identify potential - issues in a more realistic environment.\",\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 55,\n \"completion_tokens\": - 24,\n \"total_tokens\": 79,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_cd59951324\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd7224dd8661e8-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:33:14 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '964' - openai-organization: - - braintrust-data - openai-processing-ms: - - '920' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=_Cy0fl2ZnfNqiPkxtCX553M3AAn_FyRkTY1_rAC4hxE-1776785593.0927782-1.0.1.1-rdoymAPYR_R6viqog6LRWJiPhix1YyBCQZfarflhezL5HIu0sWikXRoXOQSjRvELDuziL.vInoQ8iRNJb.xXLxJfJlz8m7buTEzh937Q3tW.nJKqlhyV1rlHxxqrenOV; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 21 Apr 2026 - 16:03:14 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999940' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_6e597c978ebc480da4c7e4454fdbf1c7 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_tool_use_creates_tool_span.yaml b/py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_tool_use_creates_tool_span.yaml deleted file mode 100644 index 2cdf5aa1d..000000000 --- a/py/src/braintrust/integrations/agentscope/cassettes/latest/test_agentscope_tool_use_creates_tool_span.yaml +++ /dev/null @@ -1,462 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"system","name":"system","content":[{"type":"text","text":"You - are a helpful assistant. Use tools when required and keep answers brief."}]},{"role":"user","name":"user","content":[{"type":"text","text":"Use - Python to compute 6 * 7 and return just the result."}]}],"model":"gpt-4o-mini","stream":false,"temperature":0,"tools":[{"type":"function","function":{"name":"execute_python_code","parameters":{"properties":{"code":{"description":"The - Python code to be executed.","type":"string"},"timeout":{"default":300,"description":"The - maximum time (in seconds) allowed for the code to run.","type":"number"}},"required":["code"],"type":"object"},"description":"Execute - the given python code in a temp file and capture the return\ncode, standard - output and error. Note you must `print` the output to get\nthe result, and the - tmp file will be removed right after the execution."}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '897' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7NV1FgjSMVVHoIDjQuhW4xrd5Rt\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785557,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n - \ \"id\": \"call_mM5XjjIiNmRmMGfxWvn3SFzy\",\n \"type\": - \"function\",\n \"function\": {\n \"name\": \"execute_python_code\",\n - \ \"arguments\": \"{\\\"code\\\":\\\"result = 6 * 7\\\\nprint(result)\\\"}\"\n - \ }\n }\n ],\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 152,\n \"completion_tokens\": - 25,\n \"total_tokens\": 177,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_77c1b30b18\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd71474b96aac5-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:32:38 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '1119' - openai-organization: - - braintrust-data - openai-processing-ms: - - '576' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=lS.ajlW6j7HaL8fbIF43ys0CO061IPH1p3a_GiwbBYA-1776785557.643128-1.0.1.1-iay6FrUN34y4BrWqivM802lbV9VeJzQrZ2ydocIPT2pVHJ.ygIxM4x4DQkBp.gc31L3kHS1ftnQ31JqrgvTxhRd26lYFOM3peACNPD2CTsZiVdAeD9VK_RIDmFganqnn; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 21 Apr 2026 - 16:02:38 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999965' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_dd579fe9dd994262b9358aa115a7cfb5 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","name":"system","content":[{"type":"text","text":"You - are a helpful assistant. Use tools when required and keep answers brief."}]},{"role":"user","name":"user","content":[{"type":"text","text":"Use - Python to compute 6 * 7 and return just the result."}]},{"role":"assistant","name":"Jarvis","content":null,"tool_calls":[{"id":"call_mM5XjjIiNmRmMGfxWvn3SFzy","type":"function","function":{"name":"execute_python_code","arguments":"{\"code\": - \"result = 6 * 7\\nprint(result)\"}"}}]},{"role":"tool","tool_call_id":"call_mM5XjjIiNmRmMGfxWvn3SFzy","content":"042\n","name":"execute_python_code"}],"model":"gpt-4o-mini","stream":false,"temperature":0,"tools":[{"type":"function","function":{"name":"execute_python_code","parameters":{"properties":{"code":{"description":"The - Python code to be executed.","type":"string"},"timeout":{"default":300,"description":"The - maximum time (in seconds) allowed for the code to run.","type":"number"}},"required":["code"],"type":"object"},"description":"Execute - the given python code in a temp file and capture the return\ncode, standard - output and error. Note you must `print` the output to get\nthe result, and the - tmp file will be removed right after the execution."}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1293' - Content-Type: - - application/json - Cookie: - - __cf_bm=lS.ajlW6j7HaL8fbIF43ys0CO061IPH1p3a_GiwbBYA-1776785557.643128-1.0.1.1-iay6FrUN34y4BrWqivM802lbV9VeJzQrZ2ydocIPT2pVHJ.ygIxM4x4DQkBp.gc31L3kHS1ftnQ31JqrgvTxhRd26lYFOM3peACNPD2CTsZiVdAeD9VK_RIDmFganqnn - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7NWBRaAl2coYGIIzGvr50SEkx9v\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785558,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The result of \\\\( 6 \\\\times 7 \\\\) - is 42.\",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 209,\n \"completion_tokens\": 17,\n - \ \"total_tokens\": 226,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_77c1b30b18\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd714d5d10eff9-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:32:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '849' - openai-organization: - - braintrust-data - openai-processing-ms: - - '475' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999945' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_f195553548304b83b2079ddada1917ef - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","name":"system","content":[{"type":"text","text":"You - are a helpful assistant. Use tools when required and keep answers brief."}]},{"role":"user","name":"user","content":[{"type":"text","text":"Use - Python to compute 6 * 7 and return just the result."}]}],"model":"gpt-4o-mini","stream":false,"temperature":0,"tools":[{"type":"function","function":{"name":"execute_python_code","parameters":{"properties":{"code":{"description":"The - Python code to be executed.","type":"string"},"timeout":{"default":300,"description":"The - maximum time (in seconds) allowed for the code to run.","type":"number"}},"required":["code"],"type":"object"},"description":"Execute - the given python code in a temp file and capture the return\ncode, standard - output and error. Note you must `print` the output to get\nthe result, and the - tmp file will be removed right after the execution."}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '897' - Content-Type: - - application/json - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7O6opl2ppovW4SxZ3AqGhQmkcPe\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785594,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n - \ \"id\": \"call_hKaKsTiPvIg3byYoAoqAm0Nc\",\n \"type\": - \"function\",\n \"function\": {\n \"name\": \"execute_python_code\",\n - \ \"arguments\": \"{\\\"code\\\":\\\"result = 6 * 7\\\\nprint(result)\\\"}\"\n - \ }\n }\n ],\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 152,\n \"completion_tokens\": - 25,\n \"total_tokens\": 177,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_77c1b30b18\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd722bf8d1860b-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:33:15 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '1119' - openai-organization: - - braintrust-data - openai-processing-ms: - - '588' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - __cf_bm=2qQiga_y9S2sdgXSYFin8ICmGupzsHVfrlP.ylHr9N0-1776785594.2379313-1.0.1.1-6A2DGUueG8FwNuB97Pawero7GOmqOJhNi3wP8tw98v7Do0IUV_VipMvh2X5.qESceqlD5NxFcjlamalWaK9JZzPE9mLCStg9ykowI4qZZqFJz9NdbjB.CH9cvjaDkDgX; - HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 21 Apr 2026 - 16:03:15 GMT - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999965' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_fd911bb0a6de4e8c8431d504d855688e - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"system","name":"system","content":[{"type":"text","text":"You - are a helpful assistant. Use tools when required and keep answers brief."}]},{"role":"user","name":"user","content":[{"type":"text","text":"Use - Python to compute 6 * 7 and return just the result."}]},{"role":"assistant","name":"Jarvis","content":null,"tool_calls":[{"id":"call_hKaKsTiPvIg3byYoAoqAm0Nc","type":"function","function":{"name":"execute_python_code","arguments":"{\"code\": - \"result = 6 * 7\\nprint(result)\"}"}}]},{"role":"tool","tool_call_id":"call_hKaKsTiPvIg3byYoAoqAm0Nc","content":"042\n","name":"execute_python_code"}],"model":"gpt-4o-mini","stream":false,"temperature":0,"tools":[{"type":"function","function":{"name":"execute_python_code","parameters":{"properties":{"code":{"description":"The - Python code to be executed.","type":"string"},"timeout":{"default":300,"description":"The - maximum time (in seconds) allowed for the code to run.","type":"number"}},"required":["code"],"type":"object"},"description":"Execute - the given python code in a temp file and capture the return\ncode, standard - output and error. Note you must `print` the output to get\nthe result, and the - tmp file will be removed right after the execution."}}]}' - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1293' - Content-Type: - - application/json - Cookie: - - __cf_bm=2qQiga_y9S2sdgXSYFin8ICmGupzsHVfrlP.ylHr9N0-1776785594.2379313-1.0.1.1-6A2DGUueG8FwNuB97Pawero7GOmqOJhNi3wP8tw98v7Do0IUV_VipMvh2X5.qESceqlD5NxFcjlamalWaK9JZzPE9mLCStg9ykowI4qZZqFJz9NdbjB.CH9cvjaDkDgX - Host: - - api.openai.com - User-Agent: - - AsyncOpenAI/Python 2.31.0 - X-Stainless-Arch: - - arm64 - X-Stainless-Async: - - async:asyncio - X-Stainless-Lang: - - python - X-Stainless-OS: - - MacOS - X-Stainless-Package-Version: - - 2.31.0 - X-Stainless-Runtime: - - CPython - X-Stainless-Runtime-Version: - - 3.14.3 - x-stainless-read-timeout: - - '600' - x-stainless-retry-count: - - '0' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-DX7O7fv7EbcUjsmROugEtwNX54yg3\",\n \"object\": - \"chat.completion\",\n \"created\": 1776785595,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The result of \\\\( 6 \\\\times 7 \\\\) - is 42.\",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 209,\n \"completion_tokens\": 17,\n - \ \"total_tokens\": 226,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_77c1b30b18\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-Ray: - - 9efd7232e996bf5d-YYZ - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 21 Apr 2026 15:33:15 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - content-length: - - '849' - openai-organization: - - braintrust-data - openai-processing-ms: - - '447' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999945' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_20ce97e1d8474231b8a5ce881a381f34 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/crewai/test_crewai.py b/py/src/braintrust/integrations/crewai/test_crewai.py index 50c798e56..cb20199d4 100644 --- a/py/src/braintrust/integrations/crewai/test_crewai.py +++ b/py/src/braintrust/integrations/crewai/test_crewai.py @@ -31,7 +31,7 @@ setup_crewai, ) from braintrust.integrations.crewai.patchers import _get_registered_listener, _reset_for_testing -from braintrust.integrations.test_utils import run_in_subprocess, verify_autoinstrument_script +from braintrust.integrations.test_utils import verify_autoinstrument_script from braintrust.logger import Attachment, start_span from braintrust.test_helpers import init_test_logger from braintrust.util import LazyValue @@ -555,7 +555,7 @@ def test_integration_setup_is_idempotent(): assert CrewAIIntegration.setup() is True listener1 = _get_registered_listener() - assert listener1 is not None + assert isinstance(listener1, BraintrustCrewAIListener) before = len(crewai_event_bus._sync_handlers.get(CrewKickoffStartedEvent, frozenset())) assert CrewAIIntegration.setup() is True @@ -565,12 +565,6 @@ def test_integration_setup_is_idempotent(): assert before == after, "Repeated setup() should not register additional handlers" -def test_listener_is_braintrust_listener_instance(): - """The registered listener must satisfy ``isinstance(BraintrustCrewAIListener)``.""" - assert CrewAIIntegration.setup() is True - assert isinstance(_get_registered_listener(), BraintrustCrewAIListener) - - def test_setup_crewai_returns_true_under_active_logger(): """``setup_crewai()`` must not crash when a logger is already active.""" init_test_logger(PROJECT_NAME) @@ -586,17 +580,3 @@ def test_setup_crewai_returns_true_under_active_logger(): class TestAutoInstrumentCrewAI: def test_auto_instrument_crewai(self): verify_autoinstrument_script("test_auto_crewai.py") - - def test_patch_crewai_subprocess(self): - result = run_in_subprocess( - """ - from braintrust.integrations.crewai import patch_crewai - from braintrust.integrations.crewai.patchers import _get_registered_listener - assert patch_crewai() - assert _get_registered_listener() is not None - assert patch_crewai() # idempotent - print("SUCCESS") - """ - ) - assert result.returncode == 0, f"Failed: {result.stderr}" - assert "SUCCESS" in result.stdout diff --git a/py/src/braintrust/integrations/dspy/test_dspy.py b/py/src/braintrust/integrations/dspy/test_dspy.py index f76a246df..734b88b34 100644 --- a/py/src/braintrust/integrations/dspy/test_dspy.py +++ b/py/src/braintrust/integrations/dspy/test_dspy.py @@ -118,33 +118,23 @@ def test_dspy_adapter_callbacks(memory_logger): class TestPatchDSPy: """Tests for patch_dspy().""" - def test_patch_dspy_patches_configure(self): - """patch_dspy() should patch dspy.configure via the integration patcher.""" - result = run_in_subprocess(""" - from braintrust.integrations.dspy import patch_dspy - result = patch_dspy() - assert result, "patch_dspy() should return True" - print("SUCCESS") - """) - assert result.returncode == 0, f"Failed: {result.stderr}" - assert "SUCCESS" in result.stdout - def test_patch_dspy_wraps_configure(self): """After patch_dspy(), dspy.configure() should auto-add BraintrustDSpyCallback.""" result = run_in_subprocess(""" from braintrust.integrations.dspy import patch_dspy, BraintrustDSpyCallback - patch_dspy() + assert patch_dspy(), "patch_dspy() should return True" + assert patch_dspy(), "second patch_dspy() should be a no-op that still returns True" import dspy # Configure without explicitly adding callback dspy.configure(lm=None) - # Check that BraintrustDSpyCallback was auto-added + # Check that exactly one BraintrustDSpyCallback was auto-added (no double-wrap) from dspy.dsp.utils.settings import settings callbacks = settings.callbacks - has_bt_callback = any(isinstance(cb, BraintrustDSpyCallback) for cb in callbacks) - assert has_bt_callback, f"Expected BraintrustDSpyCallback in {callbacks}" + bt_callbacks = [cb for cb in callbacks if isinstance(cb, BraintrustDSpyCallback)] + assert len(bt_callbacks) == 1, f"Expected one BraintrustDSpyCallback in {callbacks}" print("SUCCESS") """) assert result.returncode == 0, f"Failed: {result.stderr}" @@ -202,23 +192,6 @@ def test_patch_dspy_does_not_duplicate_callback(self): assert result.returncode == 0, f"Failed: {result.stderr}" assert "SUCCESS" in result.stdout - def test_patch_dspy_idempotent(self): - """Multiple patch_dspy() calls should be safe.""" - result = run_in_subprocess(""" - from braintrust.integrations.dspy import patch_dspy - import dspy - - patch_dspy() - patch_dspy() # Second call - should be no-op, not double-wrap - - # Verify configure still works - lm = dspy.LM("openai/gpt-4o-mini") - dspy.configure(lm=lm) - print("SUCCESS") - """) - assert result.returncode == 0, f"Failed: {result.stderr}" - assert "SUCCESS" in result.stdout - def test_legacy_wrapper_import_still_works(self): """The old braintrust.wrappers.dspy import path should still work.""" result = run_in_subprocess(""" diff --git a/py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_chain_with_memory.yaml b/py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_chain_with_memory.yaml deleted file mode 100644 index 88cc88485..000000000 --- a/py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_chain_with_memory.yaml +++ /dev/null @@ -1,332 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"content": "Assistant: Hello! How can I assist you today? - User: What''s your name?", "role": "user"}], "model": "gpt-4o-mini", "stream": - false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '149' - content-type: - - application/json - host: - - localhost:8000 - user-agent: - - OpenAI/Python 1.108.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.108.2 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.11.13 - method: POST - uri: http://localhost:8000/v1/proxy/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-CJ3pSTx8NVvtJFY51xvv7gmxKCqAO\",\n \"object\": - \"chat.completion\",\n \"created\": 1758658986,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Assistant: I don't have a personal - name, but you can call me Assistant. How can I help you today?\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 24,\n \"completion_tokens\": 23,\n \"total_tokens\": 47,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_560af6e559\"\n}\n" - headers: - Access-Control-Allow-Credentials: - - 'true' - Access-Control-Expose-Headers: - - x-bt-cursor,x-bt-found-existing,x-bt-span-id,x-bt-span-export,x-bt-query-plan,x-bt-internal-trace-id - Connection: - - keep-alive - Date: - - Tue, 23 Sep 2025 20:23:06 GMT - Keep-Alive: - - timeout=5 - Transfer-Encoding: - - chunked - Vary: - - Origin - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 983cc206fc1f67ef-SJC - content-type: - - application/json - openai-organization: - - braintrust-data - openai-processing-ms: - - '755' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - _cfuvid=TIArUY3FKYo9t2vz5lADo0yFHggpjc9nkMoRBVQYfbA-1758658986949-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-bt-cached: - - MISS - x-bt-internal-trace-id: - - 899e875d60ba290b68341d027600a8fd - x-content-type-options: - - nosniff - x-envoy-upstream-service-time: - - '775' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999980' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_3b64f4bb78c14e2ea80001681e34611d - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"content":"Assistant: Hello! How can I assist you today? - User: What''s your name?","role":"user"}],"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '149' - content-type: - - application/json - cookie: - - __cf_bm=W_Ukgb.mz8e1GW7CfhzN.QQaN09_xQq1uTHm3a.dJdU-1762561359-1.0.1.1-6IrkySxpZaL.1C65iH0iOLFfere0JxHCiasT6bak.RihYFMyJgIz2OuYJqcUey8c5vicjtorNby_Z_GJX.ZMIHa6PyzVrhqgfZZmtnnn.sA; - _cfuvid=jwWMA4k30hLPwBwTSCIdIeS5.m1TkcdYLYTt4YSTZhI-1762561359243-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.108.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.108.2 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.11.10 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4ySTW/bMAyG7/4VhC67xEW+s+YyFAO2ZNhp22HYUBiMRNvaZFGT5KRBkf8+2E5i - d22BXXTgw5fiS/IxARBaiTUIWWKUlTPp+x9fxg/u4yFuv20O9ezD98/7YvPn01fFxeFOjBoF736R - jBfVjeTKGYqabYelJ4zUVJ2sltPFcjJb3LagYkWmkRUupnNOK211Oh1P5+l4lU7entUla0lBrOFn - AgDw2L5Nn1bRg1jDeHSJVBQCFiTW1yQA4dk0EYEh6BDRRjHqoWQbybat3134Grag2L6JUOKeAMGR - D2zRgMWKRrCrIxy5BokWJBoDFcFVfAMbPrRoCyUZ12ZGVnh8N/zXU14HbLzb2pgBQGs5YjO71vH9 - mZyuHg0XzvMu/CMVubY6lJknDGwbPyGyEy09JQD37SzrJ+MRznPlYhb5N7XfTeddOdFvcABnZxg5 - ounj89XohWqZoojahMEuhERZkuqV/eKwVpoHIBl4ft7MS7U739oW/1O+B1KSi6Qy50lp+dRwn+ap - ue/X0q4zbhsWgfxeS8qiJt/sQVGOtemuToRjiFRlubYFeed1d3q5yxbLMeZLWixuRXJK/gIAAP// - AwCouO6tiAMAAA== - headers: - CF-RAY: - - 99b0eacf8822aaac-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 08 Nov 2025 00:22:39 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '628' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '639' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999980' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_1009d84201314e5aa9ccdcbafeeac4af - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"content":"Assistant: Hello! How can I assist you today? - User: What''s your name?","role":"user"}],"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '149' - content-type: - - application/json - cookie: - - __cf_bm=.AxQfRhAvElThVl_Qz9zUVdqz_GtBGXwRQ0TVPIg5pc-1762561407-1.0.1.1-klsoMaFKHjzxOrHy2Zfd8Sc76RDHsMXURLAaIzORncnm47NI1MY0BqqBGOEsVXlZb.RdqeqpxzGFhl8DlRDjy.SqRfa2B4zEYdKZqQ2kVB0; - _cfuvid=0ohSoYMS21h1NkHWl4FeeVCp5aK2KHeEjclSm1NY7yY-1762561407934-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.108.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.108.2 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.11.10 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAAwAAAP//jJLBbtswDIbvfgpO53hIgiRNcxmKAcN6GNbuMmBDYTASHauRRU2imwRF - gb3GXm9PUthp4nTLgF104Mef4k/yMQNQ1qgFKF2h6Dq4/P23L6P18vJm8+Pz1e16m8pPH25u7fbe - fJ1vlmrQKnh5T1oOqrea6+BILPs91pFQqK06upiNp7PRZDjvQM2GXCtbBcknnNfW23w8HE/y4UU+ - mr+oK7aaklrA9wwA4LF72z69oa1awHBwiNSUEq5ILY5JACqyayMKU7JJ0Isa9FCzF/Jd61cHvoBr - MOx///wlUOEDAUIKpG1pNXisaQDLRmDHDWj0oNE5qAmO8jfwkTcduoaKXOgyhQ3u3p3+HKlsErbu - fePcCUDvWbCdXuf57oU8HV06XoXIy/SHVJXW21QVkTCxbx0l4aA6+pQB3HXTbF4NSIXIdZBCeE3d - d+PJvpzqd3gGCgu6Pj6ZD85UKwwJWpdOtqE06opMr+xXh42xfAKyE89/N3Ou9t639av/Kd8DrSkI - mSJEMla/NtynRWov/F9pxxl3DatE8cFqKsRSbPdgqMTG7e9OpV0SqovS+hXFEO3++MpQTGdDLGc0 - nV6q7Cl7BgAA//8DAEMiDgGKAwAA - headers: - CF-RAY: - - 99b0ebffc94fed3b-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 08 Nov 2025 00:23:28 GMT - Server: - - cloudflare - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - braintrust-data - openai-processing-ms: - - '680' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - x-envoy-upstream-service-time: - - '708' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999980' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_e273cb6eb8624df78282659b4a19fffe - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_parallel_execution.yaml b/py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_parallel_execution.yaml deleted file mode 100644 index aec3440ee..000000000 --- a/py/src/braintrust/integrations/langchain/cassettes/0.3.28/test_parallel_execution.yaml +++ /dev/null @@ -1,234 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"content": "Tell me a joke about bear", "role": "user"}], - "model": "gpt-4o-mini", "frequency_penalty": 0.0, "n": 1, "presence_penalty": - 0.0, "stream": false, "temperature": 1.0, "top_p": 1.0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '188' - content-type: - - application/json - host: - - localhost:8000 - user-agent: - - OpenAI/Python 1.108.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.108.2 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.11.13 - method: POST - uri: http://localhost:8000/v1/proxy/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-CJ3vA6tl1z95spYoDxT9RtqqzDF8n\",\n \"object\": - \"chat.completion\",\n \"created\": 1758659340,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Why don\u2019t bears ever get lost?\\n\\nBecause - they always take the bear necessities! \U0001F43B\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 13,\n \"completion_tokens\": 19,\n \"total_tokens\": 32,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_51db84afab\"\n}\n" - headers: - Access-Control-Allow-Credentials: - - 'true' - Access-Control-Expose-Headers: - - x-bt-cursor,x-bt-found-existing,x-bt-span-id,x-bt-span-export,x-bt-query-plan,x-bt-internal-trace-id - Connection: - - keep-alive - Date: - - Tue, 23 Sep 2025 20:29:00 GMT - Keep-Alive: - - timeout=5 - Transfer-Encoding: - - chunked - Vary: - - Origin - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 983ccaa98d189e59-SJC - content-type: - - application/json - openai-organization: - - braintrust-data - openai-processing-ms: - - '742' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - _cfuvid=h4eOl14etTzzF9eOjCE9SDq4Y79ZdPOJeIYnqb.tN3E-1758659340929-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-bt-cached: - - MISS - x-bt-internal-trace-id: - - ba7859db365b14edae0dc1d75360d5cb - x-content-type-options: - - nosniff - x-envoy-upstream-service-time: - - '912' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_31748d3aea8d488c9f1b1b7764b3a5d7 - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"content": "write a 2-line poem about bear", "role": "user"}], - "model": "gpt-4o-mini", "frequency_penalty": 0.0, "n": 1, "presence_penalty": - 0.0, "stream": false, "temperature": 1.0, "top_p": 1.0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '193' - content-type: - - application/json - host: - - localhost:8000 - user-agent: - - OpenAI/Python 1.108.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.108.2 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.11.13 - method: POST - uri: http://localhost:8000/v1/proxy/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-CJ3vAwrz88GjVnlchECG5UbilcrZG\",\n \"object\": - \"chat.completion\",\n \"created\": 1758659340,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"In forest shadows, a bear roams free, - \ \\nMajestic guardian of the ancient tree.\",\n \"refusal\": null,\n - \ \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 15,\n \"completion_tokens\": - 19,\n \"total_tokens\": 34,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_560af6e559\"\n}\n" - headers: - Access-Control-Allow-Credentials: - - 'true' - Access-Control-Expose-Headers: - - x-bt-cursor,x-bt-found-existing,x-bt-span-id,x-bt-span-export,x-bt-query-plan,x-bt-internal-trace-id - Connection: - - keep-alive - Date: - - Tue, 23 Sep 2025 20:29:01 GMT - Keep-Alive: - - timeout=5 - Transfer-Encoding: - - chunked - Vary: - - Origin - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - 983ccaa99f09cecd-SJC - content-type: - - application/json - openai-organization: - - braintrust-data - openai-processing-ms: - - '909' - openai-project: - - proj_vsCSXafhhByzWOThMrJcZiw9 - openai-version: - - '2020-10-01' - set-cookie: - - _cfuvid=I8TMI8qNGmqspYd_94RtBiCEVRDIffMScd.j_yw35Es-1758659341697-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-bt-cached: - - MISS - x-bt-internal-trace-id: - - 7d350d2a8b4d267107b257e3a1989c5a - x-content-type-options: - - nosniff - x-envoy-upstream-service-time: - - '1375' - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999990' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_891af1935bbf49c39105d7299babb315 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/langchain/cassettes/latest/test_chain_with_memory.yaml b/py/src/braintrust/integrations/langchain/cassettes/latest/test_chain_with_memory.yaml deleted file mode 100644 index deee60077..000000000 --- a/py/src/braintrust/integrations/langchain/cassettes/latest/test_chain_with_memory.yaml +++ /dev/null @@ -1,206 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"content":"Assistant: Hello! How can I assist you today? - User: What''s your name?","role":"user"}],"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '149' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 2.32.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 2.32.0 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.6 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EH9emMFRxyo5s3sWCEPZos0dwOCK2\",\n \"object\": - \"chat.completion\",\n \"created\": 1787757404,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Assistant: I don't have a personal - name, but you can call me Assistant. How can I help you today?\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 24,\n \"completion_tokens\": 23,\n \"total_tokens\": 47,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_6ec6bfb92d\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a313cc9f2e31b5e5-YYZ - connection: - - keep-alive - content-length: - - '904' - content-type: - - application/json - date: - - Wed, 26 Aug 2026 15:16:44 GMT - openai-processing-ms: - - '672' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999980' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_eddac7606f474a3da5bf273aa57b0647 - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"content":"Assistant: Hello! How can I assist you today? - User: What''s your name?","role":"user"}],"model":"gpt-4o-mini","stream":false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '149' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 2.32.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 2.32.0 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.14.6 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-EH9gxok5BImDgtkeDfbyrwZCG7DKa\",\n \"object\": - \"chat.completion\",\n \"created\": 1787757539,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Assistant: I don't have a personal - name, but you can call me Assistant! How can I help you today?\",\n \"refusal\": - null,\n \"annotations\": []\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 24,\n \"completion_tokens\": 23,\n \"total_tokens\": 47,\n \"prompt_tokens_details\": - {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_6ec6bfb92d\"\n}\n" - headers: - access-control-expose-headers: - - X-Request-ID - - CF-Ray - - CF-Ray - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - cf-ray: - - a313cfea0afbaaad-YYZ - connection: - - keep-alive - content-length: - - '904' - content-type: - - application/json - date: - - Wed, 26 Aug 2026 15:18:59 GMT - openai-processing-ms: - - '725' - openai-version: - - '2020-10-01' - server: - - cloudflare - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - transfer-encoding: - - chunked - x-content-type-options: - - nosniff - x-openai-proxy-wasm: - - v0.1 - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999980' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_16919a2f87164790a290bc9796658af6 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/langchain/helpers.py b/py/src/braintrust/integrations/langchain/helpers.py index 7271ef372..2dea18d75 100644 --- a/py/src/braintrust/integrations/langchain/helpers.py +++ b/py/src/braintrust/integrations/langchain/helpers.py @@ -86,3 +86,91 @@ def find_spans_by_attributes(spans: list[Any], **attributes: Any) -> list[Any]: if matches: matching_spans.append(span) return matching_spans + + +def expected_prompt_chain_spans(root_span_id: str, trace_root_id: str, *, tags: Sequence[str] = ()) -> list[Any]: + """Expected spans for ``ChatPromptTemplate("What is 1 + {number}?") | ChatOpenAI(gpt-4o-mini)`` invoked with ``{"number": "2"}``.""" + tags = list(tags) + return [ + { + "span_attributes": { + "name": "RunnableSequence", + "type": "task", + }, + "input": {"number": "2"}, + "output": { + "content": ANY, # LLM response text + "additional_kwargs": ANY, + "response_metadata": ANY, + "type": "ai", + }, + "metadata": {"tags": tags}, + "span_id": root_span_id, + "root_span_id": trace_root_id, + }, + { + "span_attributes": {"name": "ChatPromptTemplate"}, + "input": {"number": "2"}, + "output": { + "messages": [ + { + "content": ANY, # Formatted prompt text + "additional_kwargs": {}, + "response_metadata": {}, + "type": "human", + } + ] + }, + "metadata": {"tags": ["seq:step:1", *tags]}, + "root_span_id": trace_root_id, + "span_parents": [root_span_id], + }, + { + "span_attributes": {"name": "ChatOpenAI", "type": "llm"}, + "input": [ + [ + { + "content": ANY, # Prompt message content + "additional_kwargs": {}, + "response_metadata": {}, + "type": "human", + } + ] + ], + "output": { + "generations": [ + [ + { + "text": ANY, # Generated text + "generation_info": ANY, + "type": "ChatGeneration", + "message": { + "content": ANY, # Message content + "additional_kwargs": ANY, + "response_metadata": ANY, + "type": "ai", + }, + } + ] + ], + "llm_output": { + "model_name": "gpt-4o-mini-2024-07-18", + }, + "type": "LLMResult", + }, + "metrics": { + "start": ANY, + "total_tokens": ANY, + "prompt_tokens": ANY, + "completion_tokens": ANY, + "end": ANY, + }, + "metadata": { + "tags": ["seq:step:2", *tags], + "model": "gpt-4o-mini-2024-07-18", + "provider": "openai", + }, + "root_span_id": trace_root_id, + "span_parents": [root_span_id], + }, + ] diff --git a/py/src/braintrust/integrations/langchain/test_anthropic.py b/py/src/braintrust/integrations/langchain/test_anthropic.py index 498dffb03..8f90e0468 100644 --- a/py/src/braintrust/integrations/langchain/test_anthropic.py +++ b/py/src/braintrust/integrations/langchain/test_anthropic.py @@ -56,10 +56,6 @@ def test_langchain_anthropic_integration( spans = memory_logger.pop() assert len(spans) > 0 - chain_spans = [span for span in spans if "LangGraph" in span["span_attributes"].get("name", "")] - if not chain_spans: - chain_spans = [span for span in spans if span["span_attributes"].get("type") == "task"] - llm_spans = [span for span in spans if span["span_attributes"].get("type") == "llm"] assert len(llm_spans) > 0, "Should have at least one LLM call" @@ -118,4 +114,11 @@ async def test_async_langchain_invoke( assert "3" in result.content.lower() spans = memory_logger.pop() - assert len(spans) > 0 + llm_spans = [span for span in spans if span["span_attributes"].get("type") == "llm"] + assert len(llm_spans) == 1 + llm_span = llm_spans[0] + assert llm_span["metadata"]["model"] == MODEL + assert llm_span["metadata"]["provider"] == "anthropic" + assert "3" in str(llm_span["output"]) + assert llm_span["metrics"]["prompt_tokens"] > 0 + assert llm_span["metrics"]["completion_tokens"] > 0 diff --git a/py/src/braintrust/integrations/langchain/test_callbacks.py b/py/src/braintrust/integrations/langchain/test_callbacks.py index ceb0da766..cbf655d6d 100644 --- a/py/src/braintrust/integrations/langchain/test_callbacks.py +++ b/py/src/braintrust/integrations/langchain/test_callbacks.py @@ -13,13 +13,12 @@ from langchain_core.callbacks import BaseCallbackHandler from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage, ToolMessage from langchain_core.prompts import ChatPromptTemplate -from langchain_core.prompts.prompt import PromptTemplate -from langchain_core.runnables import RunnableMap, RunnableSerializable +from langchain_core.runnables import RunnableSerializable from langchain_core.tools import tool from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field -from .helpers import ANY, assert_matches_object, find_spans_by_attributes +from .helpers import ANY, assert_matches_object, expected_prompt_chain_spans, find_spans_by_attributes PROJECT_NAME = "langchain-py" @@ -57,7 +56,7 @@ def test_llm_calls(logger_memory_logger): n=1, ) chain: RunnableSerializable[dict[str, str], BaseMessage] = prompt.pipe(model) - chain.invoke({"number": "2"}, config={"callbacks": [cast(BaseCallbackHandler, handler)]}) + chain.invoke({"number": "2"}, config={"callbacks": [cast(BaseCallbackHandler, handler)], "tags": ["test"]}) spans = memory_logger.pop() assert len(spans) == 3 @@ -69,92 +68,7 @@ def test_llm_calls(logger_memory_logger): root_span_id = spans[0]["span_id"] trace_root_id = spans[0]["root_span_id"] - assert_matches_object( - spans, - [ - { - "span_attributes": { - "name": "RunnableSequence", - "type": "task", - }, - "input": {"number": "2"}, - "output": { - "content": ANY, # LLM response text - "additional_kwargs": ANY, - "response_metadata": ANY, - "type": "ai", - }, - "metadata": {"tags": []}, - "span_id": root_span_id, - "root_span_id": trace_root_id, - }, - { - "span_attributes": {"name": "ChatPromptTemplate"}, - "input": {"number": "2"}, - "output": { - "messages": [ - { - "content": ANY, # Formatted prompt text - "additional_kwargs": {}, - "response_metadata": {}, - "type": "human", - } - ] - }, - "metadata": {"tags": ["seq:step:1"]}, - "root_span_id": trace_root_id, - "span_parents": [root_span_id], - }, - { - "span_attributes": {"name": "ChatOpenAI", "type": "llm"}, - "input": [ - [ - { - "content": ANY, # Prompt message content - "additional_kwargs": {}, - "response_metadata": {}, - "type": "human", - } - ] - ], - "output": { - "generations": [ - [ - { - "text": ANY, # Generated text - "generation_info": ANY, - "type": "ChatGeneration", - "message": { - "content": ANY, # Message content - "additional_kwargs": ANY, - "response_metadata": ANY, - "type": "ai", - }, - } - ] - ], - "llm_output": { - "model_name": "gpt-4o-mini-2024-07-18", - }, - "type": "LLMResult", - }, - "metrics": { - "start": ANY, - "total_tokens": ANY, - "prompt_tokens": ANY, - "completion_tokens": ANY, - "end": ANY, - }, - "metadata": { - "tags": ["seq:step:2"], - "model": "gpt-4o-mini-2024-07-18", - "provider": "openai", - }, - "root_span_id": trace_root_id, - "span_parents": [root_span_id], - }, - ], - ) + assert_matches_object(spans, expected_prompt_chain_spans(root_span_id, trace_root_id, tags=["test"])) @pytest.mark.vcr @@ -200,116 +114,6 @@ async def test_consecutive_async_invocations_are_separate_traces(logger_memory_l assert nested_run["span_parents"] == [parent_span.span_id] -@pytest.mark.vcr -def test_chain_with_memory(logger_memory_logger): - test_logger, memory_logger = logger_memory_logger - assert not memory_logger.pop() - - handler = BraintrustCallbackHandler(logger=test_logger) - prompt = ChatPromptTemplate.from_template("{history} User: {input}") - model = ChatOpenAI(model="gpt-4o-mini") - chain: RunnableSerializable[dict[str, str], BaseMessage] = prompt.pipe(model) - - memory = {"history": "Assistant: Hello! How can I assist you today?"} - chain.invoke( - {"input": "What's your name?", **memory}, - config={"callbacks": [cast(BaseCallbackHandler, handler)], "tags": ["test"]}, - ) - - spans = memory_logger.pop() - assert len(spans) == 3 - - root_span_id = spans[0]["span_id"] - trace_root_id = spans[0]["root_span_id"] - - assert_matches_object( - spans, - [ - { - "span_attributes": { - "name": "RunnableSequence", - "type": "task", - }, - "input": {"input": "What's your name?", "history": "Assistant: Hello! How can I assist you today?"}, - "output": { - "content": ANY, # LLM response - "additional_kwargs": ANY, - "response_metadata": ANY, - "type": "ai", - }, - "metadata": {"tags": ["test"]}, - "span_id": root_span_id, - "root_span_id": trace_root_id, - }, - { - "span_attributes": {"name": "ChatPromptTemplate"}, - "input": {"input": "What's your name?", "history": "Assistant: Hello! How can I assist you today?"}, - "output": { - "messages": [ - { - "content": ANY, # Formatted prompt with history - "additional_kwargs": {}, - "response_metadata": {}, - "type": "human", - } - ] - }, - "metadata": {"tags": ["seq:step:1", "test"]}, - "root_span_id": trace_root_id, - "span_parents": [root_span_id], - }, - { - "span_attributes": {"name": "ChatOpenAI", "type": "llm"}, - "input": [ - [ - { - "content": ANY, # Prompt with history - "additional_kwargs": {}, - "response_metadata": {}, - "type": "human", - } - ] - ], - "output": { - "generations": [ - [ - { - "text": ANY, # Generated response - "generation_info": ANY, - "type": "ChatGeneration", - "message": { - "content": ANY, - "additional_kwargs": ANY, - "response_metadata": ANY, - "type": "ai", - }, - } - ] - ], - "llm_output": { - "model_name": "gpt-4o-mini-2024-07-18", - }, - "type": "LLMResult", - }, - "metrics": { - "start": ANY, - "total_tokens": ANY, - "prompt_tokens": ANY, - "completion_tokens": ANY, - "end": ANY, - }, - "metadata": { - "tags": ["seq:step:2", "test"], - "model": "gpt-4o-mini-2024-07-18", - "provider": "openai", - }, - "root_span_id": trace_root_id, - "span_parents": [root_span_id], - }, - ], - ) - - @pytest.mark.vcr def test_tool_usage(logger_memory_logger): test_logger, memory_logger = logger_memory_logger @@ -421,96 +225,6 @@ def calculator(input: CalculatorInput) -> str: ) -@pytest.mark.vcr -@pytest.mark.skip(reason="Not yet working with VCR.") -def test_parallel_execution(logger_memory_logger): - test_logger, memory_logger = logger_memory_logger - assert not memory_logger.pop() - - handler = BraintrustCallbackHandler(logger=test_logger) - - model = ChatOpenAI( - model="gpt-4o-mini", - temperature=1, - top_p=1, - frequency_penalty=0, - presence_penalty=0, - n=1, - ) - - joke_chain = PromptTemplate.from_template("Tell me a joke about {topic}").pipe(model) - poem_chain = PromptTemplate.from_template("write a 2-line poem about {topic}").pipe(model) - - map_chain = RunnableMap( - { - "joke": joke_chain, - "poem": poem_chain, - } - ) - - map_chain.invoke({"topic": "bear"}, config={"callbacks": [cast(BaseCallbackHandler, handler)]}) - - spans = cast(list, memory_logger.pop()) - - # Find the LLM spans - llm_spans = find_spans_by_attributes(spans, name="ChatOpenAI") - assert len(llm_spans) == 2 - - # Verify both LLM spans have expected structure - for span in llm_spans: - assert_matches_object( - span, - { - "span_attributes": {"name": "ChatOpenAI", "type": "llm"}, - "metadata": { - "tags": ["seq:step:2"], - "model": "gpt-4o-mini-2024-07-18", - }, - "input": [ - [ - { - "content": ANY, # Prompt about bears - "additional_kwargs": {}, - "response_metadata": {}, - "type": "human", - } - ] - ], - "output": { - "generations": [ - [ - { - "text": ANY, # Generated joke or poem - "generation_info": ANY, - "type": "ChatGeneration", - "message": { - "content": ANY, - "type": "ai", - }, - } - ] - ], - "llm_output": { - "token_usage": { - "completion_tokens": ANY, - "prompt_tokens": ANY, - "total_tokens": ANY, - }, - "model_name": "gpt-4o-mini-2024-07-18", - }, - "type": "LLMResult", - }, - "metrics": { - "start": ANY, - "total_tokens": ANY, - "prompt_tokens": ANY, - "completion_tokens": ANY, - "end": ANY, - }, - }, - ) - - @pytest.mark.vcr def test_langgraph_state_management(logger_memory_logger): test_logger, memory_logger = logger_memory_logger diff --git a/py/src/braintrust/integrations/langchain/test_context.py b/py/src/braintrust/integrations/langchain/test_context.py index b776eee49..8b90525d6 100644 --- a/py/src/braintrust/integrations/langchain/test_context.py +++ b/py/src/braintrust/integrations/langchain/test_context.py @@ -1,5 +1,4 @@ # pyright: reportTypedDictNotRequiredAccess=none -from unittest.mock import ANY import pytest from braintrust import logger @@ -12,7 +11,7 @@ from langchain_core.runnables import RunnableSerializable from langchain_openai import ChatOpenAI -from .helpers import assert_matches_object +from .helpers import assert_matches_object, expected_prompt_chain_spans PROJECT_NAME = "langchain-py" @@ -69,91 +68,7 @@ def test_global_handler(logger_memory_logger): trace_root_id = spans[0]["root_span_id"] # Spans would be empty if the handler was not registered, let's make sure it logged what we expect - assert_matches_object( - spans, - [ - { - "span_attributes": { - "name": "RunnableSequence", - "type": "task", - }, - "input": {"number": "2"}, - "output": { - "content": ANY, # LLM response text - "additional_kwargs": ANY, - "response_metadata": ANY, - "type": "ai", - }, - "metadata": {"tags": []}, - "span_id": root_span_id, - "root_span_id": trace_root_id, - }, - { - "span_attributes": {"name": "ChatPromptTemplate"}, - "input": {"number": "2"}, - "output": { - "messages": [ - { - "content": ANY, # Formatted prompt text - "additional_kwargs": {}, - "response_metadata": {}, - "type": "human", - } - ] - }, - "metadata": {"tags": ["seq:step:1"]}, - "root_span_id": trace_root_id, - "span_parents": [root_span_id], - }, - { - "span_attributes": {"name": "ChatOpenAI", "type": "llm"}, - "input": [ - [ - { - "content": ANY, # Prompt message content - "additional_kwargs": {}, - "response_metadata": {}, - "type": "human", - } - ] - ], - "output": { - "generations": [ - [ - { - "text": ANY, # Generated text - "generation_info": ANY, - "type": "ChatGeneration", - "message": { - "content": ANY, # Message content - "additional_kwargs": ANY, - "response_metadata": ANY, - "type": "ai", - }, - } - ] - ], - "llm_output": { - "model_name": "gpt-4o-mini-2024-07-18", - }, - "type": "LLMResult", - }, - "metrics": { - "start": ANY, - "total_tokens": ANY, - "prompt_tokens": ANY, - "completion_tokens": ANY, - "end": ANY, - }, - "metadata": { - "tags": ["seq:step:2"], - "model": "gpt-4o-mini-2024-07-18", - }, - "root_span_id": trace_root_id, - "span_parents": [root_span_id], - }, - ], - ) + assert_matches_object(spans, expected_prompt_chain_spans(root_span_id, trace_root_id)) assert message.content == "1 + 2 equals 3." diff --git a/py/src/braintrust/integrations/llamaindex/test_llamaindex.py b/py/src/braintrust/integrations/llamaindex/test_llamaindex.py index 36fd2099c..684fceb94 100644 --- a/py/src/braintrust/integrations/llamaindex/test_llamaindex.py +++ b/py/src/braintrust/integrations/llamaindex/test_llamaindex.py @@ -36,14 +36,6 @@ def setup_and_cleanup(): dispatcher.span_handlers = [h for h in dispatcher.span_handlers if not isinstance(h, BraintrustSpanHandler)] -def test_integration_setup(): - from llama_index.core.instrumentation import get_dispatcher - - dispatcher = get_dispatcher() - handler_types = [type(h).__name__ for h in dispatcher.span_handlers] - assert "BraintrustSpanHandler" in handler_types - - def test_integration_idempotent(): from llama_index.core.instrumentation import get_dispatcher @@ -179,6 +171,10 @@ def test_document_processing(logger_memory_logger): assert len(func_spans) >= 1 assert "SentenceSplitter" in func_spans[0]["span_attributes"]["name"] + root_span_id = spans[0]["root_span_id"] + for span in spans: + assert span["root_span_id"] == root_span_id + @pytest.mark.vcr def test_embedding(logger_memory_logger): @@ -229,27 +225,6 @@ def test_query_engine(logger_memory_logger): assert "task" in span_types -def test_span_hierarchy(logger_memory_logger): - test_logger, memory_logger = logger_memory_logger - assert not memory_logger.pop() - - from llama_index.core import Document - from llama_index.core.node_parser import SentenceSplitter - - docs = [Document(text="Hello world. This is a test document with some content.")] - splitter = SentenceSplitter(chunk_size=256, chunk_overlap=10) - - with test_logger.start_span(name="test-hierarchy"): - splitter.get_nodes_from_documents(docs) - - spans = memory_logger.pop() - assert len(spans) >= 2 - - root_span_id = spans[0]["root_span_id"] - for span in spans: - assert span["root_span_id"] == root_span_id - - @pytest.mark.vcr def test_llm_error_handling(logger_memory_logger): test_logger, memory_logger = logger_memory_logger diff --git a/py/src/braintrust/integrations/strands/test_strands.py b/py/src/braintrust/integrations/strands/test_strands.py index 334e67ea6..471dbfe11 100644 --- a/py/src/braintrust/integrations/strands/test_strands.py +++ b/py/src/braintrust/integrations/strands/test_strands.py @@ -24,6 +24,8 @@ async def test_strands_openai_agent_traces_native_otel_lifecycle(memory_logger): from strands import Agent from strands.models.openai import OpenAIModel + assert StrandsIntegration.setup() + # A repeated setup() must not double-patch: the span counts below would duplicate. assert StrandsIntegration.setup() model = OpenAIModel(model_id="gpt-4o-mini", params={"temperature": 0, "max_tokens": 16}) @@ -59,8 +61,3 @@ async def test_strands_openai_agent_traces_native_otel_lifecycle(memory_logger): assert "tokens" not in llm_span.get("metrics", {}) for span in spans: assert span["context"]["span_origin"]["instrumentation"]["name"] == "strands-auto" - - -def test_strands_setup_is_idempotent(): - assert StrandsIntegration.setup() - assert StrandsIntegration.setup() From c122f5a5c9f9fd811c82725e30b93dd234df49c1 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 20:15:12 +0000 Subject: [PATCH 06/11] chore: add check-unused-cassettes script Records which cassette files tests actually open (via an audit hook enabled by BRAINTRUST_CASSETTE_USAGE_DIR) and reports files no session reads. Complements check-stale-cassettes.py, which only checks whole version dirs. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 10 + py/Makefile | 6 +- py/scripts/check-unused-cassettes.py | 268 +++++++++++++++++++ py/src/braintrust/_test_cassette_usage.py | 82 ++++++ py/src/braintrust/conftest.py | 5 + py/src/braintrust/integrations/test_utils.py | 6 +- py/src/braintrust/test_cassette_usage.py | 164 ++++++++++++ 7 files changed, 539 insertions(+), 2 deletions(-) create mode 100644 py/scripts/check-unused-cassettes.py create mode 100644 py/src/braintrust/_test_cassette_usage.py create mode 100644 py/src/braintrust/test_cassette_usage.py diff --git a/AGENTS.md b/AGENTS.md index 954d58849..ad676049d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -244,6 +244,16 @@ Stale cassette detection: - To auto-delete stale dirs: `cd py && python scripts/check-stale-cassettes.py --clean` - When adding a new integration with versioned cassettes, add an entry to `[tool.braintrust.cassette-dirs]`. +Unused cassette detection: + +- `check-stale-cassettes.py` only checks whole version directories. Individual files inside a valid directory go stale when a test is deleted or renamed, or when a test always skips at that version. +- `py/scripts/check-unused-cassettes.py` finds those files. It runs every nox session that reads an integration's cassettes, across all matrix versions in replay-only mode, and reports files no test opened. +- Reads are recorded by an audit hook in `py/src/braintrust/_test_cassette_usage.py`, active only when `BRAINTRUST_CASSETTE_USAGE_DIR` is set. It covers every loader (pytest-recording, Claude Agent SDK transport, gRPC recordings, btx specs) and auto-instrument subprocesses. +- Check specific integrations: `cd py && make check-unused-cassettes INTEGRATIONS="openai anthropic"` (omit `INTEGRATIONS` to check all; it is slow). +- Add `--clean` to delete what it finds: `cd py && python scripts/check-unused-cassettes.py run openai --clean`. +- An integration is skipped, not reported, if any of its sessions fails or is skipped (e.g. sessions that skip on the current Python version), since its reads would be incomplete. +- After deleting or renaming a cassette-backed test, run it for that integration. + ## Benchmarks If you touch a hot path such as serialization, deep-copy, span creation, or logging, consider benchmarks. diff --git a/py/Makefile b/py/Makefile index 5eb7952d5..acb5708e5 100644 --- a/py/Makefile +++ b/py/Makefile @@ -1,6 +1,6 @@ PYTHON ?= python -.PHONY: lint pylint test test-wheel _template-version clean fixup build verify-build verify help install-build-deps install-dev test-core check-stale-cassettes sync-pytest-pin fetch-openapi-spec generate-api-client check-api-client-codegen test-api-codegen _check-git-clean bench bench-compare +.PHONY: lint pylint test test-wheel _template-version clean fixup build verify-build verify help install-build-deps install-dev test-core check-stale-cassettes check-unused-cassettes sync-pytest-pin fetch-openapi-spec generate-api-client check-api-client-codegen test-api-codegen _check-git-clean bench bench-compare clean: rm -rf build dist @@ -33,6 +33,9 @@ test-core: check-stale-cassettes: $(PYTHON) scripts/check-stale-cassettes.py +check-unused-cassettes: + $(PYTHON) scripts/check-unused-cassettes.py run $(if $(INTEGRATIONS),$(INTEGRATIONS),--all) + sync-pytest-pin: $(PYTHON) scripts/sync-pytest-pin.py @@ -92,6 +95,7 @@ help: @echo " bench-compare - Compare two benchmark results (BENCH_BASE=... BENCH_NEW=...)" @echo " build - Build Python package" @echo " check-stale-cassettes - Detect orphaned cassette version directories" + @echo " check-unused-cassettes - Find cassette files no test loads (INTEGRATIONS=\"openai anthropic\"; default all)" @echo " fetch-openapi-spec - Fetch the hash-verified pinned OpenAPI spec" @echo " generate-api-client - Generate the REST API client and public reference from the pinned spec" @echo " check-api-client-codegen - Check the committed REST API client and public reference for drift" diff --git a/py/scripts/check-unused-cassettes.py b/py/scripts/check-unused-cassettes.py new file mode 100644 index 000000000..f9e11c37a --- /dev/null +++ b/py/scripts/check-unused-cassettes.py @@ -0,0 +1,268 @@ +#!/usr/bin/env python3 +"""Find integration cassette files that no test loads. + +``check-stale-cassettes.py`` catches whole version directories that fell out of +the matrix. This script catches individual files inside valid directories that +nothing reads any more: cassettes left behind by deleted or renamed tests, and +cassettes for tests that always skip at that version (e.g. a feature the old +SDK doesn't have). + +It works from what tests actually open rather than from name matching. Tests +record every cassette they read when ``BRAINTRUST_CASSETTE_USAGE_DIR`` is set +(see ``src/braintrust/_test_cassette_usage.py``), and this script compares +those reads with the files on disk. + +Usage: + # Run every nox session that reads the given integrations' cassettes + # (all matrix versions, replay-only) and report unused files. + python scripts/check-unused-cassettes.py run anthropic openai + python scripts/check-unused-cassettes.py run --all + python scripts/check-unused-cassettes.py run anthropic --clean + + # Report from usage logs collected elsewhere (e.g. merged CI artifacts). + # Only meaningful when the logs cover every session that reads the + # reported integrations' cassettes. + python scripts/check-unused-cassettes.py report --usage-dir DIR [INTEGRATION ...] +""" + +import argparse +import ast +import json +import os +import pathlib +import shutil +import subprocess +import sys +import tempfile +from collections import defaultdict + + +_PROJECT_DIR = pathlib.Path(__file__).resolve().parent.parent +_PACKAGE_DIR = _PROJECT_DIR / "src" / "braintrust" +_INTEGRATIONS_DIR = _PACKAGE_DIR / "integrations" +_NOXFILE = _PROJECT_DIR / "noxfile.py" + +USAGE_DIR_ENV = "BRAINTRUST_CASSETTE_USAGE_DIR" + + +def integrations_with_cassettes() -> list[str]: + return sorted( + d.name + for d in _INTEGRATIONS_DIR.iterdir() + if d.is_dir() and d.name != "__pycache__" and (d / "cassettes").is_dir() + ) + + +def cassette_files(integrations: list[str]) -> set[str]: + """Cassette files on disk, as POSIX paths relative to the braintrust package.""" + files = set() + for name in integrations: + for path in (_INTEGRATIONS_DIR / name / "cassettes").rglob("*"): + if path.is_file() and "__pycache__" not in path.parts: + files.add(path.relative_to(_PACKAGE_DIR).as_posix()) + return files + + +def load_usage(usage_dir: pathlib.Path) -> set[str]: + used = set() + for log in usage_dir.glob("usage-*.txt"): + used.update(line.strip() for line in log.read_text(encoding="utf-8").splitlines() if line.strip()) + return used + + +def find_unused(integrations: list[str], used: set[str]) -> list[str]: + return sorted(cassette_files(integrations) - used) + + +def _render_test_path(node: ast.expr) -> str | None: + """Render the test-path argument of ``_run_tests`` (a literal or f-string).""" + if isinstance(node, ast.Constant) and isinstance(node.value, str): + return node.value + if isinstance(node, ast.JoinedStr): + parts = [] + for value in node.values: + if isinstance(value, ast.Constant): + parts.append(str(value.value)) + elif isinstance(value, ast.FormattedValue) and isinstance(value.value, ast.Name): + if value.value.id != "INTEGRATION_DIR": + return None + parts.append("braintrust/integrations") + else: + return None + return "".join(parts) + return None + + +def sessions_by_integration(noxfile: pathlib.Path = _NOXFILE) -> dict[str, set[str]]: + """Map integration directory -> nox session function names that read its cassettes. + + A session reads ``integrations//cassettes`` when it runs tests under + ``integrations//``, or when it passes ```` as an env value to + ``_run_tests`` (the btx sessions select their provider's cassettes that way). + """ + known = set(integrations_with_cassettes()) + mapping: dict[str, set[str]] = defaultdict(set) + tree = ast.parse(noxfile.read_text()) + for func in tree.body: + if not isinstance(func, ast.FunctionDef): + continue + for call in ast.walk(func): + if not (isinstance(call, ast.Call) and isinstance(call.func, ast.Name) and call.func.id == "_run_tests"): + continue + if len(call.args) >= 2: + path = _render_test_path(call.args[1]) + prefix = "braintrust/integrations/" + if path and path.startswith(prefix): + name = path[len(prefix) :].split("/")[0] + if name in known: + mapping[name].add(func.name) + for keyword in call.keywords: + if keyword.arg == "env" and isinstance(keyword.value, ast.Dict): + for value in keyword.value.values: + if isinstance(value, ast.Constant) and value.value in known: + mapping[value.value].add(func.name) + return dict(mapping) + + +def _nox_command() -> list[str]: + nox = shutil.which("nox") + return [nox] if nox else [sys.executable, "-m", "nox"] + + +def run_sessions(integrations: list[str], usage_dir: pathlib.Path) -> tuple[list[str], dict[str, list[str]]]: + """Run every session that reads these integrations' cassettes. + + Returns (integrations that ran completely, {integration: [problem sessions]}). + """ + mapping = sessions_by_integration() + listing = json.loads( + subprocess.run( + [*_nox_command(), "-l", "--json"], cwd=_PROJECT_DIR, check=True, capture_output=True, text=True + ).stdout + ) + concrete: dict[str, list[str]] = defaultdict(list) + for entry in listing: + concrete[entry["name"]].append(entry["session"]) + + to_run: dict[str, list[str]] = {} + incomplete: dict[str, list[str]] = {} + for name in integrations: + funcs = sorted(mapping.get(name, ())) + if not funcs: + incomplete[name] = ["no nox session found that runs these tests"] + continue + to_run[name] = [s for func in funcs for s in concrete.get(func, [])] + + sessions = sorted({s for group in to_run.values() for s in group}) + env = {**os.environ, USAGE_DIR_ENV: str(usage_dir), "CI": "1"} + results: dict[str, str] = {} + for session in sessions: + print(f"==> nox -s {session}", flush=True) + with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as report: + report_path = report.name + try: + proc = subprocess.run( + [*_nox_command(), "-s", session, "--report", report_path], + cwd=_PROJECT_DIR, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + try: + outcome = json.loads(pathlib.Path(report_path).read_text())["sessions"][0]["result"] + except (OSError, ValueError, KeyError, IndexError): + outcome = "success" if proc.returncode == 0 else "failed" + finally: + pathlib.Path(report_path).unlink(missing_ok=True) + results[session] = outcome + print(f" {outcome}", flush=True) + if outcome == "failed": + print("\n".join(f" | {line}" for line in proc.stdout.splitlines()[-15:]), flush=True) + + complete = [] + for name, group in to_run.items(): + problems = [f"{s} ({results[s]})" for s in group if results.get(s) != "success"] + if problems: + incomplete[name] = problems + else: + complete.append(name) + return complete, incomplete + + +def print_report(unused: list[str], clean: bool) -> None: + if not unused: + print("No unused cassette files found.") + return + by_dir: dict[str, list[str]] = defaultdict(list) + for path in unused: + parent, _, filename = path.rpartition("/") + by_dir[parent].append(filename) + action = "Deleted" if clean else "Found" + print(f"{action} {len(unused)} unused cassette file{'' if len(unused) == 1 else 's'}:") + for parent in sorted(by_dir): + print(f" src/braintrust/{parent}/") + for filename in by_dir[parent]: + print(f" {filename}") + if clean: + for path in unused: + (_PACKAGE_DIR / path).unlink() + else: + print("\nRun with --clean to delete them.") + + +def _resolve_integrations(names: list[str], all_: bool) -> list[str]: + available = integrations_with_cassettes() + if all_ or not names: + return available + unknown = sorted(set(names) - set(available)) + if unknown: + sys.exit(f"No cassette directory for: {', '.join(unknown)}. Choose from: {', '.join(available)}") + return sorted(set(names)) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + sub = parser.add_subparsers(dest="command", required=True) + + run_parser = sub.add_parser("run", help="Run the relevant nox sessions, then report") + run_parser.add_argument("integrations", nargs="*", help="Integration directory names (e.g. anthropic)") + run_parser.add_argument("--all", action="store_true", help="Check every integration with cassettes") + run_parser.add_argument("--usage-dir", type=pathlib.Path, help="Keep usage logs here instead of a temp dir") + run_parser.add_argument("--clean", action="store_true", help="Delete unused cassette files") + + report_parser = sub.add_parser("report", help="Report from existing usage logs") + report_parser.add_argument("integrations", nargs="*", help="Limit the report to these integrations") + report_parser.add_argument("--usage-dir", type=pathlib.Path, required=True) + report_parser.add_argument("--clean", action="store_true", help="Delete unused cassette files") + + args = parser.parse_args() + + if args.command == "run": + if not args.integrations and not args.all: + parser.error("pass integration names or --all") + integrations = _resolve_integrations(args.integrations, args.all) + usage_dir = args.usage_dir or pathlib.Path(tempfile.mkdtemp(prefix="cassette-usage-")) + usage_dir.mkdir(parents=True, exist_ok=True) + complete, incomplete = run_sessions(integrations, usage_dir) + print() + if incomplete: + print("Skipped these integrations because not every session that reads their cassettes succeeded:") + for name, problems in sorted(incomplete.items()): + print(f" {name}: {', '.join(problems)}") + print() + unused = find_unused(complete, load_usage(usage_dir)) + print_report(unused, args.clean) + sys.exit(1 if unused or incomplete else 0) + + integrations = _resolve_integrations(args.integrations, False) + used = load_usage(args.usage_dir) + if not used: + sys.exit(f"No usage recorded in {args.usage_dir}. Run tests with {USAGE_DIR_ENV}={args.usage_dir} first.") + unused = find_unused(integrations, used) + print_report(unused, args.clean) + sys.exit(1 if unused else 0) + + +if __name__ == "__main__": + main() diff --git a/py/src/braintrust/_test_cassette_usage.py b/py/src/braintrust/_test_cassette_usage.py new file mode 100644 index 000000000..233db532d --- /dev/null +++ b/py/src/braintrust/_test_cassette_usage.py @@ -0,0 +1,82 @@ +"""Record which cassette files a test process reads. + +Used by ``py/scripts/check-unused-cassettes.py`` to find cassettes that no test +loads. When ``BRAINTRUST_CASSETTE_USAGE_DIR`` is set, :func:`install` registers +an audit hook that logs every cassette file opened for reading under the +``braintrust`` package. This catches every loader (pytest-recording, the Claude +Agent SDK transport, the gRPC recorder, btx specs, ...) because they all go +through ``open()``. + +Each process writes its own ``usage--.txt`` file in that directory, +one path per line, relative to the ``braintrust`` package directory and +POSIX-style so logs from different runners (including Windows) can be merged. +Auto-instrument test subprocesses inherit the env var and install the hook +through :mod:`braintrust.integrations.test_utils`. +""" + +import os +import sys +import uuid + + +USAGE_DIR_ENV = "BRAINTRUST_CASSETTE_USAGE_DIR" + +# Auto-instrument subprocesses may import braintrust from site-packages while +# reading cassettes from the source tree handed down via this env var. +_PACKAGE_DIR = ( + os.path.dirname(os.path.abspath(os.environ["BRAINTRUST_INTEGRATIONS_DIR"])) + if os.environ.get("BRAINTRUST_INTEGRATIONS_DIR") + else os.path.dirname(os.path.abspath(__file__)) +) +_CASSETTES_SEGMENT = f"{os.sep}cassettes{os.sep}" +_WRITE_FLAGS = os.O_WRONLY | os.O_RDWR | os.O_APPEND | os.O_CREAT | os.O_TRUNC + +_installed = False + + +def _is_read(mode, flags) -> bool: + if isinstance(mode, str): + return not any(c in mode for c in "wax+") + # os.open() reports mode=None and passes the flags instead. + return not (isinstance(flags, int) and flags & _WRITE_FLAGS) + + +def install() -> bool: + """Start recording cassette reads if ``BRAINTRUST_CASSETTE_USAGE_DIR`` is set. + + Safe to call more than once. Returns True when recording is active. + """ + global _installed + if _installed: + return True + usage_dir = os.environ.get(USAGE_DIR_ENV) + if not usage_dir: + return False + + os.makedirs(usage_dir, exist_ok=True) + log_path = os.path.join(usage_dir, f"usage-{os.getpid()}-{uuid.uuid4().hex[:8]}.txt") + # Open the log once up front: writes to an already-open file don't raise + # "open" audit events, so the hook can't recurse into itself. + log = open(log_path, "a", encoding="utf-8") + seen: set[str] = set() + + def hook(event, args): + if event != "open": + return + try: + path, mode, flags = args + if isinstance(path, int) or not _is_read(mode, flags): + return + path = os.path.abspath(os.fsdecode(path)) + if path in seen or _CASSETTES_SEGMENT not in path or not path.startswith(_PACKAGE_DIR): + return + seen.add(path) + log.write(os.path.relpath(path, _PACKAGE_DIR).replace(os.sep, "/") + "\n") + log.flush() + except Exception: # pylint: disable=broad-except + # Audit hooks must never break the code under test. + pass + + sys.addaudithook(hook) + _installed = True + return True diff --git a/py/src/braintrust/conftest.py b/py/src/braintrust/conftest.py index 1e648fea2..70ff85d74 100644 --- a/py/src/braintrust/conftest.py +++ b/py/src/braintrust/conftest.py @@ -2,9 +2,14 @@ from unittest.mock import MagicMock import pytest +from braintrust import _test_cassette_usage from braintrust.framework2 import ProjectIdCache +# Record cassette reads when check-unused-cassettes.py is collecting usage. +_test_cassette_usage.install() + + def _patch_vcr_aiohttp_stubs(): """Patch VCR.py's aiohttp stubs to fix bugs with google-genai >= 1.64.0 and litellm. diff --git a/py/src/braintrust/integrations/test_utils.py b/py/src/braintrust/integrations/test_utils.py index 594167827..4ad15875e 100644 --- a/py/src/braintrust/integrations/test_utils.py +++ b/py/src/braintrust/integrations/test_utils.py @@ -8,7 +8,7 @@ import pytest import vcr -from braintrust import Attachment, logger +from braintrust import Attachment, _test_cassette_usage, logger from braintrust.conftest import get_vcr_config from braintrust.integrations.conftest import _versioned_cassette_dir from braintrust.integrations.utils import ( @@ -42,6 +42,10 @@ _INTEGRATIONS_DIR = Path(os.environ.get("BRAINTRUST_INTEGRATIONS_DIR", Path(__file__).resolve().parent)) AUTO_TEST_SCRIPTS_DIR = _INTEGRATIONS_DIR / "auto_test_scripts" +# Auto-instrument scripts run in a fresh interpreter; record their cassette +# reads too when check-unused-cassettes.py is collecting usage. +_test_cassette_usage.install() + @contextmanager def autoinstrument_test_context( diff --git a/py/src/braintrust/test_cassette_usage.py b/py/src/braintrust/test_cassette_usage.py new file mode 100644 index 000000000..f83e21b59 --- /dev/null +++ b/py/src/braintrust/test_cassette_usage.py @@ -0,0 +1,164 @@ +"""Tests for cassette usage recording and scripts/check-unused-cassettes.py.""" + +import importlib.util +import os +import subprocess +import sys +import textwrap +from pathlib import Path + +import pytest + + +_SCRIPT = Path(__file__).resolve().parents[2] / "scripts" / "check-unused-cassettes.py" + + +def _make_tree(root: Path) -> Path: + """Build a fake package tree: /pkg/integrations/{alpha,beta}/cassettes/...""" + pkg = root / "pkg" + for rel in ( + "integrations/alpha/cassettes/latest/used.yaml", + "integrations/alpha/cassettes/latest/unused.yaml", + "integrations/alpha/cassettes/1.0.0/btx/spec.yaml", + "integrations/beta/cassettes/latest/transport.json", + "integrations/alpha/test_alpha.py", + ): + path = pkg / rel + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("x") + return pkg + + +def _run_recorder(tmp_path: Path, code: str, *, enabled: bool = True) -> set[str]: + pkg = _make_tree(tmp_path) + usage_dir = tmp_path / "usage" + env = {**os.environ, "BRAINTRUST_INTEGRATIONS_DIR": str(pkg / "integrations")} + env.pop("BRAINTRUST_CASSETTE_USAGE_DIR", None) + if enabled: + env["BRAINTRUST_CASSETTE_USAGE_DIR"] = str(usage_dir) + prelude = textwrap.dedent( + f""" + import os + from pathlib import Path + from braintrust import _test_cassette_usage + print(_test_cassette_usage.install()) + pkg = Path({str(pkg)!r}) + """ + ) + result = subprocess.run( + [sys.executable, "-c", prelude + textwrap.dedent(code)], env=env, capture_output=True, text=True + ) + assert result.returncode == 0, result.stderr + assert result.stdout.splitlines()[0] == str(enabled) + lines = [] + for log in usage_dir.glob("usage-*.txt"): + lines.extend(log.read_text().splitlines()) + assert len(lines) == len(set(lines)), "each file should be recorded once per process" + return set(lines) + + +def test_recorder_logs_cassette_reads_relative_to_package(tmp_path): + used = _run_recorder( + tmp_path, + """ + (pkg / "integrations/alpha/cassettes/latest/used.yaml").read_text() + (pkg / "integrations/alpha/cassettes/latest/used.yaml").read_text() + with open(pkg / "integrations/alpha/cassettes/1.0.0/btx/spec.yaml", "rb") as f: + f.read() + os.close(os.open(pkg / "integrations/beta/cassettes/latest/transport.json", os.O_RDONLY)) + """, + ) + assert used == { + "integrations/alpha/cassettes/latest/used.yaml", + "integrations/alpha/cassettes/1.0.0/btx/spec.yaml", + "integrations/beta/cassettes/latest/transport.json", + } + + +def test_recorder_ignores_writes_non_cassettes_and_outside_paths(tmp_path): + used = _run_recorder( + tmp_path, + """ + (pkg / "integrations/alpha/cassettes/latest/new.yaml").write_text("recorded") + with open(pkg / "integrations/alpha/cassettes/latest/unused.yaml", "a") as f: + f.write("appended") + os.close(os.open(pkg / "integrations/beta/cassettes/latest/transport.json", os.O_WRONLY)) + (pkg / "integrations/alpha/test_alpha.py").read_text() + outside = pkg.parent / "elsewhere" / "cassettes" / "x.yaml" + outside.parent.mkdir(parents=True) + outside.write_text("x") + outside.read_text() + """, + ) + assert used == set() + + +def test_recorder_is_off_without_env_var(tmp_path): + used = _run_recorder( + tmp_path, + """ + (pkg / "integrations/alpha/cassettes/latest/used.yaml").read_text() + """, + enabled=False, + ) + assert used == set() + assert not (tmp_path / "usage").exists() + + +@pytest.fixture +def checker(tmp_path, monkeypatch): + if not _SCRIPT.exists(): + pytest.skip("scripts/ is not available (wheel mode)") + spec = importlib.util.spec_from_file_location("check_unused_cassettes", _SCRIPT) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + pkg = _make_tree(tmp_path) + monkeypatch.setattr(module, "_PACKAGE_DIR", pkg) + monkeypatch.setattr(module, "_INTEGRATIONS_DIR", pkg / "integrations") + return module + + +def test_checker_reports_files_missing_from_merged_usage_logs(checker, tmp_path): + usage = tmp_path / "usage" + usage.mkdir() + (usage / "usage-1-a.txt").write_text("integrations/alpha/cassettes/latest/used.yaml\n") + (usage / "usage-2-b.txt").write_text("integrations/beta/cassettes/latest/transport.json\n\n") + (usage / "ignored.txt").write_text("integrations/alpha/cassettes/1.0.0/btx/spec.yaml\n") + + used = checker.load_usage(usage) + + assert checker.integrations_with_cassettes() == ["alpha", "beta"] + assert checker.find_unused(["alpha", "beta"], used) == [ + "integrations/alpha/cassettes/1.0.0/btx/spec.yaml", + "integrations/alpha/cassettes/latest/unused.yaml", + ] + assert checker.find_unused(["beta"], used) == [] + + +def test_checker_maps_integrations_to_nox_sessions(checker, tmp_path): + noxfile = tmp_path / "noxfile.py" + noxfile.write_text( + textwrap.dedent( + """ + def test_alpha(session, version): + _run_tests(session, f"{INTEGRATION_DIR}/alpha/test_alpha.py", version=version) + + def test_alpha_extra(session): + _run_tests(session, f"{INTEGRATION_DIR}/alpha") + + def test_spec_beta(session, version): + _run_tests(session, "braintrust/btx", version=version, env={"PROVIDER": "beta"}) + + def test_core(session): + _run_tests(session, "braintrust", ignore_path=f"{INTEGRATION_DIR}/alpha") + + def test_gamma(session): + _run_tests(session, f"{INTEGRATION_DIR}/gamma/test_gamma.py") + """ + ) + ) + + assert checker.sessions_by_integration(noxfile) == { + "alpha": {"test_alpha", "test_alpha_extra"}, + "beta": {"test_spec_beta"}, + } From 5100ce488ef81790d6022fd51a2953be604b488f Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 20:41:24 +0000 Subject: [PATCH 07/11] fix(ci): pin sqlalchemy<2.1 for dspy, google-adk and llama-index sessions SQLAlchemy 2.1.0 ships only an sdist whose pyproject declares a duplicate normalized extra (mssql-pymssql), which uv refuses to build. Installing dspy (via optuna), google-adk and llama-index-core resolves it and fails. Co-Authored-By: Claude Opus 5.5 --- py/noxfile.py | 6 ++-- py/pyproject.toml | 6 ++++ py/uv.lock | 76 +++++++++++++++++++++++++---------------------- 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/py/noxfile.py b/py/noxfile.py index cfd3df4d9..58df546f0 100644 --- a/py/noxfile.py +++ b/py/noxfile.py @@ -605,7 +605,7 @@ def test_dspy(session, version): # and Python 3.14 wheels. Preinstall our portable matrix pin so DSPy's # dependency resolution does not select that incompatible release. _install_matrix_dep(session, "litellm", LATEST) - _install_matrix_dep(session, "dspy", version) + _install_matrix_dep(session, "dspy", version, "test-sqlalchemy-2-0") _run_tests(session, f"{INTEGRATION_DIR}/dspy/test_dspy.py", version=version, env=_LITELLM_LOCAL_COST_MAP) @@ -632,7 +632,7 @@ def test_crewai(session, version): @nox.parametrize("version", GOOGLE_ADK_VERSIONS, ids=GOOGLE_ADK_VERSIONS) def test_google_adk(session, version): _install_test_deps(session) - _install_matrix_dep(session, "google-adk", version) + _install_matrix_dep(session, "google-adk", version, "test-sqlalchemy-2-0") _run_tests(session, f"{INTEGRATION_DIR}/adk/test_adk.py", version=version) @@ -672,7 +672,7 @@ def test_deepagents(session, version): def test_llamaindex(session, version): _install_test_deps(session) _install_group_locked(session, "test-llamaindex") - _install_matrix_dep(session, "llama-index-core", version) + _install_matrix_dep(session, "llama-index-core", version, "test-sqlalchemy-2-0") # These packages are tightly version-coupled to llama-index-core, so we # install them unpinned and let pip resolve compatible versions. session.install("llama-index-llms-openai", "llama-index-embeddings-openai", silent=SILENT_INSTALLS) diff --git a/py/pyproject.toml b/py/pyproject.toml index b6e0f8a2e..d2aefa700 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -152,6 +152,12 @@ test-mcp-v1 = [ "mcp==1.28.1", ] +# SQLAlchemy 2.1.0 ships only an sdist whose pyproject declares a duplicate +# normalized extra (`mssql-pymssql`), which uv refuses to build. +test-sqlalchemy-2-0 = [ + "sqlalchemy<2.1", +] + test-pydantic-ai-otel-events = [ "opentelemetry-api==1.39.1", # genai-prices 0.1 returns fields that older Pydantic AI RequestUsage models cannot accept. diff --git a/py/uv.lock b/py/uv.lock index 27e9a43f5..aadf8c725 100644 --- a/py/uv.lock +++ b/py/uv.lock @@ -977,6 +977,9 @@ test-pydantic-ai-otel-events = [ { name = "genai-prices" }, { name = "opentelemetry-api", version = "1.39.1", source = { registry = "https://pypi.org/simple" } }, ] +test-sqlalchemy-2-0 = [ + { name = "sqlalchemy" }, +] test-strands = [ { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, { name = "pytest" }, @@ -1204,6 +1207,7 @@ test-pydantic-ai-otel-events = [ { name = "genai-prices", specifier = "==0.0.73" }, { name = "opentelemetry-api", specifier = "==1.39.1" }, ] +test-sqlalchemy-2-0 = [{ name = "sqlalchemy", specifier = "<2.1" }] test-strands = [ { name = "openai", specifier = "==2.32.0" }, { name = "pytest", specifier = "==9.1.1" }, @@ -1738,7 +1742,7 @@ name = "coloredlogs" version = "15.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "humanfriendly", marker = "(python_full_version < '3.12' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "humanfriendly", marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } wheels = [ @@ -2426,8 +2430,8 @@ name = "genai-prices" version = "0.0.73" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx2" }, - { name = "pydantic" }, + { name = "httpx2", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "pydantic", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/84/0b/4b430d9c6ff0c76e42b91fc4cedff84dfbefa1a35b885fad45a22d29303f/genai_prices-0.0.73.tar.gz", hash = "sha256:ddad5b23dadd7aac8a58ab5af7506addb062114037e96427324703e50bc35077", size = 88406, upload-time = "2026-07-29T12:48:58.215Z" } wheels = [ @@ -2888,8 +2892,8 @@ name = "httpcore2" version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "h11" }, - { name = "truststore" }, + { name = "h11", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "truststore", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/15/8c/e925b1c92018abb3a1863ce1549d76d2381e334d21d65d4ac8f65dabd78a/httpcore2-2.13.0.tar.gz", hash = "sha256:2adc8be4fb285fbcd6d894298db3b52c177e74b6674eda3a76bd36be3292a3db", size = 67740, upload-time = "2026-09-14T14:18:04.717Z" } wheels = [ @@ -2933,7 +2937,7 @@ dependencies = [ { name = "anyio", marker = "(sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra != 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "httpcore2", marker = "(sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra != 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "httpx2-jsfetch", marker = "(python_full_version >= '3.12' and sys_platform == 'emscripten' and extra == 'group-10-braintrust-lint') or (python_full_version >= '3.12' and sys_platform == 'emscripten' and extra == 'group-10-braintrust-test-agentscope') or (python_full_version >= '3.12' and sys_platform == 'emscripten' and extra == 'group-10-braintrust-test-agno') or (python_full_version >= '3.12' and sys_platform == 'emscripten' and extra == 'group-10-braintrust-test-crewai') or (python_full_version >= '3.12' and sys_platform == 'emscripten' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version >= '3.12' and sys_platform == 'emscripten' and extra == 'group-10-braintrust-test-langchain') or (python_full_version >= '3.12' and sys_platform == 'emscripten' and extra == 'group-10-braintrust-test-litellm') or (python_full_version >= '3.12' and sys_platform == 'emscripten' and extra != 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (python_full_version < '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (python_full_version < '3.12' and extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, - { name = "idna" }, + { name = "idna", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "truststore", marker = "(sys_platform != 'emscripten' and extra == 'group-10-braintrust-lint') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agentscope') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'emscripten' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'emscripten' and extra != 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and extra == 'group-10-braintrust-lint') or (python_full_version < '3.13' and extra == 'group-10-braintrust-test-agentscope') or (python_full_version < '3.13' and extra == 'group-10-braintrust-test-agno') or (python_full_version < '3.13' and extra == 'group-10-braintrust-test-crewai') or (python_full_version < '3.13' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version < '3.13' and extra == 'group-10-braintrust-test-langchain') or (python_full_version < '3.13' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.13' and extra != 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, ] @@ -2977,7 +2981,7 @@ name = "humanfriendly" version = "10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyreadline3", marker = "(python_full_version < '3.12' and sys_platform == 'win32' and extra == 'group-10-braintrust-lint') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (python_full_version >= '3.12' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (sys_platform == 'win32' and extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "pyreadline3", marker = "(python_full_version < '3.11' and sys_platform == 'win32' and extra == 'group-10-braintrust-lint') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (python_full_version >= '3.11' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (sys_platform != 'win32' and extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (sys_platform != 'win32' and extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (sys_platform == 'win32' and extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } wheels = [ @@ -4151,16 +4155,16 @@ name = "logfire" version = "4.32.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "executing" }, - { name = "opentelemetry-exporter-otlp-proto-http", version = "1.39.1", source = { registry = "https://pypi.org/simple" } }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-sdk", version = "1.39.1", source = { registry = "https://pypi.org/simple" } }, + { name = "executing", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "opentelemetry-exporter-otlp-proto-http", version = "1.39.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "opentelemetry-instrumentation", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "opentelemetry-sdk", version = "1.39.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "protobuf", version = "5.29.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra == 'group-10-braintrust-test-openai-agents' or extra == 'group-10-braintrust-test-pydantic-ai-logfire' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra != 'group-10-braintrust-test-pydantic-ai-otel-events' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents')" }, { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra == 'group-10-braintrust-test-openai-agents' or extra == 'group-10-braintrust-test-pydantic-ai-logfire' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra != 'group-10-braintrust-test-pydantic-ai-otel-events' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents')" }, { name = "tomli", marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or (python_full_version < '3.11' and extra == 'group-10-braintrust-test-agentscope') or (python_full_version < '3.11' and extra == 'group-10-braintrust-test-agno') or (python_full_version < '3.11' and extra == 'group-10-braintrust-test-crewai') or (python_full_version < '3.11' and extra == 'group-10-braintrust-test-deepagents') or (python_full_version < '3.11' and extra == 'group-10-braintrust-test-langchain') or (python_full_version < '3.11' and extra == 'group-10-braintrust-test-litellm') or (python_full_version < '3.11' and extra != 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b5/d7/70c6def7f3f459b2d57aa7fb37863d31b8d877e391547f200ee8c31d2e30/logfire-4.32.1.tar.gz", hash = "sha256:8e7ff418b5f2629c8a8e9426283ff82c760a30f24516c4c389d6cbb1d9768c58", size = 1089612, upload-time = "2026-04-15T14:11:57.518Z" } wheels = [ @@ -4959,15 +4963,15 @@ name = "onnxruntime" version = "1.23.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coloredlogs", marker = "(python_full_version < '3.12' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, - { name = "flatbuffers", marker = "(python_full_version < '3.12' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "coloredlogs", marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "flatbuffers", marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or (python_full_version < '3.11' and extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version == '3.11.*' and extra == 'group-10-braintrust-lint') or (python_full_version == '3.11.*' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version == '3.11.*' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "numpy", version = "2.5.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, - { name = "packaging", marker = "(python_full_version < '3.12' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, - { name = "protobuf", version = "5.29.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and extra == 'group-10-braintrust-lint') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "packaging", marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "protobuf", version = "5.29.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, - { name = "sympy", marker = "(python_full_version < '3.12' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "sympy", marker = "(python_full_version < '3.11' and extra == 'group-10-braintrust-lint') or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra != 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/b3/84/42b8a11c9ebfb042071aaab73d17829fc094126e30caf65b18a94c3a5116/onnxruntime-1.23.1-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:6b5257157d319abc87aa17294a9acf17119c6ecfdf9531017239b9022334f9b7", size = 17192895, upload-time = "2025-10-08T04:25:21.961Z" }, @@ -5073,15 +5077,15 @@ resolution-markers = [ "python_full_version < '3.11' and sys_platform == 'darwin'", ] dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, + { name = "anyio", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, + { name = "distro", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, + { name = "httpx", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, { name = "jiter", version = "0.14.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "jiter", version = "0.17.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or extra == 'group-10-braintrust-test-strands' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra != 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents')" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, + { name = "pydantic", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, + { name = "sniffio", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, + { name = "tqdm", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, + { name = "typing-extensions", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } wheels = [ @@ -5140,15 +5144,15 @@ resolution-markers = [ "python_full_version < '3.11' and sys_platform == 'darwin'", ] dependencies = [ - { name = "griffelib" }, + { name = "griffelib", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra != 'group-10-braintrust-test-litellm' or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands')" }, { name = "mcp", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra != 'group-10-braintrust-test-litellm' or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands')" }, { name = "openai", version = "2.31.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-openai-agents' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra != 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra != 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra != 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra != 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands') or (extra != 'group-10-braintrust-test-agentscope' and extra != 'group-10-braintrust-test-agno' and extra != 'group-10-braintrust-test-litellm' and extra != 'group-10-braintrust-test-openai-agents')" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "types-requests" }, - { name = "typing-extensions" }, - { name = "websockets" }, + { name = "pydantic", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra != 'group-10-braintrust-test-litellm' or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands')" }, + { name = "requests", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra != 'group-10-braintrust-test-litellm' or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands')" }, + { name = "types-requests", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra != 'group-10-braintrust-test-litellm' or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands')" }, + { name = "typing-extensions", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra != 'group-10-braintrust-test-litellm' or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands')" }, + { name = "websockets", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra != 'group-10-braintrust-test-litellm' or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fd/16/b79c1849125eb6d19cae98c21ff35caa2e55b5ec8d7a02b354b711917ef7/openai_agents-0.17.3.tar.gz", hash = "sha256:63b6dda6bd4fb51169e2a2cbd5d187a4e5ce823bbd15f965c8ed1d3b89072eec", size = 5406135, upload-time = "2026-05-19T01:28:15.971Z" } wheels = [ @@ -5444,10 +5448,10 @@ name = "opentelemetry-instrumentation" version = "0.60b1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-api", version = "1.39.1", source = { registry = "https://pypi.org/simple" } }, - { name = "opentelemetry-semantic-conventions", version = "0.60b1", source = { registry = "https://pypi.org/simple" } }, - { name = "packaging" }, - { name = "wrapt" }, + { name = "opentelemetry-api", version = "1.39.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "opentelemetry-semantic-conventions", version = "0.60b1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "packaging", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, + { name = "wrapt", marker = "extra == 'group-10-braintrust-lint' or extra == 'group-10-braintrust-test-agentscope' or extra == 'group-10-braintrust-test-agno' or extra == 'group-10-braintrust-test-crewai' or extra == 'group-10-braintrust-test-deepagents' or extra == 'group-10-braintrust-test-langchain' or extra == 'group-10-braintrust-test-litellm' or extra != 'group-10-braintrust-test-livekit-agents' or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/41/0f/7e6b713ac117c1f5e4e3300748af699b9902a2e5e34c9cf443dde25a01fa/opentelemetry_instrumentation-0.60b1.tar.gz", hash = "sha256:57ddc7974c6eb35865af0426d1a17132b88b2ed8586897fee187fd5b8944bd6a", size = 31706, upload-time = "2025-12-11T13:36:42.515Z" } wheels = [ @@ -7737,7 +7741,7 @@ name = "sqlalchemy" version = "2.0.54" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agentscope') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-lint' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-agno') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agentscope' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-crewai') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-agno' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-deepagents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-crewai' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-langchain') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-deepagents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-litellm') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-langchain' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-livekit-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-litellm' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-openai-agents') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-logfire') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-pydantic-ai-otel-events') or (extra == 'group-10-braintrust-test-livekit-agents' and extra == 'group-10-braintrust-test-strands') or (extra == 'group-10-braintrust-test-openai-agents' and extra == 'group-10-braintrust-test-strands')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/29/9c/271aa905cf2964f841371a97f3e63ab692bf51b4423d0491e67bc7f64037/sqlalchemy-2.0.54.tar.gz", hash = "sha256:baa8521e8ee9f24e75dfc7aaabc08020e551ef0d48d7c3e3536f5cddf277586b", size = 9969559, upload-time = "2026-09-15T21:06:57.337Z" } From eeaf047e8e35e6317c12503689cc0b81e994501c Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 20:41:24 +0000 Subject: [PATCH 08/11] test: delete unversioned huggingface_hub cassettes Nox always reads the per-version cassette directories; these base-dir copies are never loaded (found with check-unused-cassettes.py). Co-Authored-By: Claude Opus 5.5 --- .../cassettes/test_auto_huggingface_hub.yaml | 166 ------------------ ...ync_streaming_nests_under_parent_span.yaml | 119 ------------- ...at_completion_nests_under_parent_span.yaml | 104 ----------- ...ion_streaming_nests_under_parent_span.yaml | 119 ------------- ...huggingface_hub_chat_completion_async.yaml | 104 ----------- ...e_hub_chat_completion_async_streaming.yaml | 119 ------------- ...e_hub_chat_completion_error_logs_span.yaml | 68 ------- ...face_hub_chat_completion_openai_alias.yaml | 104 ----------- ...ingface_hub_chat_completion_streaming.yaml | 119 ------------- ..._huggingface_hub_chat_completion_sync.yaml | 166 ------------------ ...ngface_hub_chat_completion_tool_calls.yaml | 106 ----------- ...ggingface_hub_feature_extraction_sync.yaml | 143 --------------- ...gingface_hub_sentence_similarity_sync.yaml | 144 --------------- ...ggingface_hub_text_generation_details.yaml | 85 --------- ..._huggingface_hub_text_generation_sync.yaml | 147 ---------------- 15 files changed, 1813 deletions(-) delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_auto_huggingface_hub.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_async_streaming_nests_under_parent_span.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_nests_under_parent_span.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_streaming_nests_under_parent_span.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async_streaming.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_error_logs_span.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_openai_alias.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_streaming.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_sync.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_tool_calls.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_feature_extraction_sync.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_sentence_similarity_sync.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_details.yaml delete mode 100644 py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_sync.yaml diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_auto_huggingface_hub.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_auto_huggingface_hub.yaml deleted file mode 100644 index c5ba77048..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_auto_huggingface_hub.yaml +++ /dev/null @@ -1,166 +0,0 @@ -interactions: -- request: - body: '' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Host: - - huggingface.co - X-Amzn-Trace-Id: - - c4e361b1-36ee-4193-95ba-d07e728337a5 - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: GET - uri: https://huggingface.co/api/models/meta-llama/Llama-3.1-8B-Instruct?expand=inferenceProviderMapping - response: - body: - string: '{"_id":"6698d8a0653e4babe21e1e7d","id":"meta-llama/Llama-3.1-8B-Instruct","inferenceProviderMapping":{"novita":{"status":"live","providerId":"meta-llama/llama-3.1-8b-instruct","task":"conversational","isModelAuthor":false},"cerebras":{"status":"live","providerId":"llama3.1-8b","task":"conversational","isModelAuthor":false},"nscale":{"status":"live","providerId":"meta-llama/Llama-3.1-8B-Instruct","task":"conversational","isModelAuthor":false},"featherless-ai":{"status":"live","providerId":"meta-llama/Llama-3.1-8B-Instruct","task":"conversational","isModelAuthor":false},"scaleway":{"status":"live","providerId":"llama-3.1-8b-instruct","task":"conversational","isModelAuthor":false},"sambanova":{"status":"error","providerId":"Meta-Llama-3.1-8B-Instruct","task":"conversational","isModelAuthor":false}}}' - headers: - Access-Control-Allow-Origin: - - https://huggingface.co - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Access-Control-Max-Age: - - '86400' - Connection: - - keep-alive - Content-Length: - - '807' - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 21 May 2026 15:04:14 GMT - ETag: - - W/"327-rGmaw5kJdg5YAxbzm0/YqcFylMQ" - RateLimit: - - '"api";r=994;t=51' - RateLimit-Policy: - - '"fixed window";"api";q=1000;w=300' - Referrer-Policy: - - strict-origin-when-cross-origin - Vary: - - Origin - Via: - - 1.1 5e2f1ed3ba0ab1e08304bb3d134360de.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - xOjF6PWM4uL37GJfjAaFoowjSvGEKlfNzAjR4RWMKwZXsRSYTVpw7g== - X-Amz-Cf-Pop: - - YTO50-P2 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1eee-2007b669377e21b06ea03e53;c4e361b1-36ee-4193-95ba-d07e728337a5 - cross-origin-opener-policy: - - same-origin - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '115' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 4b7a36a6-7243-4dd4-a80f-e2e38347e19b - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-adc10106-89c1-40ac-8051-dc7ec432a255","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hello.","role":"assistant"}}],"created":1779375854,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion","usage":{"total_tokens":44,"completion_tokens":3,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375854.8248267,"queue_time":0.149282837,"prompt_time":0.002891561,"completion_time":0.001194703,"total_time":0.1547222137451172}}' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:04:15 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 101faeb149b23d8a2ab2e8bae2efec18.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - YOnkWigBECa6IwLDJ0_NDOQPar4TBE3PxSZlqS7utEGQLSa3rONVYg== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478f4589cd691-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-adc10106-89c1-40ac-8051-dc7ec432a255 - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=fu13c5V_nJmVaf9R3OGVHwR_bW6pXk.NxuWgLZMRMf4-1779375854.773181-1.0.1.1-gWrOzq046h6Y1OX_FIINf6DTID1UQqxrqvcpjuiYIW4Td7XwJSFmdo3O.HRSrTP7wjPKzYQJYUnlnLhXu9.ucpD9dhwJh66lpSEYaYSvhv8m01zp1SMADFnYPtCagNpZ; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:34:15 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879958' - x-ratelimit-remaining-requests-hour: - - '119958' - x-ratelimit-remaining-requests-minute: - - '1958' - x-ratelimit-remaining-tokens-day: - - '9223372036854763520' - x-ratelimit-remaining-tokens-hour: - - '9223372036854763520' - x-ratelimit-remaining-tokens-minute: - - '9223372036854763520' - x-request-id: - - 9ff478f4589cd691-IAD - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_async_streaming_nests_under_parent_span.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_async_streaming_nests_under_parent_span.yaml deleted file mode 100644 index ba2e3834f..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_async_streaming_nests_under_parent_span.yaml +++ /dev/null @@ -1,119 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '114' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 05a868e6-a1a6-45ab-846b-333036a38754 - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-b3f9aee8-4f8a-4167-9795-34eb05030b45","choices":[{"delta":{"role":"assistant"},"index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-b3f9aee8-4f8a-4167-9795-34eb05030b45","choices":[{"delta":{"content":"Hello"},"index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-b3f9aee8-4f8a-4167-9795-34eb05030b45","choices":[{"delta":{"content":"."},"index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-b3f9aee8-4f8a-4167-9795-34eb05030b45","choices":[{"delta":{},"finish_reason":"stop","index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk","usage":{"total_tokens":44,"completion_tokens":3,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375853.7841375,"queue_time":0.162620106,"prompt_time":0.003247135,"completion_time":0.001201065,"total_time":0.1689300537109375}} - - - data: [DONE] - - - ' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Thu, 21 May 2026 15:04:13 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 bb9ef32b857fc891bea749f3fa65f58a.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - xf6obaElOiGLu_uwpaN2OyIC7veKqdA5ugTcDGEMoms59V-McqeXlQ== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478edea62f493-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-b3f9aee8-4f8a-4167-9795-34eb05030b45 - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=1fkGqYKX_pALXyLpHagVLqGXXscv0VXB6Y0c.ffl4xA-1779375853.7473137-1.0.1.1-LBL2T85i_KzaCuhqLkn84CjNrRSFLp80DEloHfeOI_uAkFUnDjvjAwgUXSAn_0.37Uous6y.SUinxXYKy_Nn9413BqGe2.FrPqEZO8.hnhHa5xDEPIrHr.7pNnXJLNP6; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:34:13 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879989' - x-ratelimit-remaining-requests-hour: - - '119989' - x-ratelimit-remaining-requests-minute: - - '1989' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff478edea62f493-IAD - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_nests_under_parent_span.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_nests_under_parent_span.yaml deleted file mode 100644 index c0763b004..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_nests_under_parent_span.yaml +++ /dev/null @@ -1,104 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '115' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 5afa8f5d-69bf-499b-9dd1-d3bc8819d763 - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-57df8b9b-9e10-4b18-b7ef-64190aab603c","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hello.","role":"assistant"}}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion","usage":{"total_tokens":44,"completion_tokens":3,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375853.1342707,"queue_time":0.123147488,"prompt_time":0.002747226,"completion_time":0.001201875,"total_time":0.1284933090209961}}' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:04:13 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 c73f9dc228a4b3fb05ae37ce52d04a1c.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - yLCgfmnMUMRkCd1Ootm8boGu5tYcm8ndql67DQ6189tGWftPdcuKaw== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478e9db8913fa-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-57df8b9b-9e10-4b18-b7ef-64190aab603c - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=UjlbbmDP_iqOEX9OwXd3XGXBRdy3zW.POkC6tkNsXF8-1779375853.0965118-1.0.1.1-03OjGX0xMBNpOjOU6JtTQSJH2m9.YIybMRLnQETXFYZ9_0i0PTSEPnOVjbf2nDKYGB7jHah9zSYfu0ePNkHyRt.B8EerGP9UU7CaGDxvIx.4d.rci_fhaUfM6AL7YRxk; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:34:13 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879999' - x-ratelimit-remaining-requests-hour: - - '119999' - x-ratelimit-remaining-requests-minute: - - '1999' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff478e9db8913fa-IAD - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_streaming_nests_under_parent_span.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_streaming_nests_under_parent_span.yaml deleted file mode 100644 index 8ebd92e2a..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_chat_completion_streaming_nests_under_parent_span.yaml +++ /dev/null @@ -1,119 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '114' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 0f1cfca5-0b3a-42f0-bdc7-b0b36c449caf - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-d1d4bc7a-d192-47b5-944a-21fd0b1f7772","choices":[{"delta":{"role":"assistant"},"index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-d1d4bc7a-d192-47b5-944a-21fd0b1f7772","choices":[{"delta":{"content":"Hello"},"index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-d1d4bc7a-d192-47b5-944a-21fd0b1f7772","choices":[{"delta":{"content":""},"index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-d1d4bc7a-d192-47b5-944a-21fd0b1f7772","choices":[{"delta":{},"finish_reason":"stop","index":0}],"created":1779375853,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk","usage":{"total_tokens":43,"completion_tokens":2,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375853.472369,"queue_time":0.014082278,"prompt_time":0.002660887,"completion_time":0.000793718,"total_time":0.01933145523071289}} - - - data: [DONE] - - - ' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Thu, 21 May 2026 15:04:13 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 54f8dfc32403dc4b8a1c2d5ea7335730.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - o3xmFnRgF1bwCnOX2cG-Kr_AeLC_5cK6_f9LswRaO8fRLgzNzkj79w== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478ebdb20876a-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-d1d4bc7a-d192-47b5-944a-21fd0b1f7772 - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=NQC5lH2wUMzWQjz4mibL4lBN6AsnZk790BbD_yq2rvc-1779375853.4202898-1.0.1.1-tLdiHI6x_MS5I0lWneDbqBDRnY799L00AJ3p2IsMCQWpjdnUYcUNzbENjPgdX_owEZFW3DJhOVdvizVtkzHZUqtBGbCnWGGTWwCN7nbfPND90G8gZ6q8aDO0kO5bePcA; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:34:13 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879994' - x-ratelimit-remaining-requests-hour: - - '119994' - x-ratelimit-remaining-requests-minute: - - '1994' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff478ebdb20876a-CMH - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async.yaml deleted file mode 100644 index 285dc905f..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async.yaml +++ /dev/null @@ -1,104 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '115' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 916a859d-93b2-4775-af86-6664e8e4ed44 - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-08fd9bbf-d9b5-4764-ac91-8a89b0c9e9d9","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hi.","role":"assistant"}}],"created":1779375833,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion","usage":{"total_tokens":44,"completion_tokens":3,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375833.9141822,"queue_time":0.00236532,"prompt_time":0.001976071,"completion_time":0.0011937,"total_time":0.006955146789550781}}' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:03:53 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 c73f9dc228a4b3fb05ae37ce52d04a1c.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - -w3GvGNZO_WfVO_cEKAww-CXhfHSxnNuFr8I4nBC_7GbXC_3fw-C2Q== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478719b73fa2f-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-08fd9bbf-d9b5-4764-ac91-8a89b0c9e9d9 - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=ZNkMjKAqADQH.MFQetYlWLwWAWpCRLUvEFFW7KW9cIo-1779375833.8592622-1.0.1.1-hUDE_dg6jm9uhquh26r1Z_3NUl03T5CHNd6E0dNSKglO8zwnm7JI1Ds9o7SwOF98nxkCevBS1RLSxc_Et9.BA8s8MHRQpNadYRMRKsISQlJ8YExmadeCHBkCN3n6bBIz; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:33:53 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879995' - x-ratelimit-remaining-requests-hour: - - '119995' - x-ratelimit-remaining-requests-minute: - - '1995' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff478719b73fa2f-CMH - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async_streaming.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async_streaming.yaml deleted file mode 100644 index 590387782..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_async_streaming.yaml +++ /dev/null @@ -1,119 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '114' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 57489e2d-1134-48d1-b2a3-04616150821c - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-4441a22b-5e5c-4376-9fbb-3b87135421db","choices":[{"delta":{"role":"assistant"},"index":0}],"created":1779375834,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-4441a22b-5e5c-4376-9fbb-3b87135421db","choices":[{"delta":{"content":"Hello"},"index":0}],"created":1779375834,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-4441a22b-5e5c-4376-9fbb-3b87135421db","choices":[{"delta":{"content":"."},"index":0}],"created":1779375834,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-4441a22b-5e5c-4376-9fbb-3b87135421db","choices":[{"delta":{},"finish_reason":"stop","index":0}],"created":1779375834,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk","usage":{"total_tokens":44,"completion_tokens":3,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375834.1494284,"queue_time":0.00022884,"prompt_time":0.002677371,"completion_time":0.00120663,"total_time":0.0064373016357421875}} - - - data: [DONE] - - - ' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Thu, 21 May 2026 15:03:54 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 bfb1eb580f1b74920e77f7f003dbce62.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - NxigQ4bVwgaz-lyfihnzgZ0Vby8jBU-LbNZMKV_veh1K002AYKBBBw== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478731a940625-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-4441a22b-5e5c-4376-9fbb-3b87135421db - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=e8uxaFwPBzPswCwDPPvQb_Qq32jLFv4.8TWl.tFKuIQ-1779375834.0966256-1.0.1.1-U.sysoi7d1mSWv1aYHnwUZiDCweWUiVatcD1Qrzll0eq97tvItKuwZd8Bw7qKrtS69MN.mcb_1nvQnenGMQ7kZK94YW6kZQnxUL0yPsMaZqQvnhE8_DO09cQ4WoaOU5W; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:33:54 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879999' - x-ratelimit-remaining-requests-hour: - - '119999' - x-ratelimit-remaining-requests-minute: - - '1999' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff478731a940625-IAD - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_error_logs_span.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_error_logs_span.yaml deleted file mode 100644 index 34e1a03d2..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_error_logs_span.yaml +++ /dev/null @@ -1,68 +0,0 @@ -interactions: -- request: - body: '' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Host: - - huggingface.co - X-Amzn-Trace-Id: - - b64f2fb2-4111-4746-a187-e31d11228d86 - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: GET - uri: https://huggingface.co/api/models/this-model-id-does-not-exist-xyz - response: - body: - string: '{"error":"Repository not found"}' - headers: - Access-Control-Allow-Origin: - - https://huggingface.co - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Access-Control-Max-Age: - - '86400' - Connection: - - keep-alive - Content-Length: - - '32' - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 21 May 2026 15:03:53 GMT - ETag: - - W/"20-bITJowpdmeRi6flSV9yCp5Fkq5k" - RateLimit: - - '"api";r=998;t=72' - RateLimit-Policy: - - '"fixed window";"api";q=1000;w=300' - Referrer-Policy: - - strict-origin-when-cross-origin - Vary: - - Origin - Via: - - 1.1 74797197cacba7d22a7c3a7685b38272.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - 5HRFYb8uerxktVOGIGnpt-CrEDmaicODQ9c2u0lDtl0M3aaKeAufrg== - X-Amz-Cf-Pop: - - YTO50-P2 - X-Cache: - - Error from cloudfront - X-Error-Code: - - RepoNotFound - X-Error-Message: - - Repository not found - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1ed9-1436a1ad7038056335d2d3dc;b64f2fb2-4111-4746-a187-e31d11228d86 - cross-origin-opener-policy: - - same-origin - status: - code: 404 - message: Not Found -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_openai_alias.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_openai_alias.yaml deleted file mode 100644 index 2e21bb445..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_openai_alias.yaml +++ /dev/null @@ -1,104 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '115' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 734d050a-8303-4a86-8341-b2f8e2feb77a - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-67df9c59-0282-42ae-9633-604ce758e283","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hello","role":"assistant"}}],"created":1779375832,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion","usage":{"total_tokens":43,"completion_tokens":2,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375832.879558,"queue_time":8.683e-05,"prompt_time":0.002542951,"completion_time":0.0008069,"total_time":0.00526881217956543}}' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:03:52 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 1469d4976bc2a36b5840519c9e3dbad6.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - W1TTZ87RDE5cu7gLijOESGppVGdbcI1Dyzmu1VxcCyyYh4Hl-Bb8uw== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff4786b2a8f8121-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-67df9c59-0282-42ae-9633-604ce758e283 - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=Qk72oahO5rTpPB6zK4eHOrou2Zs0PeKqhqcVLU0qcho-1779375832.8308907-1.0.1.1-iwjHv2_u.X6w9KTo6spMBCAvHmaR_PCcy2m71PRU9vo8lb19g8VZsmlRV1iB63JtRbYzml8DEb4YTKtBym9JuDa9Sa3tazLLa0ziP_QMQLHlBxD_Frj1tGC7kBWfQ_.e; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:33:52 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879998' - x-ratelimit-remaining-requests-hour: - - '119998' - x-ratelimit-remaining-requests-minute: - - '1998' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff4786b2a8f8121-IAD - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_streaming.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_streaming.yaml deleted file mode 100644 index 7c649c442..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_streaming.yaml +++ /dev/null @@ -1,119 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '114' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - e8f8da67-390b-4972-8efb-67cf5faeaf10 - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-14e1c46c-419d-41a3-be5a-253a2bee4bdf","choices":[{"delta":{"role":"assistant"},"index":0}],"created":1779375833,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-14e1c46c-419d-41a3-be5a-253a2bee4bdf","choices":[{"delta":{"content":"Hello"},"index":0}],"created":1779375833,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-14e1c46c-419d-41a3-be5a-253a2bee4bdf","choices":[{"delta":{"content":""},"index":0}],"created":1779375833,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk"} - - - data: {"id":"chatcmpl-14e1c46c-419d-41a3-be5a-253a2bee4bdf","choices":[{"delta":{},"finish_reason":"stop","index":0}],"created":1779375833,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion.chunk","usage":{"total_tokens":43,"completion_tokens":2,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375833.1232736,"queue_time":0.000250699,"prompt_time":0.002252547,"completion_time":0.000802518,"total_time":0.00509333610534668}} - - - data: [DONE] - - - ' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - text/event-stream; charset=utf-8 - Date: - - Thu, 21 May 2026 15:03:53 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 3758a948ce5cf1a44c10afecd9aed040.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - ObKNmH2iCOkTulTTA_YkmpFSeCoJjgGXPHOeE_Y2NlhArcDp6efvig== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff4786cad822430-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-14e1c46c-419d-41a3-be5a-253a2bee4bdf - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=4UR6nZzmwUQrAFee2b.7NcjDVy8t4HS69JyLVOtxXb4-1779375833.0660443-1.0.1.1-xh3wZbVuHkT7QlLRingVElArY871f0NFY0nAijuoPCcChogB54Ig61qqO2Ad1l1SH8uP3KERq_bus5Ev4MoaDXT6RA3JQ5556JqUQ2NpzBT3o2VjLZhq5RWNzPR81MEr; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:33:53 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879997' - x-ratelimit-remaining-requests-hour: - - '119997' - x-ratelimit-remaining-requests-minute: - - '1997' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff4786cad822430-IAD - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_sync.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_sync.yaml deleted file mode 100644 index 41511afde..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_sync.yaml +++ /dev/null @@ -1,166 +0,0 @@ -interactions: -- request: - body: '' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Host: - - huggingface.co - X-Amzn-Trace-Id: - - c38b2199-26a3-4e9d-85e7-fba65d84745e - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: GET - uri: https://huggingface.co/api/models/meta-llama/Llama-3.1-8B-Instruct?expand=inferenceProviderMapping - response: - body: - string: '{"_id":"6698d8a0653e4babe21e1e7d","id":"meta-llama/Llama-3.1-8B-Instruct","inferenceProviderMapping":{"novita":{"status":"live","providerId":"meta-llama/llama-3.1-8b-instruct","task":"conversational","isModelAuthor":false},"cerebras":{"status":"live","providerId":"llama3.1-8b","task":"conversational","isModelAuthor":false},"nscale":{"status":"live","providerId":"meta-llama/Llama-3.1-8B-Instruct","task":"conversational","isModelAuthor":false},"featherless-ai":{"status":"live","providerId":"meta-llama/Llama-3.1-8B-Instruct","task":"conversational","isModelAuthor":false},"scaleway":{"status":"live","providerId":"llama-3.1-8b-instruct","task":"conversational","isModelAuthor":false},"sambanova":{"status":"error","providerId":"Meta-Llama-3.1-8B-Instruct","task":"conversational","isModelAuthor":false}}}' - headers: - Access-Control-Allow-Origin: - - https://huggingface.co - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Access-Control-Max-Age: - - '86400' - Connection: - - keep-alive - Content-Length: - - '807' - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 21 May 2026 15:03:52 GMT - ETag: - - W/"327-rGmaw5kJdg5YAxbzm0/YqcFylMQ" - RateLimit: - - '"api";r=999;t=73' - RateLimit-Policy: - - '"fixed window";"api";q=1000;w=300' - Referrer-Policy: - - strict-origin-when-cross-origin - Vary: - - Origin - Via: - - 1.1 cb0c6226aa19d81a39519501df383968.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - QTBNcGjEp3xm41o6W0qaQG6Cb7IJ_Pm5CeRsSlmJxPlDQW4jK9rPLg== - X-Amz-Cf-Pop: - - YTO50-P2 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1ed8-41eb074c445b85944943ba21;c38b2199-26a3-4e9d-85e7-fba65d84745e - cross-origin-opener-policy: - - same-origin - status: - code: 200 - message: OK -- request: - body: '{"messages":[{"role":"user","content":"Say hi in one word."}],"model":"llama3.1-8b","max_tokens":10,"stream":false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '115' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 946b8c5f-7283-4cdb-943e-17b4825c0a33 - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-5df8f61b-19b1-4d35-8bc5-518aa9b9b9fd","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hello.","role":"assistant"}}],"created":1779375832,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion","usage":{"total_tokens":44,"completion_tokens":3,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":41,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375832.5974257,"queue_time":0.00012591,"prompt_time":0.00226602,"completion_time":0.001206031,"total_time":0.004887819290161133}}' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:03:52 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 792fd72f7da1e5732d6b6173dea66aa8.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - OH_ijgAJwcmMohEvOYYAKM66HYl57c7s1HuON-IWmJffZnfsUEiJsA== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478696b200625-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-5df8f61b-19b1-4d35-8bc5-518aa9b9b9fd - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=VR7M1SuWD7BOaFrde30u18JDF_hvWDQQQbW.3SJ.Fyk-1779375832.5509648-1.0.1.1-iiUE_nQ6PDsLW8yswc2tkTfuQHFtwaMNDZj.0t8Z1FAAyfN3J2AaNMEJWazGKBzuPIPUQFkKqBgCWDz2gqQysOH0z7dFzFqjQDanIa.3yZBcRkf8swqmQoJPkgXtNWC0; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:33:52 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879999' - x-ratelimit-remaining-requests-hour: - - '119999' - x-ratelimit-remaining-requests-minute: - - '1999' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff478696b200625-IAD - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_tool_calls.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_tool_calls.yaml deleted file mode 100644 index d45c27c9a..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_chat_completion_tool_calls.yaml +++ /dev/null @@ -1,106 +0,0 @@ -interactions: -- request: - body: '{"messages":[{"role":"user","content":"What''s the weather in Paris?"}],"model":"llama3.1-8b","max_tokens":64,"tool_choice":"required","tools":[{"type":"function","function":{"name":"get_weather","description":"Get - the weather for a city.","parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}}],"stream":false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '348' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 78decb13-4531-4fd0-86f1-17bfc0c7b48b - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/cerebras/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-a2aa763e-752c-460e-aa9b-a7678bc85ba0","choices":[{"finish_reason":"tool_calls","index":0,"message":{"tool_calls":[{"function":{"name":"get_weather","arguments":"{\"city\": - \"Paris\"}"},"type":"function","id":"56395fa88"}],"role":"assistant"}}],"created":1779375833,"model":"llama3.1-8b","system_fingerprint":"fp_f613d2b18eccee549c5f","object":"chat.completion","usage":{"total_tokens":389,"completion_tokens":18,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":0},"prompt_tokens":371,"prompt_tokens_details":{"cached_tokens":0}},"time_info":{"created":1779375833.3963675,"queue_time":0.00354333,"prompt_time":0.016687176,"completion_time":0.007223559,"total_time":0.02937150001525879}}' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:03:53 GMT - Transfer-Encoding: - - chunked - Vary: - - Origin - Via: - - 1.1 94703ff6f88fa098310f25ad977e6604.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - UwEekOTSU2HZrpLMysbN0xpyb0HC3ANzmTkRhj5_aSFrhZsaWx6P3g== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff4786e78a45668-IAD - cross-origin-opener-policy: - - same-origin - inference-id: - - chatcmpl-a2aa763e-752c-460e-aa9b-a7678bc85ba0 - referrer-policy: - - strict-origin-when-cross-origin - server: - - cloudflare - set-cookie: - - __cf_bm=rXzt7OjnjM42tSFZLcA1futaV6D4kVXavXZ0OfyNaDs-1779375833.356332-1.0.1.1-3u7NEhFloXkqbG__3gNNku_6O.vgpG7AIAv5b4GwicZYZcQqa0JNjxl4yANddP6YReqLqyqVGD.hebLdAK.Y3TJ_mxuaCdOr0Iw.tgkpdahQ.yEvvj6ijI6BktgvVpj8; - HttpOnly; SameSite=None; Secure; Path=/; Domain=api.cerebras.ai; Expires=Thu, - 21 May 2026 15:33:53 GMT - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-content-type-options: - - nosniff - x-inference-provider: - - cerebras - x-ratelimit-limit-requests-day: - - '2880000' - x-ratelimit-limit-requests-hour: - - '120000' - x-ratelimit-limit-requests-minute: - - '2000' - x-ratelimit-limit-tokens-day: - - '9223372036854775807' - x-ratelimit-limit-tokens-hour: - - '9223372036854775807' - x-ratelimit-limit-tokens-minute: - - '9223372036854775807' - x-ratelimit-remaining-requests-day: - - '2879996' - x-ratelimit-remaining-requests-hour: - - '119996' - x-ratelimit-remaining-requests-minute: - - '1996' - x-ratelimit-remaining-tokens-day: - - '9223372036854775807' - x-ratelimit-remaining-tokens-hour: - - '9223372036854775807' - x-ratelimit-remaining-tokens-minute: - - '9223372036854775807' - x-request-id: - - 9ff4786e78a45668-CMH - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_feature_extraction_sync.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_feature_extraction_sync.yaml deleted file mode 100644 index 942e0095c..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_feature_extraction_sync.yaml +++ /dev/null @@ -1,143 +0,0 @@ -interactions: -- request: - body: '' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Host: - - huggingface.co - X-Amzn-Trace-Id: - - f4b81854-8cf3-4eaa-9fbd-9c8a19425f3a - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: GET - uri: https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 - response: - body: - string: '{"_id":"621ffdc136468d709f180294","id":"sentence-transformers/all-MiniLM-L6-v2","private":false,"pipeline_tag":"sentence-similarity","library_name":"sentence-transformers","tags":["sentence-transformers","pytorch","tf","rust","onnx","safetensors","openvino","bert","feature-extraction","sentence-similarity","transformers","en","dataset:s2orc","dataset:flax-sentence-embeddings/stackexchange_xml","dataset:ms_marco","dataset:gooaq","dataset:yahoo_answers_topics","dataset:code_search_net","dataset:search_qa","dataset:eli5","dataset:snli","dataset:multi_nli","dataset:wikihow","dataset:natural_questions","dataset:trivia_qa","dataset:embedding-data/sentence-compression","dataset:embedding-data/flickr30k-captions","dataset:embedding-data/altlex","dataset:embedding-data/simple-wiki","dataset:embedding-data/QQP","dataset:embedding-data/SPECTER","dataset:embedding-data/PAQ_pairs","dataset:embedding-data/WikiAnswers","arxiv:1904.06472","arxiv:2102.07033","arxiv:2104.08727","arxiv:1704.05179","arxiv:1810.09305","license:apache-2.0","eval-results","text-embeddings-inference","endpoints_compatible","deploy:azure","region:us"],"downloads":259912583,"likes":4809,"modelId":"sentence-transformers/all-MiniLM-L6-v2","author":"sentence-transformers","sha":"c9745ed1d9f207416be6d2e6f8de32d1f16199bf","lastModified":"2025-03-06T13:37:44.000Z","gated":false,"disabled":false,"mask_token":"[MASK]","widgetData":[{"source_sentence":"That - is a happy person","sentences":["That is a happy dog","That is a very happy - person","Today is a sunny day"]}],"model-index":null,"config":{"architectures":["BertModel"],"model_type":"bert","tokenizer_config":{"unk_token":"[UNK]","sep_token":"[SEP]","pad_token":"[PAD]","cls_token":"[CLS]","mask_token":"[MASK]"}},"cardData":{"language":"en","license":"apache-2.0","library_name":"sentence-transformers","tags":["sentence-transformers","feature-extraction","sentence-similarity","transformers"],"datasets":["s2orc","flax-sentence-embeddings/stackexchange_xml","ms_marco","gooaq","yahoo_answers_topics","code_search_net","search_qa","eli5","snli","multi_nli","wikihow","natural_questions","trivia_qa","embedding-data/sentence-compression","embedding-data/flickr30k-captions","embedding-data/altlex","embedding-data/simple-wiki","embedding-data/QQP","embedding-data/SPECTER","embedding-data/PAQ_pairs","embedding-data/WikiAnswers"],"pipeline_tag":"sentence-similarity"},"transformersInfo":{"auto_model":"AutoModel","pipeline_tag":"feature-extraction","processor":"AutoTokenizer"},"siblings":[{"rfilename":".gitattributes"},{"rfilename":"1_Pooling/config.json"},{"rfilename":"README.md"},{"rfilename":"config.json"},{"rfilename":"config_sentence_transformers.json"},{"rfilename":"data_config.json"},{"rfilename":"model.safetensors"},{"rfilename":"modules.json"},{"rfilename":"onnx/model.onnx"},{"rfilename":"onnx/model_O1.onnx"},{"rfilename":"onnx/model_O2.onnx"},{"rfilename":"onnx/model_O3.onnx"},{"rfilename":"onnx/model_O4.onnx"},{"rfilename":"onnx/model_qint8_arm64.onnx"},{"rfilename":"onnx/model_qint8_avx512.onnx"},{"rfilename":"onnx/model_qint8_avx512_vnni.onnx"},{"rfilename":"onnx/model_quint8_avx2.onnx"},{"rfilename":"openvino/openvino_model.bin"},{"rfilename":"openvino/openvino_model.xml"},{"rfilename":"openvino/openvino_model_qint8_quantized.bin"},{"rfilename":"openvino/openvino_model_qint8_quantized.xml"},{"rfilename":"pytorch_model.bin"},{"rfilename":"rust_model.ot"},{"rfilename":"sentence_bert_config.json"},{"rfilename":"special_tokens_map.json"},{"rfilename":"tf_model.h5"},{"rfilename":"tokenizer.json"},{"rfilename":"tokenizer_config.json"},{"rfilename":"train_script.py"},{"rfilename":"vocab.txt"}],"spaces":["mteb/leaderboard","marcosv/InstructIR","onkar-waghmode/neural-humanizer","Mr-TD/RAG-PDF-QnA-ChatBot","opensearch-project/OpenSearch-AI","kapil14/Research-Mate","kapil14/Research-Mate-V1","faris-abuali/kbdebugger-demo","abiju/notebook_lm_clone","nirmanpatel/semantic-book-recommender","chitresh14/my_profile","ktejeshnaidu/DocuMind_hf","Gianluca88/Chatbot_Bez_Wettingen","boeykeow/AI_logistics","Ram-N/embeddings-playground","krrishbabu/futurex-feaser1","hasancanbiyik/immigration-assistant","WasifSajjad/research-compiler","williamwuphd/career_conversation_05152026","ZhaoJingzi/idea2space","Mahi00077/SHL_Assessment_Recommender","NSRSAMEER/SameerPipeline1","vrrajaram/aegisdemofuturense","Nagendravarma/Health-Insurance-RAG","dragonHead1000101/Agent_1000101","Yashodeep2006/anuvadak_api","Shafia01/learnify-ai","dp45/punching-automation","Nagendravarma/Health-Insurance-Copilot","thisisaadi123/gridops-ai","shivenduec1094/guardrail-inspector","cvachet/pdf-chatbot","JournalistsonHF/ai-scraper","mteb/arena","Illia56/Ask-AI-Youtube","nickmuchi/semantic-search-with-retrieve-and-rerank","Gradio-Blocks/Ask_Questions_To_YouTube_Videos","Agents-MCP-Hackathon/ScouterAI","nickmuchi/article-text-summarizer","mteb/leaderboard_legacy","SeaLLMs/SeaLLM-Chat","coder-vansh/JARVIS","q-future/Co-Instruct","FireRedTeam/FireRed-OpenStoryline","radames/sentence-embeddings-visualization","radames/Candle-BERT-Semantic-Similarity-Wasm","MCP-1st-Birthday/DETERMINATOR","ml6team/post-processing-summarization","gabruarya/legal-advisor","DiffusionAgent/DiffusionAgent-XL","openfree/Cycle-Navigator","Gradio-Blocks/pubmed-abstract-retriever","seanpedrickcase/Light-PDF-Web-QA-Chatbot","seanpedrickcase/topic_modelling","merterbak/RAG-Llama","Agents-MCP-Hackathon/Intelligent_Content_Organizer","MCP-1st-Birthday/Jobly","jscheah/open-webui","ZySec-AI/ZySec","Agents-MCP-Hackathon/KarmaCheck","Yas1n/CADomatic","hfmlsoc/different-flops","cffl/Exploring_Intelligent_Writing_Assistance","arshadmangi112/chatpdf.document","Thanos51/ai-recruitment-system","Rabbit-Innotech/GBVR_Chatbot","pritamdeka/health-article-keyphrase-generator","taskswithcode/semantic_similarity","zhuolisam/resume-ranker","MCP-1st-Birthday/AI-Digital-Library-Assistant","ModularityAI/LLama3Rag","pedropauletti/social-ear","m-ric/Quotes","taupirho/gradio_multi_file_rag","lihuigu/SciPIP","responsible-prompting/demo-multiturn","Pulastya0/Data-Science-Agent","aseifert/ExplaiNER","pritamdeka/pubmed-abstract-retriever","somosnlp-hackathon-2022/AbstractGen_ES","DiffusionAgent/DiffusionAgent","Aabbhishekk/ChatPdf","ReithBjarkan/SEO_Keyword_Similarity_Tool","Shreyas094/GPT-Researcher","usmanyousaf/AI_Interview_Coach","Vartex39/vizsum-pro","UII-AI/MedVidBench-Leaderboard","jspr/autodrummer","khalifssa/medicine-chartbot","dnzblgn/RAG_PDF_langchain","Ardaarslan02/finance-chatbot","VIDraft/Local-RAG-llama-3-8b","santanavagner/responsible-prompting-demo","CyberTud/legalchat","MCP-1st-Birthday/auto-distill","Anmol4521/jansahayak","RaviRaj988/Asking-question-to-video","vjain/Trading-Chatbot","OuroborosM/STLA-BABY","KrishnaKumar23/documentQABot"],"createdAt":"2022-03-02T23:29:05.000Z","safetensors":{"parameters":{"I64":512,"F32":22713216},"total":22713728},"inference":"warm","usedStorage":1844563487}' - headers: - Access-Control-Allow-Origin: - - https://huggingface.co - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Access-Control-Max-Age: - - '86400' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 21 May 2026 15:04:08 GMT - ETag: - - W/"1b05-LW1mW5EK8o3/zi09T5Zo0TZNqqs" - RateLimit: - - '"api";r=996;t=57' - RateLimit-Policy: - - '"fixed window";"api";q=1000;w=300' - Referrer-Policy: - - strict-origin-when-cross-origin - Transfer-Encoding: - - chunked - Via: - - 1.1 cb0c6226aa19d81a39519501df383968.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - bJs6vhSdIudXhZNO_b28BGfmdZIuRRv2w-Rfzw8TR7Pb8i_i1F5Qiw== - X-Amz-Cf-Pop: - - YTO50-P2 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1ee8-7b15935c3a1807ff2e7cb89d;f4b81854-8cf3-4eaa-9fbd-9c8a19425f3a - content-length: - - '6917' - cross-origin-opener-policy: - - same-origin - vary: - - Accept-Encoding - status: - code: 200 - message: OK -- request: - body: '{"inputs":"braintrust tracing"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '31' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 6a79b11d-7734-4bcf-a1dd-ec2356445014 - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/hf-inference/models/sentence-transformers/all-MiniLM-L6-v2/pipeline/feature-extraction - response: - body: - string: '[-0.0614289790391922,-0.07163531333208084,-0.018658695742487907,-0.07219985872507095,0.02809877321124077,-0.05659611150622368,0.08040130138397217,-0.04225039854645729,-0.019476618617773056,-0.02670866809785366,0.045225970447063446,-0.02135135419666767,0.02138354815542698,-0.0020652655512094498,-0.09787249565124512,-0.06704019010066986,-0.015089254826307297,-0.024759236723184586,-0.0011647173669189215,-0.021054349839687347,-0.05917459353804588,-0.11536695808172226,-0.07175271213054657,-0.045734766870737076,0.0034959628246724606,-0.02210739627480507,0.03433212265372276,-0.03368952497839928,-0.01541149988770485,-0.05574493855237961,0.07254324108362198,-0.01913258247077465,-0.08118274807929993,0.014595710672438145,-0.010401099920272827,-0.028816411271691322,-0.034383971244096756,0.027030616998672485,-0.022096673026680946,-0.030375057831406593,0.007570924703031778,-0.09240370988845825,-0.017918851226568222,0.03726762533187866,-0.030423235148191452,-0.023127490654587746,0.0013610374880954623,-0.015165302902460098,-0.05944794416427612,-0.06343600153923035,-0.09109237790107727,-0.051407549530267715,-0.04808388650417328,0.10773678869009018,-0.06280224770307541,0.00929588545113802,0.058228325098752975,0.00008774984598858282,-0.09134776145219803,0.03577828407287598,-0.023928990587592125,-0.009337064810097218,0.03299640864133835,-0.049847979098558426,0.08077608048915863,0.09350680559873581,-0.024636544287204742,0.03454403579235077,0.04917769506573677,0.010459746234118938,0.023395471274852753,-0.008800351060926914,-0.03299640491604805,-0.05219664424657822,0.047305334359407425,0.014182738028466702,-0.05357212945818901,-0.04520466923713684,0.06272858381271362,-0.11672543734312057,0.021876391023397446,-0.003414782462641597,-0.016734682023525238,0.09081574529409409,0.0342160202562809,0.01704895868897438,-0.00291314790956676,0.02564501203596592,0.012713956646621227,0.060219526290893555,0.0557049922645092,-0.015253948979079723,-0.032543256878852844,-0.027974553406238556,-0.002981127705425024,-0.004695645999163389,0.003937906119972467,0.03578997403383255,0.0667743980884552,0.09475021064281464,0.021969111636281013,-0.013230768963694572,0.0007549701840616763,-0.0417323037981987,0.04850374907255173,0.07140963524580002,0.07777850329875946,-0.01768912933766842,0.08554437011480331,-0.008977510035037994,-0.027205362915992737,0.011559179052710533,0.004159604664891958,0.07656950503587723,0.08903012424707413,0.07842624187469482,-0.008890993893146515,0.12253877520561218,0.06831581145524979,-0.025836430490016937,0.0780525729060173,0.04955145716667175,0.05765073746442795,-0.051204580813646317,0.001858870149590075,-0.06373916566371918,-0.01534497644752264,-5.130480450829895e-34,0.002296740422025323,0.03412243723869324,-0.019655633717775345,-0.06787289679050446,-0.008818140253424644,0.004807934630662203,0.009407063946127892,0.013171262107789516,-0.00041284345206804574,0.07318928092718124,-0.11281374096870422,0.054911769926548004,-0.022254008799791336,0.04775204882025719,0.002160301897674799,-0.011750162579119205,-0.0748949870467186,0.07703140377998352,-0.007670428138226271,-0.020070187747478485,0.020906032994389534,-0.10204599052667618,0.019182223826646805,-0.05446917936205864,0.026056954637169838,-0.029128577560186386,-0.08782552927732468,0.02063436061143875,0.10818180441856384,0.018778663128614426,-0.010422071442008018,-0.0037780029233545065,-0.024898711591959,0.009082837030291557,0.02543911710381508,0.08229829370975494,0.04071832075715065,-0.06677113473415375,0.01401783898472786,-0.026302296668291092,0.013817301951348782,-0.023620741441845894,0.05976782366633415,-0.004155394621193409,-0.09229837357997894,0.07380994409322739,-0.08694688975811005,0.01286417804658413,0.016825219616293907,0.032465916126966476,-0.035056982189416885,0.00974021852016449,-0.011962725780904293,-0.07300757616758347,-0.007214078214019537,0.03637690469622612,0.021102065220475197,0.054929785430431366,0.09216174483299255,0.03020489774644375,0.07940404862165451,0.02402150258421898,-0.10314778238534927,-0.026176422834396362,-0.08738374710083008,0.043182630091905594,-0.034297045320272446,-0.05953443422913551,0.00854403991252184,0.0054075345396995544,-0.0917571410536766,0.07147462666034698,-0.007351928390562534,-0.06184327229857445,-0.02619391866028309,-0.042377494275569916,-0.045400701463222504,0.07883526384830475,-0.03313327580690384,-0.09039090573787689,-0.038576629012823105,-0.06377518177032471,-0.02304176427423954,0.023731941357254982,-0.01661618985235691,0.03878762945532799,0.002506741788238287,-0.07342907786369324,-0.15086789429187775,-0.012116510421037674,0.03366517275571823,0.045024387538433075,0.09340715408325195,0.03813695162534714,-0.09154541045427322,1.4581554672954418e-33,-0.1665148138999939,-0.037149276584386826,0.07478528469800949,0.10340124368667603,-0.006181860808283091,-0.03539052605628967,0.007767445407807827,-0.01699105091392994,0.030396241694688797,0.09288369119167328,-0.04413248971104622,0.007164476905018091,0.05146963894367218,0.004763133358210325,0.034902315586805344,-0.07025574147701263,0.000302623346215114,0.01602678745985031,0.02138119377195835,-0.011274627409875393,0.007055522408336401,0.01977482996881008,-0.051307424902915955,-0.0044448054395616055,0.009337452240288258,0.09418188780546188,0.023678384721279144,-0.06147871911525726,-0.016655681654810905,0.036721862852573395,-0.03295522183179855,0.043223604559898376,-0.03703641518950462,0.0028467143420130014,-0.03390193358063698,0.025618353858590126,0.08893006294965744,-0.04725635051727295,-0.04032530263066292,-0.05848892778158188,0.012828405015170574,0.013553207740187645,0.001484083360992372,-0.02206564135849476,-0.052061621099710464,0.0416402742266655,-0.05086010694503784,0.14665530622005463,-0.0005944744916632771,0.048175912350416183,0.06240032613277435,0.06460989266633987,-0.02173321135342121,-0.026533780619502068,-0.06493712216615677,0.13368481397628784,0.019707903265953064,0.007316937670111656,0.07439664751291275,-0.03914296254515648,-0.005562289617955685,-0.029672378674149513,-0.06200955808162689,0.021471714600920677,0.04705147445201874,0.06648488342761993,0.05426108464598656,0.04583350569009781,0.013476390391588211,0.041064366698265076,0.013524787500500679,-0.007096913177520037,-0.060745831578969955,-0.07942087203264236,0.05422480031847954,0.052415020763874054,-0.06193378195166588,-0.0607728436589241,-0.009430662728846073,0.04891058802604675,0.04247627407312393,-0.053862471133470535,0.04863147437572479,0.018284272402524948,0.09241339564323425,0.0252589862793684,0.008100123144686222,-0.03213286027312279,-0.0253217164427042,-0.017449786886572838,-0.015557142905890942,0.016851510852575302,-0.020381109789013863,-0.008271412923932076,-0.027866749092936516,-1.1500327801172716e-8,0.002101363381370902,-0.05741894990205765,0.04971540719270706,0.04446754232048988,0.07185131311416626,-0.0037258656229823828,0.07206463813781738,-0.024326492100954056,-0.05073365196585655,0.03102525882422924,0.03155628219246864,-0.08332202583551407,-0.033963561058044434,0.004826564807444811,0.10588906705379486,-0.00025369448121637106,-0.05142200365662575,0.04254455491900444,-0.059487927705049515,-0.01738874800503254,0.012431799434125423,0.06441885977983475,-0.032280731946229935,0.07261514663696289,-0.02812836691737175,0.027432436123490334,0.057950373739004135,0.10915516316890717,-0.005695919040590525,0.04835706204175949,-0.013613071292638779,0.07087203115224838,0.04942723363637924,-0.0018313515465706587,0.0027677002362906933,0.05806449055671692,-0.024349436163902283,0.05526096746325493,-0.01768822781741619,0.09556283801794052,-0.03316082805395126,-0.03935910016298294,0.018572216853499413,-0.017219536006450653,0.07465630024671555,-0.07623523473739624,-0.013574614189565182,-0.029622860252857208,0.03611314296722412,0.010965002700686455,0.052351560443639755,-0.05995279923081398,0.005041129887104034,0.035090357065200806,0.049654051661491394,-0.004334818106144667,0.03497585654258728,-0.0067239864729344845,-0.06107598543167114,0.05106405168771744,0.09621384739875793,0.05326808616518974,0.08842786401510239,0.021238019689917564]' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Length: - - '8060' - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:04:12 GMT - Referrer-Policy: - - strict-origin-when-cross-origin - Via: - - 1.1 ed31b4e68abf63ec3ae0c1e539b4d67c.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - rVcPKkicWJn3Hd8QYuG1mppxFRyBo9YEz3N92yCA9kuMPjY1RfqbKA== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - access-control-allow-credentials: - - 'true' - cross-origin-opener-policy: - - same-origin - server: - - uvicorn - vary: - - origin, access-control-request-method, access-control-request-headers, origin, - access-control-request-method, access-control-request-headers - x-inference-id: - - 1bee4177-2291-4dc6-aeb9-d0f8ee338fd7 - x-inference-provider: - - hf-inference - x-proxied-host: - - http://10.109.80.145 - x-proxied-path: - - /pipeline/feature-extraction - x-proxied-replica: - - kdjvq3i3-pvlxh - x-request-id: - - Root=1-6a0f1ee8-6dc64c1d53b79bbb75d88424;6a79b11d-7734-4bcf-a1dd-ec2356445014 - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_sentence_similarity_sync.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_sentence_similarity_sync.yaml deleted file mode 100644 index 1cc22d916..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_sentence_similarity_sync.yaml +++ /dev/null @@ -1,144 +0,0 @@ -interactions: -- request: - body: '' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Host: - - huggingface.co - X-Amzn-Trace-Id: - - eecfaf9f-5fb7-4b35-9019-3f506f08d325 - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: GET - uri: https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 - response: - body: - string: '{"_id":"621ffdc136468d709f180294","id":"sentence-transformers/all-MiniLM-L6-v2","private":false,"pipeline_tag":"sentence-similarity","library_name":"sentence-transformers","tags":["sentence-transformers","pytorch","tf","rust","onnx","safetensors","openvino","bert","feature-extraction","sentence-similarity","transformers","en","dataset:s2orc","dataset:flax-sentence-embeddings/stackexchange_xml","dataset:ms_marco","dataset:gooaq","dataset:yahoo_answers_topics","dataset:code_search_net","dataset:search_qa","dataset:eli5","dataset:snli","dataset:multi_nli","dataset:wikihow","dataset:natural_questions","dataset:trivia_qa","dataset:embedding-data/sentence-compression","dataset:embedding-data/flickr30k-captions","dataset:embedding-data/altlex","dataset:embedding-data/simple-wiki","dataset:embedding-data/QQP","dataset:embedding-data/SPECTER","dataset:embedding-data/PAQ_pairs","dataset:embedding-data/WikiAnswers","arxiv:1904.06472","arxiv:2102.07033","arxiv:2104.08727","arxiv:1704.05179","arxiv:1810.09305","license:apache-2.0","eval-results","text-embeddings-inference","endpoints_compatible","deploy:azure","region:us"],"downloads":259912583,"likes":4809,"modelId":"sentence-transformers/all-MiniLM-L6-v2","author":"sentence-transformers","sha":"c9745ed1d9f207416be6d2e6f8de32d1f16199bf","lastModified":"2025-03-06T13:37:44.000Z","gated":false,"disabled":false,"mask_token":"[MASK]","widgetData":[{"source_sentence":"That - is a happy person","sentences":["That is a happy dog","That is a very happy - person","Today is a sunny day"]}],"model-index":null,"config":{"architectures":["BertModel"],"model_type":"bert","tokenizer_config":{"unk_token":"[UNK]","sep_token":"[SEP]","pad_token":"[PAD]","cls_token":"[CLS]","mask_token":"[MASK]"}},"cardData":{"language":"en","license":"apache-2.0","library_name":"sentence-transformers","tags":["sentence-transformers","feature-extraction","sentence-similarity","transformers"],"datasets":["s2orc","flax-sentence-embeddings/stackexchange_xml","ms_marco","gooaq","yahoo_answers_topics","code_search_net","search_qa","eli5","snli","multi_nli","wikihow","natural_questions","trivia_qa","embedding-data/sentence-compression","embedding-data/flickr30k-captions","embedding-data/altlex","embedding-data/simple-wiki","embedding-data/QQP","embedding-data/SPECTER","embedding-data/PAQ_pairs","embedding-data/WikiAnswers"],"pipeline_tag":"sentence-similarity"},"transformersInfo":{"auto_model":"AutoModel","pipeline_tag":"feature-extraction","processor":"AutoTokenizer"},"siblings":[{"rfilename":".gitattributes"},{"rfilename":"1_Pooling/config.json"},{"rfilename":"README.md"},{"rfilename":"config.json"},{"rfilename":"config_sentence_transformers.json"},{"rfilename":"data_config.json"},{"rfilename":"model.safetensors"},{"rfilename":"modules.json"},{"rfilename":"onnx/model.onnx"},{"rfilename":"onnx/model_O1.onnx"},{"rfilename":"onnx/model_O2.onnx"},{"rfilename":"onnx/model_O3.onnx"},{"rfilename":"onnx/model_O4.onnx"},{"rfilename":"onnx/model_qint8_arm64.onnx"},{"rfilename":"onnx/model_qint8_avx512.onnx"},{"rfilename":"onnx/model_qint8_avx512_vnni.onnx"},{"rfilename":"onnx/model_quint8_avx2.onnx"},{"rfilename":"openvino/openvino_model.bin"},{"rfilename":"openvino/openvino_model.xml"},{"rfilename":"openvino/openvino_model_qint8_quantized.bin"},{"rfilename":"openvino/openvino_model_qint8_quantized.xml"},{"rfilename":"pytorch_model.bin"},{"rfilename":"rust_model.ot"},{"rfilename":"sentence_bert_config.json"},{"rfilename":"special_tokens_map.json"},{"rfilename":"tf_model.h5"},{"rfilename":"tokenizer.json"},{"rfilename":"tokenizer_config.json"},{"rfilename":"train_script.py"},{"rfilename":"vocab.txt"}],"spaces":["mteb/leaderboard","marcosv/InstructIR","onkar-waghmode/neural-humanizer","Mr-TD/RAG-PDF-QnA-ChatBot","opensearch-project/OpenSearch-AI","kapil14/Research-Mate","kapil14/Research-Mate-V1","faris-abuali/kbdebugger-demo","abiju/notebook_lm_clone","nirmanpatel/semantic-book-recommender","chitresh14/my_profile","ktejeshnaidu/DocuMind_hf","Gianluca88/Chatbot_Bez_Wettingen","boeykeow/AI_logistics","Ram-N/embeddings-playground","krrishbabu/futurex-feaser1","hasancanbiyik/immigration-assistant","WasifSajjad/research-compiler","williamwuphd/career_conversation_05152026","ZhaoJingzi/idea2space","Mahi00077/SHL_Assessment_Recommender","NSRSAMEER/SameerPipeline1","vrrajaram/aegisdemofuturense","Nagendravarma/Health-Insurance-RAG","dragonHead1000101/Agent_1000101","Yashodeep2006/anuvadak_api","Shafia01/learnify-ai","dp45/punching-automation","Nagendravarma/Health-Insurance-Copilot","thisisaadi123/gridops-ai","shivenduec1094/guardrail-inspector","cvachet/pdf-chatbot","JournalistsonHF/ai-scraper","mteb/arena","Illia56/Ask-AI-Youtube","nickmuchi/semantic-search-with-retrieve-and-rerank","Gradio-Blocks/Ask_Questions_To_YouTube_Videos","Agents-MCP-Hackathon/ScouterAI","nickmuchi/article-text-summarizer","mteb/leaderboard_legacy","SeaLLMs/SeaLLM-Chat","coder-vansh/JARVIS","q-future/Co-Instruct","FireRedTeam/FireRed-OpenStoryline","radames/sentence-embeddings-visualization","radames/Candle-BERT-Semantic-Similarity-Wasm","MCP-1st-Birthday/DETERMINATOR","ml6team/post-processing-summarization","gabruarya/legal-advisor","DiffusionAgent/DiffusionAgent-XL","openfree/Cycle-Navigator","Gradio-Blocks/pubmed-abstract-retriever","seanpedrickcase/Light-PDF-Web-QA-Chatbot","seanpedrickcase/topic_modelling","merterbak/RAG-Llama","Agents-MCP-Hackathon/Intelligent_Content_Organizer","MCP-1st-Birthday/Jobly","jscheah/open-webui","ZySec-AI/ZySec","Agents-MCP-Hackathon/KarmaCheck","Yas1n/CADomatic","hfmlsoc/different-flops","cffl/Exploring_Intelligent_Writing_Assistance","arshadmangi112/chatpdf.document","Thanos51/ai-recruitment-system","Rabbit-Innotech/GBVR_Chatbot","pritamdeka/health-article-keyphrase-generator","taskswithcode/semantic_similarity","zhuolisam/resume-ranker","MCP-1st-Birthday/AI-Digital-Library-Assistant","ModularityAI/LLama3Rag","pedropauletti/social-ear","m-ric/Quotes","taupirho/gradio_multi_file_rag","lihuigu/SciPIP","responsible-prompting/demo-multiturn","Pulastya0/Data-Science-Agent","aseifert/ExplaiNER","pritamdeka/pubmed-abstract-retriever","somosnlp-hackathon-2022/AbstractGen_ES","DiffusionAgent/DiffusionAgent","Aabbhishekk/ChatPdf","ReithBjarkan/SEO_Keyword_Similarity_Tool","Shreyas094/GPT-Researcher","usmanyousaf/AI_Interview_Coach","Vartex39/vizsum-pro","UII-AI/MedVidBench-Leaderboard","jspr/autodrummer","khalifssa/medicine-chartbot","dnzblgn/RAG_PDF_langchain","Ardaarslan02/finance-chatbot","VIDraft/Local-RAG-llama-3-8b","santanavagner/responsible-prompting-demo","CyberTud/legalchat","MCP-1st-Birthday/auto-distill","Anmol4521/jansahayak","RaviRaj988/Asking-question-to-video","vjain/Trading-Chatbot","OuroborosM/STLA-BABY","KrishnaKumar23/documentQABot"],"createdAt":"2022-03-02T23:29:05.000Z","safetensors":{"parameters":{"I64":512,"F32":22713216},"total":22713728},"inference":"warm","usedStorage":1844563487}' - headers: - Access-Control-Allow-Origin: - - https://huggingface.co - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Access-Control-Max-Age: - - '86400' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 21 May 2026 15:04:12 GMT - ETag: - - W/"1b05-LW1mW5EK8o3/zi09T5Zo0TZNqqs" - RateLimit: - - '"api";r=995;t=53' - RateLimit-Policy: - - '"fixed window";"api";q=1000;w=300' - Referrer-Policy: - - strict-origin-when-cross-origin - Transfer-Encoding: - - chunked - Via: - - 1.1 5a2f8eb373b5a17b769c0fee9b0725a6.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - KzHw-qW6W_0ProyhecvO7_qXW43ojkYTTMyn2OtEtgD8Nike0_E9jA== - X-Amz-Cf-Pop: - - YTO50-P2 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1eec-76691eb533f1243a266e09ac;eecfaf9f-5fb7-4b35-9019-3f506f08d325 - content-length: - - '6917' - cross-origin-opener-policy: - - same-origin - vary: - - Accept-Encoding - status: - code: 200 - message: OK -- request: - body: '{"inputs":{"source_sentence":"Machine learning is so easy.","sentences":["Deep - learning is so straightforward.","This is so difficult, like rocket science."]},"parameters":{}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '175' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - ee6d975f-1d0f-47b0-984f-810e61b6598c - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/hf-inference/models/sentence-transformers/all-MiniLM-L6-v2/pipeline/sentence-similarity - response: - body: - string: '[0.7785726189613342,0.45876264572143555]' - headers: - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Length: - - '40' - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:04:12 GMT - Referrer-Policy: - - strict-origin-when-cross-origin - Via: - - 1.1 a44cf9ed8a499212c53e0b8f57aa31f4.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - 7UdGXxzIbx44x16O2_xgQ57Ydt4wZO_4RsDC0hGdNc-sMncxNwwdbA== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Robots-Tag: - - none - access-control-allow-credentials: - - 'true' - cross-origin-opener-policy: - - same-origin - server: - - uvicorn - vary: - - origin, access-control-request-method, access-control-request-headers, origin, - access-control-request-method, access-control-request-headers - x-inference-id: - - 4e37919f-3d2a-42c5-9300-745bc414874b - x-inference-provider: - - hf-inference - x-proxied-host: - - http://10.109.4.102 - x-proxied-path: - - /pipeline/sentence-similarity - x-proxied-replica: - - kdjvq3i3-mnd2z - x-request-id: - - Root=1-6a0f1eec-735241bc1a4b926f39e523f3;ee6d975f-1d0f-47b0-984f-810e61b6598c - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_details.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_details.yaml deleted file mode 100644 index 8ee646616..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_details.yaml +++ /dev/null @@ -1,85 +0,0 @@ -interactions: -- request: - body: '{"prompt":"The Braintrust SDK is","details":true,"max_tokens":8,"model":"meta-llama/Llama-3.2-3B"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '98' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - 2c836356-77ea-4d60-ab5c-8faaad184edd - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/featherless-ai/v1/completions - response: - body: - string: '{"id":"e8706bba-5462-48be-8126-4a571fe71106","object":"text_completion","created":1779375846,"model":"meta-llama/Llama-3.2-3B","choices":[{"index":0,"text":" - a collection of open source C++ libraries","logprobs":null,"finish_reason":"length"}],"system_fingerprint":"fp1-rss-s3","usage":{"prompt_tokens":5,"completion_tokens":8,"total_tokens":13}}' - headers: - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:04:07 GMT - Referrer-Policy: - - strict-origin-when-cross-origin - Transfer-Encoding: - - chunked - Via: - - 1.1 94703ff6f88fa098310f25ad977e6604.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - bjrHE1ZvDdV18wQtQfmqFyvYUSYxhiciFH8ly-TYwYLP9qUW7X2AtQ== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1ee6-7939ca45429343be05bf94fe;2c836356-77ea-4d60-ab5c-8faaad184edd - X-Robots-Tag: - - none - access-control-allow-credentials: - - 'true' - access-control-allow-methods: - - authorization,content-type - access-control-allow-origin: - - '*' - cache-control: - - no-cache - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff478c0de74e5f7-IAD - cross-origin-opener-policy: - - same-origin - nel: - - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' - report-to: - - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2Buruk7jX86qypXCzQJDZx10mXwur9mPr4N9WmmBRTtXyqHixP61k9bHv8LVC3C1rq580tSgY4PQUrJJIa9R2qQIFWqNMqS9Gx75LJpm2r1V98eQICCC0C1aZyMqmZC5rB5PTDw%3D%3D"}]}' - request-id: - - e8706bba-5462-48be-8126-4a571fe71106 - server: - - cloudflare - strict-transport-security: - - max-age=15724800; includeSubDomains - vary: - - Origin - x-inference-provider: - - featherless-ai - status: - code: 200 - message: OK -version: 1 diff --git a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_sync.yaml b/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_sync.yaml deleted file mode 100644 index dc89c2c89..000000000 --- a/py/src/braintrust/integrations/huggingface_hub/cassettes/test_wrap_huggingface_hub_text_generation_sync.yaml +++ /dev/null @@ -1,147 +0,0 @@ -interactions: -- request: - body: '' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Host: - - huggingface.co - X-Amzn-Trace-Id: - - 7bea75e6-7f9e-4a04-9b19-029de18f492f - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: GET - uri: https://huggingface.co/api/models/meta-llama/Llama-3.2-3B?expand=inferenceProviderMapping - response: - body: - string: '{"_id":"66eaf084b3b3239188f66fa7","id":"meta-llama/Llama-3.2-3B","inferenceProviderMapping":{"featherless-ai":{"status":"live","providerId":"meta-llama/Llama-3.2-3B","task":"text-generation","isModelAuthor":false}}}' - headers: - Access-Control-Allow-Origin: - - https://huggingface.co - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Access-Control-Max-Age: - - '86400' - Connection: - - keep-alive - Content-Length: - - '215' - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 21 May 2026 15:03:54 GMT - ETag: - - W/"d7-F25ANpBgcxCxP88UAH9KfLwlUJ8" - RateLimit: - - '"api";r=997;t=71' - RateLimit-Policy: - - '"fixed window";"api";q=1000;w=300' - Referrer-Policy: - - strict-origin-when-cross-origin - Vary: - - Origin - Via: - - 1.1 dcd16c430149132ea12a5783d54ff114.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - VTqFQvAk9UIe9sKiHVVVkx0-2lWKIxTFjX8Q7dxcg5sRDULiMfHSmg== - X-Amz-Cf-Pop: - - YTO50-P2 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1eda-4f176990640fe6b86e5a8c3e;7bea75e6-7f9e-4a04-9b19-029de18f492f - cross-origin-opener-policy: - - same-origin - status: - code: 200 - message: OK -- request: - body: '{"prompt":"The Braintrust SDK is","max_tokens":8,"model":"meta-llama/Llama-3.2-3B"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '83' - Host: - - router.huggingface.co - X-Amzn-Trace-Id: - - f4dfb4c6-fea0-47c6-aa71-56d1e0c3ed27 - content-type: - - application/json - user-agent: - - unknown/None; hf_hub/1.15.0; python/3.14.3; agent/pi - method: POST - uri: https://router.huggingface.co/featherless-ai/v1/completions - response: - body: - string: '{"id":"74419196-02e9-47db-9d04-2d5a3c52730c","object":"text_completion","created":1779375834,"model":"meta-llama/Llama-3.2-3B","choices":[{"index":0,"text":" - the main entry point for the Braintrust","logprobs":null,"finish_reason":"length"}],"system_fingerprint":"fp1-rss-s3","usage":{"prompt_tokens":5,"completion_tokens":8,"total_tokens":13}}' - headers: - Access-Control-Expose-Headers: - - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 21 May 2026 15:04:05 GMT - Referrer-Policy: - - strict-origin-when-cross-origin - Transfer-Encoding: - - chunked - Via: - - 1.1 4eb35caa679bb95c591a03f41b151b8c.cloudfront.net (CloudFront) - X-Amz-Cf-Id: - - b0gBKxkvhVz7UWWJbKiaZQHTO3IKwyXH7Oax_15RKWIBeWnXgGNoNw== - X-Amz-Cf-Pop: - - YTO50-P1 - X-Cache: - - Miss from cloudfront - X-Powered-By: - - huggingface-moon - X-Request-Id: - - Root=1-6a0f1eda-4f3573c1691874580adb67fe;f4dfb4c6-fea0-47c6-aa71-56d1e0c3ed27 - X-Robots-Tag: - - none - access-control-allow-credentials: - - 'true' - access-control-allow-methods: - - authorization,content-type - access-control-allow-origin: - - '*' - cache-control: - - no-cache - cf-cache-status: - - DYNAMIC - cf-ray: - - 9ff47875dcd5c96a-IAD - cross-origin-opener-policy: - - same-origin - nel: - - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' - report-to: - - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=uk8Ff85ZCYI%2FcSnhBWYrrd8LylJSk9oQN5WTHnw8jzni1PvzO%2BJoqhc2Q5bRmgg8YPKX1t%2BDi%2FP1Nd1GAFQrAjqyrpQPBdDu2XciQMq3qVD3ncR6KtVESv9nNvCg2pNuztVKbw%3D%3D"}]}' - request-id: - - 74419196-02e9-47db-9d04-2d5a3c52730c - server: - - cloudflare - strict-transport-security: - - max-age=15724800; includeSubDomains - vary: - - Origin - x-inference-provider: - - featherless-ai - status: - code: 200 - message: OK -version: 1 From 1bd2445cae0e340763d89f40ef490b53f91fc0b3 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 20:55:53 +0000 Subject: [PATCH 09/11] refactor: simplify pruned tests and cassette checker - reuse find_spans_by_type / assert_metrics_are_valid / _find_agent_span instead of inline copies - share one _method_refs builder in mistral tests; trim unused helper params - drop the redundant install() in test_utils (braintrust.conftest covers it) - load the recorder by path in its tests (no full SDK import per subprocess) - checker: --reuse-venv flag, keep nox reports in the usage dir Co-Authored-By: Claude Opus 5.5 --- py/Makefile | 2 +- py/scripts/check-unused-cassettes.py | 54 ++++++++------- py/src/braintrust/_test_cassette_usage.py | 5 +- .../claude_agent_sdk/test_claude_agent_sdk.py | 10 +-- .../google_genai/test_google_genai.py | 43 ++++++------ .../integrations/langchain/test_anthropic.py | 7 +- .../integrations/mistral/test_mistral.py | 66 ++++++++++--------- .../openai/test_openai_openrouter_gateway.py | 9 +-- .../test_pydantic_ai_integration.py | 12 ++-- .../test_pydantic_ai_wrap_openai.py | 9 +-- py/src/braintrust/integrations/test_utils.py | 6 +- py/src/braintrust/test_cassette_usage.py | 14 ++-- 12 files changed, 119 insertions(+), 118 deletions(-) diff --git a/py/Makefile b/py/Makefile index acb5708e5..7effb88d0 100644 --- a/py/Makefile +++ b/py/Makefile @@ -34,7 +34,7 @@ check-stale-cassettes: $(PYTHON) scripts/check-stale-cassettes.py check-unused-cassettes: - $(PYTHON) scripts/check-unused-cassettes.py run $(if $(INTEGRATIONS),$(INTEGRATIONS),--all) + $(PYTHON) scripts/check-unused-cassettes.py run $(or $(INTEGRATIONS),--all) sync-pytest-pin: $(PYTHON) scripts/sync-pytest-pin.py diff --git a/py/scripts/check-unused-cassettes.py b/py/scripts/check-unused-cassettes.py index f9e11c37a..0246b1743 100644 --- a/py/scripts/check-unused-cassettes.py +++ b/py/scripts/check-unused-cassettes.py @@ -129,7 +129,9 @@ def _nox_command() -> list[str]: return [nox] if nox else [sys.executable, "-m", "nox"] -def run_sessions(integrations: list[str], usage_dir: pathlib.Path) -> tuple[list[str], dict[str, list[str]]]: +def run_sessions( + integrations: list[str], usage_dir: pathlib.Path, reuse_venv: bool = False +) -> tuple[list[str], dict[str, list[str]]]: """Run every session that reads these integrations' cassettes. Returns (integrations that ran completely, {integration: [problem sessions]}). @@ -158,23 +160,27 @@ def run_sessions(integrations: list[str], usage_dir: pathlib.Path) -> tuple[list results: dict[str, str] = {} for session in sessions: print(f"==> nox -s {session}", flush=True) - with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as report: - report_path = report.name + # load_usage only reads usage-*.txt, so reports can live alongside the logs. + report_path = usage_dir / f"report-{len(results)}.json" + proc = subprocess.run( + [ + *_nox_command(), + "-s", + session, + "--report", + str(report_path), + *(["--reuse-venv=yes"] if reuse_venv else []), + ], + cwd=_PROJECT_DIR, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) try: - proc = subprocess.run( - [*_nox_command(), "-s", session, "--report", report_path], - cwd=_PROJECT_DIR, - env=env, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - text=True, - ) - try: - outcome = json.loads(pathlib.Path(report_path).read_text())["sessions"][0]["result"] - except (OSError, ValueError, KeyError, IndexError): - outcome = "success" if proc.returncode == 0 else "failed" - finally: - pathlib.Path(report_path).unlink(missing_ok=True) + outcome = json.loads(report_path.read_text())["sessions"][0]["result"] + except (OSError, ValueError, KeyError, IndexError): + outcome = "success" if proc.returncode == 0 else "failed" results[session] = outcome print(f" {outcome}", flush=True) if outcome == "failed": @@ -211,9 +217,10 @@ def print_report(unused: list[str], clean: bool) -> None: print("\nRun with --clean to delete them.") -def _resolve_integrations(names: list[str], all_: bool) -> list[str]: +def _resolve_integrations(names: list[str]) -> list[str]: + """Validate integration names; an empty list means all of them.""" available = integrations_with_cassettes() - if all_ or not names: + if not names: return available unknown = sorted(set(names) - set(available)) if unknown: @@ -230,6 +237,9 @@ def main() -> None: run_parser.add_argument("--all", action="store_true", help="Check every integration with cassettes") run_parser.add_argument("--usage-dir", type=pathlib.Path, help="Keep usage logs here instead of a temp dir") run_parser.add_argument("--clean", action="store_true", help="Delete unused cassette files") + run_parser.add_argument( + "--reuse-venv", action="store_true", help="Reuse existing nox virtualenvs instead of recreating them" + ) report_parser = sub.add_parser("report", help="Report from existing usage logs") report_parser.add_argument("integrations", nargs="*", help="Limit the report to these integrations") @@ -241,10 +251,10 @@ def main() -> None: if args.command == "run": if not args.integrations and not args.all: parser.error("pass integration names or --all") - integrations = _resolve_integrations(args.integrations, args.all) + integrations = _resolve_integrations([] if args.all else args.integrations) usage_dir = args.usage_dir or pathlib.Path(tempfile.mkdtemp(prefix="cassette-usage-")) usage_dir.mkdir(parents=True, exist_ok=True) - complete, incomplete = run_sessions(integrations, usage_dir) + complete, incomplete = run_sessions(integrations, usage_dir, reuse_venv=args.reuse_venv) print() if incomplete: print("Skipped these integrations because not every session that reads their cassettes succeeded:") @@ -255,7 +265,7 @@ def main() -> None: print_report(unused, args.clean) sys.exit(1 if unused or incomplete else 0) - integrations = _resolve_integrations(args.integrations, False) + integrations = _resolve_integrations(args.integrations) used = load_usage(args.usage_dir) if not used: sys.exit(f"No usage recorded in {args.usage_dir}. Run tests with {USAGE_DIR_ENV}={args.usage_dir} first.") diff --git a/py/src/braintrust/_test_cassette_usage.py b/py/src/braintrust/_test_cassette_usage.py index 233db532d..d7ab21f93 100644 --- a/py/src/braintrust/_test_cassette_usage.py +++ b/py/src/braintrust/_test_cassette_usage.py @@ -10,8 +10,9 @@ Each process writes its own ``usage--.txt`` file in that directory, one path per line, relative to the ``braintrust`` package directory and POSIX-style so logs from different runners (including Windows) can be merged. -Auto-instrument test subprocesses inherit the env var and install the hook -through :mod:`braintrust.integrations.test_utils`. +:mod:`braintrust.conftest` calls :func:`install` at import, which also covers +auto-instrument subprocesses: they inherit the env var and import it through +:mod:`braintrust.integrations.test_utils`. """ import os diff --git a/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py b/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py index cad671cb6..2be9e56c0 100644 --- a/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py +++ b/py/src/braintrust/integrations/claude_agent_sdk/test_claude_agent_sdk.py @@ -1726,7 +1726,7 @@ class TaskNotificationMessage: usage: dict[str, Any] | None = None -def _task_started(task_id, *, description, uuid, tool_use_id=None, task_type="local_agent"): +def _task_started(task_id, *, description, uuid, tool_use_id): return TaskStartedMessage( subtype="task_started", data={"subtype": "task_started", "task_id": task_id}, @@ -1735,17 +1735,17 @@ def _task_started(task_id, *, description, uuid, tool_use_id=None, task_type="lo uuid=uuid, session_id="session-123", tool_use_id=tool_use_id, - task_type=task_type, + task_type="local_agent", ) -def _task_done(task_id, *, summary, uuid, tool_use_id=None, usage=None, status="completed", output_file=""): +def _task_done(task_id, *, summary, uuid, tool_use_id, usage): return TaskNotificationMessage( subtype="task_notification", data={"subtype": "task_notification", "task_id": task_id}, task_id=task_id, - status=status, - output_file=output_file, + status="completed", + output_file="", summary=summary, uuid=uuid, session_id="session-123", diff --git a/py/src/braintrust/integrations/google_genai/test_google_genai.py b/py/src/braintrust/integrations/google_genai/test_google_genai.py index b8fbb20b4..a760c34c3 100644 --- a/py/src/braintrust/integrations/google_genai/test_google_genai.py +++ b/py/src/braintrust/integrations/google_genai/test_google_genai.py @@ -172,17 +172,14 @@ def _assert_timing_metrics_are_valid(metrics, start=None, end=None): assert metrics["start"] <= metrics["end"] -def _weather_tool(): - def get_weather(location: str, unit: str = "celsius") -> str: - """Get the current weather for a location. +def get_weather(location: str, unit: str = "celsius") -> str: + """Get the current weather for a location. - Args: - location: The city and state, e.g. San Francisco, CA - unit: The unit of temperature (celsius or fahrenheit) - """ - return f"22 degrees {unit} and sunny in {location}" - - return get_weather + Args: + location: The city and state, e.g. San Francisco, CA + unit: The unit of temperature (celsius or fahrenheit) + """ + return f"22 degrees {unit} and sunny in {location}" def _has_function_call(responses): @@ -192,8 +189,8 @@ def _has_function_call(responses): ) -def _assert_tool_use_span(span, model, start, end): - assert span["metadata"]["model"] == model +def _assert_tool_use_span(span, start, end): + assert span["metadata"]["model"] == TOOL_MODEL assert span["metadata"]["provider"] == "google" assert span["metadata"]["tools"], "tools should be surfaced on metadata.tools" assert "get_weather" in str(span["metadata"]["tools"]) @@ -688,7 +685,6 @@ def test_image_input_wrapped_in_content(memory_logger): def test_tool_use(memory_logger, mode): """Test function calling / tool use in sync modes.""" assert not memory_logger.pop() - model = TOOL_MODEL client = Client() start = time.time() @@ -696,20 +692,20 @@ def test_tool_use(memory_logger, mode): if mode == "sync": response = client.models.generate_content( - model=model, + model=TOOL_MODEL, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[_weather_tool()], + tools=[get_weather], max_output_tokens=500, ), ) has_function_call = _has_function_call([response]) elif mode == "stream": stream = client.models.generate_content_stream( - model=model, + model=TOOL_MODEL, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[_weather_tool()], + tools=[get_weather], max_output_tokens=500, ), ) @@ -724,7 +720,7 @@ def test_tool_use(memory_logger, mode): # Automatic function calling may create multiple spans; check the initial request. spans = memory_logger.pop() assert len(spans) >= 1 - _assert_tool_use_span(spans[0], model, start, end) + _assert_tool_use_span(spans[0], start, end) # Test 3b: Tool Use (Async) @@ -737,7 +733,6 @@ def test_tool_use(memory_logger, mode): async def test_tool_use_async(memory_logger, mode): """Test function calling / tool use in async modes.""" assert not memory_logger.pop() - model = TOOL_MODEL client = Client() start = time.time() @@ -745,20 +740,20 @@ async def test_tool_use_async(memory_logger, mode): if mode == "async": response = await client.aio.models.generate_content( - model=model, + model=TOOL_MODEL, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[_weather_tool()], + tools=[get_weather], max_output_tokens=500, ), ) has_function_call = _has_function_call([response]) elif mode == "async_stream": stream = await client.aio.models.generate_content_stream( - model=model, + model=TOOL_MODEL, contents="What is the weather like in Paris, France?", config=types.GenerateContentConfig( - tools=[_weather_tool()], + tools=[get_weather], max_output_tokens=500, ), ) @@ -775,7 +770,7 @@ async def test_tool_use_async(memory_logger, mode): # Automatic function calling may create multiple spans; check the initial request. spans = memory_logger.pop() assert len(spans) >= 1 - _assert_tool_use_span(spans[0], model, start, end) + _assert_tool_use_span(spans[0], start, end) # Test 4: System Prompt diff --git a/py/src/braintrust/integrations/langchain/test_anthropic.py b/py/src/braintrust/integrations/langchain/test_anthropic.py index 8f90e0468..e23cf7cdb 100644 --- a/py/src/braintrust/integrations/langchain/test_anthropic.py +++ b/py/src/braintrust/integrations/langchain/test_anthropic.py @@ -4,7 +4,8 @@ import pytest from braintrust import flush, logger from braintrust.integrations.langchain import BraintrustCallbackHandler, set_global_handler -from braintrust.test_helpers import init_test_logger +from braintrust.span_types import SpanTypeAttribute +from braintrust.test_helpers import find_spans_by_type, init_test_logger from langchain_anthropic import ChatAnthropic from langchain_core.prompts import ChatPromptTemplate @@ -56,7 +57,7 @@ def test_langchain_anthropic_integration( spans = memory_logger.pop() assert len(spans) > 0 - llm_spans = [span for span in spans if span["span_attributes"].get("type") == "llm"] + llm_spans = find_spans_by_type(spans, SpanTypeAttribute.LLM) assert len(llm_spans) > 0, "Should have at least one LLM call" llm_span = llm_spans[0] @@ -114,7 +115,7 @@ async def test_async_langchain_invoke( assert "3" in result.content.lower() spans = memory_logger.pop() - llm_spans = [span for span in spans if span["span_attributes"].get("type") == "llm"] + llm_spans = find_spans_by_type(spans, SpanTypeAttribute.LLM) assert len(llm_spans) == 1 llm_span = llm_spans[0] assert llm_span["metadata"]["model"] == MODEL diff --git a/py/src/braintrust/integrations/mistral/test_mistral.py b/py/src/braintrust/integrations/mistral/test_mistral.py index ba5e27930..098ff3176 100644 --- a/py/src/braintrust/integrations/mistral/test_mistral.py +++ b/py/src/braintrust/integrations/mistral/test_mistral.py @@ -138,51 +138,53 @@ def _assert_conversation_span(span, expected_input, start, end, *, expected_cont assert_metrics_are_valid(span["metrics"], start, end) +def _method_refs(*targets): + """Snapshot ``{(cls, method): static attr}`` for ``(cls, methods)`` pairs, skipping missing classes.""" + return { + (cls, method): inspect.getattr_static(cls, method) + for cls, methods in targets + if cls is not None + for method in methods + } + + def _core_method_refs(): - refs = {} - for cls, methods in ( + return _method_refs( (Chat, ("complete", "complete_async", "stream", "stream_async")), (Embeddings, ("create", "create_async")), (Fim, ("complete", "complete_async", "stream", "stream_async")), (Agents, ("complete", "complete_async", "stream", "stream_async")), (Ocr, ("process", "process_async")), - ): - for method in methods: - refs[(cls, method)] = inspect.getattr_static(cls, method) - return refs + ) def _audio_method_refs(): - refs = {} - for cls, methods in ( + return _method_refs( (Transcriptions, ("complete", "complete_async", "stream", "stream_async")), - (Speech, ("complete", "complete_async") if Speech is not None else ()), - ): - if cls is None: - continue - for method in methods: - refs[(cls, method)] = inspect.getattr_static(cls, method) - return refs + (Speech, ("complete", "complete_async")), + ) def _conversation_method_refs(): - refs = {} - for method in ( - "start", - "start_async", - "start_stream", - "start_stream_async", - "append", - "append_async", - "append_stream", - "append_stream_async", - "restart", - "restart_async", - "restart_stream", - "restart_stream_async", - ): - refs[(Conversations, method)] = inspect.getattr_static(Conversations, method) - return refs + return _method_refs( + ( + Conversations, + ( + "start", + "start_async", + "start_stream", + "start_stream_async", + "append", + "append_async", + "append_stream", + "append_stream_async", + "restart", + "restart_async", + "restart_stream", + "restart_stream_async", + ), + ), + ) def _restore_method_refs(monkeypatch, refs): diff --git a/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py b/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py index ca31e1a02..f2d946bb9 100644 --- a/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py +++ b/py/src/braintrust/integrations/openai/test_openai_openrouter_gateway.py @@ -13,7 +13,7 @@ from braintrust import logger, wrap_openai from braintrust.integrations.test_utils import assert_metrics_are_valid from braintrust.test_helpers import init_test_logger -from openai import AsyncOpenAI, OpenAI +from openai import OpenAI PROJECT_NAME = "test-openrouter" @@ -34,13 +34,6 @@ def _get_client(): ) -def _get_async_client(): - return AsyncOpenAI( - base_url="https://openrouter.ai/api/v1", - api_key=os.environ.get("OPENROUTER_API_KEY"), - ) - - @pytest.mark.vcr def test_openrouter_chat_completion_sync(memory_logger): assert not memory_logger.pop() diff --git a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py index 1220a566a..ef751745f 100644 --- a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py +++ b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py @@ -232,7 +232,7 @@ async def test_agent_run_async(memory_logger): assert len(spans) == 2, f"Expected 2 spans (agent_run + chat), got {len(spans)}" # Find agent_run and chat spans - agent_span = next((s for s in spans if "agent_run" in s["span_attributes"]["name"]), None) + agent_span = _find_agent_span(spans) chat_span = next((s for s in spans if "chat" in s["span_attributes"]["name"]), None) assert agent_span is not None, "agent_run span not found" @@ -292,7 +292,7 @@ async def test_wrapper_agent_run_is_traced(memory_logger): spans = memory_logger.pop() assert len(spans) >= 2, f"Expected at least 2 spans (agent_run + chat), got {len(spans)}" - agent_span = next((s for s in spans if "agent_run" in s["span_attributes"]["name"]), None) + agent_span = _find_agent_span(spans) chat_span = next((s for s in spans if "chat" in s["span_attributes"]["name"]), None) assert agent_span is not None, "agent_run span not found" @@ -1657,7 +1657,7 @@ def calculate(operation: str, a: float, b: float) -> str: assert len(spans) >= 2, f"Expected at least 2 spans, got {len(spans)}" # Find agent_run span - agent_span = next((s for s in spans if "agent_run" in s["span_attributes"]["name"]), None) + agent_span = _find_agent_span(spans) assert agent_span is not None, "agent_run span not found" # Verify that toolsets are captured in input with correct tool names @@ -1740,7 +1740,7 @@ def get_weather(city: str) -> str: assert "Paris" in str(result.output) or "sunny" in str(result.output) spans = memory_logger.pop() - agent_span = next((s for s in spans if "agent_run" in s["span_attributes"]["name"]), None) + agent_span = _find_agent_span(spans) tool_span = next((s for s in spans if s["span_attributes"].get("name") == "get_weather"), None) chat_spans = [s for s in spans if "chat" in s["span_attributes"]["name"]] @@ -1794,7 +1794,7 @@ def calculate(operation: str, a: float, b: float) -> float: spans = memory_logger.pop() # Find spans by type - agent_span = next((s for s in spans if "agent_run" in s["span_attributes"]["name"]), None) + agent_span = _find_agent_span(spans) chat_spans = [s for s in spans if "chat" in s["span_attributes"]["name"]] # Assertions - verify basic tracing works with tools @@ -2318,7 +2318,7 @@ async def test_no_model_agent_run(memory_logger): spans = memory_logger.pop() assert len(spans) == 2, f"Expected 2 spans (agent_run + chat), got {len(spans)}" - agent_span = next((s for s in spans if "agent_run" in s["span_attributes"]["name"]), None) + agent_span = _find_agent_span(spans) chat_span = next((s for s in spans if "chat" in s["span_attributes"]["name"]), None) assert agent_span is not None, "agent_run span not found" diff --git a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py index 5b3fc62ee..600f2859d 100644 --- a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py +++ b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_wrap_openai.py @@ -16,6 +16,7 @@ OpenAIModelClass = OpenAIModel from braintrust import logger, wrap_openai +from braintrust.integrations.test_utils import assert_metrics_are_valid from braintrust.span_types import SpanTypeAttribute from braintrust.test_helpers import init_test_logger from pydantic_ai.providers.openai import OpenAIProvider # pylint: disable=import-error @@ -67,12 +68,8 @@ def _assert_wrapped_span(span, start, end): assert TEST_PROMPT in str(span["input"]) assert "Rome" in str(span["output"]) - metrics = span["metrics"] - assert metrics["tokens"] > 0 - assert metrics["prompt_tokens"] > 0 - assert metrics["completion_tokens"] > 0 - assert "time_to_first_token" in metrics - assert start <= metrics["start"] <= metrics["end"] <= end + assert_metrics_are_valid(span["metrics"], start, end) + assert "time_to_first_token" in span["metrics"] assert span["span_id"] assert span["root_span_id"] diff --git a/py/src/braintrust/integrations/test_utils.py b/py/src/braintrust/integrations/test_utils.py index 4ad15875e..594167827 100644 --- a/py/src/braintrust/integrations/test_utils.py +++ b/py/src/braintrust/integrations/test_utils.py @@ -8,7 +8,7 @@ import pytest import vcr -from braintrust import Attachment, _test_cassette_usage, logger +from braintrust import Attachment, logger from braintrust.conftest import get_vcr_config from braintrust.integrations.conftest import _versioned_cassette_dir from braintrust.integrations.utils import ( @@ -42,10 +42,6 @@ _INTEGRATIONS_DIR = Path(os.environ.get("BRAINTRUST_INTEGRATIONS_DIR", Path(__file__).resolve().parent)) AUTO_TEST_SCRIPTS_DIR = _INTEGRATIONS_DIR / "auto_test_scripts" -# Auto-instrument scripts run in a fresh interpreter; record their cassette -# reads too when check-unused-cassettes.py is collecting usage. -_test_cassette_usage.install() - @contextmanager def autoinstrument_test_context( diff --git a/py/src/braintrust/test_cassette_usage.py b/py/src/braintrust/test_cassette_usage.py index f83e21b59..c89117a55 100644 --- a/py/src/braintrust/test_cassette_usage.py +++ b/py/src/braintrust/test_cassette_usage.py @@ -8,6 +8,7 @@ from pathlib import Path import pytest +from braintrust import _test_cassette_usage _SCRIPT = Path(__file__).resolve().parents[2] / "scripts" / "check-unused-cassettes.py" @@ -33,15 +34,20 @@ def _run_recorder(tmp_path: Path, code: str, *, enabled: bool = True) -> set[str pkg = _make_tree(tmp_path) usage_dir = tmp_path / "usage" env = {**os.environ, "BRAINTRUST_INTEGRATIONS_DIR": str(pkg / "integrations")} - env.pop("BRAINTRUST_CASSETTE_USAGE_DIR", None) + env.pop(_test_cassette_usage.USAGE_DIR_ENV, None) if enabled: - env["BRAINTRUST_CASSETTE_USAGE_DIR"] = str(usage_dir) + env[_test_cassette_usage.USAGE_DIR_ENV] = str(usage_dir) + # Load the recorder by path: importing the braintrust package would add + # ~0.7s per subprocess and the recorder needs nothing from it. prelude = textwrap.dedent( f""" + import importlib.util import os from pathlib import Path - from braintrust import _test_cassette_usage - print(_test_cassette_usage.install()) + spec = importlib.util.spec_from_file_location("recorder", {_test_cassette_usage.__file__!r}) + recorder = importlib.util.module_from_spec(spec) + spec.loader.exec_module(recorder) + print(recorder.install()) pkg = Path({str(pkg)!r}) """ ) From 541291bb78e01a9682089065616e3646905a3f51 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 20:56:57 +0000 Subject: [PATCH 10/11] fix: use an absolute, freshly emptied usage dir in check-unused-cassettes run A relative --usage-dir was resolved differently by test processes that run from another cwd (e.g. pipecat's run_from_temp_dir), so nothing was recorded and every cassette looked unused. Reusing a usage dir also merged stale reads from earlier runs, hiding cassettes the current tests no longer open. Co-Authored-By: Claude Opus 5.5 --- py/scripts/check-unused-cassettes.py | 21 ++++++++++++++++++--- py/src/braintrust/test_cassette_usage.py | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/py/scripts/check-unused-cassettes.py b/py/scripts/check-unused-cassettes.py index 0246b1743..3a9427513 100644 --- a/py/scripts/check-unused-cassettes.py +++ b/py/scripts/check-unused-cassettes.py @@ -70,6 +70,20 @@ def load_usage(usage_dir: pathlib.Path) -> set[str]: return used +def prepare_usage_dir(usage_dir: pathlib.Path | None) -> pathlib.Path: + """Return an absolute usage directory with no logs from earlier runs. + + Absolute because test processes resolve the env var from their own cwd + (some sessions run from a temp dir). Emptied because stale reads would mark + cassettes as used that the current tests no longer open. + """ + usage_dir = (usage_dir or pathlib.Path(tempfile.mkdtemp(prefix="cassette-usage-"))).resolve() + usage_dir.mkdir(parents=True, exist_ok=True) + for stale in [*usage_dir.glob("usage-*.txt"), *usage_dir.glob("report-*.json")]: + stale.unlink() + return usage_dir + + def find_unused(integrations: list[str], used: set[str]) -> list[str]: return sorted(cassette_files(integrations) - used) @@ -235,7 +249,9 @@ def main() -> None: run_parser = sub.add_parser("run", help="Run the relevant nox sessions, then report") run_parser.add_argument("integrations", nargs="*", help="Integration directory names (e.g. anthropic)") run_parser.add_argument("--all", action="store_true", help="Check every integration with cassettes") - run_parser.add_argument("--usage-dir", type=pathlib.Path, help="Keep usage logs here instead of a temp dir") + run_parser.add_argument( + "--usage-dir", type=pathlib.Path, help="Write usage logs here (cleared first) instead of a temp dir" + ) run_parser.add_argument("--clean", action="store_true", help="Delete unused cassette files") run_parser.add_argument( "--reuse-venv", action="store_true", help="Reuse existing nox virtualenvs instead of recreating them" @@ -252,8 +268,7 @@ def main() -> None: if not args.integrations and not args.all: parser.error("pass integration names or --all") integrations = _resolve_integrations([] if args.all else args.integrations) - usage_dir = args.usage_dir or pathlib.Path(tempfile.mkdtemp(prefix="cassette-usage-")) - usage_dir.mkdir(parents=True, exist_ok=True) + usage_dir = prepare_usage_dir(args.usage_dir) complete, incomplete = run_sessions(integrations, usage_dir, reuse_venv=args.reuse_venv) print() if incomplete: diff --git a/py/src/braintrust/test_cassette_usage.py b/py/src/braintrust/test_cassette_usage.py index c89117a55..1bdb27426 100644 --- a/py/src/braintrust/test_cassette_usage.py +++ b/py/src/braintrust/test_cassette_usage.py @@ -168,3 +168,21 @@ def test_gamma(session): "alpha": {"test_alpha", "test_alpha_extra"}, "beta": {"test_spec_beta"}, } + + +def test_checker_prepares_an_absolute_empty_usage_dir(checker, tmp_path, monkeypatch): + monkeypatch.chdir(tmp_path) + stale = tmp_path / "usage" + stale.mkdir() + (stale / "usage-1-a.txt").write_text("integrations/alpha/cassettes/latest/unused.yaml\n") + (stale / "report-0.json").write_text("{}") + (stale / "keep.txt").write_text("unrelated") + + usage_dir = checker.prepare_usage_dir(Path("usage")) + + # Test processes may run from another cwd (e.g. run_from_temp_dir), so the + # env var must be absolute; a fresh run must not inherit old reads. + assert usage_dir == stale.resolve() + assert checker.load_usage(usage_dir) == set() + assert sorted(p.name for p in usage_dir.iterdir()) == ["keep.txt"] + assert checker.prepare_usage_dir(None).is_absolute() From 09f0204ef82b3e40bbf118331fea593054aebd99 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 24 Sep 2026 21:10:34 +0000 Subject: [PATCH 11/11] fix: never clean cassettes next to skipped tests in check-unused-cassettes A session can succeed while platform- or version-specific tests skip (e.g. cursor's sync-bridge tests on Windows), leaving their cassettes unread. Tests now log skips alongside cassette reads; unread files in a version directory whose session skipped anything are listed with the skip reasons for review instead of being reported as deletable. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 1 + py/scripts/check-unused-cassettes.py | 121 ++++++++++++++++++---- py/src/braintrust/_test_cassette_usage.py | 24 +++++ py/src/braintrust/conftest.py | 22 ++++ py/src/braintrust/test_cassette_usage.py | 55 +++++++++- 5 files changed, 199 insertions(+), 24 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ad676049d..66167bc58 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -252,6 +252,7 @@ Unused cassette detection: - Check specific integrations: `cd py && make check-unused-cassettes INTEGRATIONS="openai anthropic"` (omit `INTEGRATIONS` to check all; it is slow). - Add `--clean` to delete what it finds: `cd py && python scripts/check-unused-cassettes.py run openai --clean`. - An integration is skipped, not reported, if any of its sessions fails or is skipped (e.g. sessions that skip on the current Python version), since its reads would be incomplete. +- Unread files in a cassette version directory whose session skipped any test (e.g. platform-only tests) are listed with the skip reasons for manual review and never deleted by `--clean`, since the skipped test may read them elsewhere. - After deleting or renaming a cassette-backed test, run it for that integration. ## Benchmarks diff --git a/py/scripts/check-unused-cassettes.py b/py/scripts/check-unused-cassettes.py index 3a9427513..f2e5083c8 100644 --- a/py/scripts/check-unused-cassettes.py +++ b/py/scripts/check-unused-cassettes.py @@ -12,6 +12,11 @@ (see ``src/braintrust/_test_cassette_usage.py``), and this script compares those reads with the files on disk. +Tests also log when they skip. A skipped test may be the only reader of a +cassette on another platform or Python version, so unused files in a cassette +version directory whose sessions skipped anything are listed for review with +the skip reasons, but never deleted by ``--clean``. + Usage: # Run every nox session that reads the given integrations' cassettes # (all matrix versions, replay-only) and report unused files. @@ -65,11 +70,39 @@ def cassette_files(integrations: list[str]) -> set[str]: def load_usage(usage_dir: pathlib.Path) -> set[str]: used = set() - for log in usage_dir.glob("usage-*.txt"): + for log in usage_dir.rglob("usage-*.txt"): used.update(line.strip() for line in log.read_text(encoding="utf-8").splitlines() if line.strip()) return used +def load_skips(usage_dir: pathlib.Path) -> list[dict]: + return [ + json.loads(line) + for log in usage_dir.rglob("skips-*.jsonl") + for line in log.read_text(encoding="utf-8").splitlines() + if line.strip() + ] + + +def _version_prefix(integration: str, version: str | None) -> str: + return f"integrations/{integration}/cassettes/" + (f"{version}/" if version else "") + + +def skipped_prefixes(skips: list[dict], integrations: list[str]) -> dict[str, set[str]]: + """Map cassette directory prefix -> skip reasons, attributing each skip by its test path. + + Skips from tests outside ``integrations//`` (e.g. btx specs) can't be + attributed, so they mark that version's directory in every integration. + """ + prefixes: dict[str, set[str]] = defaultdict(set) + for skip in skips: + parts = skip["path"].split("/") + owners = [parts[1]] if parts[0] == "integrations" and len(parts) > 2 else integrations + for name in owners: + prefixes[_version_prefix(name, skip["version"])].add(skip["reason"]) + return dict(prefixes) + + def prepare_usage_dir(usage_dir: pathlib.Path | None) -> pathlib.Path: """Return an absolute usage directory with no logs from earlier runs. @@ -79,7 +112,9 @@ def prepare_usage_dir(usage_dir: pathlib.Path | None) -> pathlib.Path: """ usage_dir = (usage_dir or pathlib.Path(tempfile.mkdtemp(prefix="cassette-usage-"))).resolve() usage_dir.mkdir(parents=True, exist_ok=True) - for stale in [*usage_dir.glob("usage-*.txt"), *usage_dir.glob("report-*.json")]: + for stale in usage_dir.glob("session-*"): + shutil.rmtree(stale) + for stale in [*usage_dir.glob("usage-*.txt"), *usage_dir.glob("skips-*.jsonl")]: stale.unlink() return usage_dir @@ -88,6 +123,19 @@ def find_unused(integrations: list[str], used: set[str]) -> list[str]: return sorted(cassette_files(integrations) - used) +def split_skipped(unused: list[str], skipped: dict[str, set[str]]) -> tuple[list[str], dict[str, list[str]]]: + """Split unused files into (safe to delete, {skipped dir prefix: files kept for review}).""" + deletable = [] + kept: dict[str, list[str]] = defaultdict(list) + for path in unused: + prefix = next((p for p in sorted(skipped, key=len, reverse=True) if path.startswith(p)), None) + if prefix is None: + deletable.append(path) + else: + kept[prefix].append(path) + return deletable, dict(kept) + + def _render_test_path(node: ast.expr) -> str | None: """Render the test-path argument of ``_run_tests`` (a literal or f-string).""" if isinstance(node, ast.Constant) and isinstance(node.value, str): @@ -145,10 +193,11 @@ def _nox_command() -> list[str]: def run_sessions( integrations: list[str], usage_dir: pathlib.Path, reuse_venv: bool = False -) -> tuple[list[str], dict[str, list[str]]]: +) -> tuple[list[str], dict[str, list[str]], dict[str, set[str]]]: """Run every session that reads these integrations' cassettes. - Returns (integrations that ran completely, {integration: [problem sessions]}). + Returns (integrations that ran completely, {integration: [problem sessions]}, + {cassette dir prefix: skip reasons} for sessions that skipped tests). """ mapping = sessions_by_integration() listing = json.loads( @@ -157,8 +206,10 @@ def run_sessions( ).stdout ) concrete: dict[str, list[str]] = defaultdict(list) + versions: dict[str, str | None] = {} for entry in listing: concrete[entry["name"]].append(entry["session"]) + versions[entry["session"]] = entry.get("call_spec", {}).get("version") to_run: dict[str, list[str]] = {} incomplete: dict[str, list[str]] = {} @@ -170,12 +221,15 @@ def run_sessions( to_run[name] = [s for func in funcs for s in concrete.get(func, [])] sessions = sorted({s for group in to_run.values() for s in group}) - env = {**os.environ, USAGE_DIR_ENV: str(usage_dir), "CI": "1"} results: dict[str, str] = {} + skipped: dict[str, set[str]] = defaultdict(set) for session in sessions: print(f"==> nox -s {session}", flush=True) - # load_usage only reads usage-*.txt, so reports can live alongside the logs. - report_path = usage_dir / f"report-{len(results)}.json" + # One directory per session so skips can be attributed to its cassette dirs. + session_dir = usage_dir / f"session-{len(results):03d}" + session_dir.mkdir() + report_path = session_dir / "report.json" + env = {**os.environ, USAGE_DIR_ENV: str(session_dir), "CI": "1"} proc = subprocess.run( [ *_nox_command(), @@ -199,6 +253,10 @@ def run_sessions( print(f" {outcome}", flush=True) if outcome == "failed": print("\n".join(f" | {line}" for line in proc.stdout.splitlines()[-15:]), flush=True) + reasons = {skip["reason"] for skip in load_skips(session_dir)} + for name, group in to_run.items(): + if reasons and session in group: + skipped[_version_prefix(name, versions.get(session))] |= reasons complete = [] for name, group in to_run.items(): @@ -207,28 +265,46 @@ def run_sessions( incomplete[name] = problems else: complete.append(name) - return complete, incomplete + return complete, incomplete, dict(skipped) -def print_report(unused: list[str], clean: bool) -> None: - if not unused: - print("No unused cassette files found.") - return +def _print_files(paths: list[str]) -> None: by_dir: dict[str, list[str]] = defaultdict(list) - for path in unused: + for path in paths: parent, _, filename = path.rpartition("/") by_dir[parent].append(filename) - action = "Deleted" if clean else "Found" - print(f"{action} {len(unused)} unused cassette file{'' if len(unused) == 1 else 's'}:") for parent in sorted(by_dir): print(f" src/braintrust/{parent}/") for filename in by_dir[parent]: print(f" {filename}") + + +def print_report(unused: list[str], skipped: dict[str, set[str]], clean: bool) -> bool: + """Print (and with ``clean``, delete) unused files. Returns True if any are deletable.""" + deletable, kept = split_skipped(unused, skipped) + if kept: + count = sum(len(files) for files in kept.values()) + print(f"Kept {count} unread cassette file{'' if count == 1 else 's'} next to skipped tests (review by hand):") + for prefix in sorted(kept): + reasons = sorted(skipped[prefix]) + print( + f" src/braintrust/{prefix} (skipped: {'; '.join(reasons[:3])}{'; ...' if len(reasons) > 3 else ''})" + ) + for path in kept[prefix]: + print(f" {path[len(prefix) :]}") + print() + if not deletable: + print("No unused cassette files found.") + return False + action = "Deleted" if clean else "Found" + print(f"{action} {len(deletable)} unused cassette file{'' if len(deletable) == 1 else 's'}:") + _print_files(deletable) if clean: - for path in unused: + for path in deletable: (_PACKAGE_DIR / path).unlink() else: print("\nRun with --clean to delete them.") + return True def _resolve_integrations(names: list[str]) -> list[str]: @@ -269,24 +345,23 @@ def main() -> None: parser.error("pass integration names or --all") integrations = _resolve_integrations([] if args.all else args.integrations) usage_dir = prepare_usage_dir(args.usage_dir) - complete, incomplete = run_sessions(integrations, usage_dir, reuse_venv=args.reuse_venv) + complete, incomplete, skipped = run_sessions(integrations, usage_dir, reuse_venv=args.reuse_venv) print() if incomplete: print("Skipped these integrations because not every session that reads their cassettes succeeded:") for name, problems in sorted(incomplete.items()): print(f" {name}: {', '.join(problems)}") print() - unused = find_unused(complete, load_usage(usage_dir)) - print_report(unused, args.clean) - sys.exit(1 if unused or incomplete else 0) + found = print_report(find_unused(complete, load_usage(usage_dir)), skipped, args.clean) + sys.exit(1 if found or incomplete else 0) integrations = _resolve_integrations(args.integrations) used = load_usage(args.usage_dir) if not used: sys.exit(f"No usage recorded in {args.usage_dir}. Run tests with {USAGE_DIR_ENV}={args.usage_dir} first.") - unused = find_unused(integrations, used) - print_report(unused, args.clean) - sys.exit(1 if unused else 0) + skipped = skipped_prefixes(load_skips(args.usage_dir), integrations) + found = print_report(find_unused(integrations, used), skipped, args.clean) + sys.exit(1 if found else 0) if __name__ == "__main__": diff --git a/py/src/braintrust/_test_cassette_usage.py b/py/src/braintrust/_test_cassette_usage.py index d7ab21f93..6444a77ac 100644 --- a/py/src/braintrust/_test_cassette_usage.py +++ b/py/src/braintrust/_test_cassette_usage.py @@ -10,11 +10,16 @@ Each process writes its own ``usage--.txt`` file in that directory, one path per line, relative to the ``braintrust`` package directory and POSIX-style so logs from different runners (including Windows) can be merged. +Skipped tests are logged too (``skips-*.jsonl``, via :func:`record_skip`): a +skipped test may be the only reader of a cassette on another platform or +Python version, so the checker never deletes cassettes next to a skip. + :mod:`braintrust.conftest` calls :func:`install` at import, which also covers auto-instrument subprocesses: they inherit the env var and import it through :mod:`braintrust.integrations.test_utils`. """ +import json import os import sys import uuid @@ -81,3 +86,22 @@ def hook(event, args): sys.addaudithook(hook) _installed = True return True + + +def record_skip(path, test: str, reason: str) -> None: + """Log a skipped test (or skipped test module) when usage recording is on.""" + usage_dir = os.environ.get(USAGE_DIR_ENV) + if not usage_dir: + return + path = os.path.abspath(os.fspath(path)) + if path.startswith(_PACKAGE_DIR + os.sep): + path = os.path.relpath(path, _PACKAGE_DIR).replace(os.sep, "/") + entry = { + "path": path, + "test": test, + "version": os.environ.get("BRAINTRUST_TEST_PACKAGE_VERSION"), + "reason": reason, + } + os.makedirs(usage_dir, exist_ok=True) + with open(os.path.join(usage_dir, f"skips-{os.getpid()}.jsonl"), "a", encoding="utf-8") as f: + f.write(json.dumps(entry) + "\n") diff --git a/py/src/braintrust/conftest.py b/py/src/braintrust/conftest.py index 70ff85d74..e6cfd460d 100644 --- a/py/src/braintrust/conftest.py +++ b/py/src/braintrust/conftest.py @@ -10,6 +10,28 @@ _test_cassette_usage.install() +def _skip_reason(report) -> str: + longrepr = report.longrepr + return longrepr[2] if isinstance(longrepr, tuple) and len(longrepr) == 3 else str(longrepr) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_makereport(item, call): + outcome = yield + report = outcome.get_result() + if report.skipped and not hasattr(report, "wasxfail"): + _test_cassette_usage.record_skip(item.path, item.nodeid, _skip_reason(report)) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_make_collect_report(collector): + # Whole modules skipped at collection (e.g. importorskip) never reach makereport. + outcome = yield + report = outcome.get_result() + if report.skipped: + _test_cassette_usage.record_skip(collector.path, report.nodeid, _skip_reason(report)) + + def _patch_vcr_aiohttp_stubs(): """Patch VCR.py's aiohttp stubs to fix bugs with google-genai >= 1.64.0 and litellm. diff --git a/py/src/braintrust/test_cassette_usage.py b/py/src/braintrust/test_cassette_usage.py index 1bdb27426..96b8a5b4c 100644 --- a/py/src/braintrust/test_cassette_usage.py +++ b/py/src/braintrust/test_cassette_usage.py @@ -1,6 +1,7 @@ """Tests for cassette usage recording and scripts/check-unused-cassettes.py.""" import importlib.util +import json import os import subprocess import sys @@ -175,7 +176,9 @@ def test_checker_prepares_an_absolute_empty_usage_dir(checker, tmp_path, monkeyp stale = tmp_path / "usage" stale.mkdir() (stale / "usage-1-a.txt").write_text("integrations/alpha/cassettes/latest/unused.yaml\n") - (stale / "report-0.json").write_text("{}") + (stale / "skips-1.jsonl").write_text("{}\n") + (stale / "session-000").mkdir() + (stale / "session-000" / "usage-2-b.txt").write_text("integrations/alpha/cassettes/latest/used.yaml\n") (stale / "keep.txt").write_text("unrelated") usage_dir = checker.prepare_usage_dir(Path("usage")) @@ -186,3 +189,53 @@ def test_checker_prepares_an_absolute_empty_usage_dir(checker, tmp_path, monkeyp assert checker.load_usage(usage_dir) == set() assert sorted(p.name for p in usage_dir.iterdir()) == ["keep.txt"] assert checker.prepare_usage_dir(None).is_absolute() + + +def test_record_skip_logs_package_relative_path_and_version(tmp_path, monkeypatch): + pkg = _make_tree(tmp_path) + usage_dir = tmp_path / "usage" + monkeypatch.setattr(_test_cassette_usage, "_PACKAGE_DIR", str(pkg)) + monkeypatch.setenv("BRAINTRUST_TEST_PACKAGE_VERSION", "1.0.0") + + monkeypatch.delenv(_test_cassette_usage.USAGE_DIR_ENV, raising=False) + _test_cassette_usage.record_skip(pkg / "integrations/alpha/test_alpha.py", "test_off", "not recorded") + assert not usage_dir.exists() + + monkeypatch.setenv(_test_cassette_usage.USAGE_DIR_ENV, str(usage_dir)) + _test_cassette_usage.record_skip(pkg / "integrations/alpha/test_alpha.py", "test_sync", "no sync bridge") + _test_cassette_usage.record_skip(tmp_path / "elsewhere/test_x.py", "test_x", "other") + + skips = [json.loads(line) for log in usage_dir.glob("skips-*.jsonl") for line in log.read_text().splitlines()] + assert skips == [ + { + "path": "integrations/alpha/test_alpha.py", + "test": "test_sync", + "version": "1.0.0", + "reason": "no sync bridge", + }, + {"path": str(tmp_path / "elsewhere/test_x.py"), "test": "test_x", "version": "1.0.0", "reason": "other"}, + ] + + +def test_checker_keeps_unread_files_next_to_skipped_tests(checker): + unused = [ + "integrations/alpha/cassettes/1.0.0/btx/spec.yaml", + "integrations/alpha/cassettes/latest/unused.yaml", + "integrations/beta/cassettes/latest/transport.json", + ] + skips = [ + # A platform skip in alpha's latest session: its unread files may still be needed elsewhere. + {"path": "integrations/alpha/test_alpha.py", "test": "t", "version": "latest", "reason": "no sync bridge"}, + # Unattributable (e.g. btx specs): marks that version in every integration. + {"path": "btx/test_btx.py", "test": "t", "version": "1.0.0", "reason": "spec not supported"}, + ] + + skipped = checker.skipped_prefixes(skips, ["alpha", "beta"]) + deletable, kept = checker.split_skipped(unused, skipped) + + assert deletable == ["integrations/beta/cassettes/latest/transport.json"] + assert kept == { + "integrations/alpha/cassettes/1.0.0/": ["integrations/alpha/cassettes/1.0.0/btx/spec.yaml"], + "integrations/alpha/cassettes/latest/": ["integrations/alpha/cassettes/latest/unused.yaml"], + } + assert skipped["integrations/alpha/cassettes/latest/"] == {"no sync bridge"}