diff --git a/py/src/braintrust/contrib/temporal/__init__.py b/py/src/braintrust/contrib/temporal/__init__.py index 61e4397e..b25a3946 100644 --- a/py/src/braintrust/contrib/temporal/__init__.py +++ b/py/src/braintrust/contrib/temporal/__init__.py @@ -421,21 +421,21 @@ def __init__(self, logger: Any | None = None) -> None: params = inspect.signature(SimplePlugin.__init__).parameters - # temporalio >= 1.23.0 merged client_interceptors/worker_interceptors - # into a single `interceptors` parameter. + # temporalio plugin APIs differ by version. Newer releases may expose + # a merged `interceptors` kwarg, while older releases keep separate + # client/worker interceptor kwargs. Build kwargs dynamically so pylint + # does not validate unsupported keywords against the installed version. + kwargs: dict[str, Any] = { + "name": "braintrust", + "workflow_runner": _modify_workflow_runner, + } if "interceptors" in params: - super().__init__( # pylint: disable=unexpected-keyword-arg - name="braintrust", - interceptors=[interceptor], - workflow_runner=_modify_workflow_runner, - ) + kwargs["interceptors"] = [interceptor] else: - super().__init__( - name="braintrust", - client_interceptors=[interceptor], - worker_interceptors=[interceptor], - workflow_runner=_modify_workflow_runner, - ) + kwargs["client_interceptors"] = [interceptor] + kwargs["worker_interceptors"] = [interceptor] + + super().__init__(**kwargs) __all__ = ["BraintrustInterceptor", "BraintrustPlugin"] diff --git a/py/src/braintrust/wrappers/test_pydantic_ai_integration.py b/py/src/braintrust/wrappers/test_pydantic_ai_integration.py index b794b18b..5dc1007c 100644 --- a/py/src/braintrust/wrappers/test_pydantic_ai_integration.py +++ b/py/src/braintrust/wrappers/test_pydantic_ai_integration.py @@ -50,7 +50,13 @@ def _assert_metrics_are_valid(metrics, start, end): assert "end" in metrics assert "duration" in metrics assert start <= metrics["start"] <= metrics["end"] <= end - assert metrics["duration"] > 0 + assert metrics["duration"] >= 0 + assert metrics["duration"] == pytest.approx(metrics["end"] - metrics["start"], abs=1e-9) + + # Windows can report identical timestamps for very fast synchronous operations, + # so duration may legitimately be 0.0 for those spans. + if metrics["end"] > metrics["start"]: + assert metrics["duration"] > 0 # Token metrics (if present) if "tokens" in metrics: