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<M, T> TranscriptionClientDyn for T
35where
36    T: TranscriptionClient<TranscriptionModel = M>,
37    M: TranscriptionModel + 'static,
38{
39    fn transcription_model<'a>(&self, model: &str) -> Box<dyn TranscriptionModelDyn + 'a> {
40        Box::new(self.transcription_model(model))
41    }
42}
43
44impl<T> AsTranscription for T
45where
46    T: TranscriptionClientDyn + Clone + 'static,
47{
48    fn as_transcription(&self) -> Option<Box<dyn TranscriptionClientDyn>> {
49        Some(Box::new(self.clone()))
50    }
51}
52
53/// Wraps a TranscriptionModel in a dyn-compatible way for TranscriptionRequestBuilder.
54#[derive(Clone)]
55pub struct TranscriptionModelHandle<'a> {
56    pub inner: Arc<dyn TranscriptionModelDyn + 'a>,
57}
58
59impl TranscriptionModel for TranscriptionModelHandle<'_> {
60    type Response = ();
61
62    async fn transcription(
63        &self,
64        request: TranscriptionRequest,
65    ) -> Result<TranscriptionResponse<Self::Response>, TranscriptionError> {
66        self.inner.transcription(request).await
67    }
68}