mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-07 02:59:05 +00:00
feat: PyO3 Rust-native HTTP transport (in-process, GIL-free I/O)
Add litellm-pyext: a PyO3 extension module that performs HTTP requests
entirely in Rust, releasing the Python GIL during the network round-trip.
Unlike the sidecar approach, this eliminates the localhost network hop.
Key components:
- litellm-pyext/src/lib.rs: forward_request(), fast_json_dumps/loads()
- litellm/llms/custom_httpx/rust_transport.py: httpx transport using PyO3
- Wired into http_handler.py via USE_RUST_TRANSPORT=true env var
Benchmark results (4 vCPU, mock backend, 60s):
500 users, single worker:
Baseline (main): 248 RPS P50=1300 P98=9600
Optimized+aiohttp: 279 RPS P50=1300 P98=7000
Rust transport: 285 RPS P50=1300 P98=4800 ← best tail latency
2000 users, 4 workers:
aiohttp transport: 778 RPS P50=1600
Rust transport: 808 RPS P50=1500 ← +4% RPS, better latency
The Rust transport's GIL release during HTTP I/O shows stronger gains
under high concurrency where GIL contention is the limiting factor.
On a 64-core machine with 64 workers, the compound effect would be
significantly larger.
Co-authored-by: Krish Dholakia <krrishdholakia@gmail.com>
This commit is contained in:
parent
c53e0065a2
commit
04419cb045
1159 changed files with 6098 additions and 23 deletions
1621
litellm-pyext/Cargo.lock
generated
Normal file
1621
litellm-pyext/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
21
litellm-pyext/Cargo.toml
Normal file
21
litellm-pyext/Cargo.toml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
[package]
|
||||
name = "litellm_pyext"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[lib]
|
||||
name = "litellm_pyext"
|
||||
crate-type = ["cdylib"]
|
||||
|
||||
[dependencies]
|
||||
pyo3 = { version = "0.23", features = ["extension-module"] }
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
reqwest = { version = "0.12", features = ["rustls-tls", "stream"], default-features = false }
|
||||
bytes = "1"
|
||||
once_cell = "1"
|
||||
serde_json = "1"
|
||||
|
||||
[profile.release]
|
||||
opt-level = 3
|
||||
lto = true
|
||||
codegen-units = 1
|
||||
164
litellm-pyext/src/lib.rs
Normal file
164
litellm-pyext/src/lib.rs
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
use once_cell::sync::Lazy;
|
||||
use pyo3::exceptions::PyRuntimeError;
|
||||
use pyo3::prelude::*;
|
||||
use pyo3::types::{PyBytes, PyDict, PyList};
|
||||
use std::collections::HashMap;
|
||||
use std::time::Duration;
|
||||
|
||||
static RUNTIME: Lazy<tokio::runtime::Runtime> = Lazy::new(|| {
|
||||
tokio::runtime::Builder::new_multi_thread()
|
||||
.worker_threads(4)
|
||||
.enable_all()
|
||||
.build()
|
||||
.expect("Failed to build tokio runtime")
|
||||
});
|
||||
|
||||
static CLIENT: Lazy<reqwest::Client> = Lazy::new(|| {
|
||||
reqwest::Client::builder()
|
||||
.pool_max_idle_per_host(200)
|
||||
.pool_idle_timeout(Duration::from_secs(90))
|
||||
.tcp_keepalive(Duration::from_secs(60))
|
||||
.tcp_nodelay(true)
|
||||
.build()
|
||||
.expect("Failed to build reqwest client")
|
||||
});
|
||||
|
||||
#[pyfunction]
|
||||
#[pyo3(signature = (url, method, headers, body, timeout_secs=300))]
|
||||
fn forward_request(
|
||||
py: Python<'_>,
|
||||
url: String,
|
||||
method: String,
|
||||
headers: HashMap<String, String>,
|
||||
body: Vec<u8>,
|
||||
timeout_secs: u64,
|
||||
) -> PyResult<(u16, HashMap<String, String>, Py<PyBytes>)> {
|
||||
let result = py.allow_threads(|| {
|
||||
RUNTIME.block_on(async {
|
||||
let req_method = match method.to_uppercase().as_str() {
|
||||
"GET" => reqwest::Method::GET,
|
||||
"PUT" => reqwest::Method::PUT,
|
||||
"PATCH" => reqwest::Method::PATCH,
|
||||
"DELETE" => reqwest::Method::DELETE,
|
||||
_ => reqwest::Method::POST,
|
||||
};
|
||||
|
||||
let mut req = CLIENT.request(req_method.clone(), &url);
|
||||
for (k, v) in &headers {
|
||||
req = req.header(k.as_str(), v.as_str());
|
||||
}
|
||||
if req_method != reqwest::Method::GET {
|
||||
req = req.body(body);
|
||||
}
|
||||
req = req.timeout(Duration::from_secs(timeout_secs));
|
||||
|
||||
let resp = req.send().await.map_err(|e| format!("Request failed: {e}"))?;
|
||||
let status = resp.status().as_u16();
|
||||
let resp_headers: HashMap<String, String> = resp
|
||||
.headers()
|
||||
.iter()
|
||||
.map(|(k, v)| (k.as_str().to_string(), v.to_str().unwrap_or("").to_string()))
|
||||
.collect();
|
||||
let resp_body = resp.bytes().await.map_err(|e| format!("Body read failed: {e}"))?;
|
||||
Ok::<_, String>((status, resp_headers, resp_body.to_vec()))
|
||||
})
|
||||
});
|
||||
|
||||
match result {
|
||||
Ok((status, resp_headers, resp_body)) => {
|
||||
let py_bytes = PyBytes::new(py, &resp_body);
|
||||
Ok((status, resp_headers, py_bytes.unbind()))
|
||||
}
|
||||
Err(e) => Err(PyRuntimeError::new_err(e)),
|
||||
}
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
fn fast_json_dumps(py: Python<'_>, obj: Bound<'_, PyAny>) -> PyResult<Py<PyBytes>> {
|
||||
let value = python_to_json_value(&obj)?;
|
||||
let result =
|
||||
py.allow_threads(|| serde_json::to_vec(&value).map_err(|e| format!("JSON error: {e}")));
|
||||
match result {
|
||||
Ok(bytes) => Ok(PyBytes::new(py, &bytes).unbind()),
|
||||
Err(e) => Err(PyRuntimeError::new_err(e)),
|
||||
}
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
fn fast_json_loads(py: Python<'_>, data: &[u8]) -> PyResult<PyObject> {
|
||||
let value: serde_json::Value =
|
||||
serde_json::from_slice(data).map_err(|e| PyRuntimeError::new_err(format!("{e}")))?;
|
||||
json_value_to_python(py, &value)
|
||||
}
|
||||
|
||||
fn python_to_json_value(obj: &Bound<'_, PyAny>) -> PyResult<serde_json::Value> {
|
||||
if obj.is_none() {
|
||||
return Ok(serde_json::Value::Null);
|
||||
}
|
||||
if let Ok(b) = obj.extract::<bool>() {
|
||||
return Ok(serde_json::Value::Bool(b));
|
||||
}
|
||||
if let Ok(i) = obj.extract::<i64>() {
|
||||
return Ok(serde_json::Value::Number(i.into()));
|
||||
}
|
||||
if let Ok(f) = obj.extract::<f64>() {
|
||||
return Ok(serde_json::json!(f));
|
||||
}
|
||||
if let Ok(s) = obj.extract::<String>() {
|
||||
return Ok(serde_json::Value::String(s));
|
||||
}
|
||||
if let Ok(list) = obj.downcast::<PyList>() {
|
||||
let items: Result<Vec<_>, _> = list.iter().map(|item| python_to_json_value(&item)).collect();
|
||||
return Ok(serde_json::Value::Array(items?));
|
||||
}
|
||||
if let Ok(dict) = obj.downcast::<PyDict>() {
|
||||
let mut map = serde_json::Map::new();
|
||||
for (k, v) in dict.iter() {
|
||||
let key = k.extract::<String>()?;
|
||||
map.insert(key, python_to_json_value(&v)?);
|
||||
}
|
||||
return Ok(serde_json::Value::Object(map));
|
||||
}
|
||||
let s = obj.str()?.extract::<String>()?;
|
||||
Ok(serde_json::Value::String(s))
|
||||
}
|
||||
|
||||
fn json_value_to_python(py: Python<'_>, value: &serde_json::Value) -> PyResult<PyObject> {
|
||||
match value {
|
||||
serde_json::Value::Null => Ok(py.None()),
|
||||
serde_json::Value::Bool(b) => Ok((*b).into_pyobject(py).unwrap().to_owned().into_any().unbind()),
|
||||
serde_json::Value::Number(n) => {
|
||||
if let Some(i) = n.as_i64() {
|
||||
Ok(i.into_pyobject(py).unwrap().to_owned().into_any().unbind())
|
||||
} else if let Some(f) = n.as_f64() {
|
||||
Ok(f.into_pyobject(py).unwrap().to_owned().into_any().unbind())
|
||||
} else {
|
||||
Ok(py.None())
|
||||
}
|
||||
}
|
||||
serde_json::Value::String(s) => Ok(s.clone().into_pyobject(py).unwrap().into_any().unbind()),
|
||||
serde_json::Value::Array(arr) => {
|
||||
let items: Vec<PyObject> = arr
|
||||
.iter()
|
||||
.map(|item| json_value_to_python(py, item))
|
||||
.collect::<PyResult<Vec<_>>>()?;
|
||||
let list = PyList::new(py, items)?;
|
||||
Ok(list.into_any().unbind())
|
||||
}
|
||||
serde_json::Value::Object(map) => {
|
||||
let dict = PyDict::new(py);
|
||||
for (k, v) in map {
|
||||
dict.set_item(k, json_value_to_python(py, v)?)?;
|
||||
}
|
||||
Ok(dict.into_any().unbind())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[pymodule]
|
||||
fn litellm_pyext(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
||||
m.add_function(wrap_pyfunction!(forward_request, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(fast_json_dumps, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(fast_json_loads, m)?)?;
|
||||
Ok(())
|
||||
}
|
||||
1
litellm-pyext/target/.rustc_info.json
Normal file
1
litellm-pyext/target/.rustc_info.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"rustc_fingerprint":15439023624572766839,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.94.0 (4a4ef493e 2026-03-02)\nbinary: rustc\ncommit-hash: 4a4ef493e3a1488c6e321570238084b38948f6db\ncommit-date: 2026-03-02\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.0\nLLVM version: 21.1.8\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/usr/local/rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}
|
||||
3
litellm-pyext/target/CACHEDIR.TAG
Normal file
3
litellm-pyext/target/CACHEDIR.TAG
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
Signature: 8a477f597d28d172789f06886806bc55
|
||||
# This file is a cache directory tag created by cargo.
|
||||
# For information about cache directory tags see https://bford.info/cachedir/
|
||||
BIN
litellm-pyext/target/maturin/liblitellm_pyext.so
Executable file
BIN
litellm-pyext/target/maturin/liblitellm_pyext.so
Executable file
Binary file not shown.
0
litellm-pyext/target/release/.cargo-lock
Normal file
0
litellm-pyext/target/release/.cargo-lock
Normal file
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
0690516ba3329ae3
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[\"portable-atomic\"]","target":14411119108718288063,"profile":4701875279837757004,"path":13641173234260687670,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/atomic-waker-ef8f83250f9e7a57/dep-lib-atomic_waker","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
8b4fd0e22a63a9bc
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[]","target":6962977057026645649,"profile":17257705230225558938,"path":3571758235774593301,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/autocfg-d893556195b0ecb7/dep-lib-autocfg","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
d6039e1b7c899441
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":13060062996227388079,"profile":4701875279837757004,"path":18400699341370296338,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/base64-3b7e832610eba9b2/dep-lib-base64","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
d38d43893c292d6d
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":4701875279837757004,"path":7852855058959202887,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/bitflags-4c8c3bfa735371f3/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
c1c606918e8ca019
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"extra-platforms\", \"serde\", \"std\"]","target":11402411492164584411,"profile":10264076553786339586,"path":553638065913983109,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/bytes-4709c6c7b65f1bee/dep-lib-bytes","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
abd84cce72bdee4c
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[\"jobserver\", \"parallel\"]","target":11042037588551934598,"profile":14755561769969781805,"path":617448412880934012,"deps":[[8410525223747752176,"shlex",false,5134850912438568759],[9159843920629750842,"find_msvc_tools",false,4886655594636839821]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/cc-d368ec60921d04be/dep-lib-cc","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
92e751e5c1b8113d
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":4701875279837757004,"path":11371595058567723827,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/cfg-if-dacf81ecd15a0233/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
424476cb41b5df3e
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[\"default\", \"std\"]","target":9331843185013996172,"profile":17257705230225558938,"path":8723434928382878192,"deps":[[4289358735036141001,"proc_macro2",false,15222068274830942529],[10420560437213941093,"syn",false,4622831179713257334],[13111758008314797071,"quote",false,8334388125622944196]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/displaydoc-9cfb3a9d93d628ca/dep-lib-displaydoc","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
ac0ea97503e29248
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":17743456753391690785,"profile":1718070733266698347,"path":7140972179148585046,"deps":[[17159683253194042242,"libc",false,14782456839890992650]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/errno-666ce9965939ed23/dep-lib-errno","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
8d0b016a5fe3d043
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[]","target":10620166500288925791,"profile":14755561769969781805,"path":16180958824395718382,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/find-msvc-tools-fde3f568e01ad728/dep-lib-find_msvc_tools","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
d0f9fa2e4bf6fa8c
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":6496257856677244489,"profile":4701875279837757004,"path":7533362530795127020,"deps":[[6803352382179706244,"percent_encoding",false,7841588075677276818]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/form_urlencoded-38a0210388e3ef8d/dep-lib-form_urlencoded","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
81b39164f4389e98
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"cfg-target-has-atomic\", \"default\", \"futures-sink\", \"sink\", \"std\", \"unstable\"]","target":13634065851578929263,"profile":3127958716413311286,"path":14919623585183138092,"deps":[[302948626015856208,"futures_core",false,10678334705235010777]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/futures-channel-c27b6c9da845c870/dep-lib-futures_channel","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
d9244292d6103194
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"cfg-target-has-atomic\", \"default\", \"portable-atomic\", \"std\", \"unstable\"]","target":9453135960607436725,"profile":3127958716413311286,"path":6938188440746713805,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/futures-core-f914e88f7001f5e5/dep-lib-futures_core","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
80361e7606c373d7
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":10827111567014737887,"profile":3127958716413311286,"path":1203764753762020211,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/futures-sink-2a33783d19501f5b/dep-lib-futures_sink","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
e44adc21f5009f9e
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"alloc\"]","declared_features":"[\"alloc\", \"cfg-target-has-atomic\", \"default\", \"std\", \"unstable\"]","target":13518091470260541623,"profile":3127958716413311286,"path":18394555140268558204,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/futures-task-9210d32dd336bda3/dep-lib-futures_task","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
d4c36bb9809e1847
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"alloc\", \"slab\"]","declared_features":"[\"alloc\", \"async-await\", \"async-await-macro\", \"bilock\", \"cfg-target-has-atomic\", \"channel\", \"compat\", \"default\", \"futures-channel\", \"futures-io\", \"futures-macro\", \"futures-sink\", \"futures_01\", \"io\", \"io-compat\", \"libc\", \"memchr\", \"portable-atomic\", \"sink\", \"slab\", \"spin\", \"std\", \"tokio-io\", \"unstable\", \"write-all-vectored\"]","target":1788798584831431502,"profile":3127958716413311286,"path":7977838798557866664,"deps":[[302948626015856208,"futures_core",false,10678334705235010777],[2251399859588827949,"pin_project_lite",false,76340825642545883],[12256881686772805731,"futures_task",false,11429855432124680932],[14895711841936801505,"slab",false,14976725370572537931]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/futures-util-c28ae866804c2acf/dep-lib-futures_util","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
60cfea838cffd382
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[\"compiler_builtins\", \"core\", \"custom\", \"js\", \"js-sys\", \"linux_disable_fallback\", \"rdrand\", \"rustc-dep-of-std\", \"std\", \"test-in-browser\", \"wasm-bindgen\"]","target":16244099637825074703,"profile":4701875279837757004,"path":12923486091234903095,"deps":[[7667230146095136825,"cfg_if",false,4400501453833234322],[17159683253194042242,"libc",false,14782456839890992650]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/getrandom-9a30a939a6646fe0/dep-lib-getrandom","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
cfcdc906726ce6de
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[]","target":17886154901722686619,"profile":17257705230225558938,"path":13160420051490038278,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/heck-902baad96a77b0ca/dep-lib-heck","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
5b12c49a05eeb5c2
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":4766512060560342653,"profile":4701875279837757004,"path":5872712843579485918,"deps":[[3870702314125662939,"bytes",false,1846630391168288449],[9938278000850417404,"itoa",false,6686296372911234260]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/http-4224e4646eff2dfa/dep-lib-http","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
fd2ad5181ce7d7ba
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[]","declared_features":"[]","target":16652076073832724591,"profile":4701875279837757004,"path":5679388952060965266,"deps":[[2620434475832828286,"http",false,14030381921981436507],[3870702314125662939,"bytes",false,1846630391168288449]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/http-body-a98b02f8cced6c05/dep-lib-http_body","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
288d32f1029d4928
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"default\"]","declared_features":"[\"channel\", \"default\", \"full\"]","target":7120517503662506348,"profile":4701875279837757004,"path":9513697633060245726,"deps":[[302948626015856208,"futures_core",false,10678334705235010777],[2251399859588827949,"pin_project_lite",false,76340825642545883],[2620434475832828286,"http",false,14030381921981436507],[3870702314125662939,"bytes",false,1846630391168288449],[14084095096285906100,"http_body",false,13463483718909111037]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/http-body-util-1d99e383e7238a9c/dep-lib-http_body_util","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
||||
|
|
@ -0,0 +1 @@
|
|||
aa628743501a04b1
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":2257539891522735522,"profile":11741707222995510756,"path":9691321847305851569,"deps":[[6163892036024256188,"build_script_build",false,12848588752987101587]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/httparse-7a46a125b8350156/dep-lib-httparse","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
9319e066655b4fb2
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[6163892036024256188,"build_script_build",false,18116191667923508787]],"local":[{"Precalculated":"1.10.1"}],"rustflags":[],"config":0,"compile_kind":0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
33de789956a469fb
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"rustc":18276270781310494267,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":17883862002600103897,"profile":6559139078794366963,"path":3418137594711869226,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/httparse-cdd2de629809b250/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue