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, RequestOptions};
27//!
28//! const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1";
29//!
30//! #[tokio::main]
31//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
32//!     // Needs the `ferritls` cargo feature; drop this line if you install
33//!     // your own rustls crypto provider (see `openai_interface::rest`).
34//!     # #[cfg(feature = "ferritls")]
35//!     openai_interface::rest::install_crypto_provider().ok();
36//!
37//!     let file_path = PathBuf::from("src/files/create/file-test.txt");
38//!     let create_file_request = CreateFileRequest {
39//!         file: file_path,
40//!         purpose: FilePurpose::Batch,
41//!         ..Default::default()
42//!     };
43//!
44//!     let response: FileObject = create_file_request
45//!         .get_response(&default_client(), MODELSCOPE_URL, &RequestOptions::bearer("YOUR_API_KEY"))
46//!         .await?;
47//!
48//!     println!("Uploaded file ID: {}", response.id);
49//!     println!("File size: {} bytes", response.bytes);
50//!     println!("Filename: {}", response.filename);
51//!     Ok(())
52//! }
53//! ```
54//!
55//! ## File Upload with Custom Purpose
56//!
57//! This example shows how to upload a file with a custom purpose:
58//!
59//! ```rust,no_run
60//! use std::path::PathBuf;
61//! use openai_interface::files::create::request::{CreateFileRequest, FilePurpose};
62//! use openai_interface::files::FileObject;
63//! use openai_interface::rest::{default_client, post::PostNoStream, RequestOptions};
64//!
65//! const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1";
66//!
67//! #[tokio::main]
68//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
69//!     // Needs the `ferritls` cargo feature; drop this line if you install
70//!     // your own rustls crypto provider (see `openai_interface::rest`).
71//!     # #[cfg(feature = "ferritls")]
72//!     openai_interface::rest::install_crypto_provider().ok();
73//!
74//!     let file_path = PathBuf::from("src/files/create/file-test.txt");
75//!     let create_file_request = CreateFileRequest {
76//!         file: file_path,
77//!         purpose: FilePurpose::Other("file-extract".to_string()),
78//!         ..Default::default()
79//!     };
80//!
81//!     let response: FileObject = create_file_request
82//!         .get_response(&default_client(), MODELSCOPE_URL, &RequestOptions::bearer("YOUR_API_KEY"))
83//!         .await?;
84//!
85//!     println!("Uploaded file with custom purpose: {}", response.id);
86//!     Ok(())
87//! }
88//! ```
89
90pub mod request;
91
92#[cfg(test)]
93mod tests {
94    use std::path::PathBuf;
95
96    use crate::rest::{RequestOptions, default_client, post::PostNoStream};
97
98    use super::*;
99
100    const TEST_FILE_PATH: &str = "src/files/create/file-test.txt";
101    const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1";
102
103    fn modelstudio_key() -> Option<String> {
104        std::env::var("QWEN_API_KEY")
105            .ok()
106            .map(|key| key.trim().to_string())
107            .filter(|key| !key.is_empty())
108    }
109
110    #[tokio::test]
111    async fn test_file_create() -> Result<(), anyhow::Error> {
112        let Some(api_key) = modelstudio_key() else {
113            println!("Skipping: set QWEN_API_KEY to run this test");
114            return Ok(());
115        };
116
117        let file_path = PathBuf::from(TEST_FILE_PATH);
118        let create_file_request = request::CreateFileRequest {
119            file: file_path,
120            purpose: request::FilePurpose::Other("file-extract".to_string()),
121            ..Default::default()
122        };
123
124        let response = create_file_request
125            .get_response(
126                &default_client(),
127                MODELSCOPE_URL,
128                &RequestOptions::bearer(&api_key),
129            )
130            .await?;
131
132        println!("Uploaded file ID: {}", response.id);
133        println!("File size: {} bytes", response.bytes);
134        println!("Filename: {}", response.filename);
135
136        Ok(())
137    }
138}