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 C++ engine port (permission_callers()), byte-identical to the Python one 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 engine's dataset is compiled in, so a $DEXLLM_AOSP_DATASET override moves only the Python side (usage). 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-match1)

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 · 28/28 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). In a string literal it then renders those units one by one — readable UTF-8 for BMP text (한글/CJK), a \uXXXX escape for a surrogate or control unit — so a supplementary (astral) char stays 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.) An IDENTIFIER is rendered readably instead (dexllm#28): a class named A𐀀sTest reads the same in decompiled Java, in the smali listing and in list_classes(), rather than splitting into A\ud800\udc00sTest in the Java pane alone. Code-unit fidelity is a claim about string CONTENT — what mirror::String actually holds — while an identifier is a source symbol; the split spelling broke correlation for anyone reading two views of the same class side by side, or pasting a class name into a hooking script. A BMP identifier (A한ysisTest) always rendered readably, so the old behaviour was inconsistent as well: it survived by unit count rather than by rule.
  • 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.11.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, source}, …] (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

The web backend's POST /upload takes the same inputs as everything else — identified by content, not by filename — and returns the identify() verdict alongside the session_id.

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).

  1. The definer-match check is ART's FindFirstClassDataDefiner, and like the name says it reads the FIRST member. ART additionally re-checks every field and method in CheckInterClassDataItem; we do not yet (#48), so a crafted class_data can declare a member whose field_id.class_idx names another class. Bounds are still checked, so this is a wrong-answer GIGO on crafted input, not a memory-safety gap; corpus incidence is 0.

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.13.0.tar.gz (1.5 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.13.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.13.0-cp313-cp313-macosx_13_0_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

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

Uploaded CPython 3.13macOS 13.0+ ARM64

dexllm-0.13.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.13.0-cp312-cp312-macosx_13_0_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 13.0+ x86-64

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

Uploaded CPython 3.12macOS 13.0+ ARM64

dexllm-0.13.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.13.0-cp311-cp311-macosx_13_0_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

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

Uploaded CPython 3.11macOS 13.0+ ARM64

dexllm-0.13.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.13.0-cp310-cp310-macosx_13_0_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

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

Uploaded CPython 3.10macOS 13.0+ ARM64

dexllm-0.13.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.13.0-cp39-cp39-macosx_13_0_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9macOS 13.0+ x86-64

dexllm-0.13.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.13.0.tar.gz.

File metadata

  • Download URL: dexllm-0.13.0.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for dexllm-0.13.0.tar.gz
Algorithm Hash digest
SHA256 31c4eb2a4dc37b13d50da01ccfddc7547e1e1dd59742cfb81d076ca6acca0b71
MD5 1ad1ac42f3bd5507b06956f613ce34b5
BLAKE2b-256 dde3f5f5b73185802c7ca5c1d0514ccee3d280f46f1f0386bb2a4dab83e4c4bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 715f95c72bb75354f8e079b8c6cc360be081d2aeebf81cb72812941dd50fe5f7
MD5 18d1d8e2ad4572721866206dd62a2132
BLAKE2b-256 c348806e01e97a8185c4c024d3100b47370263eccc26d631002de0e1edfa428e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 b81780fb9706c6dec4767b5737c84346ff988f7b2674eae59193944c7a6b9e4f
MD5 ca32cec76a987e844e65bd0992c2f9aa
BLAKE2b-256 08076071d32c3cb8af853543eaea1e1defd57df9f7cce029692a313b45adab0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp313-cp313-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 3967ddbaa1bed6d10da4b219ffcdfe168972734403e37236c55576d8ee2afe40
MD5 acd44174ac8c37279a5f91fef7c7e7a9
BLAKE2b-256 e33941a75ea478b41458bbea6b43754c932068cffb60f141bc2bd57b7851644c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 465d1ae75135a88afbc8adc67a77abcb4e830624428770beeb88043c047a5ade
MD5 bb1df51dcce8766c22e49c752410a80a
BLAKE2b-256 57d233c445faefc0f857adc10473817633eb090e71a505531fcd41ded0a7e003

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 009ca959243acade8d59433e35789cc68ea59cdbf2e3859f76ee457a2bf16f0e
MD5 9399421c29dab7212a5b6b4171ab1336
BLAKE2b-256 77b9a91f1d1c376319fe5bdcdf6e0b555ab9a4f28bf16f1affc4b3ba9a31a9a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 202e7a9b3b12dc138db7128bb7ac6e6ee8533a1df094ed5c9f348a1fece6220b
MD5 7d4df20aa2b5af7d47ad1160d44e3aad
BLAKE2b-256 d445ada47b8b57cf0afe137196f5ff5149a3edee67140c37d9c3eecf945898e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 df1fe9a58eb6d31fed350e77cb774bc123128faa7b938e3c2ed3e514fe8adceb
MD5 a2cdf0d8928a99b16780d3b3f6b14630
BLAKE2b-256 336539e5a45d20487b1d2a6ed2961f8c6640901c321ad2cf68fc666a024fe8e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 a37571eb313c5450c4ae98f5d55f3e063bf1017a8d5856cf352dd7f7d50a3fcb
MD5 25b7580519925f8cb4a7e42ff0686032
BLAKE2b-256 74f640f1aad483a99433a4f134a8744c0455b188ae5928ae13af4db574beadfb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp311-cp311-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 bbcb5ea65d70b8f53ce0f136d8646506e8c603ffe4889a1807c219266fbd19db
MD5 5eec6b7a4e03151ace570d878e930ce9
BLAKE2b-256 85d421912ddd6f23b0c0bf2d6155b9b599a79a8729de54b826b0ec99c235e72d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f2ac556e5b44f2a977b347d438902455bf4a6b258fdba67e3df17ebac7d36a41
MD5 f6d249d5b39302faac2894f34b4ec7a7
BLAKE2b-256 bbc7e7398b8a493a3b6db6adfc1df08cb0ae5af338ce1a70862ce375401e0d06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 2f2238377ec32edca17b25b1f41f132ca2be925a0104982e68be28ba15bbfaf0
MD5 09ce5097a456ec6aa3d8b20908ff926e
BLAKE2b-256 b9908c13b178d273377b400bae955b28881a194c525671bb56fc58cbaa18742c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp310-cp310-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 7d481a14ad8fdcf18ac11404fdc2a0c44bd4a6e19f8697e08d6215b1dc276084
MD5 3bca1b5e8b8374059cc6bc012697faa4
BLAKE2b-256 beb72029341577292c2c82367feccf2ae74e6386fa8b3a0d94eaa7232f606719

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c2cc7b834d1bf3ca43ad17245b548cf314998330ee77d1d0f87166146302b5ac
MD5 c43664943c963f0b6ef9d010ce69dde6
BLAKE2b-256 819d74e80cbf0c681f302c23d2f9942f542c3ee4dfacbf304b51c57e1b0debed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp39-cp39-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 92126a78c4fb4a6f5bece8290cd8def835b9055e30febc66c669e057cbed5451
MD5 4ad50763ab13c3652fec2ee0097c26d1
BLAKE2b-256 244505f7d64398933efcb3cc62b9b9b5ef42fdbc1b1548c7d0fa18f309bb1013

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dexllm-0.13.0-cp39-cp39-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 746d396114f59922316e9d33ae4003d6819dd6d311b07924371dba725a2f01a0
MD5 13200d0d7c9cf4a8a347ece0b08c46dd
BLAKE2b-256 8a69d16238fb7e4fd841b7b807533d70692f0a99e352f93bed7692c22d693f7f

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 Sentry Error logging StatusPage Status page