hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

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^