@@ -306,14 +306,24 @@ def create_judge(
306306 print('Relevance score:', relevance_eval.score)
307307 """
308308 self ._client .track (_TRACK_USAGE_CREATE_JUDGE , context , key , 1 )
309+ return self ._create_judge_instance (key , context , default , variables , default_ai_provider )
309310
310- try :
311- if variables :
312- if 'message_history' in variables :
313- pass
314- if 'response_to_evaluate' in variables :
315- pass
311+ def _create_judge_instance (
312+ self ,
313+ key : str ,
314+ context : Context ,
315+ default : Optional [AIJudgeConfigDefault ] = None ,
316+ variables : Optional [Dict [str , Any ]] = None ,
317+ default_ai_provider : Optional [str ] = None ,
318+ sample_rate : float = 1.0 ,
319+ ) -> Optional [Judge ]:
320+ """
321+ Construct a Judge for ``key`` without emitting the public create-judge usage event.
316322
323+ Used both by the public :meth:`create_judge` and by :meth:`_build_evaluator`
324+ when materializing judges referenced by an AI config's judge configuration.
325+ """
326+ try :
317327 extended_variables = dict (variables ) if variables else {}
318328 extended_variables ['message_history' ] = '{{message_history}}'
319329 extended_variables ['response_to_evaluate' ] = '{{response_to_evaluate}}'
@@ -329,45 +339,11 @@ def create_judge(
329339 if not provider :
330340 return None
331341
332- return Judge (judge_config , provider )
333- except Exception as error :
342+ return Judge (judge_config , provider , sample_rate = sample_rate )
343+ except Exception as e :
344+ log .warning ('Failed to initialize judge %r: %s' , key , e )
334345 return None
335346
336- def _initialize_judges (
337- self ,
338- judge_configs : List [JudgeConfiguration .Judge ],
339- context : Context ,
340- variables : Optional [Dict [str , Any ]] = None ,
341- default_ai_provider : Optional [str ] = None ,
342- ) -> Dict [str , Judge ]:
343- """
344- Initialize judges from judge configurations.
345-
346- :param judge_configs: List of judge configurations
347- :param context: Standard Context used when evaluating flags
348- :param variables: Dictionary of values for instruction interpolation
349- :param default_ai_provider: Optional default AI provider to use
350- :return: Dictionary of judge instances keyed by their configuration keys
351- """
352- judges : Dict [str , Judge ] = {}
353-
354- for judge_config in judge_configs :
355- try :
356- judge = self .create_judge (
357- judge_config .key ,
358- context ,
359- AIJudgeConfigDefault .disabled (),
360- variables ,
361- default_ai_provider ,
362- )
363- if judge :
364- judges [judge_config .key ] = judge
365- except Exception as e :
366- log .warning (f'Failed to initialize judge { judge_config .key !r} : { e } ' )
367- continue
368-
369- return judges
370-
371347 def _build_evaluator (
372348 self ,
373349 judge_configuration : Optional [JudgeConfiguration ],
@@ -387,11 +363,19 @@ def _build_evaluator(
387363 """
388364 if not judge_configuration or not judge_configuration .judges :
389365 return Evaluator .noop ()
390- judges = self ._initialize_judges (
391- judge_configuration .judges , context , default_ai_provider = default_ai_provider ,
392- variables = variables ,
393- )
394- return Evaluator (judges , judge_configuration )
366+ judge_instances : List [Judge ] = []
367+ for jc in judge_configuration .judges :
368+ judge = self ._create_judge_instance (
369+ jc .key ,
370+ context ,
371+ AIJudgeConfigDefault .disabled (),
372+ variables ,
373+ default_ai_provider ,
374+ sample_rate = jc .sampling_rate ,
375+ )
376+ if judge is not None :
377+ judge_instances .append (judge )
378+ return Evaluator (judge_instances )
395379
396380 async def create_model (
397381 self ,
0 commit comments