diff --git a/py/src/braintrust/logger.py b/py/src/braintrust/logger.py index 522b31e1..3e10377b 100644 --- a/py/src/braintrust/logger.py +++ b/py/src/braintrust/logger.py @@ -5070,6 +5070,11 @@ def prompt(self) -> PromptBlockData | None: def version(self) -> str: return self._lazy_metadata.get()._xact_id + @property + def version_pretty(self) -> str | None: + version = cast(str | None, self.version) + return prettify_xact(version) if version is not None else None + @property def options(self) -> PromptOptions: return self._lazy_metadata.get().prompt_data.options or {} diff --git a/py/src/braintrust/test_logger.py b/py/src/braintrust/test_logger.py index e8c22bdc..e7af0f01 100644 --- a/py/src/braintrust/test_logger.py +++ b/py/src/braintrust/test_logger.py @@ -263,6 +263,35 @@ def test_load_prompt_prefers_version_over_environment_for_id(self): {"version": "v1"}, ) + def test_load_prompt_exposes_pretty_version(self): + mock_api_conn = MagicMock() + mock_api_conn.get_json.return_value = { + "objects": [ + { + "id": "prompt-123", + "project_id": "project-123", + "name": "Saved prompt", + "slug": "saved-prompt", + "_xact_id": "123456789", + "description": None, + "tags": None, + "prompt_data": { + "prompt": { + "type": "chat", + "messages": [{"role": "user", "content": "Hello"}], + }, + "options": {"model": "gpt-5-mini"}, + }, + } + ] + } + + simulate_login() + with patch.object(logger._state, "api_conn", return_value=mock_api_conn): + prompt = braintrust.load_prompt(project="test-project", slug="saved-prompt") + assert prompt.version == "123456789" + assert prompt.version_pretty == "f2be28742b0b0c2d" + def test_load_parameters_returns_remote_object(self): mock_api_conn = MagicMock() mock_api_conn.get_json.return_value = {