@@ -18,6 +18,7 @@ defmodule Wardwright do
1818 @ choice_index_key "index"
1919 @ choices_key "choices"
2020 @ content_key "content"
21+ @ enabled_key "enabled"
2122 @ finish_reason_key "finish_reason"
2223 @ message_key "message"
2324 @ messages_key "messages"
@@ -30,6 +31,22 @@ defmodule Wardwright do
3031 @ recording_manual_mode "manual"
3132 @ refusal_key "refusal"
3233 @ role_key "role"
34+ @ server_tool_beam_module_engine "beam_module"
35+ @ server_tool_builtin_engine "builtin"
36+ @ server_tool_dune_engine "dune"
37+ @ server_tool_elixir_module_engine "elixir_module"
38+ @ server_tool_engine_key "engine"
39+ @ server_tool_input_key "input"
40+ @ server_tool_limits_key "limits"
41+ @ server_tool_module_key "module"
42+ @ server_tool_parameters_key "parameters"
43+ @ server_tool_path_key "path"
44+ @ server_tools_key "server_tools"
45+ @ server_tool_policy_cache_status "wardwright_policy_cache_status"
46+ @ server_tool_snippet_id_key "snippet_id"
47+ @ server_tool_source_key "source"
48+ @ tool_mediation_key "tool_mediation"
49+ @ tool_mediation_rules_key "rules"
3350 @ delta_key "delta"
3451 @ preserved_delta_fields_key "preserved_delta_fields"
3552 @ system_fingerprint_key "system_fingerprint"
@@ -88,7 +105,8 @@ defmodule Wardwright do
88105 @ recording_adapted_agents_key => @ recording_auto_mode ,
89106 @ recording_default_key => @ recording_manual_mode ,
90107 @ recording_generic_clients_key => @ recording_manual_mode
91- }
108+ } ,
109+ @ tool_mediation_key => % { @ tool_mediation_rules_key => [ ] }
92110 }
93111 end
94112
@@ -932,7 +950,9 @@ defmodule Wardwright do
932950 version -> version
933951 end ) ,
934952 @ description_key => normalize_description ( config ) ,
935- @ recording_key => normalize_recording ( Map . get ( config , @ recording_key , % { } ) )
953+ @ recording_key => normalize_recording ( Map . get ( config , @ recording_key , % { } ) ) ,
954+ @ server_tools_key => normalize_server_tools ( Map . get ( config , @ server_tools_key , [ ] ) ) ,
955+ @ tool_mediation_key => normalize_tool_mediation ( Map . get ( config , @ tool_mediation_key , % { } ) )
936956 }
937957 end
938958
@@ -1064,6 +1084,138 @@ defmodule Wardwright do
10641084
10651085 defp normalize_vcr ( _ ) , do: % { "mode" => "metadata_only" }
10661086
1087+ defp normalize_tool_mediation ( % { @ tool_mediation_rules_key => rules } = mediation ) when is_list ( rules ) do
1088+ mediation
1089+ |> Map . take ( [ "mode" , @ tool_mediation_rules_key ] )
1090+ |> Map . put ( @ tool_mediation_rules_key , Enum . filter ( rules , & is_map / 1 ) )
1091+ end
1092+
1093+ defp normalize_tool_mediation ( rules ) when is_list ( rules ) ,
1094+ do: % { @ tool_mediation_rules_key => Enum . filter ( rules , & is_map / 1 ) }
1095+
1096+ defp normalize_tool_mediation ( _mediation ) , do: % { @ tool_mediation_rules_key => [ ] }
1097+
1098+ defp normalize_server_tools ( tools ) when is_list ( tools ) do
1099+ tools
1100+ |> Enum . flat_map ( fn
1101+ % { @ enabled_key => false } = tool ->
1102+ tool
1103+ |> Map . delete ( @ enabled_key )
1104+ |> normalize_server_tool ( )
1105+ |> Enum . map ( & Map . put ( & 1 , @ enabled_key , false ) )
1106+
1107+ % { } = tool ->
1108+ normalize_server_tool ( tool )
1109+
1110+ @ server_tool_policy_cache_status ->
1111+ [ % { @ name_key => @ server_tool_policy_cache_status , @ server_tool_engine_key => @ server_tool_builtin_engine } ]
1112+
1113+ _tool ->
1114+ [ ]
1115+ end )
1116+ end
1117+
1118+ defp normalize_server_tools ( _tools ) , do: [ ]
1119+
1120+ defp normalize_server_tool ( tool ) do
1121+ engine = normalize_server_tool_engine ( Map . get ( tool , @ server_tool_engine_key ) , tool )
1122+
1123+ cond do
1124+ engine == @ server_tool_builtin_engine ->
1125+ tool
1126+ |> Map . get ( @ name_key , "" )
1127+ |> to_string ( )
1128+ |> String . trim ( )
1129+ |> case do
1130+ @ server_tool_policy_cache_status ->
1131+ [ % { @ name_key => @ server_tool_policy_cache_status , @ server_tool_engine_key => @ server_tool_builtin_engine } ]
1132+
1133+ _other ->
1134+ [ ]
1135+ end
1136+
1137+ engine == @ server_tool_dune_engine ->
1138+ tool
1139+ |> normalize_dune_server_tool ( )
1140+ |> List . wrap ( )
1141+
1142+ engine == @ server_tool_beam_module_engine ->
1143+ tool
1144+ |> normalize_beam_module_server_tool ( )
1145+ |> List . wrap ( )
1146+
1147+ true ->
1148+ [ ]
1149+ end
1150+ end
1151+
1152+ defp normalize_server_tool_engine ( @ server_tool_elixir_module_engine , _tool ) , do: @ server_tool_beam_module_engine
1153+
1154+ defp normalize_server_tool_engine ( engine , _tool )
1155+ when engine in [ @ server_tool_builtin_engine , @ server_tool_dune_engine , @ server_tool_beam_module_engine ] ,
1156+ do: engine
1157+
1158+ defp normalize_server_tool_engine ( _engine , tool ) do
1159+ cond do
1160+ present_string? ( Map . get ( tool , @ server_tool_source_key ) ) or
1161+ present_string? ( Map . get ( tool , @ server_tool_snippet_id_key ) ) ->
1162+ @ server_tool_dune_engine
1163+
1164+ present_string? ( Map . get ( tool , @ server_tool_module_key ) ) or present_string? ( Map . get ( tool , @ server_tool_path_key ) ) ->
1165+ @ server_tool_beam_module_engine
1166+
1167+ true ->
1168+ @ server_tool_builtin_engine
1169+ end
1170+ end
1171+
1172+ defp normalize_dune_server_tool ( tool ) do
1173+ name = tool |> Map . get ( @ name_key , "" ) |> to_string ( ) |> String . trim ( )
1174+
1175+ if name != "" and
1176+ ( present_string? ( Map . get ( tool , @ server_tool_source_key ) ) or
1177+ present_string? ( Map . get ( tool , @ server_tool_snippet_id_key ) ) ) do
1178+ tool
1179+ |> Map . take ( [
1180+ @ description_key ,
1181+ @ name_key ,
1182+ @ server_tool_input_key ,
1183+ @ server_tool_limits_key ,
1184+ @ server_tool_parameters_key ,
1185+ @ server_tool_snippet_id_key ,
1186+ @ server_tool_source_key
1187+ ] )
1188+ |> Map . put ( @ server_tool_engine_key , @ server_tool_dune_engine )
1189+ |> Map . put ( @ name_key , name )
1190+ end
1191+ end
1192+
1193+ defp normalize_beam_module_server_tool ( tool ) do
1194+ module = tool |> Map . get ( @ server_tool_module_key , "" ) |> to_string ( ) |> String . trim ( )
1195+ path = tool |> Map . get ( @ server_tool_path_key , "" ) |> to_string ( ) |> String . trim ( )
1196+
1197+ if module != "" or path != "" do
1198+ tool
1199+ |> Map . take ( [
1200+ @ description_key ,
1201+ @ name_key ,
1202+ @ server_tool_module_key ,
1203+ @ server_tool_parameters_key ,
1204+ @ server_tool_path_key
1205+ ] )
1206+ |> Map . put ( @ server_tool_engine_key , @ server_tool_beam_module_engine )
1207+ |> put_present ( @ name_key , tool |> Map . get ( @ name_key , "" ) |> to_string ( ) |> String . trim ( ) )
1208+ |> put_present ( @ server_tool_module_key , module )
1209+ |> put_present ( @ server_tool_path_key , path )
1210+ end
1211+ end
1212+
1213+ defp present_string? ( value ) when is_binary ( value ) , do: String . trim ( value ) != ""
1214+ defp present_string? ( _value ) , do: false
1215+
1216+ defp put_present ( map , _key , "" ) , do: map
1217+ defp put_present ( map , key , value ) , do: Map . put ( map , key , value )
1218+
10671219 defp validate_config ( % { "model_id" => model_id , "targets" => targets } = config ) do
10681220 cond do
10691221 model_id == "" ->
0 commit comments