From baa8cb2e947c89012847baa01521348a46a4e245 Mon Sep 17 00:00:00 2001 From: Pedro Mora Date: Wed, 22 Jul 2026 12:34:11 -0500 Subject: [PATCH 1/3] Adding test --- py/src/braintrust/test_parameters.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/py/src/braintrust/test_parameters.py b/py/src/braintrust/test_parameters.py index b5ff3bca..d6f353fa 100644 --- a/py/src/braintrust/test_parameters.py +++ b/py/src/braintrust/test_parameters.py @@ -635,3 +635,26 @@ def test_prompt_parameter_defaults_omit_none_values_from_dict(): assert "function_call" not in default["prompt"]["messages"][0] assert "tool_calls" not in default["prompt"]["messages"][0] _assert_no_none_values(default) + + +@pytest.mark.skipif(not HAS_PYDANTIC, reason="pydantic not installed") +def test_serialize_eval_parameters_omits_description_when_absent(): + from pydantic import BaseModel + + class TemplateParam(BaseModel): + value: str = "default template" + + serialized = serialize_eval_parameters( + { + "template": TemplateParam, + "main": {"type": "prompt"}, + "judge_model": {"type": "model"}, + } + ) + + assert serialized["template"]["type"] == "data" + assert serialized["template"]["default"] == "default template" + assert serialized["main"]["type"] == "prompt" + assert serialized["judge_model"]["type"] == "model" + for name in ("template", "main", "judge_model"): + assert "description" not in serialized[name] From 4d4a41e9e349b9bfafb3868a38aa5bf35fbd2ad7 Mon Sep 17 00:00:00 2001 From: Pedro Mora Date: Wed, 22 Jul 2026 12:41:34 -0500 Subject: [PATCH 2/3] Fix attempt --- py/src/braintrust/parameters.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/py/src/braintrust/parameters.py b/py/src/braintrust/parameters.py index 31dea194..a99cee42 100644 --- a/py/src/braintrust/parameters.py +++ b/py/src/braintrust/parameters.py @@ -424,19 +424,19 @@ def serialize_eval_parameters(parameters: EvalParameters) -> dict[str, Any]: for name, schema in parameters.items(): if _is_prompt_parameter(schema): - prompt_parameter_data: dict[str, Any] = { - "type": "prompt", - "description": schema.get("description"), - } + prompt_parameter_data: dict[str, Any] = {"type": "prompt"} + prompt_description = schema.get("description") + if prompt_description is not None: + prompt_parameter_data["description"] = prompt_description prompt_default = schema.get("default") if prompt_default is not None: prompt_parameter_data["default"] = _prompt_data_to_dict(prompt_default) result[name] = prompt_parameter_data elif _is_model_parameter(schema): - model_parameter_data: dict[str, Any] = { - "type": "model", - "description": schema.get("description"), - } + model_parameter_data: dict[str, Any] = {"type": "model"} + model_description = schema.get("description") + if model_description is not None: + model_parameter_data["description"] = model_description model_default = schema.get("default") if model_default is not None: model_parameter_data["default"] = model_default @@ -451,8 +451,10 @@ def serialize_eval_parameters(parameters: EvalParameters) -> dict[str, Any]: data_parameter_data: dict[str, Any] = { "type": "data", "schema": schema_json, - "description": schema_json.get("description"), } + data_description = schema_json.get("description") + if data_description is not None: + data_parameter_data["description"] = data_description if "default" in schema_json: data_parameter_data["default"] = schema_json["default"] result[name] = data_parameter_data From 6b0c0ce1f07037488ac53da4d47bdb86969bb825 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 29 Jul 2026 09:33:55 -0400 Subject: [PATCH 3/3] simplify --- py/src/braintrust/parameters.py | 35 ++++++++++++++++------------ py/src/braintrust/test_parameters.py | 24 +++++++++++++++---- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/py/src/braintrust/parameters.py b/py/src/braintrust/parameters.py index a99cee42..c0a97f99 100644 --- a/py/src/braintrust/parameters.py +++ b/py/src/braintrust/parameters.py @@ -12,6 +12,7 @@ from .generated_types import PromptBlockDataNullish, PromptOptionsNullish from .prompt import PromptData from .serializable_data_class import SerializableDataClass +from .util import clean_nones if TYPE_CHECKING: @@ -424,19 +425,23 @@ def serialize_eval_parameters(parameters: EvalParameters) -> dict[str, Any]: for name, schema in parameters.items(): if _is_prompt_parameter(schema): - prompt_parameter_data: dict[str, Any] = {"type": "prompt"} - prompt_description = schema.get("description") - if prompt_description is not None: - prompt_parameter_data["description"] = prompt_description + prompt_parameter_data = clean_nones( + { + "type": "prompt", + "description": schema.get("description"), + } + ) prompt_default = schema.get("default") if prompt_default is not None: prompt_parameter_data["default"] = _prompt_data_to_dict(prompt_default) result[name] = prompt_parameter_data elif _is_model_parameter(schema): - model_parameter_data: dict[str, Any] = {"type": "model"} - model_description = schema.get("description") - if model_description is not None: - model_parameter_data["description"] = model_description + model_parameter_data = clean_nones( + { + "type": "model", + "description": schema.get("description"), + } + ) model_default = schema.get("default") if model_default is not None: model_parameter_data["default"] = model_default @@ -448,13 +453,13 @@ def serialize_eval_parameters(parameters: EvalParameters) -> dict[str, Any]: } else: schema_json = _serialize_pydantic_parameter_schema(schema) - data_parameter_data: dict[str, Any] = { - "type": "data", - "schema": schema_json, - } - data_description = schema_json.get("description") - if data_description is not None: - data_parameter_data["description"] = data_description + data_parameter_data = clean_nones( + { + "type": "data", + "schema": schema_json, + "description": schema_json.get("description"), + } + ) if "default" in schema_json: data_parameter_data["default"] = schema_json["default"] result[name] = data_parameter_data diff --git a/py/src/braintrust/test_parameters.py b/py/src/braintrust/test_parameters.py index d6f353fa..d96d45ae 100644 --- a/py/src/braintrust/test_parameters.py +++ b/py/src/braintrust/test_parameters.py @@ -637,12 +637,28 @@ def test_prompt_parameter_defaults_omit_none_values_from_dict(): _assert_no_none_values(default) -@pytest.mark.skipif(not HAS_PYDANTIC, reason="pydantic not installed") def test_serialize_eval_parameters_omits_description_when_absent(): - from pydantic import BaseModel + class _FakeField: + required = False + + class TemplateParam: + __fields__ = {"value": _FakeField()} + + @classmethod + def parse_obj(cls, value): + return value - class TemplateParam(BaseModel): - value: str = "default template" + @classmethod + def schema(cls): + return { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "default template", + } + }, + } serialized = serialize_eval_parameters( {