openrouter_rs/api/
generation.rs1use 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
36pub 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}