use std::future::Future;
use bytes::Bytes;
use serde::Deserialize;
use serde::Serialize;
use tokio_util::sync::CancellationToken;
use crate::error::ProviderError;
use crate::language_model::RequestMetadata;
use crate::language_model::ResponseMetadata;
use crate::shared::Headers;
use crate::shared::MediaType;
use crate::shared::ModelId;
use crate::shared::ProviderId;
use crate::shared::ProviderMetadata;
use crate::shared::ProviderOptions;
use crate::shared::Warning;
use crate::shared::base64_bytes;
pub trait SpeechModel: Send + Sync + 'static {
fn provider(&self) -> &ProviderId;
fn model_id(&self) -> &ModelId;
fn do_generate(
&self,
options: SpeechOptions,
) -> impl Future<Output = Result<SpeechResult, ProviderError>> + Send;
}
#[derive(Debug, Clone, Default)]
pub struct SpeechOptions {
pub text: String,
pub voice: Option<String>,
pub output_format: Option<String>,
pub instructions: Option<String>,
pub speed: Option<f64>,
pub language: Option<String>,
pub provider_options: ProviderOptions,
pub headers: Headers,
pub cancellation: CancellationToken,
}
impl SpeechOptions {
#[must_use]
pub fn new(text: impl Into<String>) -> Self {
Self {
text: text.into(),
..Self::default()
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SpeechResult {
#[serde(with = "base64_bytes")]
pub audio: Bytes,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub media_type: Option<MediaType>,
#[serde(default)]
pub warnings: Vec<Warning>,
#[serde(default)]
pub request: RequestMetadata,
#[serde(default)]
pub response: ResponseMetadata,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider_metadata: Option<ProviderMetadata>,
}