openrouter_rs/api/
generation.rs

1use serde::{Deserialize, Serialize};
2use surf::http::headers::AUTHORIZATION;
3
4use crate::{error::OpenRouterError, types::ApiResponse, utils::handle_error};
5
6#[derive(Serialize, Deserialize, Debug)]
7pub struct GenerationData {
8    pub id: String,
9    pub total_cost: f64,
10    pub created_at: String,
11    pub model: String,
12    pub origin: String,
13    pub usage: f64,
14    pub is_byok: bool,
15    pub upstream_id: Option<String>,
16    pub cache_discount: Option<f64>,
17    pub app_id: Option<u32>,
18    pub streamed: Option<bool>,
19    pub cancelled: Option<bool>,
20    pub provider_name: Option<String>,
21    pub latency: Option<u32>,
22    pub moderation_latency: Option<u32>,
23    pub generation_time: Option<u32>,
24    pub finish_reason: Option<String>,
25    pub native_finish_reason: Option<String>,
26    pub tokens_prompt: Option<u32>,
27    pub tokens_completion: Option<u32>,
28    pub native_tokens_prompt: Option<u32>,
29    pub native_tokens_completion: Option<u32>,
30    pub native_tokens_reasoning: Option<u32>,
31    pub num_media_prompt: Option<u32>,
32    pub num_media_completion: Option<u32>,
33    pub num_search_results: Option<u32>,
34}
35
36/// Returns metadata about a specific generation request
37///
38/// # Arguments
39///
40/// * `base_url` - The base URL of the OpenRouter API.
41/// * `api_key` - The API key for authentication
42/// * `id` - The ID of the generation request
43///
44/// # Returns
45///
46/// * `Result<GenerationData, OpenRouterError>` - The metadata of the generation request or an error
47pub async fn get_generation(
48    base_url: &str,
49    api_key: &str,
50    id: impl Into<String>,
51) -> Result<GenerationData, OpenRouterError> {
52    let id = id.into();
53    let url = format!("{base_url}/generation?id={id}");
54
55    let mut response = surf::get(url)
56        .header(AUTHORIZATION, format!("Bearer {api_key}"))
57        .await?;
58
59    if response.status().is_success() {
60        let generation_response: ApiResponse<_> = response.body_json().await?;
61        Ok(generation_response.data)
62    } else {
63        handle_error(response).await?;
64        unreachable!()
65    }
66}