Skip to main content

Module retrieve

Module retrieve 

Source
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 openai_interface::files::retrieve::*;
use openai_interface::{
    files::{list::request::ListFilesRequest, retrieve::request::RetrieveRequest},
    rest::{
        RequestOptions,
        default_client,
        get::{Get, GetNoStream},
    },
};
use anyhow::bail;
use futures_util::future;

const MODELSCOPE_BASE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/";
const MODELSCOPE_KEY: &str = "YOUR_API_KEY";

#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
    // Needs the `ferritls` cargo feature; drop this line if you install
    // your own rustls crypto provider (see `openai_interface::rest`).
    openai_interface::rest::install_crypto_provider().ok();

    // first get all files
    let list_request = ListFilesRequest {
        limit: Some(5), // avoid rate limit
        ..Default::default()
    };

    let list_response = list_request
        .get_response(&default_client(), MODELSCOPE_BASE_URL, &RequestOptions::bearer(MODELSCOPE_KEY))
        .await?;

    let client = default_client();
    let futures: Vec<_> = list_response
        .data
        .iter()
        .map(|file_object| {
            let client = client.clone();
            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,
                    ..Default::default()
                };
                retrieve_request
                    .get_response(&client, &base_url, &RequestOptions::bearer(&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);
            }
            Err(e) => {
                bail!(
                    "Failed to get response: {e:#}. The file is: index {i}, {:?}",
                    list_response.data[i]
                )
            }
        }
    }

    Ok(())
}

Modules§

request