mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-21 00:21:49 +00:00
litellm-http now builds the rustls config itself, so one route-neutral place covers roots, the client certificate, ALPN, ssl_ecdh_curve and ssl_security_level. A curve picks the single key exchange group. A cipher string restricts the TLS 1.2 suites it names, and entries rustls cannot express, such as @SECLEVEL=1, are logged once and skipped. user_url_validation and user_url_allowed_hosts are applied by the media fetcher. Document downloads honor the environment proxy whenever provider calls do, keeping the per-hop address check, and stay on the pinned resolver when no proxy applies. AIOHTTP_SO_KEEPALIVE, AIOHTTP_TCP_KEEPIDLE, AIOHTTP_TCP_KEEPINTVL, AIOHTTP_TCP_KEEPCNT and AIOHTTP_KEEPALIVE_TIMEOUT map onto the client. A client= argument and a live SSLContext are ignored
65 lines
1.8 KiB
Rust
65 lines
1.8 KiB
Rust
use pyo3::prelude::*;
|
|
|
|
const MODULE: &str = "litellm.rust_bridge.settings";
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
pub(crate) enum PythonSettings {
|
|
Http,
|
|
UrlPolicy,
|
|
}
|
|
|
|
impl PythonSettings {
|
|
#[cfg(test)]
|
|
pub(crate) const ALL: [Self; 2] = [Self::Http, Self::UrlPolicy];
|
|
|
|
pub(crate) fn name(self) -> &'static str {
|
|
match self {
|
|
Self::Http => "http_settings",
|
|
Self::UrlPolicy => "url_policy",
|
|
}
|
|
}
|
|
|
|
pub(crate) fn read(self, py: Python<'_>) -> PyResult<Bound<'_, PyAny>> {
|
|
py.import(MODULE)?.getattr(self.name())?.call0()
|
|
}
|
|
|
|
pub(crate) fn warn(py: Python<'_>, message: &str) -> PyResult<()> {
|
|
py.import(MODULE)?.getattr("warn")?.call1((message,))?;
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub(crate) const CONTRACT: &str = include_str!("../python_settings.json");
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use std::{collections::BTreeSet, ffi::CString};
|
|
|
|
use pyo3::{prelude::*, types::PyDict};
|
|
|
|
use super::{CONTRACT, PythonSettings};
|
|
|
|
#[test]
|
|
fn every_settings_group_is_in_the_python_contract() {
|
|
Python::initialize();
|
|
Python::attach(|py| {
|
|
let locals = PyDict::new(py);
|
|
locals.set_item("contract", CONTRACT).unwrap();
|
|
let source = CString::new("import json\nkeys = list(json.loads(contract))").unwrap();
|
|
py.run(&source, Some(&locals), Some(&locals)).unwrap();
|
|
let declared: BTreeSet<String> = locals
|
|
.get_item("keys")
|
|
.unwrap()
|
|
.unwrap()
|
|
.extract::<Vec<String>>()
|
|
.unwrap()
|
|
.into_iter()
|
|
.collect();
|
|
let read: BTreeSet<String> = PythonSettings::ALL
|
|
.map(|group| group.name().to_owned())
|
|
.into();
|
|
assert_eq!(read, declared);
|
|
});
|
|
}
|
|
}
|