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