mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-10 12:01:36 +00:00
timeout for gmiclient
This commit is contained in:
1 parent
1ac983a871
commit
46a7993bfb
6 files changed
+67
-7
No files matched your search
+15
-2
@@ -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 {
|
||||
|
||||
+15
-2
@@ -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;
|
||||
Reference in new issue
Block a user