rig/client/
audio_generation.rs

1#[cfg(feature = "audio")]
2mod audio {
3    use crate::audio_generation::{
4        AudioGenerationError, AudioGenerationModel, AudioGenerationModelDyn,
5        AudioGenerationRequest, AudioGenerationResponse,
6    };
7    use crate::client::{AsAudioGeneration, ProviderClient};
8    use std::future::Future;
9    use std::sync::Arc;
10
11    /// A provider client with audio generation capabilities.
12    /// Clone is required for conversions between client types.
13    pub trait AudioGenerationClient: ProviderClient + Clone {
14        /// The AudioGenerationModel used by the Client
15        type AudioGenerationModel: AudioGenerationModel;
16
17        /// Create an audio generation model with the given name.
18        ///
19        /// # Example
20        /// ```
21        /// use rig::providers::openai::{Client, self};
22        ///
23        /// // Initialize the OpenAI client
24        /// let openai = Client::new("your-open-ai-api-key");
25        ///
26        /// let tts = openai.audio_generation_model(openai::TTS_1);
27        /// ```
28        fn audio_generation_model(&self, model: &str) -> Self::AudioGenerationModel;
29    }
30
31    pub trait AudioGenerationClientDyn: ProviderClient {
32        fn audio_generation_model<'a>(&self, model: &str) -> Box<dyn AudioGenerationModelDyn + 'a>;
33    }
34
35    impl<T, M> AudioGenerationClientDyn for T
36    where
37        T: AudioGenerationClient<AudioGenerationModel = M>,
38        M: AudioGenerationModel + 'static,
39    {
40        fn audio_generation_model<'a>(&self, model: &str) -> Box<dyn AudioGenerationModelDyn + 'a> {
41            Box::new(self.audio_generation_model(model))
42        }
43    }
44
45    impl<T> AsAudioGeneration for T
46    where
47        T: AudioGenerationClientDyn + Clone + 'static,
48    {
49        fn as_audio_generation(&self) -> Option<Box<dyn AudioGenerationClientDyn>> {
50            Some(Box::new(self.clone()))
51        }
52    }
53
54    /// Wraps a AudioGenerationModel in a dyn-compatible way for AudioGenerationRequestBuilder.
55    #[derive(Clone)]
56    pub struct AudioGenerationModelHandle<'a> {
57        pub(crate) inner: Arc<dyn AudioGenerationModelDyn + 'a>,
58    }
59
60    impl AudioGenerationModel for AudioGenerationModelHandle<'_> {
61        type Response = ();
62
63        fn audio_generation(
64            &self,
65            request: AudioGenerationRequest,
66        ) -> impl Future<
67            Output = Result<AudioGenerationResponse<Self::Response>, AudioGenerationError>,
68        > + Send {
69            self.inner.audio_generation(request)
70        }
71    }
72}
73
74#[cfg(feature = "audio")]
75pub use audio::*;