sarvam-rs 0.2.0

Rust SDK for Sarvam AI APIs — chat, translation, speech-to-text, text-to-speech, transliteration, and language identification
Documentation
use crate::config::SarvamConfig;
use crate::error::{Result, SarvamError};
use crate::types::translate::*;
use crate::types::transliterate::*;

pub struct TextApi {
    config: SarvamConfig,
    client: reqwest::Client,
}

impl TextApi {
    pub(crate) fn new(config: SarvamConfig, client: reqwest::Client) -> Self {
        Self { config, client }
    }

    pub async fn translate(&self, request: TranslationRequest) -> Result<TranslationResponse> {
        let url = format!("{}/translate", self.config.base_url);

        let response = self
            .client
            .post(&url)
            .header("api-subscription-key", &self.config.api_subscription_key)
            .json(&request)
            .timeout(self.config.timeout)
            .send()
            .await?;

        let status = response.status();
        if !status.is_success() {
            let body = response.text().await.unwrap_or_default();
            return Err(SarvamError::from_response(status, &body));
        }

        response
            .json::<TranslationResponse>()
            .await
            .map_err(SarvamError::from)
    }

    pub async fn transliterate(
        &self,
        request: TransliterationRequest,
    ) -> Result<TransliterationResponse> {
        let url = format!("{}/transliterate", self.config.base_url);

        let response = self
            .client
            .post(&url)
            .header("api-subscription-key", &self.config.api_subscription_key)
            .json(&request)
            .timeout(self.config.timeout)
            .send()
            .await?;

        let status = response.status();
        if !status.is_success() {
            let body = response.text().await.unwrap_or_default();
            return Err(SarvamError::from_response(status, &body));
        }

        response
            .json::<TransliterationResponse>()
            .await
            .map_err(SarvamError::from)
    }

    pub async fn identify_language(
        &self,
        request: LanguageIdentificationRequest,
    ) -> Result<LanguageIdentificationResponse> {
        let url = format!("{}/text-lid", self.config.base_url);

        let response = self
            .client
            .post(&url)
            .header("api-subscription-key", &self.config.api_subscription_key)
            .json(&request)
            .timeout(self.config.timeout)
            .send()
            .await?;

        let status = response.status();
        if !status.is_success() {
            let body = response.text().await.unwrap_or_default();
            return Err(SarvamError::from_response(status, &body));
        }

        response
            .json::<LanguageIdentificationResponse>()
            .await
            .map_err(SarvamError::from)
    }
}