Skip to main content

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 syntax for every type_id (CheckInterTypeIdItem) as well as the field/method/class_def references to one, 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
search: methods using string "http" 1.95 ms 8.28 ms
search: call sites of Log.d 0.27 ms 1.22 ms

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 from art/libdexfile/dex/utf-inl.h), emitting readable UTF-8 for BMP text (한글/CJK) and a \uXXXX escape only for surrogates/control chars. A supplementary (astral) char is kept as a surrogate pair, exactly like ART. androguard DAD instead emits one \u followed by the full codepoint hex — e.g. a real-corpus U+DFFFD comes out as "\udfffd" (5 hex digits → invalid Java: the lexer reads \udfff + a literal d, 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 (not return 0/1), return null for a null reference, IEEE-754 float/double literals (1.0f, Double.NaN) where androguard prints the raw integer bits, and null/true/false field initializers (not Python None/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]"
# upgrading from an older install? plain `install` is a no-op once dexllm is
# present ("Requirement already satisfied") — you need -U:
pip install -U dexllm

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.

To pin a version, use a version specifier — not --find-links, which adds a source rather than replacing PyPI, so pip still resolves to the highest version it can see anywhere:

pip install "dexllm==0.9.0"
# ≤0.8.1 predates PyPI and lives only on Releases — point pip at that tag's assets:
pip install "dexllm==0.8.1" --find-links https://github.com/mobile-threat-hunter/dex-analyzer-for-llm/releases/expanded_assets/v0.8.1

The wheels are also mirrored on this repo's Releases — download a specific .whl and pip install ./that-file.whl if you'd rather not go through an index.

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 zlib dev 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 system zlib. 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 embeddingdexllm.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

dexllm-0.9.0.tar.gz (1.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dexllm-0.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

dexllm-0.9.0-cp313-cp313-macosx_13_0_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

dexllm-0.9.0-cp313-cp313-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 13.0+ ARM64

dexllm-0.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

dexllm-0.9.0-cp312-cp312-macosx_13_0_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 13.0+ x86-64

dexllm-0.9.0-cp312-cp312-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 13.0+ ARM64

dexllm-0.9.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

dexllm-0.9.0-cp311-cp311-macosx_13_0_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

dexllm-0.9.0-cp311-cp311-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 13.0+ ARM64

dexllm-0.9.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

dexllm-0.9.0-cp310-cp310-macosx_13_0_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

dexllm-0.9.0-cp310-cp310-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 13.0+ ARM64

dexllm-0.9.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

dexllm-0.9.0-cp39-cp39-macosx_13_0_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9macOS 13.0+ x86-64

dexllm-0.9.0-cp39-cp39-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.9macOS 13.0+ ARM64

File details

Details for the file dexllm-0.9.0.tar.gz.

File metadata

  • Download URL: dexllm-0.9.0.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

Hashes for dexllm-0.9.0.tar.gz
Algorithm Hash digest
SHA256 2f5eea9feccfbd5b94f3b866e75a0dd12416e031007c940eabe0fc0440c5fc76
MD5 fed0d2569161d987e74538d10923f0db
BLAKE2b-256 1d5fea3a12bd33d4260bc13a01c8875d8189ac602bef446c6af2b1ffc43f7dd7

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8ec31be5d46d0a19af2f6180f46b1fc3e77518f6832a9b80c8d8856660cac48c
MD5 859b52afa656cfa4463d29c4fc96742e
BLAKE2b-256 06d4453288a4a10feaf1c630fe15741a7e004b582c507a50c7a7d5d3128f7f25

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp313-cp313-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 31afafbe70303cec34f4698415820bca14906530bb1da415fbe534540b0bc4a6
MD5 5afdded74c4a9bec8fe09924ec4ebe96
BLAKE2b-256 861880ef90d06548b688163183c6514069780309168273aca1fac5ea1deb43b2

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp313-cp313-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp313-cp313-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 caea7f84e1ebd0597ed52a64dd40a6b1c34d201cc8d91665af574ca317937041
MD5 fc9d291e622eee06ae96feff6c33ea49
BLAKE2b-256 e254a5b57b61ec22045ec0b54ee54e9a8458263c8a0c0d2146a0db795a0253b0

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 deb01d76c8137790666e02b040b12c5bf332f39431bbdd246f6210d268c378c4
MD5 5684ea4d82235ac5a797aca14cc16ef8
BLAKE2b-256 764e8cfcc6e2df831fc3bb9c6e006727d2a7c5980973c60884c9ce89090e74d3

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp312-cp312-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 fb3231878788109e6ca5182a4bea5028be8e768c29b209e476597373ed907990
MD5 277849772e8b8dca336a98399189765a
BLAKE2b-256 d3e86c5a98924ad5799ef05ae173b3ae4773b0d5d1cc01e86eb780bff2472a3d

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp312-cp312-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 428acc3e798997d747c67032b81a9937e12632703cd14067c47be6e94cda56ef
MD5 4a21cbc40f4d6f05a477462c3c747776
BLAKE2b-256 3498bf5faee3753a931e846e9ce652d6cdbbcdaa41176aed1821ea4534b3214d

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ed9d437de0e5eaf348536536697cb1e34c9b00f3bc21c3393322d596f6a72b9e
MD5 c1e02a597030f3ee43433f4a5309e617
BLAKE2b-256 babbc44add2af7770216cf9acf821fdbd65f93a2963655ebfabdb688ba8695d9

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 f5a63a8cadd1131e49532053a3ac56737223be32d8c88637e9fcb70b035df550
MD5 158af881925207fda9b42e8bd0e19a07
BLAKE2b-256 73509809ac0f0c0c7e403de2967b231a15fab4a527dc69c371233ac095f96972

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp311-cp311-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp311-cp311-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 0531a25ee4f80fb9b96361b0adfd6818ddc6bddc0709eec66decb0209f734202
MD5 6c33a8d2fccf8328b2e22f7e8f250325
BLAKE2b-256 bdbe0c0439ad827abe8c9716e951f9a763f3e82b6bee2bf04027add5b8383589

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0cce883042c475518ac2d583dc76579fc2ef3e187d17e484fb6dcba3a01364ef
MD5 6ff929a9d12384efc6bbbb947eef0c0f
BLAKE2b-256 f5ee5e21552a4370549d17c3a17f1bb341a61ce4db1bbab854881b613441ecd3

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 0bb08cc730c1b9f77768e048e7f96c561a93e4f6ebb6954a6fb3d85b7d96f932
MD5 ab0aa07af751ca74ea587209d4669b98
BLAKE2b-256 0bee52b1f7025a9e8f0cf70d91eb0c458089eeb60c5ba912c06bc5fc62bc2688

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp310-cp310-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp310-cp310-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 134d099c16eeb873c6e4c1ef38b94b6ea30ff67c329a20b7438a33e1820c20fd
MD5 cd43ce423f401e3f2784642420c00f5e
BLAKE2b-256 5942be72c1da236752970c09b1d47ec60dd41821dc3c0c413c23106fdd4dab98

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8f8ca98599bece336344d4331b3bdf1b98328d1c9fafcb5b07d4ca3316a0232f
MD5 88dc7c18c814744fa129dc590624bacd
BLAKE2b-256 b2bd1b3c55e6c72e1a123e8e4afa465661b90516133ca042f4eb603fe4ab9cab

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp39-cp39-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp39-cp39-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 b2742f5969afcb999316354b2c2cdf0903ddf45a4f022d906e68759bd7bbc8a5
MD5 a3cb3f7b232296ac7086c08b91216aa3
BLAKE2b-256 5feae7be281f2c9cb8d66e7c652046b9a4db998c144471d3530d64eddada9fb9

See more details on using hashes here.

File details

Details for the file dexllm-0.9.0-cp39-cp39-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for dexllm-0.9.0-cp39-cp39-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 f9f898b29c93f5cab847a90d618541ac733267546631782b3c6c357a739ca351
MD5 13e376fda20f710051d9a891d7936952
BLAKE2b-256 1ea286110144549f6129db42f86befacf3badee834ee43ed4414a96bf06f073e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page