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}