mllm-shap
Shapley-value attributions for conversational language models.
Explicit estimands (Shapley vs Banzhaf), reproducible run archives, pluggable backends (Hugging Face, LM Studio, OpenAI-compatible APIs).
Installation
pip install mllm-shap
Optional backends and visualization:
pip install "mllm-shap[transformers]" # Hugging Face text backend
pip install "mllm-shap[lmstudio]" # LM Studio SDK
pip install "mllm-shap[api]" # OpenAI-compatible HTTP API
pip install "mllm-shap[viz]" # matplotlib token charts
The core package does not install PyTorch. Python 3.12 or newer; uv for development.
Why mllm-shap
- Honest estimands. Shapley and Banzhaf are separate, labelled aggregators; every result and archive records which one produced it, and results report
base_valueandgrand_valueso efficiency (sum(values) == v(N) - v(empty)) can be verified; axiom tests enforce it. - Reproducible runs. One validated configuration, a run id derived from it, and an archive of every model generation, so attributions can be recomputed with another value function without calling the model again.
- Pluggable everything. Partitions, absence policies, estimators, value functions, backends and renderers are entry-point plugins; exact, Monte Carlo, complementary and Neyman estimators ship built in.
Quickstart
import math
from mllm_shap import (
ConversationSnapshot,
ExplainConfig,
ExplainRunner,
Message,
Role,
Turn,
)
snapshot = ConversationSnapshot.from_turns((
Turn(messages=(Message(role=Role.USER, text="refund my order"),)),
))
config = ExplainConfig.model_validate({
"backend": {"kind": "mock", "model_id": "stub"},
"explanation": {"estimator": "exact", "value_fn": "tfidf_cosine"},
})
result = ExplainRunner(config).explain_sync(snapshot).result
print(result.values) # one attribution per token
print(result.base_value) # v(empty): payoff of the fully masked prompt
print(result.grand_value) # v(N): payoff of the full prompt
# Efficiency: Shapley values sum to v(N) - v(empty).
assert math.isclose(sum(result.values), result.grand_value - result.base_value)
The mock backend needs no model; swap backend.kind for transformers, lmstudio or api to explain a real model. Runs are archived under ./runs/{run_id}; running the same configuration twice raises ArchiveExistsError unless explanation.archive.on_exists is overwrite (or archive.path is "").
Command line
The same run without Python: write a snapshot as JSON, start from the commented config skeleton, and get the result as JSON (--render token_bar --png out.png also saves a chart).
echo '{"turns": [{"messages": [{"role": "user", "text": "refund my order"}]}]}' > snapshot.json
mllm-shap config --example > config.yaml
mllm-shap explain --config config.yaml --snapshot snapshot.json --out result.json
mllm-shap reanalyze --config config.yaml --archive runs/<run_id> # rescore, no model calls
mllm-shap plugins
See the command-line guide.
Documentation
Full documentation: pawlo77.github.io/MLLM-SHAP
- Getting started
- How a run works
- Configuration
- Choosing an estimator
- Backends
- Extending
- Theory
- API reference
Examples, vault and development
- Runnable notebooks:
examples/, also embedded in the docs. - Architecture notes, decisions, known issues and papers: the Obsidian vault in
knowledge/. - Development setup, checks and pull requests:
CONTRIBUTING.md.
Citing
If you use mllm-shap in research, please cite it (CITATION.cff; GitHub's "Cite this repository" button renders it as APA or BibTeX):
cff-version: 1.2.0
title: "mllm-shap: Shapley-value explainability for conversational language models"
type: software
authors:
- family-names: Pozorski
given-names: Paweł
repository-code: "https://github.com/Pawlo77/MLLM-SHAP"
license: Apache-2.0
License
Apache License 2.0. See LICENSE.
Copyright 2026 Paweł Pozorski.
Metadata
Release files for mllm-shap 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mllm_shap-0.6.0.tar.gz | 116.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mllm_shap-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 286.0 kB
Release files / mllm_shap-0.6.0.tar.gz
| Download URL | mllm_shap-0.6.0.tar.gz |
|---|---|
| Size | 116.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e5da9ecec1f3e8cd30655cdb3bc235344a1e39c7b6662996f54b8343080dd22f
|
|
BLAKE2b-256 checksum How to use checksums |
c22608eed3774fa9e83e98846e756b673fb66b19ea6abfcf4c745b9b102cdef5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / mllm_shap-0.6.0-py3-none-any.whl
| Download URL | mllm_shap-0.6.0-py3-none-any.whl |
|---|---|
| Size | 169.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c1bf79cc2ade97f6b2c06d4dcfc3f2d3f927ab75c51355606c4a248a71d0d607
|
|
BLAKE2b-256 checksum How to use checksums |
04933fd6a2d020184b802bd61245d4f001cde75026e609509cbf1f7ff45fdf5d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|