///|
/// LucentRequest JSON 序列化
pub fn LucentRequest::to_json(self : LucentRequest) -> Json {
  let fields : Map[String, Json] = {
    "schema_version": Json::string(self.schema_version),
    "model": Json::string(self.model),
    "conversation": Json::array(self.conversation.map(fn(ci) { ci.to_json() })),
    "options": self.options.to_json(),
  }
  match self.instructions {
    Some(instrs) =>
      fields["instructions"] = Json::array(instrs.map(fn(c) { c.to_json() }))
    None => ()
  }
  match self.tools {
    Some(tools) =>
      fields["tools"] = Json::array(tools.map(fn(t) { t.to_json() }))
    None => ()
  }
  match self.tool_choice {
    Some(tc) => fields["tool_choice"] = tc.to_json()
    None => ()
  }
  match self.capabilities {
    Some(cap) => fields["capabilities"] = cap.to_json()
    None => ()
  }
  match self.reasoning {
    Some(rc) => fields["reasoning"] = rc.to_json()
    None => ()
  }
  match self.metadata {
    Some(m) => {
      let meta_fields : Map[String, Json] = Map([])
      for entry in m {
        match entry {
          (k, v) => meta_fields[k] = Json::string(v)
        }
      }
      if meta_fields.length() > 0 {
        fields["metadata"] = Json::object(meta_fields)
      }
    }
    None => ()
  }
  match self.extra {
    Some(e) => {
      let extra_fields : Map[String, Json] = Map([])
      for entry in e {
        match entry {
          (k, v) => extra_fields[k] = v
        }
      }
      if extra_fields.length() > 0 {
        fields["extra"] = Json::object(extra_fields)
      }
    }
    None => ()
  }
  Json::object(fields)
}

///|
/// ConversationSnapshot 序列化(T8;宿主持久化用,不参与 wire)
pub fn ConversationSnapshot::to_json(self : ConversationSnapshot) -> Json {
  let fields : Map[String, Json] = {
    "response_id": Json::string(self.response_id),
    "request": self.request.to_json(),
  }
  match self.response_text {
    Some(t) => fields["response_text"] = Json::string(t)
    None => ()
  }
  Json::object(fields)
}