explain_result.mojo (4236B)
1 from std.collections import List 2 3 from json import Value, loads 4 5 from hyf_core.capabilities.query_analysis import ( 6 analyze_query_text, 7 build_deterministic_meta, 8 query_signal_tags, 9 serialize_extracted_filters, 10 string_array_value, 11 ) 12 from hyf_core.capabilities.ranking_support import ( 13 ExplainResultRequest, 14 evaluate_candidate, 15 parse_explain_result_request, 16 ) 17 from hyf_core.errors import ( 18 CapabilityResult, 19 failed_capability, 20 invalid_input_error, 21 successful_capability, 22 ) 23 from hyf_core.provenance import ProvenanceSourceRef 24 from hyf_core.request_context import RequestContext 25 26 27 def _join_reason_summary(reasons: List[String]) -> String: 28 if len(reasons) == 0: 29 return "no strong ranking signals were detected" 30 31 if len(reasons) == 1: 32 return String(reasons[0]) 33 34 var summary = String() 35 for index in range(len(reasons)): 36 if index > 0: 37 if index == len(reasons) - 1: 38 summary += " and " 39 else: 40 summary += ", " 41 summary += String(reasons[index]) 42 return summary^ 43 44 45 def _build_output( 46 result_id: String, 47 score: Int, 48 reasons: List[String], 49 matched_terms: List[String], 50 ranking_hints: List[String], 51 extracted_filters: Value, 52 delivery_alignment: String, 53 distance_band: String, 54 freshness_band: String, 55 scope_match: Bool, 56 ) raises -> Value: 57 var output = loads("{}") 58 output.set("result_id", Value(String(result_id))) 59 output.set( 60 "explanation_kind", 61 Value("deterministic"), 62 ) 63 output.set( 64 "summary", 65 Value( 66 "Result " 67 + result_id 68 + " was ranked using deterministic heuristic signals: " 69 + _join_reason_summary(reasons) 70 + "." 71 ), 72 ) 73 output.set("score", Value(score)) 74 output.set("reasons", string_array_value(reasons)) 75 output.set("matched_terms", string_array_value(matched_terms)) 76 output.set("ranking_hints", string_array_value(ranking_hints)) 77 output.set("extracted_filters", extracted_filters) 78 79 var assessment = loads("{}") 80 assessment.set("delivery_alignment", Value(String(delivery_alignment))) 81 assessment.set("distance_band", Value(String(distance_band))) 82 assessment.set("freshness_band", Value(String(freshness_band))) 83 assessment.set("scope_match", Value(scope_match)) 84 output.set("signal_assessment", assessment) 85 return output^ 86 87 88 def execute_explain_result( 89 input: Value, context: RequestContext 90 ) raises -> CapabilityResult: 91 try: 92 var request: ExplainResultRequest = parse_explain_result_request(input) 93 var analysis = analyze_query_text(request.query_text, context) 94 var evaluation = evaluate_candidate( 95 request.candidate, analysis, context 96 ) 97 98 var signal_tags = query_signal_tags(analysis) 99 for reason in evaluation.reasons: 100 signal_tags.append("reason:" + String(reason)) 101 102 var source_refs = List[ProvenanceSourceRef]() 103 source_refs.append( 104 ProvenanceSourceRef( 105 source_kind="candidate", 106 source_ref="explain_result:candidate", 107 ) 108 ) 109 110 return successful_capability( 111 _build_output( 112 result_id=evaluation.candidate.id, 113 score=evaluation.score, 114 reasons=evaluation.reasons, 115 matched_terms=evaluation.matched_terms, 116 ranking_hints=analysis.ranking_hints, 117 extracted_filters=serialize_extracted_filters( 118 analysis.extracted_filters 119 ), 120 delivery_alignment=evaluation.delivery_alignment, 121 distance_band=evaluation.distance_band, 122 freshness_band=evaluation.freshness_band, 123 scope_match=evaluation.scope_match, 124 ), 125 meta=build_deterministic_meta( 126 context=context, 127 capability_name="explain_result", 128 signal_tags=signal_tags, 129 extra_source_refs=source_refs^, 130 ), 131 ) 132 except e: 133 return failed_capability(invalid_input_error(String(e)))