timeout for gmiclient

This commit is contained in:
Brandon Thomas committed 2026-05-17 00:11:12 -04:00
1 parent 1ac983a871
commit 46a7993bfb
6 files changed
+67 -7

No files matched your search

@@ -2,8 +2,10 @@ use crate::creds::gmicloud_api_key::GmiCloudApiKey;
use crate::error::gmicloud_error::GmiCloudError;
use crate::requests::api::video::seedance_2_0_260128::raw_request::Seedance20Payload;
use crate::requests::common::create_request::{
create_gmicloud_request, GmiCloudCreateRequest, GmiCloudCreateResponse,
create_gmicloud_request, create_gmicloud_request_with_context,
GmiCloudCreateRequest, GmiCloudCreateResponse,
};
use crate::requests::context::request_context::RequestContext;
const MODEL_ID: &str = "seedance-2-0-260128";
@@ -113,12 +115,23 @@ impl Seedance20Request {
pub async fn send_request(
&self,
api_key: &GmiCloudApiKey,
) -> Result<GmiCloudCreateResponse, GmiCloudError> {
let context = RequestContext {
api_key,
maybe_timeout: None,
};
self.send_request_with_context(&context).await
}
pub async fn send_request_with_context(
&self,
context: &RequestContext<'_>,
) -> Result<GmiCloudCreateResponse, GmiCloudError> {
let body = GmiCloudCreateRequest {
model: MODEL_ID.to_string(),
payload: self.to_raw_payload(),
};
create_gmicloud_request(api_key, &body).await
create_gmicloud_request_with_context(context, &body).await
}
pub fn model_id() -> &'static str {
@@ -2,8 +2,10 @@ use crate::creds::gmicloud_api_key::GmiCloudApiKey;
use crate::error::gmicloud_error::GmiCloudError;
use crate::requests::api::video::seedance_2_0_fast_260128::raw_request::Seedance20FastPayload;
use crate::requests::common::create_request::{
create_gmicloud_request, GmiCloudCreateRequest, GmiCloudCreateResponse,
create_gmicloud_request, create_gmicloud_request_with_context,
GmiCloudCreateRequest, GmiCloudCreateResponse,
};
use crate::requests::context::request_context::RequestContext;
const MODEL_ID: &str = "seedance-2-0-fast-260128";
@@ -111,12 +113,23 @@ impl Seedance20FastRequest {
pub async fn send_request(
&self,
api_key: &GmiCloudApiKey,
) -> Result<GmiCloudCreateResponse, GmiCloudError> {
let context = RequestContext {
api_key,
maybe_timeout: None,
};
self.send_request_with_context(&context).await
}
pub async fn send_request_with_context(
&self,
context: &RequestContext<'_>,
) -> Result<GmiCloudCreateResponse, GmiCloudError> {
let body = GmiCloudCreateRequest {
model: MODEL_ID.to_string(),
payload: self.to_raw_payload(),
};
create_gmicloud_request(api_key, &body).await
create_gmicloud_request_with_context(context, &body).await
}
pub fn model_id() -> &'static str {
@@ -1,3 +1,5 @@
use std::time::Duration;
use log::warn;
use serde::{Deserialize, Serialize};
@@ -5,9 +7,14 @@ use crate::creds::gmicloud_api_key::GmiCloudApiKey;
use crate::error::gmicloud_error::GmiCloudError;
use crate::error::gmicloud_generic_api_error::GmiCloudGenericApiError;
use crate::error::gmicloud_specific_api_error::GmiCloudSpecificApiError;
use crate::requests::context::request_context::RequestContext;
const BASE_URL: &str = "https://console.gmicloud.ai/api/v1/ie/requestqueue/apikey";
/// Default request timeout. Video requests return quickly (async queue),
/// but image requests block until completion and can take 60+ seconds.
const DEFAULT_TIMEOUT: Duration = Duration::from_secs(180);
/// The top-level request body sent to `POST /requests`.
#[derive(Debug, Serialize)]
pub struct GmiCloudCreateRequest<P: Serialize> {
@@ -23,17 +30,34 @@ pub struct GmiCloudCreateResponse {
pub status: String,
}
/// Submit a video generation request to GmiCloud.
/// Submit a request to GmiCloud using just an API key (default timeout).
pub async fn create_gmicloud_request<P: Serialize>(
api_key: &GmiCloudApiKey,
body: &GmiCloudCreateRequest<P>,
) -> Result<GmiCloudCreateResponse, GmiCloudError> {
let context = RequestContext {
api_key,
maybe_timeout: None,
};
create_gmicloud_request_with_context(&context, body).await
}
/// Submit a request to GmiCloud with explicit context (custom timeout, etc.).
pub async fn create_gmicloud_request_with_context<P: Serialize>(
context: &RequestContext<'_>,
body: &GmiCloudCreateRequest<P>,
) -> Result<GmiCloudCreateResponse, GmiCloudError> {
let url = format!("{}/requests", BASE_URL);
let timeout = context.maybe_timeout.unwrap_or(DEFAULT_TIMEOUT);
let client = reqwest::Client::builder()
.timeout(timeout)
.build()
.map_err(GmiCloudGenericApiError::from)?;
let client = reqwest::Client::new();
let response = client
.post(&url)
.header("Authorization", format!("Bearer {}", api_key.as_str()))
.header("Authorization", format!("Bearer {}", context.api_key.as_str()))
.json(body)
.send()
.await
@@ -0,0 +1 @@
pub mod request_context;
@@ -0,0 +1,8 @@
use std::time::Duration;
use crate::creds::gmicloud_api_key::GmiCloudApiKey;
pub struct RequestContext<'a> {
pub api_key: &'a GmiCloudApiKey,
pub maybe_timeout: Option<Duration>,
}
@@ -1,3 +1,4 @@
pub mod api;
pub mod common;
pub mod context;
pub mod poll_request_queue;