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
23//! use std::path::PathBuf;
24//! use std::sync::LazyLock;
25//! use openai_interface::files::create::request::{CreateFileRequest, FilePurpose};
26//! use openai_interface::files::FileObject;
27//! use openai_interface::rest::post::PostNoStream;
28//!
29//! const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/files";
30//! const MODELSCOPE_KEY: LazyLock<&str> =
31//!     LazyLock::new(|| include_str!("../../../keys/modelstudio_domestic_key").trim());
32//!
33//! #[tokio::main]
34//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
35//!     let file_path = PathBuf::from("src/files/create/file-test.txt");
36//!     let create_file_request = CreateFileRequest {
37//!         file: file_path,
38//!         purpose: FilePurpose::Batch,
39//!         ..Default::default()
40//!     };
41//!
42//!     let response: FileObject = create_file_request
43//!         .get_response(MODELSCOPE_URL, MODELSCOPE_KEY.as_ref())
44//!         .await?;
45//!
46//!     println!("Uploaded file ID: {}", response.id);
47//!     println!("File size: {} bytes", response.bytes);
48//!     println!("Filename: {}", response.filename);
49//!     Ok(())
50//! }
51//! ```
52//!
53//! ## File Upload with Custom Purpose
54//!
55//! This example shows how to upload a file with a custom purpose:
56//!
57//! ```rust
58//! use std::path::PathBuf;
59//! use std::sync::LazyLock;
60//! use openai_interface::files::create::request::{CreateFileRequest, FilePurpose};
61//! use openai_interface::files::FileObject;
62//! use openai_interface::rest::post::PostNoStream;
63//!
64//! const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/files";
65//! const MODELSCOPE_KEY: LazyLock<&str> =
66//!     LazyLock::new(|| include_str!("../../../keys/modelstudio_domestic_key").trim());
67//!
68//! #[tokio::main]
69//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
70//!     let file_path = PathBuf::from("src/files/create/file-test.txt");
71//!     let create_file_request = CreateFileRequest {
72//!         file: file_path,
73//!         // This parameter is valid only for Qwen
74//!         purpose: FilePurpose::Other("file-extract".to_string()),
75//!         ..Default::default()
76//!     };
77//!
78//!     let response: FileObject = create_file_request
79//!         .get_response(MODELSCOPE_URL, MODELSCOPE_KEY.as_ref())
80//!         .await?;
81//!
82//!     println!("Uploaded file with custom purpose: {}", response.id);
83//!     Ok(())
84//! }
85//! ```
86
87pub mod request;
88
89#[cfg(test)]
90mod tests {
91    use std::{path::PathBuf, sync::LazyLock};
92
93    use crate::rest::post::PostNoStream;
94
95    use super::*;
96
97    const TEST_FILE_PATH: &str = "src/files/create/file-test.txt";
98    const MODELSCOPE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/files";
99    const MODELSCOPE_KEY: LazyLock<&str> =
100        LazyLock::new(|| include_str!("../../../keys/modelstudio_domestic_key").trim());
101
102    #[tokio::test]
103    async fn test_file_create() -> Result<(), anyhow::Error> {
104        let file_path = PathBuf::from(TEST_FILE_PATH);
105        let create_file_request = request::CreateFileRequest {
106            file: file_path,
107            purpose: request::FilePurpose::Other("file-extract".to_string()),
108            ..Default::default()
109        };
110
111        let response = create_file_request
112            .get_response(MODELSCOPE_URL, MODELSCOPE_KEY.as_ref())
113            .await?;
114
115        println!("Uploaded file ID: {}", response.id);
116        println!("File size: {} bytes", response.bytes);
117        println!("Filename: {}", response.filename);
118
119        Ok(())
120    }
121}