Expand description
This module provides functionality for retrieving files from the OpenAI API.
It includes the RetrieveRequest
struct which implements the Get
and GetNoStream
traits
to build URLs and fetch file data asynchronously.
§Example
use std::sync::LazyLock;
use openai_interface::files::retrieve::*;
use openai_interface::{
files::{list::request::ListFilesRequest, retrieve::request::RetrieveRequest},
rest::get::{Get, GetNoStream},
};
use anyhow::bail;
use futures_util::future::{self};
const MODELSCOPE_BASE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/";
const MODELSCOPE_KEY: LazyLock<&str> =
LazyLock::new(|| include_str!("../../keys/modelstudio_domestic_key").trim());
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
// first get all files
let list_request = ListFilesRequest {
limit: Some(5), // avoid rate limit
..Default::default()
};
let list_response = list_request
.get_response(MODELSCOPE_BASE_URL, &MODELSCOPE_KEY)
.await?;
let futures: Vec<_> = list_response
.data
.iter()
.map(|file_object| {
let file_id = file_object.id.clone();
let base_url = MODELSCOPE_BASE_URL.to_string();
let key = MODELSCOPE_KEY.to_string();
async move {
let retrieve_request = RetrieveRequest { file_id: &file_id };
retrieve_request.get_response(&base_url, &key).await
}
})
.collect();
let results = future::join_all(futures).await;
for (i, result) in results.iter().enumerate() {
match result {
Ok(file_object) => {
assert_eq!(&list_response.data[i].id, &file_object.id);
assert_eq!(&list_response.data[i].filename, &file_object.filename);
assert_eq!(&list_response.data[i].purpose, &file_object.purpose);
// assert_eq!(&list_response.data[i], file_object);
}
Err(e) => {
bail!(
"Failed to get response: {e:#}. The file is: index {i}, {:?}",
list_response.data[i]
)
}
}
}
Ok(())
}