diff --git a/Cargo.lock b/Cargo.lock index 6f64d2e..fe74350 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,17 +389,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "atoi" version = "2.0.0" @@ -474,47 +463,13 @@ dependencies = [ "arrayvec", ] -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core 0.4.5", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "axum" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ - "axum-core 0.5.2", + "axum-core", "bytes", "form_urlencoded", "futures-util", @@ -524,7 +479,7 @@ dependencies = [ "hyper", "hyper-util", "itoa", - "matchit 0.8.4", + "matchit", "memchr", "mime", "percent-encoding", @@ -536,28 +491,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", + "tower", "tower-layer", "tower-service", "tracing", @@ -1255,17 +1189,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.9.2", - "core-foundation 0.10.1", - "libc", -] - [[package]] name = "coreaudio-rs" version = "0.11.3" @@ -1623,15 +1546,15 @@ name = "embeddings-engine" version = "0.1.0" dependencies = [ "async-openai", - "axum 0.8.4", + "axum", "fastembed", "once_cell", "rand 0.8.5", "serde", "serde_json", "tokio", - "tower 0.5.2", - "tower-http 0.6.6", + "tower", + "tower-http", "tracing", "tracing-subscriber", ] @@ -2777,7 +2700,7 @@ dependencies = [ "ab_glyph", "accelerate-src", "anyhow", - "axum 0.8.4", + "axum", "bindgen_cuda", "byteorder", "candle-core", @@ -2813,8 +2736,8 @@ dependencies = [ "symphonia", "tokenizers", "tokio", - "tower 0.5.2", - "tower-http 0.6.6", + "tower", + "tower-http", "tracing", "tracing-chrome", "tracing-subscriber", @@ -3011,58 +2934,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" -[[package]] -name = "legacy-inference-engine" -version = "0.1.0" -dependencies = [ - "ab_glyph", - "accelerate-src", - "anyhow", - "axum 0.7.9", - "bindgen_cuda", - "byteorder", - "candle-core", - "candle-datasets", - "candle-flash-attn", - "candle-nn", - "candle-onnx", - "candle-transformers", - "clap", - "cpal", - "csv", - "cudarc", - "either", - "enterpolation", - "half", - "hf-hub", - "image", - "imageproc", - "intel-mkl-src", - "memmap2", - "metal 0.32.0", - "num-traits", - "palette", - "pdf2image", - "pyo3", - "rand 0.9.2", - "rayon", - "reborrow", - "rubato", - "safetensors", - "serde", - "serde_json", - "symphonia", - "tokenizers", - "tokio", - "tower 0.4.13", - "tower-http 0.5.2", - "tracing", - "tracing-chrome", - "tracing-subscriber", - "utoipa", - "uuid", -] - [[package]] name = "leptos" version = "0.6.15" @@ -3507,12 +3378,6 @@ dependencies = [ "regex-automata 0.1.10", ] -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "matchit" version = "0.8.4" @@ -3572,7 +3437,7 @@ checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ "bitflags 2.9.2", "block", - "core-graphics-types 0.1.3", + "core-graphics-types", "foreign-types 0.5.0", "log", "objc", @@ -3587,22 +3452,7 @@ checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ "bitflags 2.9.2", "block", - "core-graphics-types 0.1.3", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "metal" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" -dependencies = [ - "bitflags 2.9.2", - "block", - "core-graphics-types 0.2.0", + "core-graphics-types", "foreign-types 0.5.0", "log", "objc", @@ -4401,14 +4251,14 @@ dependencies = [ name = "predict-otron-9000" version = "0.1.0" dependencies = [ - "axum 0.8.4", + "axum", "embeddings-engine", "inference-engine", "serde", "serde_json", "tokio", - "tower 0.5.2", - "tower-http 0.6.6", + "tower", + "tower-http", "tracing", "tracing-subscriber", "uuid", @@ -5112,8 +4962,8 @@ dependencies = [ "tokio-native-tls", "tokio-rustls", "tokio-util", - "tower 0.5.2", - "tower-http 0.6.6", + "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -6374,17 +6224,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.5.2" @@ -6401,22 +6240,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower-http" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" -dependencies = [ - "bitflags 2.9.2", - "bytes", - "http", - "http-body", - "http-body-util", - "pin-project-lite", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-http" version = "0.6.6" @@ -6430,7 +6253,7 @@ dependencies = [ "http-body", "iri-string", "pin-project-lite", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", "tracing", diff --git a/Cargo.toml b/Cargo.toml index c88ee87..b67d266 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,7 @@ members = [ "crates/predict-otron-9000", "crates/inference-engine", "crates/embeddings-engine", - "crates/leptos-chat", - "crates/legacy-inference-engine" + "crates/leptos-chat" ] default-members = ["crates/predict-otron-9000"] resolver = "2" diff --git a/crates/legacy-inference-engine/Cargo.lock b/crates/legacy-inference-engine/Cargo.lock deleted file mode 100644 index b028a21..0000000 --- a/crates/legacy-inference-engine/Cargo.lock +++ /dev/null @@ -1,6115 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ab_glyph" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" - -[[package]] -name = "accelerate-src" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415ed64958754dbe991900f3940677e6a7eefb4d7367afd70d642677b0c7d19d" - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "const-random", - "getrandom 0.3.3", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "aligned-vec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "alsa" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" -dependencies = [ - "alsa-sys", - "bitflags 2.9.1", - "cfg-if", - "libc", -] - -[[package]] -name = "alsa-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" - -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.59.0", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" -dependencies = [ - "backtrace", -] - -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - -[[package]] -name = "arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" -dependencies = [ - "derive_arbitrary", -] - -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "arrow-array" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8010572cf8c745e242d1b632bd97bd6d4f40fefed5ed1290a8f433abaa686fea" -dependencies = [ - "ahash", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "chrono", - "half", - "hashbrown 0.14.5", - "num", -] - -[[package]] -name = "arrow-buffer" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0a2432f0cba5692bf4cb757469c66791394bac9ec7ce63c1afe74744c37b27" -dependencies = [ - "bytes", - "half", - "num", -] - -[[package]] -name = "arrow-cast" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9abc10cd7995e83505cc290df9384d6e5412b207b79ce6bdff89a10505ed2cba" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", - "atoi", - "base64 0.22.1", - "chrono", - "half", - "lexical-core", - "num", - "ryu", -] - -[[package]] -name = "arrow-data" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2742ac1f6650696ab08c88f6dd3f0eb68ce10f8c253958a18c943a68cd04aec5" -dependencies = [ - "arrow-buffer", - "arrow-schema", - "half", - "num", -] - -[[package]] -name = "arrow-ipc" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a42ea853130f7e78b9b9d178cb4cd01dee0f78e64d96c2949dc0a915d6d9e19d" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", - "arrow-schema", - "flatbuffers", -] - -[[package]] -name = "arrow-schema" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d9483aaabe910c4781153ae1b6ae0393f72d9ef757d38d09d450070cf2e528" - -[[package]] -name = "arrow-select" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "849524fa70e0e3c5ab58394c770cb8f514d0122d20de08475f7b472ed8075830" -dependencies = [ - "ahash", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "num", -] - -[[package]] -name = "assert_float_eq" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d2119f741b79fe9907f5396d19bffcb46568cfcc315e78677d731972ac7085" - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "av1-grain" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bindgen" -version = "0.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.101", -] - -[[package]] -name = "bindgen_cuda" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f8489af5b7d17a81bffe37e0f4d6e1e4de87c87329d05447f22c35d95a1227d" -dependencies = [ - "glob", - "num_cpus", - "rayon", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "bitstream-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "brotli" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "built" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" - -[[package]] -name = "bumpalo" -version = "3.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "bytemuck" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "candle-core" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f51e2ecf6efe9737af8f993433c839f956d2b6ed4fd2dd4a7c6d8b0fa667ff" -dependencies = [ - "byteorder", - "candle-kernels", - "candle-metal-kernels", - "cudarc", - "gemm 0.17.1", - "half", - "memmap2", - "metal 0.27.0", - "num-traits", - "num_cpus", - "rand 0.9.1", - "rand_distr 0.5.1", - "rayon", - "safetensors", - "thiserror 1.0.69", - "ug", - "ug-cuda", - "ug-metal", - "yoke 0.7.5", - "zip", -] - -[[package]] -name = "candle-datasets" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a7c351dd50cda83f00f17c4412e35c69d840e453edf06064974de1cc59343d" -dependencies = [ - "byteorder", - "candle-core", - "candle-nn", - "hf-hub", - "image", - "memmap2", - "parquet", - "rand 0.9.1", - "thiserror 1.0.69", - "tokenizers", -] - -[[package]] -name = "candle-flash-attn" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb38a5bfae09c4ae73fd00039e5eaf97a7d6d9400cc35ee8e603fc4a5f9cb0a3" -dependencies = [ - "anyhow", - "bindgen_cuda", - "candle-core", - "half", -] - -[[package]] -name = "candle-kernels" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fcd989c2143aa754370b5bfee309e35fbd259e83d9ecf7a73d23d8508430775" -dependencies = [ - "bindgen_cuda", -] - -[[package]] -name = "candle-metal-kernels" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a323ee9c813707f73b6e59300661b354a70410f31fe4135170c4eda8a061534" -dependencies = [ - "half", - "metal 0.27.0", - "once_cell", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "candle-nn" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1980d53280c8f9e2c6cbe1785855d7ff8010208b46e21252b978badf13ad69d" -dependencies = [ - "candle-core", - "candle-metal-kernels", - "half", - "metal 0.27.0", - "num-traits", - "rayon", - "safetensors", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "candle-onnx" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a8fa227a8176fd9b8fb58d63c908c08ad3af1503ee6fcd058be072a598044d2" -dependencies = [ - "candle-core", - "candle-nn", - "prost", - "prost-build", -] - -[[package]] -name = "candle-transformers" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186cb80045dbe47e0b387ea6d3e906f02fb3056297080d9922984c90e90a72b0" -dependencies = [ - "byteorder", - "candle-core", - "candle-nn", - "fancy-regex", - "num-traits", - "rand 0.9.1", - "rayon", - "serde", - "serde_json", - "serde_plain", - "tracing", -] - -[[package]] -name = "cc" -version = "1.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.5.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "console" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width", - "windows-sys 0.59.0", -] - -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.16", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "conv" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299" -dependencies = [ - "custom_derive", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "coreaudio-rs" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" -dependencies = [ - "bitflags 1.3.2", - "core-foundation-sys", - "coreaudio-sys", -] - -[[package]] -name = "coreaudio-sys" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" -dependencies = [ - "bindgen", -] - -[[package]] -name = "cpal" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" -dependencies = [ - "alsa", - "core-foundation-sys", - "coreaudio-rs", - "dasp_sample", - "jni", - "js-sys", - "libc", - "mach2", - "ndk", - "ndk-context", - "oboe", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "csv" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" -dependencies = [ - "memchr", -] - -[[package]] -name = "cudarc" -version = "0.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9574894139a982bf26fbb44473a9d416c015e779c51ef0fbc0789f1a1c17b25" -dependencies = [ - "half", - "libloading", -] - -[[package]] -name = "custom_derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.101", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "dasp_sample" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" - -[[package]] -name = "derive_arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.101", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "directories" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "dyn-stack" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" -dependencies = [ - "bytemuck", - "reborrow", -] - -[[package]] -name = "dyn-stack" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490bd48eb68fffcfed519b4edbfd82c69cbe741d175b84f0e0cbe8c57cbe0bdd" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enterpolation" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fadf5c8cbf7c6765ff05ccbd8811cd7bc3a763e4671755204552bf8740d042a" -dependencies = [ - "assert_float_eq", - "num-traits", - "serde", - "topology-traits", -] - -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "esaxx-rs" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d817e038c30374a4bcb22f94d0a8a0e216958d4c3dcde369b1439fec4bdda6e6" - -[[package]] -name = "extended" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" - -[[package]] -name = "fancy-regex" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" -dependencies = [ - "bit-set", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "fast-srgb8" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flatbuffers" -version = "23.5.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dac53e22462d78c16d64a1cd22371b54cc3fe94aa15e7886a2fa6e5d1ab8640" -dependencies = [ - "bitflags 1.3.2", - "rustc_version", -] - -[[package]] -name = "flate2" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "gemm" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-c32 0.17.1", - "gemm-c64 0.17.1", - "gemm-common 0.17.1", - "gemm-f16 0.17.1", - "gemm-f32 0.17.1", - "gemm-f64 0.17.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" -dependencies = [ - "dyn-stack 0.13.0", - "gemm-c32 0.18.2", - "gemm-c64 0.18.2", - "gemm-common 0.18.2", - "gemm-f16 0.18.2", - "gemm-f32 0.18.2", - "gemm-f64 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.5.0", - "seq-macro", -] - -[[package]] -name = "gemm-c32" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-c32" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" -dependencies = [ - "dyn-stack 0.13.0", - "gemm-common 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.5.0", - "seq-macro", -] - -[[package]] -name = "gemm-c64" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-c64" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" -dependencies = [ - "dyn-stack 0.13.0", - "gemm-common 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.5.0", - "seq-macro", -] - -[[package]] -name = "gemm-common" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" -dependencies = [ - "bytemuck", - "dyn-stack 0.10.0", - "half", - "num-complex", - "num-traits", - "once_cell", - "paste", - "pulp 0.18.22", - "raw-cpuid 10.7.0", - "rayon", - "seq-macro", - "sysctl 0.5.5", -] - -[[package]] -name = "gemm-common" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" -dependencies = [ - "bytemuck", - "dyn-stack 0.13.0", - "half", - "libm", - "num-complex", - "num-traits", - "once_cell", - "paste", - "pulp 0.21.5", - "raw-cpuid 11.5.0", - "rayon", - "seq-macro", - "sysctl 0.6.0", -] - -[[package]] -name = "gemm-f16" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", - "gemm-f32 0.17.1", - "half", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "rayon", - "seq-macro", -] - -[[package]] -name = "gemm-f16" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" -dependencies = [ - "dyn-stack 0.13.0", - "gemm-common 0.18.2", - "gemm-f32 0.18.2", - "half", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.5.0", - "rayon", - "seq-macro", -] - -[[package]] -name = "gemm-f32" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-f32" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" -dependencies = [ - "dyn-stack 0.13.0", - "gemm-common 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.5.0", - "seq-macro", -] - -[[package]] -name = "gemm-f64" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-f64" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" -dependencies = [ - "dyn-stack 0.13.0", - "gemm-common 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.5.0", - "seq-macro", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "getset" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3586f256131df87204eb733da72e3d3eb4f343c639f4b7be279ac7c48baeafe" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "h2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" -dependencies = [ - "bytemuck", - "cfg-if", - "crunchy", - "num-traits", - "rand 0.9.1", - "rand_distr 0.5.1", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" - -[[package]] -name = "hf-hub" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc03dcb0b0a83ae3f3363ec811014ae669f083e4e499c66602f447c4828737a1" -dependencies = [ - "dirs", - "futures", - "http", - "indicatif", - "libc", - "log", - "native-tls", - "num_cpus", - "rand 0.8.5", - "reqwest", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "ureq", - "windows-sys 0.59.0", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.61.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke 0.8.0", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke 0.8.0", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.25.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" -dependencies = [ - "bytemuck", - "byteorder-lite", - "num-traits", - "png", - "ravif", - "rayon", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "imageproc" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a0d7770f428b4615960cc8602775d1f04c75d41b0ccdef862e889ebaae9bbf" -dependencies = [ - "ab_glyph", - "approx", - "conv", - "getrandom 0.2.16", - "image", - "itertools 0.12.1", - "nalgebra", - "num", - "rand 0.8.5", - "rand_distr 0.4.3", -] - -[[package]] -name = "imgref" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown 0.15.3", - "serde", -] - -[[package]] -name = "indicatif" -version = "0.17.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" -dependencies = [ - "console", - "number_prefix", - "portable-atomic", - "unicode-width", - "web-time", -] - -[[package]] -name = "indoc" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" - -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - -[[package]] -name = "intel-mkl-src" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee70586cd5b3e772a8739a1bd43eaa90d4f4bf0fb2a4edc202e979937ee7f5e" -dependencies = [ - "anyhow", - "intel-mkl-tool", - "ocipkg", -] - -[[package]] -name = "intel-mkl-tool" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887a16b4537d82227af54d3372971cfa5e0cde53322e60f57584056c16ada1b4" -dependencies = [ - "anyhow", - "log", - "walkdir", -] - -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom 0.3.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lexical-core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" -dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", -] - -[[package]] -name = "lexical-parse-float" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" -dependencies = [ - "lexical-parse-integer", - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-parse-integer" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" -dependencies = [ - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-util" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" -dependencies = [ - "static_assertions", -] - -[[package]] -name = "lexical-write-float" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" -dependencies = [ - "lexical-util", - "lexical-write-integer", - "static_assertions", -] - -[[package]] -name = "lexical-write-integer" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" -dependencies = [ - "lexical-util", - "static_assertions", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.0", -] - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.1", - "libc", - "redox_syscall", -] - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "local_inference_engine" -version = "0.1.0" -dependencies = [ - "ab_glyph", - "accelerate-src", - "anyhow", - "axum", - "bindgen_cuda", - "byteorder", - "candle-core", - "candle-datasets", - "candle-flash-attn", - "candle-nn", - "candle-onnx", - "candle-transformers", - "clap", - "cpal", - "csv", - "cudarc", - "either", - "enterpolation", - "half", - "hf-hub", - "image", - "imageproc", - "intel-mkl-src", - "memmap2", - "num-traits", - "palette", - "pdf2image", - "pyo3", - "rand 0.9.1", - "rayon", - "reborrow", - "rubato", - "safetensors", - "serde", - "serde_json", - "symphonia", - "tokenizers", - "tokio", - "tower 0.4.13", - "tower-http 0.5.2", - "tracing", - "tracing-chrome", - "tracing-subscriber", - "utoipa", - "uuid", -] - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "lz4_flex" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" -dependencies = [ - "twox-hash", -] - -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - -[[package]] -name = "macro_rules_attribute" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65049d7923698040cd0b1ddcced9b0eb14dd22c5f86ae59c3740eab64a676520" -dependencies = [ - "macro_rules_attribute-proc_macro", - "paste", -] - -[[package]] -name = "macro_rules_attribute-proc_macro" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670fdfda89751bc4a84ac13eaa63e205cf0fd22b4c9a5fbfa085b63c1f1d3a30" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "matrixmultiply" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", - "stable_deref_trait", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metal" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" -dependencies = [ - "bitflags 2.9.1", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.9.1", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "monostate" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe1be9d0c75642e3e50fedc7ecadf1ef1cbce6eb66462153fc44245343fbee" -dependencies = [ - "monostate-impl", - "serde", -] - -[[package]] -name = "monostate-impl" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c402a4092d5e204f32c9e155431046831fa712637043c58cb73bc6bc6c9663b5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - -[[package]] -name = "nalgebra" -version = "0.32.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" -dependencies = [ - "approx", - "matrixmultiply", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" -dependencies = [ - "bitflags 2.9.1", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "bytemuck", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "oboe" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" -dependencies = [ - "jni", - "ndk", - "ndk-context", - "num-derive", - "num-traits", - "oboe-sys", -] - -[[package]] -name = "oboe-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" -dependencies = [ - "cc", -] - -[[package]] -name = "oci-spec" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f5a3fe998d50101ae009351fec56d88a69f4ed182e11000e711068c2f5abf72" -dependencies = [ - "derive_builder", - "getset", - "once_cell", - "regex", - "serde", - "serde_json", - "strum", - "strum_macros", - "thiserror 1.0.69", -] - -[[package]] -name = "ocipkg" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb3293021f06540803301af45e7ab81693d50e89a7398a3420bdab139e7ba5e" -dependencies = [ - "base16ct", - "base64 0.22.1", - "chrono", - "directories", - "flate2", - "lazy_static", - "log", - "oci-spec", - "regex", - "serde", - "serde_json", - "sha2", - "tar", - "thiserror 1.0.69", - "toml", - "ureq", - "url", - "uuid", - "walkdir", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - -[[package]] -name = "onig" -version = "6.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" -dependencies = [ - "bitflags 2.9.1", - "libc", - "once_cell", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f86c6eef3d6df15f23bcfb6af487cbd2fed4e5581d58d5bf1f5f8b7f6727dc" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "owned_ttf_parser" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" -dependencies = [ - "ttf-parser", -] - -[[package]] -name = "palette" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" -dependencies = [ - "approx", - "fast-srgb8", - "palette_derive", - "phf", -] - -[[package]] -name = "palette_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" -dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "parquet" -version = "51.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "096795d4f47f65fd3ee1ec5a98b77ab26d602f2cc785b0e4be5443add17ecc32" -dependencies = [ - "ahash", - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", - "arrow-ipc", - "arrow-schema", - "arrow-select", - "base64 0.22.1", - "brotli", - "bytes", - "chrono", - "flate2", - "half", - "hashbrown 0.14.5", - "lz4_flex", - "num", - "num-bigint", - "paste", - "seq-macro", - "snap", - "thrift", - "twox-hash", - "zstd", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pdf2image" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81faf78c5913b018802dec31a604ce551724d89014a27e063a6e186771f92dea" -dependencies = [ - "derive_builder", - "image", - "rayon", - "thiserror 1.0.69", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "portable-atomic" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" -dependencies = [ - "proc-macro2", - "syn 2.0.101", -] - -[[package]] -name = "primal-check" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" -dependencies = [ - "num-integer", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" -dependencies = [ - "quote", - "syn 2.0.101", -] - -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" -dependencies = [ - "bytes", - "heck", - "itertools 0.12.1", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.101", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "prost-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost", -] - -[[package]] -name = "pulp" -version = "0.18.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" -dependencies = [ - "bytemuck", - "libm", - "num-complex", - "reborrow", -] - -[[package]] -name = "pulp" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b86df24f0a7ddd5e4b95c94fc9ed8a98f1ca94d3b01bdce2824097e7835907" -dependencies = [ - "bytemuck", - "cfg-if", - "libm", - "num-complex", - "reborrow", - "version_check", -] - -[[package]] -name = "pyo3" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884" -dependencies = [ - "cfg-if", - "indoc", - "libc", - "memoffset", - "once_cell", - "portable-atomic", - "pyo3-build-config", - "pyo3-ffi", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-ffi" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636" -dependencies = [ - "libc", - "pyo3-build-config", -] - -[[package]] -name = "pyo3-macros" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453" -dependencies = [ - "proc-macro2", - "pyo3-macros-backend", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe" -dependencies = [ - "heck", - "proc-macro2", - "pyo3-build-config", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.3", -] - -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "rand_distr" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" -dependencies = [ - "num-traits", - "rand 0.9.1", -] - -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.12.1", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", - "simd_helpers", - "system-deps", - "thiserror 1.0.69", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "raw-cpuid" -version = "10.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "raw-cpuid" -version = "11.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-cond" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059f538b55efd2309c9794130bc149c6a553db90e9d99c2030785c82f0bd7df9" -dependencies = [ - "either", - "itertools 0.11.0", - "rayon", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "realfft" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390252372b7f2aac8360fc5e72eba10136b166d6faeed97e6d0c8324eb99b2b1" -dependencies = [ - "rustfft", -] - -[[package]] -name = "reborrow" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" - -[[package]] -name = "redox_syscall" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "regex" -version = "1.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower 0.5.2", - "tower-http 0.6.6", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rubato" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5d18b486e7d29a408ef3f825bc1327d8f87af091c987ca2f5b734625940e234" -dependencies = [ - "num-complex", - "num-integer", - "num-traits", - "realfft", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustfft" -version = "6.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f266ff9b0cfc79de11fd5af76a2bc672fe3ace10c96fa06456740fa70cb1ed49" -dependencies = [ - "num-complex", - "num-integer", - "num-traits", - "primal-check", - "strength_reduce", - "transpose", - "version_check", -] - -[[package]] -name = "rustix" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "safe_arch" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "safetensors" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.1", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" - -[[package]] -name = "seq-macro" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_plain" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - -[[package]] -name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" - -[[package]] -name = "snap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socks" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" -dependencies = [ - "byteorder", - "libc", - "winapi", -] - -[[package]] -name = "spm_precompiled" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326" -dependencies = [ - "base64 0.13.1", - "nom", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strength_reduce" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "symphonia" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" -dependencies = [ - "lazy_static", - "symphonia-bundle-flac", - "symphonia-bundle-mp3", - "symphonia-codec-aac", - "symphonia-codec-adpcm", - "symphonia-codec-alac", - "symphonia-codec-pcm", - "symphonia-codec-vorbis", - "symphonia-core", - "symphonia-format-caf", - "symphonia-format-isomp4", - "symphonia-format-mkv", - "symphonia-format-ogg", - "symphonia-format-riff", - "symphonia-metadata", -] - -[[package]] -name = "symphonia-bundle-flac" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e34f34298a7308d4397a6c7fbf5b84c5d491231ce3dd379707ba673ab3bd97" -dependencies = [ - "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", -] - -[[package]] -name = "symphonia-bundle-mp3" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" -dependencies = [ - "lazy_static", - "log", - "symphonia-core", - "symphonia-metadata", -] - -[[package]] -name = "symphonia-codec-aac" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbf25b545ad0d3ee3e891ea643ad115aff4ca92f6aec472086b957a58522f70" -dependencies = [ - "lazy_static", - "log", - "symphonia-core", -] - -[[package]] -name = "symphonia-codec-adpcm" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94e1feac3327cd616e973d5be69ad36b3945f16b06f19c6773fc3ac0b426a0f" -dependencies = [ - "log", - "symphonia-core", -] - -[[package]] -name = "symphonia-codec-alac" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d8a6666649a08412906476a8b0efd9b9733e241180189e9f92b09c08d0e38f3" -dependencies = [ - "log", - "symphonia-core", -] - -[[package]] -name = "symphonia-codec-pcm" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b" -dependencies = [ - "log", - "symphonia-core", -] - -[[package]] -name = "symphonia-codec-vorbis" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30" -dependencies = [ - "log", - "symphonia-core", - "symphonia-utils-xiph", -] - -[[package]] -name = "symphonia-core" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" -dependencies = [ - "arrayvec", - "bitflags 1.3.2", - "bytemuck", - "lazy_static", - "log", -] - -[[package]] -name = "symphonia-format-caf" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43c99c696a388295a29fe71b133079f5d8b18041cf734c5459c35ad9097af50" -dependencies = [ - "log", - "symphonia-core", - "symphonia-metadata", -] - -[[package]] -name = "symphonia-format-isomp4" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfdf178d697e50ce1e5d9b982ba1b94c47218e03ec35022d9f0e071a16dc844" -dependencies = [ - "encoding_rs", - "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", -] - -[[package]] -name = "symphonia-format-mkv" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb43471a100f7882dc9937395bd5ebee8329298e766250b15b3875652fe3d6f" -dependencies = [ - "lazy_static", - "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", -] - -[[package]] -name = "symphonia-format-ogg" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada3505789516bcf00fc1157c67729eded428b455c27ca370e41f4d785bfa931" -dependencies = [ - "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", -] - -[[package]] -name = "symphonia-format-riff" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50" -dependencies = [ - "extended", - "log", - "symphonia-core", - "symphonia-metadata", -] - -[[package]] -name = "symphonia-metadata" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" -dependencies = [ - "encoding_rs", - "lazy_static", - "log", - "symphonia-core", -] - -[[package]] -name = "symphonia-utils-xiph" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe" -dependencies = [ - "symphonia-core", - "symphonia-metadata", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "sysctl" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" -dependencies = [ - "bitflags 2.9.1", - "byteorder", - "enum-as-inner", - "libc", - "thiserror 1.0.69", - "walkdir", -] - -[[package]] -name = "sysctl" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" -dependencies = [ - "bitflags 2.9.1", - "byteorder", - "enum-as-inner", - "libc", - "thiserror 1.0.69", - "walkdir", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.9.1", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "tar" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tempfile" -version = "3.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" -dependencies = [ - "fastrand", - "getrandom 0.3.3", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "thrift" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" -dependencies = [ - "byteorder", - "integer-encoding", - "ordered-float", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokenizers" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3169b3195f925496c895caee7978a335d49218488ef22375267fba5a46a40bd7" -dependencies = [ - "aho-corasick", - "derive_builder", - "esaxx-rs", - "getrandom 0.2.16", - "hf-hub", - "itertools 0.13.0", - "lazy_static", - "log", - "macro_rules_attribute", - "monostate", - "onig", - "paste", - "rand 0.8.5", - "rayon", - "rayon-cond", - "regex", - "regex-syntax", - "serde", - "serde_json", - "spm_precompiled", - "thiserror 2.0.12", - "unicode-normalization-alignments", - "unicode-segmentation", - "unicode_categories", -] - -[[package]] -name = "tokio" -version = "1.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" - -[[package]] -name = "topology-traits" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c8dab428531e30115d3bfd6e3092b55256a4a7b4f87cb3abe37a000b1f4032" -dependencies = [ - "num-traits", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" -dependencies = [ - "bitflags 2.9.1", - "bytes", - "http", - "http-body", - "http-body-util", - "pin-project-lite", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" -dependencies = [ - "bitflags 2.9.1", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tracing-chrome" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724" -dependencies = [ - "serde_json", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "transpose" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" -dependencies = [ - "num-integer", - "strength_reduce", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - -[[package]] -name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "static_assertions", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "ug" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90b70b37e9074642bc5f60bb23247fd072a84314ca9e71cdf8527593406a0dd3" -dependencies = [ - "gemm 0.18.2", - "half", - "libloading", - "memmap2", - "num", - "num-traits", - "num_cpus", - "rayon", - "safetensors", - "serde", - "thiserror 1.0.69", - "tracing", - "yoke 0.7.5", -] - -[[package]] -name = "ug-cuda" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14053653d0b7fa7b21015aa9a62edc8af2f60aa6f9c54e66386ecce55f22ed29" -dependencies = [ - "cudarc", - "half", - "serde", - "thiserror 1.0.69", - "ug", -] - -[[package]] -name = "ug-metal" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76daec3c7a32a1b4a0e3307b6b057fa067aa64e750713987410a2c402e5cd731" -dependencies = [ - "half", - "metal 0.29.0", - "objc", - "serde", - "thiserror 1.0.69", - "ug", -] - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-normalization-alignments" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f613e4fa046e69818dd287fdc4bc78175ff20331479dab6e1b0f98d57062de" -dependencies = [ - "smallvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unindent" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" -dependencies = [ - "base64 0.22.1", - "flate2", - "log", - "native-tls", - "once_cell", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "socks", - "url", - "webpki-roots 0.26.11", -] - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "utoipa" -version = "4.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" -dependencies = [ - "indexmap", - "serde", - "serde_json", - "utoipa-gen", -] - -[[package]] -name = "utoipa-gen" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c24e8ab68ff9ee746aad22d39b5535601e6416d1b0feeabf78be986a5c4392" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "regex", - "syn 2.0.101", -] - -[[package]] -name = "uuid" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" -dependencies = [ - "getrandom 0.3.3", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "v_frame" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] - -[[package]] -name = "webpki-roots" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "wide" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" -dependencies = [ - "bytemuck", - "safe_arch", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" -dependencies = [ - "windows-core 0.54.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" -dependencies = [ - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result 0.3.4", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" -dependencies = [ - "windows-link", - "windows-result 0.3.4", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winnow" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "xattr" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" -dependencies = [ - "libc", - "rustix", -] - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.7.5", - "zerofrom", -] - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.8.0", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke 0.8.0", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke 0.8.0", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zip" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" -dependencies = [ - "arbitrary", - "crc32fast", - "crossbeam-utils", - "displaydoc", - "indexmap", - "num_enum", - "thiserror 1.0.69", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - -[[package]] -name = "zune-jpeg" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4a518c0ea2576f4da876349d7f67a7be489297cd77c2cf9e04c2e05fcd3974" -dependencies = [ - "zune-core", -] diff --git a/crates/legacy-inference-engine/Cargo.toml b/crates/legacy-inference-engine/Cargo.toml deleted file mode 100644 index 3458f90..0000000 --- a/crates/legacy-inference-engine/Cargo.toml +++ /dev/null @@ -1,77 +0,0 @@ -[package] -name = "legacy-inference-engine" -version = "0.1.0" -edition = "2021" - -[dependencies] -accelerate-src = { version = "0.3.2", optional = true } -candle-datasets = { version = "=0.9.1", optional = true } -candle-nn = { version = "=0.9.1" } -candle-transformers = { version = "=0.9.1" } -candle-flash-attn = { version = "=0.9.1", optional = true } -candle-onnx = { version = "=0.9.1", optional = true } - -csv = "1.3.0" -cudarc = { version = "0.16.3", features = ["std", "cublas", "cublaslt", "curand", "driver", "nvrtc", "f16", "cuda-version-from-build-system", "dynamic-linking"], default-features=false, optional = true } -half = { version = "2.5.0", features = ["num-traits", "use-intrinsics", "rand_distr"], optional = true } -hf-hub = { version = "0.4.1", features = ["tokio"] } -image = { version = "0.25.2", default-features = false, features = ["jpeg", "png"] } -intel-mkl-src = { version = "0.8.1", features = ["mkl-static-lp64-iomp"], optional = true } -num-traits = { version = "0.2.15" } -palette = { version = "0.7.6", optional = true } -enterpolation = { version = "0.2.1", optional = true} -pyo3 = { version = "0.22.0", features = ["auto-initialize", "abi3-py311"], optional = true } -rayon = "1.7.0" -rubato = { version = "0.15.0", optional = true } -safetensors = "0.4.1" -serde = { version = "1.0.171", features = ["derive"] } -serde_json = "1.0.99" -symphonia = { version = "0.5.3", features = ["all"], optional = true } -tokenizers = { version = "0.21.0", default-features = false, features = ["onig", "http"] } -cpal = { version = "0.15.2", optional = true } -pdf2image = { version = "0.1.2" , optional = true} -anyhow = "1.0.98" -clap= { version = "4.2.4", features = ["derive"] } -tracing = "0.1.37" -tracing-chrome = "0.7.1" -tracing-subscriber = "0.3.7" -axum = { version = "0.7.4", features = ["json"] } -tower = "0.4.13" -tower-http = { version = "0.5.1", features = ["cors"] } -tokio = { version = "1.43.0", features = ["full"] } -either = { version = "1.9.0", features = ["serde"] } -utoipa = { version = "4.2.0", features = ["axum_extras"] } -uuid = { version = "1.7.0", features = ["v4"] } -reborrow = "0.5.5" - -# --- Add this section for conditional compilation --- -[target.'cfg(target_os = "macos")'.dependencies] -candle-core = { version = "=0.9.1", features = ["metal"] } -metal = { version = "0.32.0", features = ["mps"] } - -[target.'cfg(not(target_os = "macos"))'.dependencies] -# For Linux or other non-macOS systems, you likely want the CPU backend or CUDA -# If you're building on Linux with a CUDA-enabled GPU: -candle-core = { version = "=0.9.1", features = ["cuda"], default-features = false } # Or just "cuda" if not using default features - -# If you're building on Linux with only CPU: -# candle-core = { version = "=0.9.1", default-features = false } # CPU is often the default, but good to be explicit -# --- End of conditional compilation section --- - -[dev-dependencies] -anyhow = { version = "1", features = ["backtrace"] } -byteorder = { version = "1.4.3" } -clap = { version = "4.2.4", features = ["derive"] } -imageproc = { version = "0.24.0", default-features = false } -memmap2 = { version = "0.9.3", features = ["stable_deref_trait"] } -rand = { version = "0.9.0" } -ab_glyph = { version = "0.2.23" } -tracing = { version = "0.1.37" } -tracing-chrome = { version = "0.7.1" } -tracing-subscriber = { version = "0.3.7" } -# Necessary to disambiguate with tokio in wasm examples which are 1.28.1 -tokio = "1.43.0" - -[build-dependencies] -anyhow = { version = "1", features = ["backtrace"] } -bindgen_cuda = { version = "0.1.1", optional = true } \ No newline at end of file diff --git a/crates/legacy-inference-engine/README.md b/crates/legacy-inference-engine/README.md deleted file mode 100644 index 688bae0..0000000 --- a/crates/legacy-inference-engine/README.md +++ /dev/null @@ -1,210 +0,0 @@ -# @open-web-agent-rs/legacy-inference-engine - -## Note -This is here as a reference implementation. This is harder than it looks. - - -A Rust-based inference engine for running large language models locally. This tool supports both CLI mode for direct text generation and server mode with an OpenAI-compatible API. - -## Features - -- Run Gemma models locally (1B, 2B, 7B, 9B variants) -- CLI mode for direct text generation -- Server mode with OpenAI-compatible API -- Support for various model configurations (base, instruction-tuned) -- Metal acceleration on macOS - -## Installation - -### Prerequisites - -- Rust toolchain (install via [rustup](https://rustup.rs/)) -- Cargo package manager -- For GPU acceleration: - - macOS: Metal support - - Linux/Windows: CUDA support (requires appropriate drivers) - -### Building from Source - -1. Clone the repository: - ```bash - git clone https://github.com/seemueller-io/open-web-agent-rs.git - cd open-web-agent-rs - ``` - -2. Build the local inference engine: - ```bash - cargo build -p legacy-inference-engine --release - ``` - -## Usage - -### CLI Mode - -Run the inference engine in CLI mode to generate text directly: - -```bash -cargo run -p legacy-inference-engine --release -- --prompt 'Name the 16th President of the USA.' --which 3-1b-it -``` - -#### CLI Options - -- `--prompt `: The prompt text to generate from -- `--which `: Model variant to use (default: "3-1b-it") -- `--server`: Run OpenAI compatible server -- Available options: "2b", "7b", "2b-it", "7b-it", "1.1-2b-it", "1.1-7b-it", "code-2b", "code-7b", "code-2b-it", "code-7b-it", "2-2b", "2-2b-it", "2-9b", "2-9b-it", "3-1b", "3-1b-it" -- `--temperature `: Temperature for sampling (higher = more random) -- `--top-p `: Nucleus sampling probability cutoff -- `--sample-len `: Maximum number of tokens to generate (default: 10000) -- `--repeat-penalty `: Penalty for repeating tokens (default: 1.1) -- `--repeat-last-n `: Context size for repeat penalty (default: 64) -- `--cpu`: Run on CPU instead of GPU -- `--tracing`: Enable tracing (generates a trace-timestamp.json file) - -### Server Mode with OpenAI-compatible API - -Run the inference engine in server mode to expose an OpenAI-compatible API: - -```bash -cargo run -p legacy-inference-engine --release -- --server --port 3777 --which 3-1b-it -``` - -This starts a web server on the specified port (default: 3777) with an OpenAI-compatible chat completions endpoint. - -#### Server Options - -- `--server`: Run in server mode -- `--port `: Port to use for the server (default: 3777) -- `--which `: Model variant to use (default: "3-1b-it") -- Other model options as described in CLI mode - -## API Usage - -The server exposes an OpenAI-compatible chat completions endpoint: - -### Chat Completions - -``` -POST /v1/chat/completions -``` - -#### Request Format - -```json -{ - "model": "gemma-3-1b-it", - "messages": [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Hello, how are you?"} - ], - "temperature": 0.7, - "max_tokens": 256, - "top_p": 0.9, - "stream": false -} -``` - -#### Response Format - -```json -{ - "id": "chatcmpl-123abc456def789ghi", - "object": "chat.completion", - "created": 1677858242, - "model": "gemma-3-1b-it", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": "I'm doing well, thank you for asking! How can I assist you today?" - }, - "finish_reason": "stop" - } - ], - "usage": { - "prompt_tokens": 25, - "completion_tokens": 15, - "total_tokens": 40 - } -} -``` - -### Example: Using cURL - -```bash -curl -X POST http://localhost:3777/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "gemma-3-1b-it", - "messages": [ - {"role": "user", "content": "What is the capital of France?"} - ], - "temperature": 0.7, - "max_tokens": 100 - }' -``` - -### Example: Using Python with OpenAI Client - -```python -from openai import OpenAI - -client = OpenAI( - base_url="http://localhost:3777/v1", - api_key="dummy" # API key is not validated but required by the client -) - -response = client.chat.completions.create( - model="gemma-3-1b-it", - messages=[ - {"role": "user", "content": "What is the capital of France?"} - ], - temperature=0.7, - max_tokens=100 -) - -print(response.choices[0].message.content) -``` - -### Example: Using JavaScript/TypeScript with OpenAI SDK - -```javascript -import OpenAI from 'openai'; - -const openai = new OpenAI({ - baseURL: 'http://localhost:3777/v1', - apiKey: 'dummy', // API key is not validated but required by the client -}); - -async function main() { - const response = await openai.chat.completions.create({ - model: 'gemma-3-1b-it', - messages: [ - { role: 'user', content: 'What is the capital of France?' } - ], - temperature: 0.7, - max_tokens: 100, - }); - - console.log(response.choices[0].message.content); -} - -main(); -``` - -## Troubleshooting - -### Common Issues - -1. **Model download errors**: Make sure you have a stable internet connection. The models are downloaded from Hugging Face Hub. - -2. **Out of memory errors**: Try using a smaller model variant or reducing the batch size. - -3. **Slow inference on CPU**: This is expected. For better performance, use GPU acceleration if available. - -4. **Metal/CUDA errors**: Ensure you have the latest drivers installed for your GPU. - -## License - -This project is licensed under the terms specified in the LICENSE file. diff --git a/crates/legacy-inference-engine/ROOT_CAUSE_ANALYSIS.md b/crates/legacy-inference-engine/ROOT_CAUSE_ANALYSIS.md deleted file mode 100644 index 958bfd1..0000000 --- a/crates/legacy-inference-engine/ROOT_CAUSE_ANALYSIS.md +++ /dev/null @@ -1,127 +0,0 @@ -# Root Cause Analysis: Metal error "no metal implementation for rotary-emb" - -Date: 2025-08-27 -Component: crates/legacy-inference-engine -Command to reproduce: crates/legacy-inference-engine/test_cli.sh - -## Summary -Running the CLI with the default model (--which 3-1b-it, i.e., Gemma 3 1B Instruct) on an Apple Silicon Mac results in a runtime failure: - -``` -modelError: Metal error no metal implementation for rotary-emb - -Caused by: - no metal implementation for rotary-emb -``` - -This occurs because the project targets the Candle Metal (MPS) backend on macOS, but the Candle version in use (0.9.1) does not provide a Metal kernel implementation for the rotary embedding operation required by Gemma 3 models. The program selects the Metal device by default on macOS and hits this missing kernel during the attention computation. - -## Environment and build configuration -- Machine: 2024 MacBook Pro, Apple Silicon (M4 Max) -- Crate: legacy-inference-engine -- Candle versions: pinned to =0.9.1 - - candle-core = "=0.9.1" - - candle-transformers = "=0.9.1" -- macOS-specific dependency enabling Metal (file: crates/legacy-inference-engine/Cargo.toml): - -```text -[target.'cfg(target_os = "macos")'.dependencies] -candle-core = { version = "=0.9.1", features = ["metal"] } -metal = { version = "0.32.0", features = ["mps"] } -``` - -- Run command (attached script): crates/legacy-inference-engine/test_cli.sh - -```text -cargo run -p legacy-inference-engine --release -- --prompt 'Name the 16th President of the USA.' --which 3-1b-it -``` - -## What the code does at runtime -1) Device selection (defaults to Metal on macOS if available): -- File: crates/legacy-inference-engine/src/utilities_lib.rs (lines 4–12) - -```text -pub fn device(cpu: bool) -> Result { - if cpu { - Ok(Device::Cpu) - } else if cuda_is_available() { - Ok(Device::new_cuda(0)?) - } else if metal_is_available() { - Ok(Device::new_metal(0)?) - } else { - // ... falls back to CPU - Ok(Device::Cpu) - } -} -``` - -- The CLI does not pass --cpu, so on Apple Silicon with Metal available, Device::new_metal(0) is selected. - -2) Default model selection is Gemma 3 1B Instruct: -- File: crates/legacy-inference-engine/src/main.rs -- Arg default (lines 705–707): - -```text -/// The model to use. -#[arg(long, default_value = "3-1b-it")] -which: Which, -``` - -- Model id resolution (lines 758–760): - -```text -Which::BaseV3_1B => "google/gemma-3-1b-pt".to_string(), -Which::InstructV3_1B => "google/gemma-3-1b-it".to_string(), -``` - -- Model loading uses Model3 (Gemma 3) for Which::BaseV3_1B | Which::InstructV3_1B (lines 817–821). - -3) During generation, the Gemma 3 attention path requires rotary embeddings. On the Metal backend in Candle 0.9.1, the rotary embedding op is not implemented, resulting in the runtime error. - -## Additional build-time signal (misleading but not causal) -- File: crates/legacy-inference-engine/src/main.rs (lines 10–11) - -```text -#[cfg(feature = "metal")] -extern crate metal_src; -``` - -- Build warning: unexpected cfg condition value: metal -Explanation: The project does not define a Cargo feature named "metal"; instead, Metal is enabled via target-specific dependency features in Cargo.toml. This cfg gate is ineffective and triggers a warning. It does not cause the runtime failure; it just indicates confusing/obsolete gating. - -## Root cause -- The program runs on the Candle Metal backend (MPS) due to device auto-selection on macOS. -- The selected model (Gemma 3 1B Instruct) requires the rotary embedding operation in its attention mechanism. -- Candle 0.9.1’s Metal backend lacks an implementation for the rotary-emb kernel. When the model executes on Metal, it attempts to invoke this operation and fails with: "no metal implementation for rotary-emb". - -## Evidence -- Runtime log shows the failure immediately after model load when inference begins. -- Code paths confirm: device defaults to Metal on macOS; default model is Gemma 3; Gemma 3 uses rotary embeddings. -- Candle version pinned to 0.9.1 where rotary-emb on Metal is not available. - -## Impact -- Any attempt to run Gemma 3 (and possibly other rotary-embedding reliant models) on the Metal backend with Candle 0.9.1 will fail at runtime on macOS. - -## Workarounds and remediation options -1) Immediate workarounds: -- Run on CPU: add the --cpu flag to force CPU backend. - - Example: cargo run -p legacy-inference-engine --release -- --cpu --prompt '...' --which 3-1b-it -- Use a model variant that does not hit the unimplemented kernel on Metal (e.g., older Gemma v1/v2), though many modern LLMs rely on rotary embeddings, so this may not help. - -2) Recommended remediation (code/dependency changes): -- Upgrade Candle crates (candle-core, candle-transformers, etc.) to a version where the Metal backend implements rotary embeddings. Review Candle’s changelog/PRs for Metal/MPS kernel support and update to the first version that includes rotary-emb on Metal. -- Alternatively, implement a CPU fallback path for rotary-emb when running on Metal (hybrid execution). This is non-trivial and may degrade performance. -- Provide a configuration/flag to disable Metal by default on macOS for models known to require missing ops until Candle is upgraded. -- Clean up the misleading #[cfg(feature = "metal")] gate in main.rs to avoid confusion; Metal enablement is already handled in Cargo.toml via target-specific features. - -## Suggested next steps -- Short term: document and expose --cpu usage in README and/or make the default model a Metal-compatible one until dependency upgrade. -- Medium term: bump Candle dependencies and test Gemma 3 on Metal; remove the obsolete cfg(feature = "metal") gate. -- Long term: integrate a device capability check and automatic fallback (informative log) when encountering unsupported kernels on the selected backend. - -## References (code locations) -- crates/legacy-inference-engine/src/utilities_lib.rs lines 4–12: device selection (Metal default on macOS if available). -- crates/legacy-inference-engine/src/main.rs lines 705–707: default which = 3-1b-it. -- crates/legacy-inference-engine/src/main.rs lines 758–760 and 817–821: Gemma 3 model selection and instantiation. -- crates/legacy-inference-engine/Cargo.toml macOS target section: Candle with features = ["metal"]. -- crates/legacy-inference-engine/src/main.rs lines 10–11: obsolete #[cfg(feature = "metal")] gate that triggers a warning. diff --git a/crates/legacy-inference-engine/api_test.html b/crates/legacy-inference-engine/api_test.html deleted file mode 100644 index f4654a5..0000000 --- a/crates/legacy-inference-engine/api_test.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - OpenAI-Compatible API Tester - - - -

OpenAI-Compatible API Tester

-

Use this page to test the OpenAI-compatible chat completions endpoint of the local inference engine.

- -
-

Request Settings

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -

Request Body

- - - -
-

Example Requests

- - - - -
- -
-

Response

-
Response will appear here...
-
-
- - - - \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/cli.rs b/crates/legacy-inference-engine/src/cli.rs deleted file mode 100644 index 2758bc3..0000000 --- a/crates/legacy-inference-engine/src/cli.rs +++ /dev/null @@ -1,72 +0,0 @@ -use clap::Parser; -use crate::model::Which; - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -pub struct Args { - /// Run on CPU rather than on GPU. - #[arg(long)] - pub cpu: bool, - - /// Enable tracing (generates a trace-timestamp.json file). - #[arg(long)] - pub tracing: bool, - - /// Run in server mode with OpenAI compatible API - #[arg(long)] - pub server: bool, - - /// Port to use for the server - #[arg(long, default_value_t = 3777)] - pub port: u16, - - /// Prompt for text generation (not used in server mode) - #[arg(long)] - pub prompt: Option, - - /// The temperature used to generate samples. - #[arg(long)] - pub temperature: Option, - - /// Nucleus sampling probability cutoff. - #[arg(long)] - pub top_p: Option, - - /// The seed to use when generating random samples. - #[arg(long, default_value_t = 299792458)] - pub seed: u64, - - /// The length of the sample to generate (in tokens). - #[arg(long, short = 'n', default_value_t = 10000)] - pub sample_len: usize, - - #[arg(long)] - pub model_id: Option, - - #[arg(long, default_value = "main")] - pub revision: String, - - #[arg(long)] - pub tokenizer_file: Option, - - #[arg(long)] - pub config_file: Option, - - #[arg(long)] - pub weight_files: Option, - - /// Penalty to be applied for repeating tokens, 1. means no penalty. - #[arg(long, default_value_t = 1.1)] - pub repeat_penalty: f32, - - /// The context size to consider for the repeat penalty. - #[arg(long, default_value_t = 64)] - pub repeat_last_n: usize, - - /// The model to use. - #[arg(long, default_value = "3-1b-it")] - pub which: Which, - - #[arg(long)] - pub use_flash_attn: bool, -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/lib.rs b/crates/legacy-inference-engine/src/lib.rs deleted file mode 100644 index 5769197..0000000 --- a/crates/legacy-inference-engine/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -// Expose modules for testing and library usage -pub mod token_output_stream; -pub mod model; -pub mod text_generation; -pub mod utilities_lib; -pub mod openai_types; -pub mod cli; -pub mod server; - -// Re-export key components for easier access -pub use model::{Model, Which}; -pub use text_generation::TextGeneration; -pub use token_output_stream::TokenOutputStream; \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/main.rs b/crates/legacy-inference-engine/src/main.rs deleted file mode 100644 index e0da7a3..0000000 --- a/crates/legacy-inference-engine/src/main.rs +++ /dev/null @@ -1,912 +0,0 @@ -mod token_output_stream; -mod utilities_lib; - -#[cfg(feature = "intel-mkl-src")] -extern crate intel_mkl_src; - -#[cfg(feature = "accelerate-src")] -extern crate accelerate_src; - -#[cfg(feature = "metal")] -extern crate metal_src; - -use anyhow::{Error as E, Result}; -use axum::{ - extract::State, - http::StatusCode, - response::IntoResponse, - routing::{get, post}, - Json, Router, -}; -use clap::Parser; -use either::Either; -use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, net::SocketAddr, sync::Arc}; -use tokio::sync::Mutex; -use tower_http::cors::{Any, CorsLayer}; -use utoipa::ToSchema; - -use candle_transformers::models::gemma::{Config as Config1, Model as Model1}; -use candle_transformers::models::gemma2::{Config as Config2, Model as Model2}; -use candle_transformers::models::gemma3::{Config as Config3, Model as Model3}; - -// OpenAI API compatible structs - -/// Inner content structure for messages that can be either a string or key-value pairs -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct MessageInnerContent( - #[serde(with = "either::serde_untagged")] pub Either>, -); - -impl ToSchema<'_> for MessageInnerContent { - fn schema() -> (&'static str, utoipa::openapi::RefOr) { - ( - "MessageInnerContent", - utoipa::openapi::RefOr::T(message_inner_content_schema()), - ) - } -} - -/// Function for MessageInnerContent Schema generation to handle `Either` -fn message_inner_content_schema() -> utoipa::openapi::Schema { - use utoipa::openapi::{ArrayBuilder, ObjectBuilder, OneOfBuilder, RefOr, Schema, SchemaType}; - - Schema::OneOf( - OneOfBuilder::new() - // Either::Left - simple string - .item(Schema::Object( - ObjectBuilder::new().schema_type(SchemaType::String).build(), - )) - // Either::Right - object with string values - .item(Schema::Object( - ObjectBuilder::new() - .schema_type(SchemaType::Object) - .additional_properties(Some(RefOr::T(Schema::Object( - ObjectBuilder::new().schema_type(SchemaType::String).build(), - )))) - .build(), - )) - .build(), - ) -} - -/// Message content that can be either simple text or complex structured content -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct MessageContent( - #[serde(with = "either::serde_untagged")] - Either>>, -); - -impl ToSchema<'_> for MessageContent { - fn schema() -> (&'static str, utoipa::openapi::RefOr) { - ("MessageContent", utoipa::openapi::RefOr::T(message_content_schema())) - } -} - -/// Function for MessageContent Schema generation to handle `Either` -fn message_content_schema() -> utoipa::openapi::Schema { - use utoipa::openapi::{ArrayBuilder, ObjectBuilder, OneOfBuilder, RefOr, Schema, SchemaType}; - - Schema::OneOf( - OneOfBuilder::new() - .item(Schema::Object( - ObjectBuilder::new().schema_type(SchemaType::String).build(), - )) - .item(Schema::Array( - ArrayBuilder::new() - .items(RefOr::T(Schema::Object( - ObjectBuilder::new() - .schema_type(SchemaType::Object) - .additional_properties(Some(RefOr::Ref( - utoipa::openapi::Ref::from_schema_name("MessageInnerContent"), - ))) - .build(), - ))) - .build(), - )) - .build(), - ) -} - -/// Represents a single message in a conversation -#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)] -pub struct Message { - /// The message content - pub content: Option, - /// The role of the message sender ("user", "assistant", "system", "tool", etc.) - pub role: String, - pub name: Option, -} - -/// Stop token configuration for generation -#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)] -#[serde(untagged)] -pub enum StopTokens { - /// Multiple possible stop sequences - Multi(Vec), - /// Single stop sequence - Single(String), -} - -/// Default value helper -fn default_false() -> bool { - false -} - -/// Default value helper -fn default_1usize() -> usize { - 1 -} - -/// Default value helper -fn default_model() -> String { - "default".to_string() -} - -/// Chat completion request following OpenAI's specification -#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)] -pub struct ChatCompletionRequest { - #[schema(example = json!([{"role": "user", "content": "Why did the crab cross the road?"}]))] - pub messages: Vec, - #[schema(example = "gemma-3-1b-it")] - #[serde(default = "default_model")] - pub model: String, - #[serde(default = "default_false")] - #[schema(example = false)] - pub logprobs: bool, - #[schema(example = 256)] - pub max_tokens: Option, - #[serde(rename = "n")] - #[serde(default = "default_1usize")] - #[schema(example = 1)] - pub n_choices: usize, - #[schema(example = 0.7)] - pub temperature: Option, - #[schema(example = 0.9)] - pub top_p: Option, - #[schema(example = false)] - pub stream: Option, -} - -/// Chat completion choice -#[derive(Debug, Serialize, ToSchema)] -pub struct ChatCompletionChoice { - pub index: usize, - pub message: Message, - pub finish_reason: String, -} - -/// Chat completion response -#[derive(Debug, Serialize, ToSchema)] -pub struct ChatCompletionResponse { - pub id: String, - pub object: String, - pub created: u64, - pub model: String, - pub choices: Vec, - pub usage: Usage, -} - -/// Token usage information -#[derive(Debug, Serialize, ToSchema)] -pub struct Usage { - pub prompt_tokens: usize, - pub completion_tokens: usize, - pub total_tokens: usize, -} - -// Application state shared between handlers -#[derive(Clone)] -struct AppState { - text_generation: Arc>, - model_id: String, -} - -// Chat completions endpoint handler -async fn chat_completions( - State(state): State, - Json(request): Json, -) -> Result, (StatusCode, Json)> { - let mut prompt = String::new(); - - // Convert messages to a prompt string - for message in &request.messages { - let role = &message.role; - let content = match &message.content { - Some(content) => match &content.0 { - Either::Left(text) => text.clone(), - Either::Right(_) => "".to_string(), // Handle complex content if needed - }, - None => "".to_string(), - }; - - // Format based on role - match role.as_str() { - "system" => prompt.push_str(&format!("System: {}\n", content)), - "user" => prompt.push_str(&format!("User: {}\n", content)), - "assistant" => prompt.push_str(&format!("Assistant: {}\n", content)), - _ => prompt.push_str(&format!("{}: {}\n", role, content)), - } - } - - // Add the assistant prefix for the response - prompt.push_str("Assistant: "); - - // Capture the output - let mut output = Vec::new(); - { - let mut text_gen = state.text_generation.lock().await; - - // Buffer to capture the output - let mut buffer = Vec::new(); - - // Run text generation - let max_tokens = request.max_tokens.unwrap_or(1000); - let result = text_gen.run_with_output(&prompt, max_tokens, &mut buffer); - - if let Err(e) = result { - return Err(( - StatusCode::BAD_REQUEST, - Json(serde_json::json!({ - "error": { - "message": "The OpenAI API is currently not supported due to compatibility issues with the tensor operations. Please use the CLI mode instead with: cargo run --bin inference-engine -- --prompt \"Your prompt here\"", - "type": "unsupported_api" - } - })), - )); -} - - // Convert buffer to string - if let Ok(text) = String::from_utf8(buffer) { - output.push(text); - } - } - - // Create response - let response = ChatCompletionResponse { - id: format!("chatcmpl-{}", uuid::Uuid::new_v4().to_string().replace("-", "")), - object: "chat.completion".to_string(), - created: std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default() - .as_secs(), - model: request.model, - choices: vec![ChatCompletionChoice { - index: 0, - message: Message { - role: "assistant".to_string(), - content: Some(MessageContent(Either::Left(output.join("")))), - name: None, - }, - finish_reason: "stop".to_string(), - }], - usage: Usage { - prompt_tokens: prompt.len() / 4, // Rough estimate - completion_tokens: output.join("").len() / 4, // Rough estimate - total_tokens: (prompt.len() + output.join("").len()) / 4, // Rough estimate - }, - }; - - // Return the response as JSON - Ok(Json(response)) -} - -use candle_core::{DType, Device, MetalDevice, Tensor}; -use candle_nn::VarBuilder; -use candle_transformers::generation::LogitsProcessor; -use hf_hub::{Repo, RepoType, api::sync::Api}; -use serde_json::json; -use tokenizers::Tokenizer; -use crate::token_output_stream::TokenOutputStream; -use crate::utilities_lib::device; - -// Create the router with the chat completions endpoint -fn create_router(app_state: AppState) -> Router { - // CORS layer to allow requests from any origin - let cors = CorsLayer::new() - .allow_origin(Any) - .allow_methods(Any) - .allow_headers(Any); - - Router::new() - // OpenAI compatible endpoints - .route("/v1/chat/completions", post(chat_completions)) - // Add more endpoints as needed - .layer(cors) - .with_state(app_state) -} - -#[derive(Clone, Debug, Copy, PartialEq, Eq, clap::ValueEnum)] -enum Which { - #[value(name = "2b")] - Base2B, - #[value(name = "7b")] - Base7B, - #[value(name = "2b-it")] - Instruct2B, - #[value(name = "7b-it")] - Instruct7B, - #[value(name = "1.1-2b-it")] - InstructV1_1_2B, - #[value(name = "1.1-7b-it")] - InstructV1_1_7B, - #[value(name = "code-2b")] - CodeBase2B, - #[value(name = "code-7b")] - CodeBase7B, - #[value(name = "code-2b-it")] - CodeInstruct2B, - #[value(name = "code-7b-it")] - CodeInstruct7B, - #[value(name = "2-2b")] - BaseV2_2B, - #[value(name = "2-2b-it")] - InstructV2_2B, - #[value(name = "2-9b")] - BaseV2_9B, - #[value(name = "2-9b-it")] - InstructV2_9B, - #[value(name = "3-1b")] - BaseV3_1B, - #[value(name = "3-1b-it")] - InstructV3_1B, -} - -enum Model { - V1(Model1), - V2(Model2), - V3(Model3), -} - -impl Model { - fn forward(&mut self, input_ids: &candle_core::Tensor, pos: usize) -> candle_core::Result { - match self { - Self::V1(m) => m.forward(input_ids, pos), - Self::V2(m) => m.forward(input_ids, pos), - Self::V3(m) => m.forward(input_ids, pos), - } - } -} - - - -struct TextGeneration { - model: Model, - device: Device, - tokenizer: TokenOutputStream, - logits_processor: LogitsProcessor, - repeat_penalty: f32, - repeat_last_n: usize, -} - -impl TextGeneration { - #[allow(clippy::too_many_arguments)] - fn new( - model: Model, - tokenizer: Tokenizer, - seed: u64, - temp: Option, - top_p: Option, - repeat_penalty: f32, - repeat_last_n: usize, - device: &Device, - ) -> Self { - let logits_processor = LogitsProcessor::new(seed, temp, top_p); - Self { - model, - tokenizer: TokenOutputStream::new(tokenizer), - logits_processor, - repeat_penalty, - repeat_last_n, - device: device.clone(), - } - } - - // Run text generation and print to stdout - fn run(&mut self, prompt: &str, sample_len: usize) -> Result<()> { - use std::io::Write; - self.tokenizer.clear(); - let mut tokens = self - .tokenizer - .tokenizer() - .encode(prompt, true) - .map_err(E::msg)? - .get_ids() - .to_vec(); - for &t in tokens.iter() { - if let Some(t) = self.tokenizer.next_token(t)? { - print!("{t}") - } - } - std::io::stdout().flush()?; - - let mut generated_tokens = 0usize; - let eos_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => anyhow::bail!("cannot find the token"), - }; - - let eot_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => { - println!( - "Warning: token not found in tokenizer, using as a backup" - ); - eos_token - } - }; - - let start_gen = std::time::Instant::now(); - for index in 0..sample_len { - let context_size = if index > 0 { 1 } else { tokens.len() }; - let start_pos = tokens.len().saturating_sub(context_size); - let ctxt = &tokens[start_pos..]; - let input = Tensor::new(ctxt, &self.device)?.unsqueeze(0)?; - let logits = self.model.forward(&input, start_pos)?; - let logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - let logits = if self.repeat_penalty == 1. { - logits - } else { - let start_at = tokens.len().saturating_sub(self.repeat_last_n); - - // Manual implementation of repeat penalty to avoid type conflicts - let mut logits_vec = logits.to_vec1::()?; - - for &token_id in &tokens[start_at..] { - let token_id = token_id as usize; - if token_id < logits_vec.len() { - let score = logits_vec[token_id]; - let sign = if score < 0.0 { -1.0 } else { 1.0 }; - logits_vec[token_id] = sign * score / self.repeat_penalty; - } - } - - // Create a new tensor with the modified logits - let device = logits.device().clone(); - let shape = logits.shape().clone(); - let new_logits = Tensor::new(&logits_vec[..], &device)?; - new_logits.reshape(shape)? - }; - - let next_token = self.logits_processor.sample(&logits)?; - tokens.push(next_token); - generated_tokens += 1; - if next_token == eos_token || next_token == eot_token { - break; - } - if let Some(t) = self.tokenizer.next_token(next_token)? { - print!("{t}"); - std::io::stdout().flush()?; - } - } - let dt = start_gen.elapsed(); - if let Some(rest) = self.tokenizer.decode_rest().map_err(E::msg)? { - print!("{rest}"); - } - std::io::stdout().flush()?; - println!( - "\n{generated_tokens} tokens generated ({:.2} token/s)", - generated_tokens as f64 / dt.as_secs_f64(), - ); - Ok(()) - } - - // Run text generation and write to a buffer - fn run_with_output(&mut self, prompt: &str, sample_len: usize, output: &mut Vec) -> Result<()> { - use std::io::Write; - self.tokenizer.clear(); - let mut tokens = self - .tokenizer - .tokenizer() - .encode(prompt, true) - .map_err(E::msg)? - .get_ids() - .to_vec(); - - // Write prompt tokens to output - for &t in tokens.iter() { - if let Some(t) = self.tokenizer.next_token(t)? { - write!(output, "{}", t)?; - } - } - - let mut generated_tokens = 0usize; - let eos_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => anyhow::bail!("cannot find the token"), - }; - - let eot_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => { - write!(output, "Warning: token not found in tokenizer, using as a backup")?; - eos_token - } - }; - - // Determine if we're using a Model3 (gemma-3) variant - let is_model3 = match &self.model { - Model::V3(_) => true, - _ => false, - }; - - // For Model3, we need to use a different approach - if is_model3 { - // For gemma-3 models, we'll generate one token at a time with the full context - let start_gen = std::time::Instant::now(); - - // Initial generation with the full prompt - let input = Tensor::new(tokens.as_slice(), &self.device)?.unsqueeze(0)?; - let mut logits = self.model.forward(&input, 0)?; - logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - - for _ in 0..sample_len { - // Apply repeat penalty if needed - let current_logits = if self.repeat_penalty == 1. { - logits.clone() - } else { - let start_at = tokens.len().saturating_sub(self.repeat_last_n); - - // Manual implementation of repeat penalty to avoid type conflicts - let mut logits_vec = logits.to_vec1::()?; - - for &token_id in &tokens[start_at..] { - let token_id = token_id as usize; - if token_id < logits_vec.len() { - let score = logits_vec[token_id]; - let sign = if score < 0.0 { -1.0 } else { 1.0 }; - logits_vec[token_id] = sign * score / self.repeat_penalty; - } - } - - // Create a new tensor with the modified logits - let device = logits.device().clone(); - let shape = logits.shape().clone(); - let new_logits = Tensor::new(&logits_vec[..], &device)?; - new_logits.reshape(shape)? - }; - - let next_token = self.logits_processor.sample(¤t_logits)?; - tokens.push(next_token); - generated_tokens += 1; - - if next_token == eos_token || next_token == eot_token { - break; - } - - if let Some(t) = self.tokenizer.next_token(next_token)? { - write!(output, "{}", t)?; - } - - // For the next iteration, just use the new token - let new_input = Tensor::new(&[next_token], &self.device)?.unsqueeze(0)?; - logits = self.model.forward(&new_input, tokens.len() - 1)?; - logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - } - - return Ok(()); - } - - // Standard approach for other models - let start_gen = std::time::Instant::now(); - for index in 0..sample_len { - let context_size = if index > 0 { 1 } else { tokens.len() }; - let start_pos = tokens.len().saturating_sub(context_size); - let ctxt = &tokens[start_pos..]; - let input = Tensor::new(ctxt, &self.device)?.unsqueeze(0)?; - let logits = self.model.forward(&input, start_pos)?; - let logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - let logits = if self.repeat_penalty == 1. { - logits - } else { - let start_at = tokens.len().saturating_sub(self.repeat_last_n); - - // Manual implementation of repeat penalty to avoid type conflicts - let mut logits_vec = logits.to_vec1::()?; - - for &token_id in &tokens[start_at..] { - let token_id = token_id as usize; - if token_id < logits_vec.len() { - let score = logits_vec[token_id]; - let sign = if score < 0.0 { -1.0 } else { 1.0 }; - logits_vec[token_id] = sign * score / self.repeat_penalty; - } - } - - // Create a new tensor with the modified logits - let device = logits.device().clone(); - let shape = logits.shape().clone(); - let new_logits = Tensor::new(&logits_vec[..], &device)?; - new_logits.reshape(shape)? - }; - - let next_token = self.logits_processor.sample(&logits)?; - tokens.push(next_token); - generated_tokens += 1; - if next_token == eos_token || next_token == eot_token { - break; - } - if let Some(t) = self.tokenizer.next_token(next_token)? { - write!(output, "{}", t)?; - } - } - - // Write any remaining tokens - if let Some(rest) = self.tokenizer.decode_rest().map_err(E::msg)? { - write!(output, "{}", rest)?; - } - - Ok(()) - } -} - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Args { - /// Run on CPU rather than on GPU. - #[arg(long)] - cpu: bool, - - /// Enable tracing (generates a trace-timestamp.json file). - #[arg(long)] - tracing: bool, - - /// Run in server mode with OpenAI compatible API - #[arg(long)] - server: bool, - - /// Port to use for the server - #[arg(long, default_value_t = 3777)] - port: u16, - - /// Prompt for text generation (not used in server mode) - #[arg(long)] - prompt: Option, - - /// The temperature used to generate samples. - #[arg(long)] - temperature: Option, - - /// Nucleus sampling probability cutoff. - #[arg(long)] - top_p: Option, - - /// The seed to use when generating random samples. - #[arg(long, default_value_t = 299792458)] - seed: u64, - - /// The length of the sample to generate (in tokens). - #[arg(long, short = 'n', default_value_t = 10000)] - sample_len: usize, - - #[arg(long)] - model_id: Option, - - #[arg(long, default_value = "main")] - revision: String, - - #[arg(long)] - tokenizer_file: Option, - - #[arg(long)] - config_file: Option, - - #[arg(long)] - weight_files: Option, - - /// Penalty to be applied for repeating tokens, 1. means no penalty. - #[arg(long, default_value_t = 1.1)] - repeat_penalty: f32, - - /// The context size to consider for the repeat penalty. - #[arg(long, default_value_t = 64)] - repeat_last_n: usize, - - /// The model to use. - #[arg(long, default_value = "3-1b-it")] - which: Which, - - #[arg(long)] - use_flash_attn: bool, -} - -fn main() -> Result<()> { - use tracing_chrome::ChromeLayerBuilder; - use tracing_subscriber::prelude::*; - - let args = Args::parse(); - let _guard = if args.tracing { - let (chrome_layer, guard) = ChromeLayerBuilder::new().build(); - tracing_subscriber::registry().with(chrome_layer).init(); - Some(guard) - } else { - None - }; - println!( - "avx: {}, neon: {}, simd128: {}, f16c: {}", - candle_core::utils::with_avx(), - candle_core::utils::with_neon(), - candle_core::utils::with_simd128(), - candle_core::utils::with_f16c() - ); - println!( - "temp: {:.2} repeat-penalty: {:.2} repeat-last-n: {}", - args.temperature.unwrap_or(0.), - args.repeat_penalty, - args.repeat_last_n - ); - - let start = std::time::Instant::now(); - let api = Api::new()?; - let model_id = match &args.model_id { - Some(model_id) => model_id.to_string(), - None => match args.which { - Which::InstructV1_1_2B => "google/gemma-1.1-2b-it".to_string(), - Which::InstructV1_1_7B => "google/gemma-1.1-7b-it".to_string(), - Which::Base2B => "google/gemma-2b".to_string(), - Which::Base7B => "google/gemma-7b".to_string(), - Which::Instruct2B => "google/gemma-2b-it".to_string(), - Which::Instruct7B => "google/gemma-7b-it".to_string(), - Which::CodeBase2B => "google/codegemma-2b".to_string(), - Which::CodeBase7B => "google/codegemma-7b".to_string(), - Which::CodeInstruct2B => "google/codegemma-2b-it".to_string(), - Which::CodeInstruct7B => "google/codegemma-7b-it".to_string(), - Which::BaseV2_2B => "google/gemma-2-2b".to_string(), - Which::InstructV2_2B => "google/gemma-2-2b-it".to_string(), - Which::BaseV2_9B => "google/gemma-2-9b".to_string(), - Which::InstructV2_9B => "google/gemma-2-9b-it".to_string(), - Which::BaseV3_1B => "google/gemma-3-1b-pt".to_string(), - Which::InstructV3_1B => "google/gemma-3-1b-it".to_string(), - }, - }; - let repo = api.repo(Repo::with_revision( - model_id.clone(), - RepoType::Model, - args.revision, - )); - let tokenizer_filename = match args.tokenizer_file { - Some(file) => std::path::PathBuf::from(file), - None => repo.get("tokenizer.json")?, - }; - let config_filename = match args.config_file { - Some(file) => std::path::PathBuf::from(file), - None => repo.get("config.json")?, - }; - let filenames = match args.weight_files { - Some(files) => files - .split(',') - .map(std::path::PathBuf::from) - .collect::>(), - None => match args.which { - Which::BaseV3_1B | Which::InstructV3_1B => vec![repo.get("model.safetensors")?], - _ => utilities_lib::hub_load_safetensors(&repo, "model.safetensors.index.json")?, - }, - }; - println!("retrieved the files in {:?}", start.elapsed()); - let tokenizer = Tokenizer::from_file(tokenizer_filename).map_err(E::msg)?; - - let start = std::time::Instant::now(); - let initial_device = utilities_lib::device(args.cpu)?; - - // Check if we're using a V3 model (Gemma 3) and if we're on Metal (macOS) - let is_v3_model = matches!(args.which, Which::BaseV3_1B | Which::InstructV3_1B); - let is_metal = !initial_device.is_cpu() && candle_core::utils::metal_is_available() && !args.cpu; - - // Use CPU for V3 models on Metal due to missing implementations - let device = if is_v3_model && is_metal { - println!("Note: Using CPU for Gemma 3 model due to missing Metal implementations for required operations (e.g., rotary-emb)."); - Device::Cpu - } else { - initial_device - }; - - let dtype = if device.is_cuda() { - DType::BF16 - } else { - DType::F32 - }; - - // Use the selected device and dtype - let vb = unsafe { VarBuilder::from_mmaped_safetensors(&filenames, dtype, &device)? }; - let model = match args.which { - Which::Base2B - | Which::Base7B - | Which::Instruct2B - | Which::Instruct7B - | Which::InstructV1_1_2B - | Which::InstructV1_1_7B - | Which::CodeBase2B - | Which::CodeBase7B - | Which::CodeInstruct2B - | Which::CodeInstruct7B => { - let config: Config1 = serde_json::from_reader(std::fs::File::open(config_filename)?)?; - let model = Model1::new(args.use_flash_attn, &config, vb)?; - Model::V1(model) - } - Which::BaseV2_2B | Which::InstructV2_2B | Which::BaseV2_9B | Which::InstructV2_9B => { - let config: Config2 = serde_json::from_reader(std::fs::File::open(config_filename)?)?; - let model = Model2::new(args.use_flash_attn, &config, vb)?; - Model::V2(model) - } - Which::BaseV3_1B | Which::InstructV3_1B => { - let config: Config3 = serde_json::from_reader(std::fs::File::open(config_filename)?)?; - let model = Model3::new(args.use_flash_attn, &config, vb)?; - Model::V3(model) - } - }; - - println!("loaded the model in {:?}", start.elapsed()); - - let pipeline = TextGeneration::new( - model, - tokenizer, - args.seed, - args.temperature, - args.top_p, - args.repeat_penalty, - args.repeat_last_n, - &device, - ); - - if args.server { - // Start the server - println!("Starting server on port {}", args.port); - - // Create app state - let app_state = AppState { - text_generation: Arc::new(Mutex::new(pipeline)), - model_id, - }; - - // Create router - let app = create_router(app_state); - - // Run the server - let addr = SocketAddr::from(([0, 0, 0, 0], args.port)); - - // Use tokio to run the server - tokio::runtime::Builder::new_multi_thread() - .enable_all() - .build()? - .block_on(async { - axum::serve(tokio::net::TcpListener::bind(&addr).await?, app) - .await - .map_err(|e| anyhow::anyhow!("Server error: {}", e)) - })?; - - Ok(()) - } else { - // Run in CLI mode - if let Some(prompt_text) = &args.prompt { - let prompt = match args.which { - Which::Base2B - | Which::Base7B - | Which::Instruct2B - | Which::Instruct7B - | Which::InstructV1_1_2B - | Which::InstructV1_1_7B - | Which::CodeBase2B - | Which::CodeBase7B - | Which::CodeInstruct2B - | Which::CodeInstruct7B - | Which::BaseV2_2B - | Which::InstructV2_2B - | Which::BaseV2_9B - | Which::InstructV2_9B - | Which::BaseV3_1B => prompt_text.clone(), - Which::InstructV3_1B => { - format!( - " user\n{}\n model\n", - prompt_text - ) - } - }; - - let mut pipeline = pipeline; - pipeline.run(&prompt, args.sample_len)?; - Ok(()) - } else { - anyhow::bail!("Prompt is required in CLI mode. Use --prompt to specify a prompt or --server to run in server mode.") - } - } -} diff --git a/crates/legacy-inference-engine/src/model.rs b/crates/legacy-inference-engine/src/model.rs deleted file mode 100644 index 7a7944b..0000000 --- a/crates/legacy-inference-engine/src/model.rs +++ /dev/null @@ -1,90 +0,0 @@ -use candle_core::Tensor; -use candle_transformers::models::gemma::{Config as Config1, Model as Model1}; -use candle_transformers::models::gemma2::{Config as Config2, Model as Model2}; -use candle_transformers::models::gemma3::{Config as Config3, Model as Model3}; - -#[derive(Clone, Debug, Copy, PartialEq, Eq, clap::ValueEnum)] -pub enum Which { - #[value(name = "2b")] - Base2B, - #[value(name = "7b")] - Base7B, - #[value(name = "2b-it")] - Instruct2B, - #[value(name = "7b-it")] - Instruct7B, - #[value(name = "1.1-2b-it")] - InstructV1_1_2B, - #[value(name = "1.1-7b-it")] - InstructV1_1_7B, - #[value(name = "code-2b")] - CodeBase2B, - #[value(name = "code-7b")] - CodeBase7B, - #[value(name = "code-2b-it")] - CodeInstruct2B, - #[value(name = "code-7b-it")] - CodeInstruct7B, - #[value(name = "2-2b")] - BaseV2_2B, - #[value(name = "2-2b-it")] - InstructV2_2B, - #[value(name = "2-9b")] - BaseV2_9B, - #[value(name = "2-9b-it")] - InstructV2_9B, - #[value(name = "3-1b")] - BaseV3_1B, - #[value(name = "3-1b-it")] - InstructV3_1B, -} - -pub enum Model { - V1(Model1), - V2(Model2), - V3(Model3), -} - -impl Model { - pub fn forward(&mut self, input_ids: &candle_core::Tensor, pos: usize) -> candle_core::Result { - match self { - Self::V1(m) => m.forward(input_ids, pos), - Self::V2(m) => m.forward(input_ids, pos), - Self::V3(m) => m.forward(input_ids, pos), - } - } -} - -impl Which { - pub fn to_model_id(&self) -> String { - match self { - Self::InstructV1_1_2B => "google/gemma-1.1-2b-it".to_string(), - Self::InstructV1_1_7B => "google/gemma-1.1-7b-it".to_string(), - Self::Base2B => "google/gemma-2b".to_string(), - Self::Base7B => "google/gemma-7b".to_string(), - Self::Instruct2B => "google/gemma-2b-it".to_string(), - Self::Instruct7B => "google/gemma-7b-it".to_string(), - Self::CodeBase2B => "google/codegemma-2b".to_string(), - Self::CodeBase7B => "google/codegemma-7b".to_string(), - Self::CodeInstruct2B => "google/codegemma-2b-it".to_string(), - Self::CodeInstruct7B => "google/codegemma-7b-it".to_string(), - Self::BaseV2_2B => "google/gemma-2-2b".to_string(), - Self::InstructV2_2B => "google/gemma-2-2b-it".to_string(), - Self::BaseV2_9B => "google/gemma-2-9b".to_string(), - Self::InstructV2_9B => "google/gemma-2-9b-it".to_string(), - Self::BaseV3_1B => "google/gemma-3-1b-pt".to_string(), - Self::InstructV3_1B => "google/gemma-3-1b-it".to_string(), - } - } - - pub fn is_instruct_model(&self) -> bool { - match self { - Self::Base2B | Self::Base7B | Self::CodeBase2B | Self::CodeBase7B | Self::BaseV2_2B | Self::BaseV2_9B | Self::BaseV3_1B => false, - _ => true, - } - } - - pub fn is_v3_model(&self) -> bool { - matches!(self, Self::BaseV3_1B | Self::InstructV3_1B) - } -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/openai_types.rs b/crates/legacy-inference-engine/src/openai_types.rs deleted file mode 100644 index d9a3689..0000000 --- a/crates/legacy-inference-engine/src/openai_types.rs +++ /dev/null @@ -1,167 +0,0 @@ -use either::Either; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use utoipa::ToSchema; - -/// Inner content structure for messages that can be either a string or key-value pairs -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct MessageInnerContent( - #[serde(with = "either::serde_untagged")] pub Either>, -); - -impl ToSchema<'_> for MessageInnerContent { - fn schema() -> (&'static str, utoipa::openapi::RefOr) { - ( - "MessageInnerContent", - utoipa::openapi::RefOr::T(message_inner_content_schema()), - ) - } -} - -/// Function for MessageInnerContent Schema generation to handle `Either` -fn message_inner_content_schema() -> utoipa::openapi::Schema { - use utoipa::openapi::{ArrayBuilder, ObjectBuilder, OneOfBuilder, RefOr, Schema, SchemaType}; - - Schema::OneOf( - OneOfBuilder::new() - // Either::Left - simple string - .item(Schema::Object( - ObjectBuilder::new().schema_type(SchemaType::String).build(), - )) - // Either::Right - object with string values - .item(Schema::Object( - ObjectBuilder::new() - .schema_type(SchemaType::Object) - .additional_properties(Some(RefOr::T(Schema::Object( - ObjectBuilder::new().schema_type(SchemaType::String).build(), - )))) - .build(), - )) - .build(), - ) -} - -/// Message content that can be either simple text or complex structured content -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct MessageContent( - #[serde(with = "either::serde_untagged")] - pub Either>>, -); - -impl ToSchema<'_> for MessageContent { - fn schema() -> (&'static str, utoipa::openapi::RefOr) { - ("MessageContent", utoipa::openapi::RefOr::T(message_content_schema())) - } -} - -/// Function for MessageContent Schema generation to handle `Either` -fn message_content_schema() -> utoipa::openapi::Schema { - use utoipa::openapi::{ArrayBuilder, ObjectBuilder, OneOfBuilder, RefOr, Schema, SchemaType}; - - Schema::OneOf( - OneOfBuilder::new() - .item(Schema::Object( - ObjectBuilder::new().schema_type(SchemaType::String).build(), - )) - .item(Schema::Array( - ArrayBuilder::new() - .items(RefOr::T(Schema::Object( - ObjectBuilder::new() - .schema_type(SchemaType::Object) - .additional_properties(Some(RefOr::Ref( - utoipa::openapi::Ref::from_schema_name("MessageInnerContent"), - ))) - .build(), - ))) - .build(), - )) - .build(), - ) -} - -/// Represents a single message in a conversation -#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)] -pub struct Message { - /// The message content - pub content: Option, - /// The role of the message sender ("user", "assistant", "system", "tool", etc.) - pub role: String, - pub name: Option, -} - -/// Stop token configuration for generation -#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)] -#[serde(untagged)] -pub enum StopTokens { - /// Multiple possible stop sequences - Multi(Vec), - /// Single stop sequence - Single(String), -} - -/// Default value helper -pub fn default_false() -> bool { - false -} - -/// Default value helper -pub fn default_1usize() -> usize { - 1 -} - -/// Default value helper -pub fn default_model() -> String { - "default".to_string() -} - -/// Chat completion request following OpenAI's specification -#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)] -pub struct ChatCompletionRequest { - #[schema(example = json!([{"role": "user", "content": "Why did the crab cross the road?"}]))] - pub messages: Vec, - #[schema(example = "gemma-3-1b-it")] - #[serde(default = "default_model")] - pub model: String, - #[serde(default = "default_false")] - #[schema(example = false)] - pub logprobs: bool, - #[schema(example = 256)] - pub max_tokens: Option, - #[serde(rename = "n")] - #[serde(default = "default_1usize")] - #[schema(example = 1)] - pub n_choices: usize, - #[schema(example = 0.7)] - pub temperature: Option, - #[schema(example = 0.9)] - pub top_p: Option, - #[schema(example = false)] - pub stream: Option, -} - -/// Chat completion choice -#[derive(Debug, Serialize, ToSchema)] -pub struct ChatCompletionChoice { - pub index: usize, - pub message: Message, - pub finish_reason: String, -} - -/// Chat completion response -#[derive(Debug, Serialize, ToSchema)] -pub struct ChatCompletionResponse { - pub id: String, - pub object: String, - pub created: u64, - pub model: String, - pub choices: Vec, - pub usage: Usage, -} - -/// Token usage information -#[derive(Debug, Serialize, ToSchema)] -pub struct Usage { - pub prompt_tokens: usize, - pub completion_tokens: usize, - pub total_tokens: usize, -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/server.rs b/crates/legacy-inference-engine/src/server.rs deleted file mode 100644 index 88e3ca2..0000000 --- a/crates/legacy-inference-engine/src/server.rs +++ /dev/null @@ -1,128 +0,0 @@ -use axum::{ - extract::State, - http::StatusCode, - routing::{get, post}, - Json, Router, -}; -use std::{net::SocketAddr, sync::Arc}; -use tokio::sync::Mutex; -use tower_http::cors::{Any, CorsLayer}; -use uuid::Uuid; - -use crate::openai_types::{ChatCompletionChoice, ChatCompletionRequest, ChatCompletionResponse, Message, MessageContent, Usage}; -use crate::text_generation::TextGeneration; -use either::Either; - -// Application state shared between handlers -#[derive(Clone)] -pub struct AppState { - pub text_generation: Arc>, - pub model_id: String, -} - -// Chat completions endpoint handler -pub async fn chat_completions( - State(state): State, - Json(request): Json, -) -> Result, (StatusCode, Json)> { - let mut prompt = String::new(); - - // Convert messages to a prompt string - for message in &request.messages { - let role = &message.role; - let content = match &message.content { - Some(content) => match &content.0 { - Either::Left(text) => text.clone(), - Either::Right(_) => "".to_string(), // Handle complex content if needed - }, - None => "".to_string(), - }; - - // Format based on role - match role.as_str() { - "system" => prompt.push_str(&format!("System: {}\n", content)), - "user" => prompt.push_str(&format!("User: {}\n", content)), - "assistant" => prompt.push_str(&format!("Assistant: {}\n", content)), - _ => prompt.push_str(&format!("{}: {}\n", role, content)), - } - } - - // Add the assistant prefix for the response - prompt.push_str("Assistant: "); - - // Capture the output - let mut output = Vec::new(); - { - let mut text_gen = state.text_generation.lock().await; - - // Buffer to capture the output - let mut buffer = Vec::new(); - - // Run text generation - let max_tokens = request.max_tokens.unwrap_or(1000); - let result = text_gen.run_with_output(&prompt, max_tokens, &mut buffer); - - if let Err(e) = result { - return Err(( - StatusCode::BAD_REQUEST, - Json(serde_json::json!({ - "error": { - "message": "The OpenAI API is currently not supported due to compatibility issues with the tensor operations. Please use the CLI mode instead with: cargo run --bin inference-engine -- --prompt \"Your prompt here\"", - "type": "unsupported_api" - } - })), - )); - } - - // Convert buffer to string - if let Ok(text) = String::from_utf8(buffer) { - output.push(text); - } - } - - // Create response - let response = ChatCompletionResponse { - id: format!("chatcmpl-{}", Uuid::new_v4().to_string().replace("-", "")), - object: "chat.completion".to_string(), - created: std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default() - .as_secs(), - model: request.model, - choices: vec![ChatCompletionChoice { - index: 0, - message: Message { - role: "assistant".to_string(), - content: Some(MessageContent(Either::Left(output.join("")))), - name: None, - }, - finish_reason: "stop".to_string(), - }], - usage: Usage { - prompt_tokens: prompt.len() / 4, // Rough estimate - completion_tokens: output.join("").len() / 4, // Rough estimate - total_tokens: (prompt.len() + output.join("").len()) / 4, // Rough estimate - }, - }; - - // Return the response as JSON - Ok(Json(response)) -} - -// Create the router with the chat completions endpoint -pub fn create_router(app_state: AppState) -> Router { - // CORS layer to allow requests from any origin - let cors = CorsLayer::new() - .allow_headers(Any) - .allow_credentials(true) - .allow_origin(Any) - .allow_methods(Any) - .allow_headers(Any); - - Router::new() - // OpenAI compatible endpoints - .route("/v1/chat/completions", post(chat_completions)) - // Add more endpoints as needed - .layer(cors) - .with_state(app_state) -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/text_generation.rs b/crates/legacy-inference-engine/src/text_generation.rs deleted file mode 100644 index 76b6bb7..0000000 --- a/crates/legacy-inference-engine/src/text_generation.rs +++ /dev/null @@ -1,352 +0,0 @@ -use anyhow::{Error as E, Result}; -use candle_core::{DType, Device, Tensor}; -use candle_transformers::generation::LogitsProcessor; -use tokenizers::Tokenizer; -use std::io::Write; - -use crate::model::Model; -use crate::token_output_stream::TokenOutputStream; - -pub struct TextGeneration { - model: Model, - device: Device, - // CPU device for fallback when operations are unsupported on primary device - cpu_device: Option, - // Flag to indicate if we should try to use the primary device first - try_primary_device: bool, - tokenizer: TokenOutputStream, - logits_processor: LogitsProcessor, - repeat_penalty: f32, - repeat_last_n: usize, -} - -impl TextGeneration { - #[allow(clippy::too_many_arguments)] - pub fn new( - model: Model, - tokenizer: Tokenizer, - seed: u64, - temp: Option, - top_p: Option, - repeat_penalty: f32, - repeat_last_n: usize, - device: &Device, - ) -> Self { - let logits_processor = LogitsProcessor::new(seed, temp, top_p); - - // Initialize CPU device only if the primary device is not already CPU - let (cpu_device, try_primary_device) = if device.is_cpu() { - // If already on CPU, no need for a fallback device - (None, false) - } else { - // Store CPU device for fallback and set flag to try primary device first - (Some(Device::Cpu), true) - }; - - Self { - model, - tokenizer: TokenOutputStream::new(tokenizer), - logits_processor, - repeat_penalty, - repeat_last_n, - device: device.clone(), - cpu_device, - try_primary_device, - } - } - - // Helper method for model execution with fallback to CPU for unsupported operations - fn execute_with_fallback(&mut self, input: &Tensor, start_pos: usize) -> Result { - // If we're not trying primary device anymore, go straight to CPU if available - if !self.try_primary_device { - if let Some(cpu_device) = &self.cpu_device { - let cpu_input = input.to_device(cpu_device).map_err(E::msg)?; - let cpu_result = self.model.forward(&cpu_input, start_pos).map_err(E::msg)?; - return cpu_result.to_device(&self.device).map_err(E::msg); - } else { - // No CPU fallback, use primary device - return self.model.forward(input, start_pos).map_err(E::msg); - } - } - - // Try running on the primary device first - match self.model.forward(input, start_pos) { - Ok(result) => Ok(result), - Err(err) => { - // Convert to string to check for unsupported operation - let err_string = err.to_string(); - - // Check if the error is about unsupported operations - if (err_string.contains("no metal implementation for") || - err_string.contains("no cuda implementation for")) && - self.cpu_device.is_some() { - - // Extract operation name for better logging - let op_name = if let Some(idx) = err_string.find("for ") { - &err_string[(idx + 4)..] - } else { - "an operation" - }; - - // Log the fallback - println!("Warning: The primary device does not support {}. Falling back to CPU.", op_name); - - // Move input to CPU and try again - let cpu_device = self.cpu_device.as_ref().unwrap(); - let cpu_input = input.to_device(cpu_device).map_err(E::msg)?; - let cpu_result = self.model.forward(&cpu_input, start_pos).map_err(E::msg)?; - - // Don't try primary device for future operations - self.try_primary_device = false; - println!("Successfully executed on CPU. Will use CPU for subsequent operations."); - - // Move result back to original device - cpu_result.to_device(&self.device).map_err(E::msg) - } else { - // Not an unsupported operation error or no CPU fallback - Err(E::msg(err)) - } - } - } - } - - // Run text generation and print to stdout - pub fn run(&mut self, prompt: &str, sample_len: usize) -> Result<()> { - use std::io::Write; - self.tokenizer.clear(); - let mut tokens = self - .tokenizer - .tokenizer() - .encode(prompt, true) - .map_err(E::msg)? - .get_ids() - .to_vec(); - for &t in tokens.iter() { - if let Some(t) = self.tokenizer.next_token(t)? { - print!("{t}") - } - } - std::io::stdout().flush()?; - - let mut generated_tokens = 0usize; - let eos_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => anyhow::bail!("cannot find the token"), - }; - - let eot_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => { - println!( - "Warning: token not found in tokenizer, using as a backup" - ); - eos_token - } - }; - - let start_gen = std::time::Instant::now(); - for index in 0..sample_len { - let context_size = if index > 0 { 1 } else { tokens.len() }; - let start_pos = tokens.len().saturating_sub(context_size); - let ctxt = &tokens[start_pos..]; - let input = Tensor::new(ctxt, &self.device)?.unsqueeze(0)?; - // Use execute_with_fallback instead of model.forward - let logits = self.execute_with_fallback(&input, start_pos)?; - let logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - let logits = if self.repeat_penalty == 1. { - logits - } else { - let start_at = tokens.len().saturating_sub(self.repeat_last_n); - - // Manual implementation of repeat penalty to avoid type conflicts - let mut logits_vec = logits.to_vec1::()?; - - for &token_id in &tokens[start_at..] { - let token_id = token_id as usize; - if token_id < logits_vec.len() { - let score = logits_vec[token_id]; - let sign = if score < 0.0 { -1.0 } else { 1.0 }; - logits_vec[token_id] = sign * score / self.repeat_penalty; - } - } - - // Create a new tensor with the modified logits - let device = logits.device().clone(); - let shape = logits.shape().clone(); - let new_logits = Tensor::new(&logits_vec[..], &device)?; - new_logits.reshape(shape)? - }; - - let next_token = self.logits_processor.sample(&logits)?; - tokens.push(next_token); - generated_tokens += 1; - if next_token == eos_token || next_token == eot_token { - break; - } - if let Some(t) = self.tokenizer.next_token(next_token)? { - print!("{t}"); - std::io::stdout().flush()?; - } - } - let dt = start_gen.elapsed(); - if let Some(rest) = self.tokenizer.decode_rest().map_err(E::msg)? { - print!("{rest}"); - } - std::io::stdout().flush()?; - println!( - "\n{generated_tokens} tokens generated ({:.2} token/s)", - generated_tokens as f64 / dt.as_secs_f64(), - ); - Ok(()) - } - - // Run text generation and write to a buffer - pub fn run_with_output(&mut self, prompt: &str, sample_len: usize, output: &mut Vec) -> Result<()> { - self.tokenizer.clear(); - let mut tokens = self - .tokenizer - .tokenizer() - .encode(prompt, true) - .map_err(E::msg)? - .get_ids() - .to_vec(); - - // Write prompt tokens to output - for &t in tokens.iter() { - if let Some(t) = self.tokenizer.next_token(t)? { - write!(output, "{}", t)?; - } - } - - let mut generated_tokens = 0usize; - let eos_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => anyhow::bail!("cannot find the token"), - }; - - let eot_token = match self.tokenizer.get_token("") { - Some(token) => token, - None => { - write!(output, "Warning: token not found in tokenizer, using as a backup")?; - eos_token - } - }; - - // Determine if we're using a Model3 (gemma-3) variant - let is_model3 = match &self.model { - Model::V3(_) => true, - _ => false, - }; - - // For Model3, we need to use a different approach - if is_model3 { - // For gemma-3 models, we'll generate one token at a time with the full context - let start_gen = std::time::Instant::now(); - - // Initial generation with the full prompt - let input = Tensor::new(tokens.as_slice(), &self.device)?.unsqueeze(0)?; - // Use execute_with_fallback instead of model.forward - let mut logits = self.execute_with_fallback(&input, 0)?; - logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - - for _ in 0..sample_len { - // Apply repeat penalty if needed - let current_logits = if self.repeat_penalty == 1. { - logits.clone() - } else { - let start_at = tokens.len().saturating_sub(self.repeat_last_n); - - // Manual implementation of repeat penalty to avoid type conflicts - let mut logits_vec = logits.to_vec1::()?; - - for &token_id in &tokens[start_at..] { - let token_id = token_id as usize; - if token_id < logits_vec.len() { - let score = logits_vec[token_id]; - let sign = if score < 0.0 { -1.0 } else { 1.0 }; - logits_vec[token_id] = sign * score / self.repeat_penalty; - } - } - - // Create a new tensor with the modified logits - let device = logits.device().clone(); - let shape = logits.shape().clone(); - let new_logits = Tensor::new(&logits_vec[..], &device)?; - new_logits.reshape(shape)? - }; - - let next_token = self.logits_processor.sample(¤t_logits)?; - tokens.push(next_token); - generated_tokens += 1; - - if next_token == eos_token || next_token == eot_token { - break; - } - - if let Some(t) = self.tokenizer.next_token(next_token)? { - write!(output, "{}", t)?; - } - - // For the next iteration, just use the new token - let new_input = Tensor::new(&[next_token], &self.device)?.unsqueeze(0)?; - // Use execute_with_fallback instead of model.forward - logits = self.execute_with_fallback(&new_input, tokens.len() - 1)?; - logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - } - - return Ok(()); - } - - // Standard approach for other models - let start_gen = std::time::Instant::now(); - for index in 0..sample_len { - let context_size = if index > 0 { 1 } else { tokens.len() }; - let start_pos = tokens.len().saturating_sub(context_size); - let ctxt = &tokens[start_pos..]; - let input = Tensor::new(ctxt, &self.device)?.unsqueeze(0)?; - // Use execute_with_fallback instead of model.forward - let logits = self.execute_with_fallback(&input, start_pos)?; - let logits = logits.squeeze(0)?.squeeze(0)?.to_dtype(DType::F32)?; - let logits = if self.repeat_penalty == 1. { - logits - } else { - let start_at = tokens.len().saturating_sub(self.repeat_last_n); - - // Manual implementation of repeat penalty to avoid type conflicts - let mut logits_vec = logits.to_vec1::()?; - - for &token_id in &tokens[start_at..] { - let token_id = token_id as usize; - if token_id < logits_vec.len() { - let score = logits_vec[token_id]; - let sign = if score < 0.0 { -1.0 } else { 1.0 }; - logits_vec[token_id] = sign * score / self.repeat_penalty; - } - } - - // Create a new tensor with the modified logits - let device = logits.device().clone(); - let shape = logits.shape().clone(); - let new_logits = Tensor::new(&logits_vec[..], &device)?; - new_logits.reshape(shape)? - }; - - let next_token = self.logits_processor.sample(&logits)?; - tokens.push(next_token); - generated_tokens += 1; - if next_token == eos_token || next_token == eot_token { - break; - } - if let Some(t) = self.tokenizer.next_token(next_token)? { - write!(output, "{}", t)?; - } - } - - // Write any remaining tokens - if let Some(rest) = self.tokenizer.decode_rest().map_err(E::msg)? { - write!(output, "{}", rest)?; - } - - Ok(()) - } -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/token_output_stream.rs b/crates/legacy-inference-engine/src/token_output_stream.rs deleted file mode 100644 index c6e19a4..0000000 --- a/crates/legacy-inference-engine/src/token_output_stream.rs +++ /dev/null @@ -1,86 +0,0 @@ -use candle_core::Result; - -/// This is a wrapper around a tokenizer to ensure that tokens can be returned to the user in a -/// streaming way rather than having to wait for the full decoding. -pub struct TokenOutputStream { - tokenizer: tokenizers::Tokenizer, - tokens: Vec, - prev_index: usize, - current_index: usize, -} - -impl TokenOutputStream { - pub fn new(tokenizer: tokenizers::Tokenizer) -> Self { - Self { - tokenizer, - tokens: Vec::new(), - prev_index: 0, - current_index: 0, - } - } - - pub fn into_inner(self) -> tokenizers::Tokenizer { - self.tokenizer - } - - fn decode(&self, tokens: &[u32]) -> Result { - match self.tokenizer.decode(tokens, true) { - Ok(str) => Ok(str), - Err(err) => candle_core::bail!("cannot decode: {err}"), - } - } - - // https://github.com/huggingface/text-generation-inference/blob/5ba53d44a18983a4de32d122f4cb46f4a17d9ef6/server/text_generation_server/models/model.py#L68 - pub fn next_token(&mut self, token: u32) -> Result> { - let prev_text = if self.tokens.is_empty() { - String::new() - } else { - let tokens = &self.tokens[self.prev_index..self.current_index]; - self.decode(tokens)? - }; - self.tokens.push(token); - let text = self.decode(&self.tokens[self.prev_index..])?; - if text.len() > prev_text.len() && text.chars().last().unwrap().is_alphanumeric() { - let text = text.split_at(prev_text.len()); - self.prev_index = self.current_index; - self.current_index = self.tokens.len(); - Ok(Some(text.1.to_string())) - } else { - Ok(None) - } - } - - pub fn decode_rest(&self) -> Result> { - let prev_text = if self.tokens.is_empty() { - String::new() - } else { - let tokens = &self.tokens[self.prev_index..self.current_index]; - self.decode(tokens)? - }; - let text = self.decode(&self.tokens[self.prev_index..])?; - if text.len() > prev_text.len() { - let text = text.split_at(prev_text.len()); - Ok(Some(text.1.to_string())) - } else { - Ok(None) - } - } - - pub fn decode_all(&self) -> Result { - self.decode(&self.tokens) - } - - pub fn get_token(&self, token_s: &str) -> Option { - self.tokenizer.get_vocab(true).get(token_s).copied() - } - - pub fn tokenizer(&self) -> &tokenizers::Tokenizer { - &self.tokenizer - } - - pub fn clear(&mut self) { - self.tokens.clear(); - self.prev_index = 0; - self.current_index = 0; - } -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/src/utilities_lib.rs b/crates/legacy-inference-engine/src/utilities_lib.rs deleted file mode 100644 index a52c345..0000000 --- a/crates/legacy-inference-engine/src/utilities_lib.rs +++ /dev/null @@ -1,167 +0,0 @@ -use candle_core::utils::{cuda_is_available, metal_is_available}; -use candle_core::{Device, Result, Tensor}; - -pub fn device(cpu: bool) -> Result { - if cpu { - Ok(Device::Cpu) - } else if cuda_is_available() { - Ok(Device::new_cuda(0)?) - } else if metal_is_available() { - Ok(Device::new_metal(0)?) - } else { - #[cfg(all(target_os = "macos", target_arch = "aarch64"))] - { - println!( - "Running on CPU, to run on GPU(metal), build this example with `--features metal`" - ); - } - #[cfg(not(all(target_os = "macos", target_arch = "aarch64")))] - { - println!("Running on CPU, to run on GPU, build this example with `--features cuda`"); - } - Ok(Device::Cpu) - } -} - -pub fn load_image>( - p: P, - resize_longest: Option, -) -> Result<(Tensor, usize, usize)> { - let img = image::ImageReader::open(p)? - .decode() - .map_err(candle_core::Error::wrap)?; - let (initial_h, initial_w) = (img.height() as usize, img.width() as usize); - let img = match resize_longest { - None => img, - Some(resize_longest) => { - let (height, width) = (img.height(), img.width()); - let resize_longest = resize_longest as u32; - let (height, width) = if height < width { - let h = (resize_longest * height) / width; - (h, resize_longest) - } else { - let w = (resize_longest * width) / height; - (resize_longest, w) - }; - img.resize_exact(width, height, image::imageops::FilterType::CatmullRom) - } - }; - let (height, width) = (img.height() as usize, img.width() as usize); - let img = img.to_rgb8(); - let data = img.into_raw(); - let data = Tensor::from_vec(data, (height, width, 3), &Device::Cpu)?.permute((2, 0, 1))?; - Ok((data, initial_h, initial_w)) -} - -pub fn load_image_and_resize>( - p: P, - width: usize, - height: usize, -) -> Result { - let img = image::ImageReader::open(p)? - .decode() - .map_err(candle_core::Error::wrap)? - .resize_to_fill( - width as u32, - height as u32, - image::imageops::FilterType::Triangle, - ); - let img = img.to_rgb8(); - let data = img.into_raw(); - Tensor::from_vec(data, (width, height, 3), &Device::Cpu)?.permute((2, 0, 1)) -} - -/// Saves an image to disk using the image crate, this expects an input with shape -/// (c, height, width). -pub fn save_image>(img: &Tensor, p: P) -> Result<()> { - let p = p.as_ref(); - let (channel, height, width) = img.dims3()?; - if channel != 3 { - candle_core::bail!("save_image expects an input of shape (3, height, width)") - } - let img = img.permute((1, 2, 0))?.flatten_all()?; - let pixels = img.to_vec1::()?; - let image: image::ImageBuffer, Vec> = - match image::ImageBuffer::from_raw(width as u32, height as u32, pixels) { - Some(image) => image, - None => candle_core::bail!("error saving image {p:?}"), - }; - image.save(p).map_err(candle_core::Error::wrap)?; - Ok(()) -} - -pub fn save_image_resize>( - img: &Tensor, - p: P, - h: usize, - w: usize, -) -> Result<()> { - let p = p.as_ref(); - let (channel, height, width) = img.dims3()?; - if channel != 3 { - candle_core::bail!("save_image expects an input of shape (3, height, width)") - } - let img = img.permute((1, 2, 0))?.flatten_all()?; - let pixels = img.to_vec1::()?; - let image: image::ImageBuffer, Vec> = - match image::ImageBuffer::from_raw(width as u32, height as u32, pixels) { - Some(image) => image, - None => candle_core::bail!("error saving image {p:?}"), - }; - let image = image::DynamicImage::from(image); - let image = image.resize_to_fill(w as u32, h as u32, image::imageops::FilterType::CatmullRom); - image.save(p).map_err(candle_core::Error::wrap)?; - Ok(()) -} - -/// Loads the safetensors files for a model from the hub based on a json index file. -pub fn hub_load_safetensors( - repo: &hf_hub::api::sync::ApiRepo, - json_file: &str, -) -> Result> { - let json_file = repo.get(json_file).map_err(candle_core::Error::wrap)?; - let json_file = std::fs::File::open(json_file)?; - let json: serde_json::Value = - serde_json::from_reader(&json_file).map_err(candle_core::Error::wrap)?; - let weight_map = match json.get("weight_map") { - None => candle_core::bail!("no weight map in {json_file:?}"), - Some(serde_json::Value::Object(map)) => map, - Some(_) => candle_core::bail!("weight map in {json_file:?} is not a map"), - }; - let mut safetensors_files = std::collections::HashSet::new(); - for value in weight_map.values() { - if let Some(file) = value.as_str() { - safetensors_files.insert(file.to_string()); - } - } - let safetensors_files = safetensors_files - .iter() - .map(|v| repo.get(v).map_err(candle_core::Error::wrap)) - .collect::>>()?; - Ok(safetensors_files) -} - -pub fn hub_load_local_safetensors>( - path: P, - json_file: &str, -) -> Result> { - let path = path.as_ref(); - let jsfile = std::fs::File::open(path.join(json_file))?; - let json: serde_json::Value = serde_json::from_reader(&jsfile).map_err(candle_core::Error::wrap)?; - let weight_map = match json.get("weight_map") { - None => candle_core::bail!("no weight map in {json_file:?}"), - Some(serde_json::Value::Object(map)) => map, - Some(_) => candle_core::bail!("weight map in {json_file:?} is not a map"), - }; - let mut safetensors_files = std::collections::HashSet::new(); - for value in weight_map.values() { - if let Some(file) = value.as_str() { - safetensors_files.insert(file); - } - } - let safetensors_files: Vec<_> = safetensors_files - .into_iter() - .map(|v| path.join(v)) - .collect(); - Ok(safetensors_files) -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/test_cli.sh b/crates/legacy-inference-engine/test_cli.sh deleted file mode 100755 index de08e66..0000000 --- a/crates/legacy-inference-engine/test_cli.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env sh - -cargo run -p legacy-inference-engine --release -- --prompt 'Name the 16th President of the USA.' --which 3-1b-it \ No newline at end of file diff --git a/crates/legacy-inference-engine/tests/model_tests.rs b/crates/legacy-inference-engine/tests/model_tests.rs deleted file mode 100644 index 5477cb6..0000000 --- a/crates/legacy-inference-engine/tests/model_tests.rs +++ /dev/null @@ -1,67 +0,0 @@ -use legacy_inference_engine::model::{Model, Which}; - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_which_to_model_id() { - // Test a few representative model variants - assert_eq!(Which::Base2B.to_model_id(), "google/gemma-2b"); - assert_eq!(Which::Instruct7B.to_model_id(), "google/gemma-7b-it"); - assert_eq!(Which::InstructV1_1_2B.to_model_id(), "google/gemma-1.1-2b-it"); - assert_eq!(Which::CodeBase2B.to_model_id(), "google/codegemma-2b"); - assert_eq!(Which::BaseV2_2B.to_model_id(), "google/gemma-2-2b"); - assert_eq!(Which::InstructV3_1B.to_model_id(), "google/gemma-3-1b-it"); - } - - #[test] - fn test_which_is_instruct_model() { - // Test base models (should return false) - assert!(!Which::Base2B.is_instruct_model()); - assert!(!Which::Base7B.is_instruct_model()); - assert!(!Which::CodeBase2B.is_instruct_model()); - assert!(!Which::CodeBase7B.is_instruct_model()); - assert!(!Which::BaseV2_2B.is_instruct_model()); - assert!(!Which::BaseV2_9B.is_instruct_model()); - assert!(!Which::BaseV3_1B.is_instruct_model()); - - // Test instruct models (should return true) - assert!(Which::Instruct2B.is_instruct_model()); - assert!(Which::Instruct7B.is_instruct_model()); - assert!(Which::InstructV1_1_2B.is_instruct_model()); - assert!(Which::InstructV1_1_7B.is_instruct_model()); - assert!(Which::CodeInstruct2B.is_instruct_model()); - assert!(Which::CodeInstruct7B.is_instruct_model()); - assert!(Which::InstructV2_2B.is_instruct_model()); - assert!(Which::InstructV2_9B.is_instruct_model()); - assert!(Which::InstructV3_1B.is_instruct_model()); - } - - #[test] - fn test_which_is_v3_model() { - // Test non-v3 models (should return false) - assert!(!Which::Base2B.is_v3_model()); - assert!(!Which::Base7B.is_v3_model()); - assert!(!Which::Instruct2B.is_v3_model()); - assert!(!Which::Instruct7B.is_v3_model()); - assert!(!Which::InstructV1_1_2B.is_v3_model()); - assert!(!Which::InstructV1_1_7B.is_v3_model()); - assert!(!Which::CodeBase2B.is_v3_model()); - assert!(!Which::CodeBase7B.is_v3_model()); - assert!(!Which::CodeInstruct2B.is_v3_model()); - assert!(!Which::CodeInstruct7B.is_v3_model()); - assert!(!Which::BaseV2_2B.is_v3_model()); - assert!(!Which::InstructV2_2B.is_v3_model()); - assert!(!Which::BaseV2_9B.is_v3_model()); - assert!(!Which::InstructV2_9B.is_v3_model()); - - // Test v3 models (should return true) - assert!(Which::BaseV3_1B.is_v3_model()); - assert!(Which::InstructV3_1B.is_v3_model()); - } - - // Note: Testing the Model enum's forward method would require creating actual model instances, - // which is complex and would require loading model weights. This is better suited for - // integration tests or mocking the models. -} \ No newline at end of file diff --git a/crates/legacy-inference-engine/tests/text_generation_tests.rs b/crates/legacy-inference-engine/tests/text_generation_tests.rs deleted file mode 100644 index 9d3d24d..0000000 --- a/crates/legacy-inference-engine/tests/text_generation_tests.rs +++ /dev/null @@ -1,101 +0,0 @@ -use anyhow::Result; -use candle_transformers::generation::LogitsProcessor; -use legacy_inference_engine::model::Which; -use legacy_inference_engine::token_output_stream::TokenOutputStream; -use tokenizers::Tokenizer; - -#[cfg(test)] -mod tests { - use super::*; - - // Helper function to create a simple tokenizer for testing - fn create_test_tokenizer() -> Result { - // Create a simple tokenizer from the pretrained model - // This uses the tokenizer from the Hugging Face hub - let tokenizer = Tokenizer::from_pretrained("google/gemma-2b", None).unwrap(); - Ok(tokenizer) - } - - // Test the Which enum's to_model_id method - #[test] - fn test_which_model_id() { - assert_eq!(Which::Base2B.to_model_id(), "google/gemma-2b"); - assert_eq!(Which::Instruct7B.to_model_id(), "google/gemma-7b-it"); - } - - // Test the Which enum's is_instruct_model method - #[test] - fn test_which_is_instruct() { - assert!(!Which::Base2B.is_instruct_model()); - assert!(Which::Instruct7B.is_instruct_model()); - } - - // Test the Which enum's is_v3_model method - #[test] - fn test_which_is_v3() { - assert!(!Which::Base2B.is_v3_model()); - assert!(Which::BaseV3_1B.is_v3_model()); - } - - // Test the TokenOutputStream functionality - #[test] - fn test_token_output_stream() -> Result<()> { - let tokenizer = create_test_tokenizer()?; - let mut token_stream = TokenOutputStream::new(tokenizer); - - // Test encoding and decoding - let text = "Hello, world!"; - let encoded = token_stream.tokenizer().encode(text, true).unwrap(); - let token_ids = encoded.get_ids(); - - // Add tokens one by one - for &token_id in token_ids { - token_stream.next_token(token_id)?; - } - - // Decode all and check - let decoded = token_stream.decode_all()?; - assert_eq!(decoded.trim(), text); - - Ok(()) - } - - // Test the LogitsProcessor - #[test] - fn test_logits_processor() -> Result<()> { - // Create a LogitsProcessor with default settings - let seed = 42; - let temp = Some(0.8); - let top_p = Some(0.9); - let logits_processor = LogitsProcessor::new(seed, temp, top_p); - - // Create a simple logits tensor - // In a real test, we would create a tensor with known values and verify - // that sampling produces expected results - - // For now, we'll just verify that the LogitsProcessor can be created - assert!(true); - Ok(()) - } - - // Test the TextGeneration constructor - #[test] - fn test_text_generation_constructor() -> Result<()> { - // We can't easily create a Model instance for testing, - // but we can test that the constructor compiles and the types are correct - - // In a real test with a mock Model, we would: - // 1. Create a mock model - // 2. Create a tokenizer - // 3. Call TextGeneration::new - // 4. Verify the properties of the created instance - - // For now, we'll just verify that the code compiles - assert!(true); - Ok(()) - } - - // Note: Testing the actual text generation functionality would require - // integration tests with real models, which is beyond the scope of these unit tests. - // The tests above focus on the components that can be tested in isolation. -} diff --git a/crates/legacy-inference-engine/tests/token_output_stream_tests.rs b/crates/legacy-inference-engine/tests/token_output_stream_tests.rs deleted file mode 100644 index 71053f4..0000000 --- a/crates/legacy-inference-engine/tests/token_output_stream_tests.rs +++ /dev/null @@ -1,129 +0,0 @@ -use legacy_inference_engine::token_output_stream::TokenOutputStream; -use tokenizers::Tokenizer; -use std::path::PathBuf; -use anyhow::Result; - -#[cfg(test)] -mod tests { - use super::*; - - // Helper function to create a simple tokenizer for testing - fn create_test_tokenizer() -> Result { - // Create a simple tokenizer from the pretrained model - // This uses the tokenizer from the Hugging Face hub - let tokenizer = Tokenizer::from_pretrained("google/gemma-2b", None).unwrap(); - Ok(tokenizer) - } - - #[test] - fn test_new_token_output_stream() -> Result<()> { - let tokenizer = create_test_tokenizer()?; - let token_stream = TokenOutputStream::new(tokenizer); - - // Check that the token stream was created successfully - assert!(token_stream.tokenizer().get_vocab(true).len() > 0); - Ok(()) - } - - #[test] - fn test_clear() -> Result<()> { - let tokenizer = create_test_tokenizer()?; - let mut token_stream = TokenOutputStream::new(tokenizer); - - // Add a token - let token_id = token_stream.get_token("").unwrap(); - token_stream.next_token(token_id)?; - - // Clear the stream - token_stream.clear(); - - // Check that the stream is empty by trying to decode all - let decoded = token_stream.decode_all()?; - assert_eq!(decoded, ""); - - Ok(()) - } - - #[test] - fn test_get_token() -> Result<()> { - let tokenizer = create_test_tokenizer()?; - let token_stream = TokenOutputStream::new(tokenizer); - - // Get a token that should exist - let eos_token = token_stream.get_token(""); - assert!(eos_token.is_some()); - - // Get a token that shouldn't exist - let nonexistent_token = token_stream.get_token(""); - assert!(nonexistent_token.is_none()); - - Ok(()) - } - - #[test] - fn test_next_token_and_decode() -> Result<()> { - let tokenizer = create_test_tokenizer()?; - let mut token_stream = TokenOutputStream::new(tokenizer); - - // Get some tokens - let hello_tokens = token_stream.tokenizer().encode("Hello world", true).unwrap(); - let token_ids = hello_tokens.get_ids(); - - // Add tokens one by one - let mut output = String::new(); - for &token_id in token_ids { - if let Some(text) = token_stream.next_token(token_id)? { - output.push_str(&text); - } - } - - // Get any remaining text - if let Some(rest) = token_stream.decode_rest()? { - output.push_str(&rest); - } - - // Check the output - assert!(!output.is_empty()); - assert_eq!(output.trim(), "Hello world"); - - Ok(()) - } - - #[test] - fn test_decode_all() -> Result<()> { - let tokenizer = create_test_tokenizer()?; - let mut token_stream = TokenOutputStream::new(tokenizer); - - // Get some tokens - let hello_tokens = token_stream.tokenizer().encode("Hello world", true).unwrap(); - let token_ids = hello_tokens.get_ids(); - - // Add tokens one by one - for &token_id in token_ids { - token_stream.next_token(token_id)?; - } - - // Decode all - let decoded = token_stream.decode_all()?; - - // Check the output - assert_eq!(decoded.trim(), "Hello world"); - - Ok(()) - } - - #[test] - fn test_into_inner() -> Result<()> { - let tokenizer = create_test_tokenizer()?; - let token_stream = TokenOutputStream::new(tokenizer); - - // Get the inner tokenizer - let inner_tokenizer = token_stream.into_inner(); - - // Check that the inner tokenizer works - let encoded = inner_tokenizer.encode("Test", true).unwrap(); - assert!(encoded.get_ids().len() > 0); - - Ok(()) - } -} \ No newline at end of file