dex-analyzer-for-llm (dexllm)
LLM-facing Android APK / DEX static analyzer: a C++ core (pybind11 wrapper around LuckyPray/DexKit) with an embedded, fully ported DAD-aligned Java decompiler, plus MCP and FastAPI/SSE backends for agent integrations.
Built for mobile threat hunting / malware triage — fast, low-memory, embeddable, and parallel-safe — rather than Xposed module development.
Why
| dexllm | |
|---|---|
| Input | .apk/.jar/.zip, a bare .dex, or a disguised/extension-less container — identified by content (PK / dex\n magic), not filename; identify() probes without loading |
| APK load | ~28 ms (lazy slicer parse + load-time structural verification — ~100× faster than androguard; multiple grows with APK size: Telegram's 39 k classes / 5 dex load in ~120 ms) |
| Decompile | DAD-quality Java; 4.5× faster per-method than androguard |
| Multidex | first-wins duplicate-class resolution, deterministic — matches ART/AOSP, so a packer's class collisions decompile to the body that actually runs |
| Unpack workflow | DexKit([dump, apk]) loads multiple sources with priority by order (decrypted dex first → first-wins makes it win, mirroring ART); add_dumped_dexes() is the re-analyze-after-dumping verb; lenient=True verifies in ART-structural-equivalent mode so a partially-decrypted dump still loads |
| Memory | ~520 MB on a 39k-class app — embeddable in-process, no JVM |
| Parallel | C++ releases the GIL → real multi-threaded decompile from one in-process instance |
| Search | L1–L7 (name / string / annotation / super / API call-site / xref) — 3–6× faster than androguard |
| C2 / IOC | extract_iocs() — static URL / IP / domain / email / onion extraction over the value-string feed (list_value_strings(): const-string + static VALUE_STRING, no identifier noise), defang-aware (hxxp://, [.], [at]), public-suffix-validated, each tied to its referencing method (VirusTotal's contacted-addresses view, no execution) |
| Content providers | detect_content_providers() — the content:// provider URIs (SMS / contacts / call-log / calendar) the app references, matched against a bundled AOSP provider-URI dataset — the runtime-assembled surface READ_SMS/READ_CONTACTS gate, invisible to the annotation map |
| Permissions | permission_api_callers() — which permissions the APK exercises through real framework API calls, across all protection levels (dangerous / signature / internal / normal), each group with its real protectionLevel; signature-precise against AOSP's metalava @RequiresPermission map plus the runtime-enforcement bridge (runtime-enforced APIs the annotation misses, e.g. SMS ICC ops → SEND_SMS; overloads disambiguated), and the methods that call them. dangerous_permission_apis() / dangerous_permission_api_callers() keep the dangerous-only view |
| Engine-shared / WASM | the permission-caller join has a byte-identical C++ engine port (permission_callers()) over the engine-bundled AOSP dataset, so the pybind and the in-browser WASM binding run one implementation — no re-implemented join, no forked data (issue #14). The IoC / provider / capability analyses are canonical pure-Python (extract_iocs / detect_content_providers / summarize_capabilities); a WASM consumer vendors its own engine for those |
| AST | decompile_method_ast returns the full androguard dast.py nested AST |
| Smali sync | decompile_method_with_pc_map returns Java text + a source-line ↔ bytecode-offset pc_map (condition/loop/switch headers included) for precise smali ↔ Java cursor sync; parity-neutral metadata |
| LLM | dexllm.tools catalog → MCP stdio server + FastAPI/SSE web backend |
See docs/workflow.md for how dexllm operates end to end (load → verify → search → decompile → agent, all diagrammed), docs/usage.md for the task-oriented API walkthrough (L1–L7 + decompile), docs/api.md for the flat API reference (every method, return type, example output), docs/architecture.md for the ports-&-adapters boundary map, docs/dexkit-vs-art-dex-handling.md for how dexllm's DEX handling compares to AOSP/ART (verification, multidex, cross-dex), and CLAUDE.md for the decompiler port internals.
Architecture
Hexagonal (ports & adapters): the DAD-aligned decompiler core knows nothing about how
dex bytes are loaded — it talks to the outside through one narrow port (IDexCodeSource),
so the same pipeline runs on a real APK (production adapter) or hand-built snapshots
(test adapter). Every byte crosses a load-time structural verifier first.
flowchart TB
accTitle: Ports and Adapters Architecture
accDescr: The Python API drives the decompiler facade and the DAD domain core, which reads dex only through the IDexCodeSource port. Production and test adapters implement that port, and every dex passes the VerifyDex structural verifier before the DexKit Core slicer parses it.
python_api["Python API, MCP stdio, FastAPI/SSE"]
pybind["pybind11 binding<br/>native/binding/module.cpp"]
facade["Decompiler facade + LRU cache<br/>native/dad_cpp/decompiler.cpp"]
raw_dex["raw .dex / classes*.dex"]
verify_dex["VerifyDex structural verifier<br/>1:1 AOSP DexFileVerifier port"]
dexkit_core["DexKit Core + slicer"]
prod_adapter["DexItemCodeSource<br/>core_ext, production adapter"]
mock_adapter["MockCodeSource<br/>tests, no DexKit"]
port{{"IDexCodeSource port<br/>pure abstract"}}
output["Java text | nested AST"]
subgraph core["Domain core: native/dad_cpp - 1:1 androguard DAD port"]
snapshot["MethodSnapshot, immutable DTO"]
pipeline["graph, dataflow, control_flow"]
emit["writer / dast"]
snapshot --> pipeline --> emit
end
python_api --> pybind --> facade
facade -->|drives| snapshot
raw_dex --> verify_dex --> dexkit_core --> prod_adapter
prod_adapter -->|implements| port
mock_adapter -->|implements| port
port -->|reads method code| snapshot
emit --> output
classDef io fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#14532d
classDef guard fill:#fee2e2,stroke:#dc2626,stroke-width:2px,color:#7f1d1d
classDef boundary fill:#fef9c3,stroke:#ca8a04,stroke-width:2px,color:#713f12
classDef domain fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e3a5f
class raw_dex,output io
class verify_dex guard
class port boundary
class snapshot,pipeline,emit domain
The boundary is enforced by scripts/check_dad_boundary.sh:
native/dad_cpp/ may never #include DexKit, FlatBuffers, the zip reader, or core_ext.
Parser lineage — dexllm parses with Google's slicer (tools/dexter — a mutable
heap IR built for rewriting, with no structural verification, only SLICER_CHECK
assertions). ART itself parses with libdexfile (lazy zero-copy accessors + its own
DexFileVerifier). They are independent AOSP libraries sharing only the dex format.
dexllm therefore pairs slicer's parsing with a 1:1 port of ART's DexFileVerifier
(VerifyDex, below) and of utf.cc (MUTF-8) — slicer's convenience, ART's rigor.
Why not just use libdexfile? Because it's a foundation rewrite, not a parser swap:
dex::Reader is the backbone of all of DexKit Core (L1–L7 search, enumeration), and
libdexfile isn't standalone-vendorable (it needs libartbase + libbase and builds with
Soong, not CMake). Its one real edge — rigorous verification — we already ported. Full
side-by-side + decision: docs/dexkit-vs-art-dex-handling.md §0.5.
Runtime flows — the load/verify path, the DAD decompile pipeline (Construct → BuildDefUse → … → IdentifyStructures → Writer), the L1–L7 capability ladder, and agent
(MCP/FastAPI) integration are all diagrammed in docs/workflow.md.
Malformed-dex verification (vs ART DexFileVerifier)
dexllm processes adversarial input, so every dex passes a load-time structural
verifier — VerifyDex (native/core_ext/dex_verifier.h,
the single safety contract) — before the core parses it. A reject throws with a
byte-level reason (dk.verify_report()); valid dexes are unaffected. It is a
readable 1:1 port of AOSP ART's DexFileVerifier (// ART :NNNN anchors,
spec-reference not runtime dep), turned to crash-safety, not execution trust.
Phase (ART dex_file_verifier.cc) |
vs ART |
|---|---|
CheckHeader / CheckMap |
✅ parity — magic/version/sizes/endian, section bounds, map ordering/alignment/required |
CheckIntraSection |
✅ parity — string_data MUTF-8, id indices, type_list, code_item, class_data, encoded_array · ⊕ plus VerifyInsns (per-instruction operand bounds, which ART keeps in the runtime method verifier, not the structural one) |
CheckInterSection |
✅ parity — id ordering/uniqueness, descriptor + member-name syntax, class_def semantics (dup / self-inherit / definer-match) |
Deliberately not checked — execution-trust mechanics irrelevant to a read-only analyzer, or out of the structural scope: adler32/SHA-1 checksums, instruction dataflow semantics, annotations, debug_info, call_site/method_handle, proto shorty-match, access-flag bitmasks, and the offset→map-type cross-check.
Validated: clean corpus 0 false-reject · 29/29 C++ test suites · ASan corpus + malformed-dex fuzz 0 heap-overflow/UAF/SEGV (the same fuzz segfaults 66/120 with no structural verifier). The verifier adds ~58% to load time (still ~100× faster than androguard); decompile throughput is unaffected. Full per-check breakdown: docs/dexkit-vs-art-dex-handling.md §1.
Benchmark vs androguard
dexllm ports androguard's DAD decompiler to C++, so the comparison is pure runtime
(native vs Python) and output parity, single-threaded, same APK / same methods.
Reproduce with bench/bench_vs_androguard.py:
pip install -e ".[dev]" # dexllm + androguard
python bench/bench_vs_androguard.py /path/to/app.apk
APK: com.example.android.tvleanback.apk — 4135 classes · 500-method decompile sample · single-threaded
(Ryzen 9 9950X, Python 3.13):
| Operation | dexllm | androguard | speedup |
|---|---|---|---|
| APK load (incl. structural verification) | 27.8 ms | 2.83 s | 102× |
| Decompile — method (500) | 28.4 ms | 128.9 ms | 4.5× |
| └ per method | 0.06 ms | 0.26 ms | 4.5× |
| Decompile — whole class (200) | 77.6 ms | 368.7 ms | 4.8× |
| └ per class | 0.39 ms | 1.84 ms | 4.8× |
search: class name contains "Activity" |
0.59 ms | 1.55 ms | 3× |
search: methods using string "http" |
1.95 ms | 8.28 ms | 4× |
search: call sites of Log.d |
0.27 ms | 1.22 ms | 5× |
Java decompile output parity vs androguard (indent-normalized): method byte-identical 92.4% (462/500) · whole-class byte-identical 56.5% · whole-class line-overlap 94.0%. (Byte-identical at class scale is strict — one differing line fails the whole class; line-overlap is the fairer "how close" measure.) Residual mismatches are semantic-equivalent (variable-name suffixes) or cases where dexllm emits spec-correct Java that androguard gets wrong:
- Unicode strings/identifiers — dexllm decodes dex MUTF-8 to the exact UTF-16 code units
ART builds in a
mirror::String(decoder ported 1:1 fromart/libdexfile/dex/utf-inl.h), emitting readable UTF-8 for BMP text (한글/CJK) and a\uXXXXescape only for surrogates/control chars. A supplementary (astral) char is kept as a surrogate pair, exactly like ART. androguard DAD instead emits one\ufollowed by the full codepoint hex — e.g. a real-corpusU+DFFFDcomes out as"\udfffd"(5 hex digits → invalid Java: the lexer reads\udfff+ a literald, silently corrupting the string), where dexllm emits the valid"\udb3f\udffd". (Verified against the actual AOSP source — see docs/dexkit-vs-art-dex-handling.md.) - Literals — boolean
return false/true(notreturn 0/1),return nullfor a null reference, IEEE-754float/doubleliterals (1.0f,Double.NaN) where androguard prints the raw integer bits, andnull/true/falsefield initializers (not PythonNone/True/False).
Parallel decompile — dexllm releases the GIL in decompile_*, so threads give real
parallelism on one shared instance; androguard cannot use threads at all (GIL + non-thread-safe
analysis). Full-APK decompile of the same 4135 classes:
| dexllm | wall | speedup |
|---|---|---|
| sequential (1 thread) | 1.85 s | 1.0× |
| 32 threads (shared instance) | 188 ms | 9.9× |
Speedup is workload-dependent. Here it peaks at ~10.5× near the 16 physical cores (Ryzen 9
9950X is 16C/32T); the 32 logical (SMT) threads regress slightly to ~9.9× from scheduler
contention, so bench_vs_androguard.py (which uses os.cpu_count() = 32) reports the 32-thread
figure above. On a 39k-class app the speedup drops to ~3× because returning hundreds of MB of
decompiled text becomes GIL-bound. The APK-load gap instead widens with size: that 39k-class /
5-dex app loads in ~120 ms (lazy slicer parse + linear structural verification) versus
androguard's multi-second whole-program analysis.
Each tool at its realistic max — dexllm parallel (32 threads) vs androguard single-threaded (its only mode), full-APK decompile, end-to-end:
| stage | dexllm (parallel) | androguard (single) | speedup |
|---|---|---|---|
| APK load (incl. structural verification) | 27.8 ms | 2.78 s | 100× |
| full decompile (4135 classes) | 188 ms | 9.91 s | 53× |
| END-TO-END | 0.22 s | 12.69 s | 59× |
Repository layout
.
├── pyproject.toml scikit-build-core build config
├── CMakeLists.txt native build (drives vendor/ + native/)
├── src/dexllm/ Python package: DexKit, tools, mcp_server, server, capability, …
├── native/ C++ sources
│ ├── core_ext/ extension over upstream DexKit (search / ref enumeration)
│ ├── dad_cpp/ DAD-aligned Java decompiler (graph/dataflow/control_flow/writer/dast)
│ └── binding/ pybind11 module (C++ ↔ Python boundary)
├── tests/ C++ parity suites (tests/parity, ctest) + Python pytest suite
├── examples/ runnable usage examples
├── bench/ reproducible androguard benchmark
├── docs/ detailed API walkthrough (usage.md)
├── vendor/dexkit_core/ vendored LuckyPray DexKit Core (its own LICENSE)
├── test_apk/ APK corpus for regression (fetched separately; gitignored)
├── CLAUDE.md decompiler port internals / dev notes
└── LICENSE Apache-2.0
Install
From PyPI (recommended — no toolchain)
pip install dexllm
# + LLM backends (MCP + FastAPI):
pip install "dexllm[all]"
Pre-built wheels for Linux (manylinux_2_28 x86_64) and macOS (x86_64 + arm64,
requires macOS 13.3+), CPython 3.9–3.13, are published to
PyPI. pip picks the wheel matching your platform/Python —
no C++ compiler needed.
The same wheels are mirrored on this repo's
Releases — download a
specific .whl and pip install ./that-file.whl, or pin to one release with
--find-links https://github.com/mobile-threat-hunter/dex-analyzer-for-llm/releases/expanded_assets/vX.Y.Z.
On a platform with no matching wheel (Windows, musllinux, PyPy, aarch64) pip falls back to
the sdist and builds from source — see below for the toolchain that needs.
Build from source (development)
Requirements: Python 3.9+ and a C++20 compiler. CMake / Ninja / pybind11 / scikit-build-core
are build-time deps that pip provisions automatically — you don't install them by hand.
- Linux: GCC 10+ or Clang 12+, plus
zlibdev headers (apt install build-essential zlib1g-dev). - macOS (Intel or Apple Silicon): Xcode Command Line Tools (
xcode-select --install) — provides Apple Clang (C++20 from Xcode 14+) and the systemzlib. No Homebrew packages required. The build is platform-agnostic (scikit-build-core resolves the wheel tag per OS/arch).
# from the repo root — same on Linux and macOS
pip install -e . # core (native analyzer + decompiler)
pip install -e ".[all]" # + MCP server + FastAPI backend
pip install -e ".[dev]" # + pytest + androguard (for tests / parity)
The mcp extra is pinned to >=1.0,<2: dexllm.mcp_server targets the mcp 1.x
low-level Server API, and 2.x removed those decorators (the module then fails at
import). If your environment already carries mcp 2.x, pip install -e ".[mcp]"
downgrades it.
After editing C++ sources, rebuild with the two-step loop (or /dexkit-build):
cd build/cp*-cp*-* && ninja # 1. rebuild the native lib
cd - && pip install -e . --no-build-isolation # 2. reinstall from repo root
Quick start
import dexllm
# Probe a file by content without loading it (handles disguised/extension-less APKs)
dexllm.identify("/path/to/suspect") # → {format, is_apk, has_manifest, dex_count}
# Structurally verify a dex/apk without loading — never raises (the verify() sibling of identify())
dexllm.verify("/path/to/suspect") # → [{dex_id, name, valid, reason}, …] (per dex)
dk = dexllm.DexKit("/path/to/app.apk") # .apk/.jar/.zip, a bare .dex, or a disguised container
# What framework APIs does it touch? (capability / threat triage)
for ref in dk.list_external_method_refs(framework_only=True)[:10]:
print(ref.java_signature)
# Decompile
print(dk.decompile_method("Lcom/example/Foo;->bar()V"))
print(dk.decompile_class("Lcom/example/Foo;"))
ast = dk.decompile_method_ast("Lcom/example/Foo;->bar()V") # nested AST + Java text
pc = dk.decompile_method_with_pc_map("Lcom/example/Foo;->bar()V") # {"source", "pc_map": [(line, byte_off), …]}
# Search — and its forward direction (which strings does THIS code load?)
for m in dk.find_methods_using_strings(["http"]):
print(m)
print(dk.list_method_strings("Lcom/example/Foo;->bar()V")) # its const-string operands
print(dk.list_class_strings("Lcom/example/Foo;")) # + static VALUE_STRING inits
for site in dk.find_call_sites_to("Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I"):
print(site)
Typed API for embedding — dexllm.sdk wraps the same engine in
ports & adapters (@runtime_checkable Protocol use cases + frozen-dataclass
models with an accurate type on every argument/return):
from dexllm.sdk import open_apk, DexAnalysisUseCase
session: DexAnalysisUseCase = open_apk("app.apk")
session.decompile_method("Lcom/x/Y;->m(I)V") # -> DecompiledMethod
session.permission_callers(app_only=True) # -> tuple[PermissionCallerGroup]
See docs/usage.md.
Typed out of the box — the wheel ships PEP 561 type stubs (py.typed + .pyi), so the native DexKit methods, the return objects (CallSite, ClassSummary, …), and the module helpers (identify, extract_iocs, …) autocomplete and type-check under mypy / pyright with no extra setup.
LLM backends (need the [all] extra):
python -m dexllm.mcp_server # MCP stdio (Claude Desktop / Cursor / Continue)
uvicorn dexllm.server:app --port 8000 # FastAPI + SSE web backend
Tests
# C++ parity suites (self-contained, no APK needed) — primary regression gate
cd build/cp*-cp*-* && ninja parity_tests && ctest --output-on-failure
# Python suite (skips APK-dependent tests if no APK is available)
pip install -e ".[dev]"
DEXLLM_TEST_APK=/path/to/app.apk pytest tests -v
See tests/README.md for details.
Licence
Apache-2.0 — see LICENSE. Vendored DexKit Core under vendor/dexkit_core/ keeps its
own licence (vendor/dexkit_core/LICENSE).
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dexllm-0.8.2.tar.gz.
File metadata
- Download URL: dexllm-0.8.2.tar.gz
- Upload date:
- Size: 1.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc27aef6c8ce4b1ba80db4dbf659913336750562ade38d7286fe59066d9e792f
|
|
| MD5 |
5c9cf49db940195a9d2ee1bc8a2f52f3
|
|
| BLAKE2b-256 |
389a2d0d8aa34a50a30f5ffd02ac5b030cfbbdf9bede1897973991c2677fb20f
|
File details
Details for the file dexllm-0.8.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.13, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c097f9ca200d6a6fa143664bff3c6bc89ce57869b2c385bd82cb01363fc6b01
|
|
| MD5 |
27b0a1d1438ee2c22eeadc3785e2e596
|
|
| BLAKE2b-256 |
d98fc97b47a0ab10816636f6937e754f562516433d61fe1421d31d131e584381
|
File details
Details for the file dexllm-0.8.2-cp313-cp313-macosx_13_0_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp313-cp313-macosx_13_0_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.13, macOS 13.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3954fb36a3623e2882cdef4ca76a399d47687edcc2b9230ec0f3acaa3a791805
|
|
| MD5 |
90cada20d3d349b13b141624fd32c524
|
|
| BLAKE2b-256 |
13ff2a21de99af01dee693b6c0c928a5209786e911f93626c5ffc6855ff4356c
|
File details
Details for the file dexllm-0.8.2-cp313-cp313-macosx_13_0_arm64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp313-cp313-macosx_13_0_arm64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.13, macOS 13.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cee7371123d3e71dba3f362015c913d0449c9336fe1cac7e8ce5a9b3925f470e
|
|
| MD5 |
cabf7927a8fca3d8652ff4aaeaffbbcd
|
|
| BLAKE2b-256 |
2b7b478219504bcfcf0311550f3431b02b425d799064e9408f80fdfa746dd7f3
|
File details
Details for the file dexllm-0.8.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.12, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
092e0313b41d2e9cc6aa017ab0fc7e3c74287ca989bac64fcecfe950aabcff58
|
|
| MD5 |
67c9e27510615f77d82a835739f2224b
|
|
| BLAKE2b-256 |
4cc7217d271d9d2befe2a6115d896dc259c049647ba22562652f021d9330244c
|
File details
Details for the file dexllm-0.8.2-cp312-cp312-macosx_13_0_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp312-cp312-macosx_13_0_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.12, macOS 13.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c1d57de4e55044c57ed7bc881251a4ed51b5ffbd8daff92ee596e5c2df2e76b2
|
|
| MD5 |
c24b1da8df1c2c6acd4c16f789c41e93
|
|
| BLAKE2b-256 |
cf3bc5d45b022963c6307d6ebc3f6f41ae8f4972b9e2255eea226434bfa1a86a
|
File details
Details for the file dexllm-0.8.2-cp312-cp312-macosx_13_0_arm64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp312-cp312-macosx_13_0_arm64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.12, macOS 13.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
944c0d3770386d11701483565b0ad05ee4a8961d3b2891273f7043c8c6ef0b74
|
|
| MD5 |
0484222a84835bd859f6a40804bf81bf
|
|
| BLAKE2b-256 |
5bb38b690d9bd13ac8ec84a016ae2510e90bd67dd92a0a16123a386d6d316afa
|
File details
Details for the file dexllm-0.8.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.11, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
247f3629cc50d55e7c38c6a7bba2774a28eb880daa1188be49ea7e22db9b180d
|
|
| MD5 |
b2773eb090908cf21e62ad55ba8be652
|
|
| BLAKE2b-256 |
18fd957b88ec0a0ec29fd1648945a094892f15f07074fe0587dcf176a894267f
|
File details
Details for the file dexllm-0.8.2-cp311-cp311-macosx_13_0_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp311-cp311-macosx_13_0_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.11, macOS 13.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44c31aceaa7603cb7844b101b9320477720bd981524810cb711528c303ab7725
|
|
| MD5 |
07f662ba667263cf80c1a392f9a7b85d
|
|
| BLAKE2b-256 |
c6d624012fb2a720708ce256b1d8f721f2e4e3881af33c2ecebeb29ebcd32736
|
File details
Details for the file dexllm-0.8.2-cp311-cp311-macosx_13_0_arm64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp311-cp311-macosx_13_0_arm64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.11, macOS 13.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d134b4cf072b13c48e92e480eb6dc4bd6b267880a96dd6b083c6d29564ce39a9
|
|
| MD5 |
f30277046f7cce6fd53bd972a86959c0
|
|
| BLAKE2b-256 |
d013092f3afbabf99b578abd387d594eadee29d18adbe4e4ab2b0cec54b5b341
|
File details
Details for the file dexllm-0.8.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.10, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f82910f5bde2177dcbc7cf28aee44a3388059dccbff17da5ee26cdddc3ad4045
|
|
| MD5 |
9061f60219ce7aecd66c6913cee2c7e9
|
|
| BLAKE2b-256 |
689817c63f7448c4051a2199f82e30c5ea92604a86e1708abcbb9665264c44db
|
File details
Details for the file dexllm-0.8.2-cp310-cp310-macosx_13_0_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp310-cp310-macosx_13_0_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.10, macOS 13.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4db0f6141f8fc95225fa0629d7312433531b4f2ac7bf5cfacb96189ae6e32237
|
|
| MD5 |
f994f54ad193e8c03e07082e4039071a
|
|
| BLAKE2b-256 |
e242692460a6cbbd92f7a0cdc2bbe5e3d6173458e152635b17af3139edbade08
|
File details
Details for the file dexllm-0.8.2-cp310-cp310-macosx_13_0_arm64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp310-cp310-macosx_13_0_arm64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.10, macOS 13.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a4cac11b288d31c311857340364506a6e0ee9a0bfa3d5497fd88443817adfa6
|
|
| MD5 |
6189db1ca39c7d9d9e614397f936f1ec
|
|
| BLAKE2b-256 |
2101055b6d9ad40ea586c135d0b662f0f5042294bf32ea5234774f0374ee352c
|
File details
Details for the file dexllm-0.8.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.9, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfcd52b2026ddc71448f286f62460a2ce60bcf690b5bb3b6b7012a58861c2c7c
|
|
| MD5 |
be35cf8d9536b174895b02aa05426bbe
|
|
| BLAKE2b-256 |
eac24eb626fafe33df0d27c2759dde02b66c5d2c4ab053c01d82e9dfd6970adc
|
File details
Details for the file dexllm-0.8.2-cp39-cp39-macosx_13_0_x86_64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp39-cp39-macosx_13_0_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.9, macOS 13.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e2c580efb6b06f2956bce573995c87ade290a2f9826ba665b8f5f5dc84eaf8d
|
|
| MD5 |
6c06da6fba76006796229b721487a5a8
|
|
| BLAKE2b-256 |
701a63b82865abb7e5c591ddedfda5126484673ad16dd4b0f4dc395f6bd76faa
|
File details
Details for the file dexllm-0.8.2-cp39-cp39-macosx_13_0_arm64.whl.
File metadata
- Download URL: dexllm-0.8.2-cp39-cp39-macosx_13_0_arm64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.9, macOS 13.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a81e0634192fc553a7046c081bfb4b6f4a0c84fd60897c4d8b3ea205dfde7a01
|
|
| MD5 |
c592ded79b3026101859bc79243ad136
|
|
| BLAKE2b-256 |
84cf9976c8894305fd52dc72d9a2de122d4a3f168514a2aa4c8280302bbab15f
|