pub const PROVIDER_NAME: &str = "openai";
pub mod completion;
pub mod embedding;
pub mod extension;
pub(crate) mod options;
pub mod responses_api;
pub mod wire;
pub use crate::client::openai::OpenAI;
pub use wire::{OpenAIConfig, Route};
#[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 completion::*;
pub use embedding::*;
pub(crate) fn sanitize_schema(schema: &mut serde_json::Value) {
crate::providers::internal::schema::sanitize_schema(
schema,
crate::providers::internal::schema::SanitizeOptions {
strip_ref_siblings: true,
inject_empty_properties: true,
strip_numeric_constraints: false,
},
);
}
pub(crate) fn structured_output_schema(schema: schemars::Schema) -> (String, serde_json::Value) {
let name = schema
.as_object()
.and_then(|object| object.get("title"))
.and_then(|title| title.as_str())
.unwrap_or("response_schema")
.to_string();
let mut value = schema.to_value();
sanitize_schema(&mut value);
(name, value)
}
#[cfg(feature = "audio")]
pub use audio_generation::{TTS_1, TTS_1_HD};
pub use transcription::*;
pub(crate) fn reads_images(model: &str) -> bool {
const TEXT_ONLY: [&str; 9] = [
"gpt-3.5",
"gpt-4-32k",
"gpt-4-0125-preview",
"gpt-4-1106-preview",
"gpt-4-turbo-preview",
"o1-mini",
"o1-preview",
"o3-mini",
"gpt-5.3-codex-spark",
];
let model = model.to_ascii_lowercase();
!(matches!(model.as_str(), "gpt-4" | "gpt-4-0613" | "gpt-4-0314")
|| TEXT_ONLY.iter().any(|prefix| model.starts_with(prefix)))
}
#[cfg(test)]
mod tests;