use std::sync::OnceLock; use litellm_host::{ host::HostResult, machine::{HostFailure, Interrupted, Machine, Step}, route::Route, }; use litellm_tracing::Logger; use pyo3::Python; pub(crate) struct LoggedMachine { machine: M, logger: OnceLock, } impl LoggedMachine { pub(crate) fn new(machine: M) -> Self { Self { machine, logger: OnceLock::new(), } } } impl Machine for LoggedMachine { type Route = M::Route; type Complete = M::Complete; fn resume(&mut self, result: Option>) -> Step<'_, Self> { let logger = self.logger.get_or_init(|| Python::attach(super::capture)); Box::pin(logger.instrument(logger.scope(|| self.machine.resume(result)))) } fn interrupt( &mut self, failure: HostFailure<::Error>, ) -> Interrupted<'_, Self> { let logger = self.logger.get_or_init(|| Python::attach(super::capture)); Box::pin(logger.instrument(logger.scope(|| self.machine.interrupt(failure)))) } }