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}