portkey_sdk/service/
models.rs

1//! Models API service.
2//!
3//! This module provides methods for listing available models through Portkey.
4
5use std::future::Future;
6
7use crate::client::PortkeyClient;
8use crate::error::Result;
9use crate::model::{ListModelsParams, ListModelsResponse, ModelSortField, SortOrder};
10
11/// Trait for Models API operations.
12pub trait ModelsService {
13    /// Lists the currently available models.
14    ///
15    /// Returns information about models that can be used through Portkey.
16    /// Supports filtering by provider, AI service, and pagination.
17    ///
18    /// # Arguments
19    ///
20    /// * `params` - Optional parameters for filtering and pagination
21    ///
22    /// # Returns
23    ///
24    /// Returns a `ListModelsResponse` containing available models.
25    ///
26    /// # Example
27    ///
28    /// ```no_run
29    /// use portkey_sdk::{PortkeyConfig, PortkeyClient};
30    /// use portkey_sdk::service::ModelsService;
31    /// use portkey_sdk::model::ListModelsParams;
32    ///
33    /// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
34    /// let config = PortkeyConfig::builder()
35    ///     .with_api_key("your-api-key")
36    ///     .build()?;
37    /// let client = PortkeyClient::new(config)?;
38    ///
39    /// // List all models
40    /// let models = client.list_models(None).await?;
41    /// println!("Found {} models", models.data.len());
42    ///
43    /// // List models with filters
44    /// let params = ListModelsParams {
45    ///     provider: Some("openai".to_string()),
46    ///     limit: Some(10),
47    ///     ..Default::default()
48    /// };
49    /// let models = client.list_models(Some(params)).await?;
50    /// # Ok(())
51    /// # }
52    /// ```
53    fn list_models(
54        &self,
55        params: Option<ListModelsParams>,
56    ) -> impl Future<Output = Result<ListModelsResponse>>;
57}
58
59impl ModelsService for PortkeyClient {
60    async fn list_models(&self, params: Option<ListModelsParams>) -> Result<ListModelsResponse> {
61        let mut request = self.request_builder(reqwest::Method::GET, "/models")?;
62
63        // Add query parameters if provided
64        if let Some(p) = params {
65            if let Some(ai_service) = p.ai_service {
66                request = request.query(&[("ai_service", ai_service)]);
67            }
68            if let Some(provider) = p.provider {
69                request = request.query(&[("provider", provider)]);
70            }
71            if let Some(limit) = p.limit {
72                request = request.query(&[("limit", limit.to_string())]);
73            }
74            if let Some(offset) = p.offset {
75                request = request.query(&[("offset", offset.to_string())]);
76            }
77            if let Some(sort) = p.sort {
78                let sort_str = match sort {
79                    ModelSortField::Name => "name",
80                    ModelSortField::Provider => "provider",
81                    ModelSortField::AiService => "ai_service",
82                };
83                request = request.query(&[("sort", sort_str)]);
84            }
85            if let Some(order) = p.order {
86                let order_str = match order {
87                    SortOrder::Asc => "asc",
88                    SortOrder::Desc => "desc",
89                };
90                request = request.query(&[("order", order_str)]);
91            }
92        }
93
94        let response = request.send().await?;
95        let response = response.error_for_status()?;
96        let models_response: ListModelsResponse = response.json().await?;
97        Ok(models_response)
98    }
99}
100
101#[cfg(test)]
102mod tests {
103    use super::*;
104
105    #[test]
106    fn test_list_models_params() {
107        let params = ListModelsParams {
108            provider: Some("openai".to_string()),
109            limit: Some(10),
110            ..Default::default()
111        };
112
113        assert_eq!(params.provider, Some("openai".to_string()));
114        assert_eq!(params.limit, Some(10));
115    }
116}