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
Component subclasses find_component_subclasses() — every declared class whose inheritance chain reaches one of the nine types an AndroidManifest.xml can name (Activity / Service / BroadcastReceiver / ContentProvider / Application / BackupAgent / Instrumentation / AppComponentFactory / the ZygotePreload interface), with the full chain — framework intermediates included (MyTile → TileService → Service), which no dex declares and a bundled AOSP-derived table supplies. The manifest's SUPERSET on purpose: abstract chain nodes, bundled library classes and anonymous receivers handed to registerReceiver are reported and annotated (is_abstract, is_instantiable — ART's own Class.newInstance predicate, public class + public no-arg constructor — and constructed_in), and a chain that leaves the loaded dexes at an unknown parent is unresolved rather than dropped
Permissive TLS detect_permissive_tls() — the javax.net.ssl HostnameVerifier / X509TrustManager implementations the app declares, each with a PROVEN verdict: permissive means the body was proven to accept every hostname or every certificate chain. Names the INTERFACE rather than the call that installs it, so the OkHttp / Volley / Retrofit paths — which install through bundled library code with no framework spelling — are caught too (dexllm#53). not_proven is the absence of a proof, not a clean bill of health — and a trust manager whose 2-arg checkServerTrusted is not the overload Conscrypt duck-types is DECLINED rather than accused
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, annotations subtree · ⊕ 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), and every class_data member's defining class (the definer half of CheckInterClassDataItem1)

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, debug_info, the contents of call_site entries,2 proto shorty-match, access-flag bitmasks, and the offset→map-type cross-check.3

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 from art/libdexfile/dex/utf-inl.h). In a string literal — in a method body and in a static final initializer alike, by one shared escaper since dexllm#83 — it then renders those units one by one: the Java metacharacters and \n \r \t take their short escapes, any OTHER unit below 0x20 and every surrogate become \uXXXX (so a supplementary (astral) char stays a surrogate pair, exactly like ART), and everything else is written as itself — readable UTF-8 for BMP text (한글/CJK), and raw for DEL, the C1 range and U+0085 / U+2028 / U+2029. 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). A static initializer's float payload is zero-extended to the right, as ART reads it, so a short encoding decodes to the constant the class declares rather than to a denormal (dexllm#70). A static value with no Java expression form at all — a MethodHandle, a method reference, an annotation — rides as a trailing // = Cls::name comment rather than being dropped, so Type name; never means both "no initializer" and "one we could not spell" (dexllm#64). Both reference decompilers do worse on that family: jadx 1.5.0 loses the whole class on a MethodType or a MethodHandle (Can't decode value) and emits a bare = ; for a method reference, and androguard prints a memory address for an array or an annotation.

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;
│                           UPSTREAM records the baseline and the fork point, and
│                           docs/dexkit-vendor-divergences.md every local change)
├── test_apk/               APK corpus for regression (fetched separately; gitignored)
├── CLAUDE.md               decompiler port internals / dev notes
└── LICENSE                 Apache-2.0

Install

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, source}

# 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 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[PermissionCallers]

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 rest of ART's CheckInterClassDataItem is not ported: member access-flag validation (CheckFieldAccessFlags / CheckMethodAccessFlags), CheckStaticFieldTypes (a static field's declared type vs its encoded_array initializer), and the orphan-class_data check ART gets by driving from the map where this port drives from class_defs. All three are wrong-answer gaps, not crash surface — see docs/dexkit-vs-art-dex-handling.md. ↩

  2. Both sections' extent is bounded and their alignment is checked (dexllm#57 and dexllm#62 — the latter because ART's IsDataSectionType covers both and this port's did not, so a misaligned offset was accepted). A method_handle is now read end to end: an entry's contents since dexllm#59 (ART CheckIntraMethodHandleItem :1492 — the handle type, and its index against the table that type names), and since dexllm#72 the 0x16 encoded_value's own index INTO the section, which ART caps and bounds at :1204/:1212. A call_site's contents are still unread here and bounded at the reader instead (dexllm#67). ART's data_items_left item budget stays unported on purpose, since this port consumes a section's item count only where it already has a tighter byte-span bound — docs/aosp-oob-divergences.md B2b. One mechanism goes BEYOND ART instead, and it rejects (almost) nothing: a per-image memo plus an entry budget, so a method_handle section shared between the slices of a v41 container is walked once rather than once per sibling — which is what stops that walk being quadratic in the container (B2d). ↩

  3. annotations were on that list until dexllm#56, excused as "lazy-parsed by the core". They are parsed — Reader::ExtractAnnotations runs off class_def.annotations_off during cache init — so a 4-byte repoint of that offset yielded a dex verify() called valid in both modes on which the slicer's annotation parser walked off the end. The subtree is now verified (directory → sets → items → encoded_annotation), which is also what makes the offset→map-type line above honest: without a type map, "the contents are validated directly" has to be true of every referenced structure. ↩

Metadata

Release files for dexllm 0.23.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dexllm 0.23.0
File Size Uploaded
dexllm-0.23.0.tar.gz 2.5 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for dexllm 0.23.0
File
dexllm-0.23.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
dexllm-0.23.0-cp313-cp313-macosx_13_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 13.0+ x86-64 Details
dexllm-0.23.0-cp313-cp313-macosx_13_0_arm64.whl CPython 3.13 CPython 3.13 macOS 13.0+ ARM64 Details
dexllm-0.23.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
dexllm-0.23.0-cp312-cp312-macosx_13_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 13.0+ x86-64 Details
dexllm-0.23.0-cp312-cp312-macosx_13_0_arm64.whl CPython 3.12 CPython 3.12 macOS 13.0+ ARM64 Details
dexllm-0.23.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
dexllm-0.23.0-cp311-cp311-macosx_13_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 13.0+ x86-64 Details
dexllm-0.23.0-cp311-cp311-macosx_13_0_arm64.whl CPython 3.11 CPython 3.11 macOS 13.0+ ARM64 Details
dexllm-0.23.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
dexllm-0.23.0-cp310-cp310-macosx_13_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 13.0+ x86-64 Details
dexllm-0.23.0-cp310-cp310-macosx_13_0_arm64.whl CPython 3.10 CPython 3.10 macOS 13.0+ ARM64 Details
dexllm-0.23.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
dexllm-0.23.0-cp39-cp39-macosx_13_0_x86_64.whl CPython 3.9 CPython 3.9 macOS 13.0+ x86-64 Details
dexllm-0.23.0-cp39-cp39-macosx_13_0_arm64.whl CPython 3.9 CPython 3.9 macOS 13.0+ ARM64 Details

Total release size: 26.3 MB

Release files / dexllm-0.23.0.tar.gz

Download URL dexllm-0.23.0.tar.gz
Size 2.5 MB
Tags Source
SHA-256 checksum
How to use checksums
a6656ce029d537357686d386eae684153c73124e70d0853b5fdcfe236e170f29
BLAKE2b-256 checksum
How to use checksums
e99832599139e3644da449e9829945b922ce474ac3bc86580320264f9a196501
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL dexllm-0.23.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.9 MB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
641001997d80b373274e79bed58803a9b9c957b73b2bc2dfe9cab55b8690f3a0
BLAKE2b-256 checksum
How to use checksums
e9eedcff81ca8d29f3f9408a692c0093c0d1584faea665f3a102dba4d8635f48
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp313-cp313-macosx_13_0_x86_64.whl

Download URL dexllm-0.23.0-cp313-cp313-macosx_13_0_x86_64.whl
Size 1.5 MB
Tags CPython 3.13 macOS 13.0+ x86-64
SHA-256 checksum
How to use checksums
d56b676d5b44400620f0957593c814c6f3987ca38c7f8f1f50456ef087ef0f04
BLAKE2b-256 checksum
How to use checksums
b4ca8d7644a9d9fafdf7cf677298f8dcb6a056b59e280fe0b3b51e1309b8bb7f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp313-cp313-macosx_13_0_arm64.whl

Download URL dexllm-0.23.0-cp313-cp313-macosx_13_0_arm64.whl
Size 1.4 MB
Tags CPython 3.13 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
14c9e55de1e70da795b8ad4bf374aa9eccdde81be618d853264bb5f4a791a8eb
BLAKE2b-256 checksum
How to use checksums
4e38c859c91b387d1ae483c24d407c61413b8d5e51a22196da89b348096245d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL dexllm-0.23.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.9 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0a3e0aec73c804381c6f7ebb32e8ed95f9f88340a384bf870540ff574d7c3ee0
BLAKE2b-256 checksum
How to use checksums
cfb5f2ec2617b44c2fc0a5d2ea2139ebfd0a9654ce6686511835fe125f52ec2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp312-cp312-macosx_13_0_x86_64.whl

Download URL dexllm-0.23.0-cp312-cp312-macosx_13_0_x86_64.whl
Size 1.5 MB
Tags CPython 3.12 macOS 13.0+ x86-64
SHA-256 checksum
How to use checksums
798ad663079ee014bafb3070961c6e86cd6d174d378d8364aad7e53d25b99dc6
BLAKE2b-256 checksum
How to use checksums
e3007fa8c71a1eeee0d272c039b3fdb7d85f05b14b5bf3dc7d99aa382497bb18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp312-cp312-macosx_13_0_arm64.whl

Download URL dexllm-0.23.0-cp312-cp312-macosx_13_0_arm64.whl
Size 1.4 MB
Tags CPython 3.12 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
5e7bd94873d6790d94bb31057f182c09ce09431988be469a47d7c1baeca10682
BLAKE2b-256 checksum
How to use checksums
cba2937b5eb0242ae5e931bd93005ee003a63d5c722e175563ed57623fbac69e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL dexllm-0.23.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.9 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
59785861e1b61f81dcbe8a5871627d530f95fd7781fb54b9ead0b45f4077f64c
BLAKE2b-256 checksum
How to use checksums
44aa0637a3b60fc3dd9c80650a91311df502c8f3569f813d28d8f92af996876a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp311-cp311-macosx_13_0_x86_64.whl

Download URL dexllm-0.23.0-cp311-cp311-macosx_13_0_x86_64.whl
Size 1.5 MB
Tags CPython 3.11 macOS 13.0+ x86-64
SHA-256 checksum
How to use checksums
7d0450b67fd7796ce3e21bfbea10e31b78e654116a301260c5fe64ed09df60e5
BLAKE2b-256 checksum
How to use checksums
b1495fd7fcb060105aafc3a1847f97532d9ee5589f108c7fdc538a0cd11b3a82
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp311-cp311-macosx_13_0_arm64.whl

Download URL dexllm-0.23.0-cp311-cp311-macosx_13_0_arm64.whl
Size 1.4 MB
Tags CPython 3.11 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
579aa57618a7beea64d259b30e521b9d41494504c5bfefb1c355ed4be5b582d4
BLAKE2b-256 checksum
How to use checksums
dac2982412a7a9879c487c961b39f87e4336acb208b32df4b37f893e2b4b2ef1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL dexllm-0.23.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.9 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
6e0b1b23084b17e9a937af4a04c4ba97636cb5f615c2dfe5168f308d137e6ae6
BLAKE2b-256 checksum
How to use checksums
459308db43baacae06678da91d4ee08185ddea8923a77b156fb88c8d246f558e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp310-cp310-macosx_13_0_x86_64.whl

Download URL dexllm-0.23.0-cp310-cp310-macosx_13_0_x86_64.whl
Size 1.5 MB
Tags CPython 3.10 macOS 13.0+ x86-64
SHA-256 checksum
How to use checksums
8246258c3c3cd7dc0a1cbbe2d3c00c64463d1a31f9a5bc6c11a392b1d2fdcc1e
BLAKE2b-256 checksum
How to use checksums
dced9a5e7828d8065257fde383c0ae18239b647c05c5f0631d56cedfc91b8e50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp310-cp310-macosx_13_0_arm64.whl

Download URL dexllm-0.23.0-cp310-cp310-macosx_13_0_arm64.whl
Size 1.4 MB
Tags CPython 3.10 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
8ddc8f0bad85b5efd1eceb6f5e76e12c846fcddcb3d3c2dc2ccddfb7b09252fd
BLAKE2b-256 checksum
How to use checksums
3a692d295c7902ee938e3d834725ce92fc71d58e081efbfef615a9c20878eb3e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL dexllm-0.23.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.9 MB
Tags CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
56f0a19585cfb49b0e3ba3e3dbd2c9a9acb8b67c30f62b7ec7eedffdc36c0de3
BLAKE2b-256 checksum
How to use checksums
a5f3fa30b8f8c9fd2d5d66edb833dc70c7439302a1e05c13fb68225bfb602bdd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp39-cp39-macosx_13_0_x86_64.whl

Download URL dexllm-0.23.0-cp39-cp39-macosx_13_0_x86_64.whl
Size 1.5 MB
Tags CPython 3.9 macOS 13.0+ x86-64
SHA-256 checksum
How to use checksums
d8e157e3ef6c3831464f45b0988804dd9772412a8884c5191956e0aeeaaeb3d7
BLAKE2b-256 checksum
How to use checksums
b94702f20fb19dde5ca96fb953d74ec4fb03a4ca47dbd2cbfe38c3f047738cb4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dexllm-0.23.0-cp39-cp39-macosx_13_0_arm64.whl

Download URL dexllm-0.23.0-cp39-cp39-macosx_13_0_arm64.whl
Size 1.4 MB
Tags CPython 3.9 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
504b3dc79625a5f89c464fd44f3baf7a49dbfbd88c69b01f32b9928006539084
BLAKE2b-256 checksum
How to use checksums
e99d7009d9f3444df280e4f5fee7f132772c8a884a9934bb486c5ed3a1ae2272
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page