diff --git a/py/src/braintrust/logger.py b/py/src/braintrust/logger.py index e8243f070..52d4aa4da 100644 --- a/py/src/braintrust/logger.py +++ b/py/src/braintrust/logger.py @@ -1701,7 +1701,7 @@ def compute_metadata(): state.login(org_name=org_name, api_key=api_key, app_url=app_url) if project_id is None: project_info = state.api_client().projects.post_project( - body={"name": project or GLOBAL_PROJECT, "org_name": state.org_name} + body={"name": project if project is not None else GLOBAL_PROJECT, "org_name": state.org_name} ) else: project_info = state.api_client().projects.get_project_id(project_id) diff --git a/py/src/braintrust/test_logger.py b/py/src/braintrust/test_logger.py index 19dc3add3..b6754e40a 100644 --- a/py/src/braintrust/test_logger.py +++ b/py/src/braintrust/test_logger.py @@ -141,6 +141,18 @@ def test_init_validation(self): assert str(cm.exception) == f"duplicate tag: {tag}" + def test_init_preserves_empty_project_name(self): + api_client = self._mock_api_client() + api_client.projects.post_project.return_value = {"id": "empty-project-id", "name": ""} + + simulate_login() + with patch.object(logger._state, "api_client", return_value=api_client): + exp = braintrust.init(project="") + metadata = exp._lazy_metadata.get() + + api_client.projects.post_project.assert_called_once_with(body={"name": "", "org_name": logger._state.org_name}) + assert metadata.project.name == "" + def test_init_with_repo_info_does_not_raise(self): """Test that passing repo_info to init() doesn't cause an UnboundLocalError.