mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-30 01:52:18 +00:00
* feat(logger): add shared Rust diagnostics and Python logging bridge * feat(logger): dispatch diagnostic processing through Rust * chore: regenerate Cargo.lock after rebase Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test: allowlist bounded logging tree walkers in recursive detector Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * perf(logger): skip decoding plain access arguments * test(logger): skip embedded-python logger test when litellm deps are absent Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * style: cargo fmt Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test: expect NativeDiagnosticProcessor in the native public surface Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(stub): export NativeDiagnosticProcessor via __new__ in _native.pyi Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(tracing): rename logger crate and document host sink contract * test(logger): cover exc, stack, and nested extras in the diagnostic filter Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(logger): keep rendered redacted line when template scan flags a key pattern The blanket REDACTED for a changed msg/color template discarded lines whose rendered form was already redacted by the same pipeline, e.g. 'password=%s' became 'REDACTED' instead of 'password=REDACTED'. Only fall back to REDACTED when the rendered form did not change either, which is where interpolation can mangle the key pattern the scrub would otherwise see. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * ci(rust): install python deps so the logger bridge test runs The end-to-end bridge test skipped silently when litellm's Python deps were absent. uv sync --no-install-project installs them without a maturin build, and PYTHONPATH makes them visible to the embedded interpreter Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Yujong Lee <yujong@berri.ai> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
41 lines
1.1 KiB
Rust
41 lines
1.1 KiB
Rust
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<M> {
|
|
machine: M,
|
|
logger: OnceLock<Logger>,
|
|
}
|
|
|
|
impl<M> LoggedMachine<M> {
|
|
pub(crate) fn new(machine: M) -> Self {
|
|
Self {
|
|
machine,
|
|
logger: OnceLock::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<M: Machine> Machine for LoggedMachine<M> {
|
|
type Route = M::Route;
|
|
type Complete = M::Complete;
|
|
|
|
fn resume(&mut self, result: Option<HostResult<Self::Route>>) -> 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<<Self::Route as Route>::Error>,
|
|
) -> Interrupted<'_, Self> {
|
|
let logger = self.logger.get_or_init(|| Python::attach(super::capture));
|
|
Box::pin(logger.instrument(logger.scope(|| self.machine.interrupt(failure))))
|
|
}
|
|
}
|