Skip to main content

openai_interface/files/create/
mod.rs

1//! File upload functionality for OpenAI-compatible APIs
2//!
3//! This module provides functionality for uploading files to OpenAI-compatible APIs.
4//! Files can be uploaded for various purposes such as fine-tuning, batch processing,
5//! assistants, and more.
6//!
7//! # Overview
8//!
9//! The `create` module contains:
10//! - [`request`]: File upload request types and functionality
11//! - Support for multipart/form-data file uploads
12//! - Comprehensive error handling for file operations
13//!
14//! The response object is in [`super`]
15//!
16//! # Examples
17//!
18//! ## Basic File Upload
19//!
20//! This example demonstrates how to upload a file for batch processing:
21//!
22//! ```rust,no_run
23//! use std::path::PathBuf;
24//! use openai_interface::files::create::request::{CreateFileRequest, FilePurpose};
25//! use openai_interface::files::FileObject;
26//! use openai_interface::rest::{default_client, post::PostNoStream};
27//!
28//! const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/files";
29//!
30//! #[tokio::main]
31//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
32//!     let file_path = PathBuf::from("src/files/create/file-test.txt");
33//!     let create_file_request = CreateFileRequest {
34//!         file: file_path,
35//!         purpose: FilePurpose::Batch,
36//!         ..Default::default()
37//!     };
38//!
39//!     let response: FileObject = create_file_request
40//!         .get_response(&default_client(), MODELSCOPE_URL, "YOUR_API_KEY")
41//!         .await?;
42//!
43//!     println!("Uploaded file ID: {}", response.id);
44//!     println!("File size: {} bytes", response.bytes);
45//!     println!("Filename: {}", response.filename);
46//!     Ok(())
47//! }
48//! ```
49//!
50//! ## File Upload with Custom Purpose
51//!
52//! This example shows how to upload a file with a custom purpose:
53//!
54//! ```rust,no_run
55//! use std::path::PathBuf;
56//! use openai_interface::files::create::request::{CreateFileRequest, FilePurpose};
57//! use openai_interface::files::FileObject;
58//! use openai_interface::rest::{default_client, post::PostNoStream};
59//!
60//! const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/files";
61//!
62//! #[tokio::main]
63//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
64//!     let file_path = PathBuf::from("src/files/create/file-test.txt");
65//!     let create_file_request = CreateFileRequest {
66//!         file: file_path,
67//!         purpose: FilePurpose::Other("file-extract".to_string()),
68//!         ..Default::default()
69//!     };
70//!
71//!     let response: FileObject = create_file_request
72//!         .get_response(&default_client(), MODELSCOPE_URL, "YOUR_API_KEY")
73//!         .await?;
74//!
75//!     println!("Uploaded file with custom purpose: {}", response.id);
76//!     Ok(())
77//! }
78//! ```
79
80pub mod request;
81
82#[cfg(test)]
83mod tests {
84    use std::path::PathBuf;
85
86    use crate::rest::{default_client, post::PostNoStream};
87
88    use super::*;
89
90    const TEST_FILE_PATH: &str = "src/files/create/file-test.txt";
91    const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/files";
92
93    fn modelstudio_key() -> Option<String> {
94        std::env::var("QWEN_API_KEY")
95            .ok()
96            .map(|key| key.trim().to_string())
97            .filter(|key| !key.is_empty())
98    }
99
100    #[tokio::test]
101    async fn test_file_create() -> Result<(), anyhow::Error> {
102        let Some(api_key) = modelstudio_key() else {
103            println!("Skipping: set QWEN_API_KEY to run this test");
104            return Ok(());
105        };
106
107        let file_path = PathBuf::from(TEST_FILE_PATH);
108        let create_file_request = request::CreateFileRequest {
109            file: file_path,
110            purpose: request::FilePurpose::Other("file-extract".to_string()),
111            ..Default::default()
112        };
113
114        let response = create_file_request
115            .get_response(&default_client(), MODELSCOPE_URL, &api_key)
116            .await?;
117
118        println!("Uploaded file ID: {}", response.id);
119        println!("File size: {} bytes", response.bytes);
120        println!("Filename: {}", response.filename);
121
122        Ok(())
123    }
124}