rig/client/
transcription.rs

1use crate::client::{AsTranscription, ProviderClient};
2use crate::transcription::{
3    TranscriptionError, TranscriptionModel, TranscriptionModelDyn, TranscriptionRequest,
4    TranscriptionResponse,
5};
6use std::sync::Arc;
7
8/// A provider client with transcription capabilities.
9/// Clone is required for conversions between client types.
10pub trait TranscriptionClient: ProviderClient + Clone {
11    /// The type of TranscriptionModel used by the Client
12    type TranscriptionModel: TranscriptionModel;
13
14    /// Create a transcription model with the given name.
15    ///
16    /// # Example with OpenAI
17    /// ```
18    /// use rig::prelude::*;
19    /// use rig::providers::openai::{Client, self};
20    ///
21    /// // Initialize the OpenAI client
22    /// let openai = Client::new("your-open-ai-api-key");
23    ///
24    /// let whisper = openai.transcription_model(openai::WHISPER_1);
25    /// ```
26    fn transcription_model(&self, model: &str) -> Self::TranscriptionModel;
27}
28
29pub trait TranscriptionClientDyn: ProviderClient {
30    /// Create a transcription model with the given name.
31    fn transcription_model<'a>(&self, model: &str) -> Box<dyn TranscriptionModelDyn + 'a>;
32}
33
34impl<T: TranscriptionClient<TranscriptionModel = M>, M: TranscriptionModel + 'static>
35    TranscriptionClientDyn for T
36{
37    fn transcription_model<'a>(&self, model: &str) -> Box<dyn TranscriptionModelDyn + 'a> {
38        Box::new(self.transcription_model(model))
39    }
40}
41
42impl<T: TranscriptionClientDyn + Clone + 'static> AsTranscription for T {
43    fn as_transcription(&self) -> Option<Box<dyn TranscriptionClientDyn>> {
44        Some(Box::new(self.clone()))
45    }
46}
47
48/// Wraps a TranscriptionModel in a dyn-compatible way for TranscriptionRequestBuilder.
49#[derive(Clone)]
50pub struct TranscriptionModelHandle<'a> {
51    pub inner: Arc<dyn TranscriptionModelDyn + 'a>,
52}
53
54impl TranscriptionModel for TranscriptionModelHandle<'_> {
55    type Response = ();
56
57    async fn transcription(
58        &self,
59        request: TranscriptionRequest,
60    ) -> Result<TranscriptionResponse<Self::Response>, TranscriptionError> {
61        self.inner.transcription(request).await
62    }
63}