schema.mojo (4279B)
1 from json import Value, loads 2 3 from hyf_core.request_context import RequestContext 4 from hyf_provider.config import MaxLocalProviderConfig 5 6 7 def query_rewrite_schema_version() -> Int: 8 return 1 9 10 11 def query_rewrite_prompt_version() -> String: 12 return "max_local_query_rewrite_v1" 13 14 15 def query_rewrite_schema() raises -> Value: 16 var schema = loads("{}") 17 schema.set("type", Value("object")) 18 schema.set("additionalProperties", Value(False)) 19 20 var required = loads("[]") 21 required.append(Value("original_text")) 22 required.append(Value("normalized_text")) 23 required.append(Value("rewritten_text")) 24 required.append(Value("query_terms")) 25 required.append(Value("normalization_signals")) 26 required.append(Value("ranking_hints")) 27 required.append(Value("extracted_filters")) 28 schema.set("required", required) 29 30 var properties = loads("{}") 31 properties.set("original_text", loads('{"type":"string"}')) 32 properties.set("normalized_text", loads('{"type":"string"}')) 33 properties.set("rewritten_text", loads('{"type":"string"}')) 34 properties.set( 35 "query_terms", 36 loads('{"type":"array","items":{"type":"string"}}'), 37 ) 38 properties.set( 39 "normalization_signals", 40 loads('{"type":"array","items":{"type":"string"}}'), 41 ) 42 properties.set( 43 "ranking_hints", 44 loads('{"type":"array","items":{"type":"string"}}'), 45 ) 46 properties.set( 47 "extracted_filters", 48 loads( 49 '{"type":"object","additionalProperties":false,"required":["local_intent","fulfillment","time_window"],"properties":{"local_intent":{"type":"boolean"},"fulfillment":{"type":"string"},"time_window":{"type":"string"}}}' 50 ), 51 ) 52 schema.set("properties", properties) 53 return schema^ 54 55 56 def query_rewrite_system_prompt() -> String: 57 return ( 58 "Return only strict JSON matching the supplied schema. Preserve " 59 + "original_text, normalized_text, rewritten_text, query_terms, " 60 + "normalization_signals, ranking_hints, and extracted_filters." 61 ) 62 63 64 def build_query_rewrite_user_prompt( 65 text: String, context: RequestContext 66 ) -> String: 67 var prompt = ( 68 "Rewrite the market search query into normalized search terms and " 69 + "extracted filters.\nquery: " 70 + text 71 + "\n" 72 ) 73 74 if context.scope and len(context.scope.value().listing_ids) > 0: 75 var first = True 76 prompt += "scope_listing_ids: " 77 for listing_id in context.scope.value().listing_ids: 78 if not first: 79 prompt += "," 80 prompt += String(listing_id) 81 first = False 82 prompt += "\n" 83 84 if context.time_range: 85 prompt += ( 86 "time_range: " 87 + context.time_range.value().start 88 + " -> " 89 + context.time_range.value().end 90 + "\n" 91 ) 92 93 prompt += "consistency: " + context.consistency + "\n" 94 prompt += "evidence_limit: " + String(context.evidence_limit) + "\n" 95 prompt += "explain_plan: " + String(context.explain_plan) + "\n" 96 return prompt^ 97 98 99 def build_query_rewrite_request_body( 100 config: MaxLocalProviderConfig, text: String, context: RequestContext 101 ) raises -> Value: 102 var body = loads("{}") 103 body.set("model", Value(String(config.model))) 104 105 var messages = loads("[]") 106 107 var system_message = loads("{}") 108 system_message.set("role", Value("system")) 109 system_message.set("content", Value(query_rewrite_system_prompt())) 110 messages.append(system_message) 111 112 var user_message = loads("{}") 113 user_message.set("role", Value("user")) 114 user_message.set( 115 "content", Value(build_query_rewrite_user_prompt(text, context)) 116 ) 117 messages.append(user_message) 118 119 body.set("messages", messages) 120 body.set("temperature", Value(0.1)) 121 body.set("max_tokens", Value(256)) 122 123 var response_format = loads("{}") 124 response_format.set("type", Value("json_schema")) 125 126 var json_schema = loads("{}") 127 json_schema.set("name", Value("query_rewrite")) 128 json_schema.set("strict", Value(True)) 129 json_schema.set("schema", query_rewrite_schema()) 130 response_format.set("json_schema", json_schema) 131 132 body.set("response_format", response_format) 133 return body^