From 6bb6c0614cecf79b64955ee637689de3f71e384e Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 30 Mar 2026 10:17:34 -0400 Subject: [PATCH 1/2] fix(temporal): avoid pylint false positive in plugin init Build SimplePlugin constructor kwargs dynamically based on the\ninstalled temporalio signature. This preserves compatibility across\nTemporal versions while preventing pylint from flagging unsupported\nkeyword arguments during the CI pylint session. --- .../braintrust/contrib/temporal/__init__.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) 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"] From 252b06101664cfa07634036890a36fb87f707b3e Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 30 Mar 2026 11:24:41 -0400 Subject: [PATCH 2/2] fix flaky pydantic test --- .../braintrust/wrappers/test_pydantic_ai_integration.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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: