pub mod client;
pub mod completion;
pub mod embedding;
pub mod responses_api;
#[cfg(feature = "audio")]
#[cfg_attr(docsrs, doc(cfg(feature = "audio")))]
pub mod audio_generation;
#[cfg(feature = "image")]
#[cfg_attr(docsrs, doc(cfg(feature = "image")))]
pub mod image_generation;
#[cfg(feature = "image")]
pub use image_generation::*;
pub mod transcription;
pub use client::*;
pub use completion::*;
pub use embedding::*;
pub(crate) fn sanitize_schema(schema: &mut serde_json::Value) {
use serde_json::Value;
if let Value::Object(obj) = schema {
let is_object_schema = obj.get("type") == Some(&Value::String("object".to_string()))
|| obj.contains_key("properties");
if is_object_schema && !obj.contains_key("additionalProperties") {
obj.insert("additionalProperties".to_string(), Value::Bool(false));
}
if let Some(Value::Object(properties)) = obj.get("properties") {
let prop_keys = properties.keys().cloned().map(Value::String).collect();
obj.insert("required".to_string(), Value::Array(prop_keys));
}
if let Some(defs) = obj.get_mut("$defs")
&& let Value::Object(defs_obj) = defs
{
for (_, def_schema) in defs_obj.iter_mut() {
sanitize_schema(def_schema);
}
}
if let Some(properties) = obj.get_mut("properties")
&& let Value::Object(props) = properties
{
for (_, prop_value) in props.iter_mut() {
sanitize_schema(prop_value);
}
}
if let Some(items) = obj.get_mut("items") {
sanitize_schema(items);
}
if let Some(one_of) = obj.remove("oneOf") {
match obj.get_mut("anyOf") {
Some(Value::Array(existing)) => {
if let Value::Array(mut incoming) = one_of {
existing.append(&mut incoming);
}
}
_ => {
obj.insert("anyOf".to_string(), one_of);
}
}
}
for key in ["anyOf", "oneOf", "allOf"] {
if let Some(variants) = obj.get_mut(key)
&& let Value::Array(variants_array) = variants
{
for variant in variants_array.iter_mut() {
sanitize_schema(variant);
}
}
}
}
}
#[cfg(feature = "audio")]
pub use audio_generation::{TTS_1, TTS_1_HD};
pub use streaming::*;
pub use transcription::*;