8
8
)
9
9
10
10
from pydantic import BaseModel
11
+ from pydantic_core import PydanticUndefinedType
11
12
from langevals .utils import (
12
13
EvaluatorDefinitions ,
13
14
get_evaluator_classes ,
@@ -23,9 +24,27 @@ def stringify_field_types(field_types):
23
24
return "Record<string, never>"
24
25
25
26
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 "
29
48
settings += " }"
30
49
31
50
return settings
@@ -47,7 +66,11 @@ def get_field_type_to_typescript(field):
47
66
if inspect .isclass (field ) and issubclass (field , BaseModel ):
48
67
return stringify_field_types (
49
68
{
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
+ }
51
74
for field_name , field in field .model_fields .items ()
52
75
}
53
76
)
@@ -93,9 +116,11 @@ def dump_model_type(value):
93
116
"description" : field .description ,
94
117
"default" : default ,
95
118
}
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
+ }
99
124
100
125
base_score_description = EvaluationResult .model_fields ["score" ].description
101
126
score_field = definitions .result_type .model_fields .get ("score" )
0 commit comments