///|
/// LucentResponse JSON εΊεˆ—εŒ–
pub fn LucentUsage::to_json(self : LucentUsage) -> Json {
  let fields : Map[String, Json] = {
    "prompt_tokens": self.prompt_tokens.to_json(),
    "completion_tokens": self.completion_tokens.to_json(),
    "total_tokens": self.total_tokens.to_json(),
  }
  match self.reasoning_tokens {
    Some(n) => fields["reasoning_tokens"] = n.to_json()
    None => ()
  }
  match self.cached_tokens {
    Some(n) => fields["cached_tokens"] = n.to_json()
    None => ()
  }
  match self.cache_creation_tokens {
    Some(n) => fields["cache_creation_tokens"] = n.to_json()
    None => ()
  }
  Json::object(fields)
}

///|
pub fn LucentFinishReason::to_json(self : LucentFinishReason) -> Json {
  Json::string(self.to_string())
}

///|
pub fn LucentSafetyRating::to_json(self : LucentSafetyRating) -> Json {
  Json::object({
    "category": Json::string(self.category),
    "probability": Json::string(self.probability),
  })
}

///|
pub fn LucentChoice::to_json(self : LucentChoice) -> Json {
  let fields : Map[String, Json] = {
    "index": self.index.to_json(),
    "message": self.message.to_json(),
    "finish_reason": self.finish_reason.to_json(),
  }
  match self.safety_ratings {
    Some(arr) =>
      fields["safety_ratings"] = Json::array(arr.map(fn(sr) { sr.to_json() }))
    None => ()
  }
  Json::object(fields)
}

///|
pub fn LucentResponse::to_json(self : LucentResponse) -> Json {
  let fields : Map[String, Json] = {
    "schema_version": Json::string(self.schema_version),
    "id": Json::string(self.id),
    "model": Json::string(self.model),
    "choices": Json::array(self.choices.map(fn(c) { c.to_json() })),
  }
  match self.created_at {
    Some(n) => fields["created_at"] = n.to_json()
    None => ()
  }
  match self.usage {
    Some(u) => fields["usage"] = u.to_json()
    None => ()
  }
  match self.provider_payload {
    Some(p) => fields["provider_payload"] = p
    None => ()
  }
  Json::object(fields)
}

///|
pub fn LucentError::to_json(self : LucentError) -> Json {
  let fields : Map[String, Json] = {
    "kind": self.kind.to_json(),
    "message": Json::string(self.message),
  }
  match self.provider_code {
    Some(c) => fields["provider_code"] = Json::string(c)
    None => ()
  }
  Json::object(fields)
}

///|
pub fn LucentErrorKind::to_json(self : LucentErrorKind) -> Json {
  match self {
    RateLimit => Json::string("rate_limit")
    InvalidRequest => Json::string("invalid_request")
    Authentication => Json::string("authentication")
    ServerError => Json::string("server_error")
    ContentFilter => Json::string("content_filter")
    Native(s) => Json::string(s)
  }
}

///|
pub fn LucentConversationMeta::to_json(self : LucentConversationMeta) -> Json {
  let fields : Map[String, Json] = Map([])
  match self.id {
    Some(id) => fields["id"] = Json::string(id)
    None => ()
  }
  match self.model {
    Some(m) => fields["model"] = Json::string(m)
    None => ()
  }
  match self.usage_input {
    Some(n) => fields["usage_input"] = n.to_json()
    None => ()
  }
  match self.created_at {
    Some(ts) => fields["created_at"] = ts.to_json()
    None => ()
  }
  match self.extra {
    Some(ex) => fields["extra"] = ex
    None => ()
  }
  Json::object(fields)
}