Skip to content

Commit b1cb361

Browse files
committed
Add description and default jdoc to generated ts types to be used as json schema later
1 parent 724a85b commit b1cb361

File tree

2 files changed

+574
-7
lines changed

2 files changed

+574
-7
lines changed

scripts/generate_evaluators_ts.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
)
99

1010
from pydantic import BaseModel
11+
from pydantic_core import PydanticUndefinedType
1112
from langevals.utils import (
1213
EvaluatorDefinitions,
1314
get_evaluator_classes,
@@ -23,9 +24,27 @@ def stringify_field_types(field_types):
2324
return "Record<string, never>"
2425

2526
settings = "{\n"
26-
for field_name, field_type in field_types.items():
27-
optional = "?" if " | undefined" in field_type else ""
28-
settings += f" {field_name}{optional}: {field_type.replace(' | undefined', '')};\n"
27+
for field_name, field in field_types.items():
28+
optional = "?" if " | undefined" in field["type"] else ""
29+
description = (
30+
field.get("description")
31+
if not isinstance(field.get("description"), PydanticUndefinedType)
32+
else None
33+
)
34+
default = (
35+
field.get("default")
36+
if not isinstance(field.get("default"), PydanticUndefinedType)
37+
else None
38+
)
39+
if description or default or type(default) == bool:
40+
settings += f" /**\n"
41+
description_ = description.replace("\n", ". ") if description else None
42+
if description_:
43+
settings += f" * @description {description_}\n"
44+
if default or type(default) == bool:
45+
settings += f" * @default {json.dumps(default)}\n"
46+
settings += f" */\n"
47+
settings += f" {field_name}{optional}: {field['type'].replace(' | undefined', '')};\n"
2948
settings += " }"
3049

3150
return settings
@@ -47,7 +66,11 @@ def get_field_type_to_typescript(field):
4766
if inspect.isclass(field) and issubclass(field, BaseModel):
4867
return stringify_field_types(
4968
{
50-
field_name: get_field_type_to_typescript(field.annotation)
69+
field_name: {
70+
"type": get_field_type_to_typescript(field.annotation),
71+
"description": field.description,
72+
"default": dump_model_type(field.default),
73+
}
5174
for field_name, field in field.model_fields.items()
5275
}
5376
)
@@ -93,9 +116,11 @@ def dump_model_type(value):
93116
"description": field.description,
94117
"default": default,
95118
}
96-
evaluator_info["settingsTypes"][field_name] = get_field_type_to_typescript(
97-
field.annotation
98-
)
119+
evaluator_info["settingsTypes"][field_name] = {
120+
"type": get_field_type_to_typescript(field.annotation),
121+
"description": field.description,
122+
"default": default,
123+
}
99124

100125
base_score_description = EvaluationResult.model_fields["score"].description
101126
score_field = definitions.result_type.model_fields.get("score")

0 commit comments

Comments
 (0)