use std::sync::Arc;
use bevy_ecs::entity::Entity;
use leviath_providers::{InferenceRequest, Provider, ProviderError};
use tokio::sync::Notify;
use tokio::sync::mpsc::UnboundedSender;
use crate::inference_pool::InferencePermit;
pub struct TitleJob {
pub entity: Entity,
pub provider: Arc<dyn Provider>,
pub request: InferenceRequest,
pub permit: InferencePermit,
}
pub struct TitleOutcome {
pub entity: Entity,
pub result: Result<String, ProviderError>,
}
pub async fn run_title_job(
job: TitleJob,
deadline: std::time::Duration,
results: UnboundedSender<TitleOutcome>,
wake: Arc<Notify>,
) {
let TitleJob {
entity,
provider,
request,
permit,
} = job;
let result = match tokio::time::timeout(deadline, provider.infer(request)).await {
Ok(outcome) => outcome.map(|r| r.content),
Err(_) => Err(leviath_providers::ProviderError::Other(format!(
"title generation exceeded the {}s deadline and was aborted to free the pool slot",
deadline.as_secs()
))),
};
drop(permit);
let _ = results.send(TitleOutcome { entity, result });
wake.notify_one();
}