diff --git a/py/src/braintrust/parameters.py b/py/src/braintrust/parameters.py index 31dea194..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", - "description": schema.get("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", - "description": schema.get("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,11 +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, - "description": schema_json.get("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 b5ff3bca..d96d45ae 100644 --- a/py/src/braintrust/test_parameters.py +++ b/py/src/braintrust/test_parameters.py @@ -635,3 +635,42 @@ 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) + + +def test_serialize_eval_parameters_omits_description_when_absent(): + class _FakeField: + required = False + + class TemplateParam: + __fields__ = {"value": _FakeField()} + + @classmethod + def parse_obj(cls, value): + return value + + @classmethod + def schema(cls): + return { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "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]