Skip to main content

deeplife

PyPI version CI Python 3.12+ License: MIT

Official DeepLife Python toolkit for TwinCell and related analysis: call the Open API from Python, pseudo-bulk with deeplife.pseudobulk, and run sample-level differential expression with deeplife.differential_expression (suitable for pseudo-bulk, bulk, or other compatible count tables). TwinCell code is split into focused subpackages under deeplife.twincell (HTTP client, workflows, preprocess, validation); deeplife.twincell itself still exposes a flat import surface for notebooks.

Source: github.com/deeplifeai/deeplife · Documentation: twincell.deeplife.co/docs · Python: 3.12+ (see pyproject.toml).


Install

pip install deeplife

API key: you need a DeepLife key (usually dl_…). Create or copy one from the TwinCell console (sign in, then open API keys / Keys). In code, set DEEPLIFE_API_KEY in the environment or pass api_key= when constructing the client; the client sends it as the X-API-Key header on every request (not Authorization: Bearer).

Network: the TwinCell Open API is public. The client defaults to https://open-deeplife-api.deeplife.co, reachable over the Internet. Interactive REST docs are at /docs and the schema at /openapi.json; pass base_url= to target another environment. Local-only features (pseudo-bulk, differential expression on .h5ad) do not require API connectivity.

From a git clone (contributors):

uv sync --group dev

Documentation

Hosted docs (same content as the Documentation link on PyPI):

Guide Description
Quick Start pip install, optional [notebook], API keys, first TwinCell workflow
Tutorials End-to-end single-cell target-validation notebook (Deucravacitinib / psoriasis)
API Reference TwinCell, preprocessing, validation, pseudo-bulk, differential expression

Source: docs/index.md.


Package layout

TwinCell (deeplife.twincell)

Import Role
deeplife.twincell Convenience namespace: DeepLifeClient, TwinCell, TwinCellSession, TwinCellStudy (alias of TwinCell), read_h5ad, adata_to_h5ad_bytes, etc.; plus the preprocess helpers pseudobulk, pydeseq2 (and lazy preprocessing).
deeplife.twincell.http REST client (DeepLifeClient, AsyncDeepLifeClient), request/response models, errors, HTTP helpers, logging (DeepLifeClient lives in twincell.http.client).
deeplife.twincell.workflows High-level session and study code: import submodules explicitly, e.g. twincell.workflows.workflows (TwinCellSession, …), twincell.workflows.study (TwinCell, …), twincell.validation.upload_helpers (adata_to_h5ad_bytes for client-side serialization), twincell.workflows.h5ad_io (read_h5ad for local paths and remote .h5ad URIs). The package __init__ resolves names lazily to avoid import cycles.
deeplife.twincell.preprocess Notebook-oriented pseudo-bulk and PyDESeq2 helpers (preprocess.pseudobulk, preprocess.pydeseq2).
deeplife.twincell.validation Local checks for the split inference upload path (validate_twincell_split_anndata, shared with the HTTP client). Exceptions live under validation.core; shared result types under validation.checks.

Other packages

Import Role
deeplife.pseudobulk, deeplife.differential_expression Pseudo-bulk from single-cell AnnData, and sample-level DE (CLIs twincell-pseudobulk, twincell-diffexpr)

Install with pip install deeplife. Import deeplife.twincell (flat or by submodule), deeplife.pseudobulk, and deeplife.differential_expression.


Minimal API usage

End-to-end flow: build a control and a perturbed AnnData plus a DEG list yourself → submit them as a split target-validation run → poll → read the target score and causal mechanism.

The notebook-oriented TwinCell class is the shortest path. It validates the split inputs locally, checks API connectivity on construction, and submits with job_type="target_validation":

import os
from deeplife.twincell import TwinCell

tc = TwinCell(
    pdata_control=pdata_control,  # AnnData, raw counts in .X
    pdata_pert=pdata_pert,        # AnnData, raw counts in .X
    degs=degs,                    # list[str] of HGNC-style symbols
    api_key=os.environ["DEEPLIFE_API_KEY"],
)
prediction_id = tc.target_validation(target="TYK2|PROTEIN")
print(tc.get_target_score(prediction_id=prediction_id))

The same run through the HTTP client, when you want to manage polling yourself:

import os
from deeplife.twincell.http import DeepLifeClient

client = DeepLifeClient(api_key=os.environ["DEEPLIFE_API_KEY"])
prediction = client.create_prediction_split(
    pdata_control=pdata_control,
    pdata_pert=pdata_pert,
    degs=degs,
    job_type="target_validation",
    target="TYK2|PROTEIN",
)
final = client.wait_for_prediction(prediction_id=prediction.prediction_id)
print(final.status)

External API keys are limited to split target validation. A merged single-file upload via create_prediction(dataset=…) returns 403 (prediction_external_split_required), and leaving job_type at its default "target_id" returns 403 (prediction_external_target_validation_only). Both paths are internal-only; use create_prediction_split(..., job_type="target_validation") as above.

The Python arguments are pdata_control / pdata_pert; the underlying multipart REST fields on POST /v1/predictions are named dataset_control / dataset_pert. Don't pass the REST names to the SDK.

Defaults: the client targets https://open-deeplife-api.deeplife.co; pass base_url= for another environment. Retries apply to safe GET-style calls (polling), not duplicate uploads on POST. Polling waits 5s between status requests (poll_interval_seconds) to stay well inside the edge rate limit of 30 requests/minute per IP — lower it only if you know the address isn't shared. For TLS/proxy issues, use tls_verify= and trust_env= on the client—see DeepLifeClient in deeplife.twincell.http.client.

For richer AnnData preparation (QC, column mapping, pseudo-bulk), use deeplife.twincell.preprocess or the tutorial notebooks.


Tutorials

Tutorial .ipynb files are published on the docs site (interactive + download). target-validation-deucravacitinib-psoriasis.ipynb is the end-to-end walkthrough: it loads a public psoriasis skin atlas (GSE162183), builds pseudo-bulk profiles for psoriatic vs. normal dendritic cells, derives the disease signature with PyDESeq2, then uses TwinCell to test whether Deucravacitinib's target (TYK2) causally explains it.

Run locally from a git clone:

pip install "deeplife[notebook]" jupyterlab
git clone https://github.com/deeplifeai/deeplife
cd deeplife
jupyter lab tutorials/

Set DEEPLIFE_API_KEY (or use the notebook getpass prompt) before the TwinCell API steps. Everything up to that point runs locally; the API cells need an Internet connection.

Location Role
twincell.deeplife.co/docs/tutorials/ Canonical hosted tutorials (browse or download)
tutorials/ in a git clone Same notebooks for local Jupyter

Contributors can use uv sync --group dev --extra notebook instead of pip if you prefer the locked lockfile.

After pip install -U deeplife, confirm imports match the layout you expect; the latest release is always on PyPI.


Development

uv sync --group dev
make check-all    # or: ruff, mypy, pytest — see Makefile

CI: .github/workflows/ci.yml runs on pushes and PRs to main / master: uv sync --frozen --group dev, Ruff, mypy, pytest, uv build, twine check --strict. .github/dependabot.yml bumps GitHub Actions weekly.

Releases to PyPI: .github/workflows/pypi-publish.yml runs the same checks, then publishes with OIDC trusted publishing (GitHub environment pypi, trusted publisher configured on the deeplife PyPI project). Bump version in pyproject.toml, push to main, then either push a tag matching v* or run the workflow manually from the Actions tab.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

deeplife-1.0.4.tar.gz (708.1 kB view details)

Uploaded Source

Built Distribution

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

deeplife-1.0.4-py3-none-any.whl (181.4 kB view details)

Uploaded Python 3

File details

Details for the file deeplife-1.0.4.tar.gz.

File metadata

  • Download URL: deeplife-1.0.4.tar.gz
  • Upload date:
  • Size: 708.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for deeplife-1.0.4.tar.gz
Algorithm Hash digest
SHA256 785e356ff14bbe1e6c46850dcfc28a6961e169bb5749652da2035d1bfe944c16
MD5 da7ac3f245a61ae13aea0a77d8f66c53
BLAKE2b-256 2f93fc8e568274fa219577edc434540cd47a41c639b3200eb925175b4a43b4f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for deeplife-1.0.4.tar.gz:

Publisher: pypi-publish.yml on deeplifeai/deeplife

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file deeplife-1.0.4-py3-none-any.whl.

File metadata

  • Download URL: deeplife-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 181.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for deeplife-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 945d4a8484f8ab1d9b5dd745d356d2fafa7a0ea5b01a01aea8954896b3973a69
MD5 566109ea7c6761388c39b1bf64bc0e04
BLAKE2b-256 6d73c654e9fc62218b45d7285bd0337ec43189f13face50774db16b98ae86609

See more details on using hashes here.

Provenance

The following attestation bundles were made for deeplife-1.0.4-py3-none-any.whl:

Publisher: pypi-publish.yml on deeplifeai/deeplife

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.0.5

2 files

This release

1.0.4 This release

2 files

1.0.3

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

0.0.1

2 files

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