openai_interface/files/list/
mod.rs

1//! This module provides functionality for listing files from OpenAI-compatible APIs.
2//!
3//! # Examples
4//!
5//! ```rust
6//!
7//! use std::sync::LazyLock;
8//!
9//! use openai_interface::files::list::request::ListFilesRequest;
10//! use openai_interface::rest::get::{Get, GetNoStream};
11//!
12//! const QWEN_BASE_URL: &'static str = "https://dashscope.aliyuncs.com/compatible-mode/v1/";
13//! const QWEN_API_KEY: LazyLock<&str> =
14//!     LazyLock::new(|| include_str!("../../../keys/modelstudio_domestic_key").trim());
15//!
16//! #[tokio::main]
17//! async fn main() -> Result<(), anyhow::Error> {
18//!    let request = ListFilesRequest {
19//!        purpose: Some("batch".to_string()),
20//!        limit: Some(1),
21//!        // after: Some("file_123".to_string()),
22//!        ..Default::default()
23//!    };
24//!    let response = request.get_response(QWEN_BASE_URL, &QWEN_API_KEY).await?;
25//!
26//!    println!("Response: {:?}", response);
27//!
28//!    Ok(())
29//! }
30//! ```
31
32pub mod request;
33pub mod response;
34
35#[cfg(test)]
36mod tests {
37    use std::sync::LazyLock;
38
39    use super::request::*;
40    use crate::rest::get::{Get, GetNoStream};
41
42    const QWEN_BASE_URL: &'static str = "https://dashscope.aliyuncs.com/compatible-mode/v1/";
43    const QWEN_API_KEY: LazyLock<&str> =
44        LazyLock::new(|| include_str!("../../../keys/modelstudio_domestic_key").trim());
45
46    #[test]
47    fn test_build_url_no_params() {
48        let request = ListFilesRequest::default();
49        let base_url = "https://api.openai.com/v1/";
50        let url = request.build_url(base_url).expect("Failed to build url");
51        assert_eq!(url, "https://api.openai.com/v1/files");
52    }
53
54    #[test]
55    fn test_build_url_with_purpose() {
56        let request = ListFilesRequest {
57            purpose: Some("fine-tune".to_string()),
58            ..Default::default()
59        };
60        let base_url = "https://api.openai.com/v1/";
61        let url = request.build_url(base_url).expect("Failed to build url");
62        assert_eq!(url, "https://api.openai.com/v1/files?purpose=fine-tune");
63    }
64
65    #[test]
66    fn test_build_url_with_limit() {
67        let request = ListFilesRequest {
68            limit: Some(100),
69            ..Default::default()
70        };
71        let base_url = "https://api.openai.com/v1/";
72        let url = request.build_url(base_url).expect("Failed to build url");
73        assert_eq!(url, "https://api.openai.com/v1/files?limit=100");
74    }
75
76    #[test]
77    fn test_build_url_with_after() {
78        let request = ListFilesRequest {
79            after: Some("file_123".to_string()),
80            ..Default::default()
81        };
82        let base_url = "https://api.openai.com/v1/";
83        let url = request.build_url(base_url).expect("Failed to build url");
84        assert_eq!(url, "https://api.openai.com/v1/files?after=file_123");
85    }
86
87    #[test]
88    fn test_build_url_with_all_params() {
89        let request = ListFilesRequest {
90            purpose: Some("assistants".to_string()),
91            limit: Some(50),
92            after: Some("file_abc".to_string()),
93        };
94        let base_url = "https://api.openai.com/v1/";
95        let url = request.build_url(base_url).expect("Failed to build url");
96        // Note: URL parameters are ordered alphabetically by the url crate
97        assert!(url.contains("after=file_abc"));
98        assert!(url.contains("limit=50"));
99        assert!(url.contains("purpose=assistants"));
100        assert!(url.starts_with("https://api.openai.com/v1/files?"));
101    }
102
103    #[test]
104    fn test_build_url_encoding() {
105        let request = ListFilesRequest {
106            purpose: Some("fine tune".to_string()), // Space should be encoded
107            ..Default::default()
108        };
109        let base_url = "https://api.openai.com/v1/";
110        let url = request.build_url(base_url).expect("Failed to build url");
111        assert_eq!(url, "https://api.openai.com/v1/files?purpose=fine+tune");
112    }
113
114    #[tokio::test]
115    async fn test_query_qwen_no_params() -> Result<(), anyhow::Error> {
116        let request = ListFilesRequest::default();
117        let response = request.get_response(QWEN_BASE_URL, &QWEN_API_KEY).await?;
118
119        println!("Response: {:?}", response);
120
121        Ok(())
122    }
123
124    #[tokio::test]
125    async fn test_query_qwen_with_params() -> Result<(), anyhow::Error> {
126        let request = ListFilesRequest {
127            purpose: Some("batch".to_string()),
128            limit: Some(1),
129            // after: Some("file_123".to_string()),
130            ..Default::default()
131        };
132        let response = request.get_response(QWEN_BASE_URL, &QWEN_API_KEY).await?;
133
134        println!("Response: {:?}", response);
135
136        Ok(())
137    }
138}