Skip to main content

Official Python SDK for the LIGANDAI® platform — peptide design, structure prediction, scoring, and discovery.

Project description

LIGANDAI Python SDK

Official Python SDK for the LIGANDAI platform — peptide design, structure prediction, scoring, and discovery.

License & Terms — By installing or using this SDK you agree to the LigandAI Terms of Service and End User License Agreement. API usage is logged for billing and abuse prevention. See LICENSE for the full agreement.

pip install ligandai
from ligandai import LigandAI

client = LigandAI(api_key="lgai_pro_...")
print(f"Tier: {client.tier}, Credits: {client.credits}")

# Find tissue-specific surface markers
markers = client.discovery.tissue_markers(target_tissues=["Liver"], top_n=2000)

# Resolve a structure for the top marker
gene = markers.top[0].gene
structure = client.structures.get(gene)
analysis = client.structures.analyze(gene, analysis_depth="full")

# Generate peptides targeting the recommended pocket
job = client.peptides.generate(
    gene=gene,
    num_peptides=300,
    target_residues=[analysis.recommended_pocket] if analysis.recommended_pocket else None,
    targeting_strategy="pocket_targeted",
    auto_fold=True,
    top_n_fold=25,
)

# Wait for completion (generation + auto-fold)
result = job.wait(timeout=1800)
print(f"Got {len(result.peptides)} peptides, top iPSAE: {result.peptides[0].ipsae}")

Authentication

# 1. Pass explicitly
client = LigandAI(api_key="lgai_pro_...")

# 2. Read from env var (preferred for prod)
# $ export LIGANDAI_API_KEY=lgai_pro_...
client = LigandAI()

# 3. Custom base URL (dev / on-prem / enterprise)
client = LigandAI(api_key="...", base_url="http://localhost:5050")

API keys carry a tier prefix:

Prefix Tier What it can do
lgai_free_* free search, view structures, get job status
lgai_edu_* academia + generate, fold, score, glycosylation
lgai_pro_* pro + bivalent, transport vasculome (no batch ops)
lgai_ent_* enterprise everything + batch operations + priority queue
lgai_sa_* superadmin all features (internal)

The client detects the tier from the prefix at construction — no network call.

client.tier                     # "pro"
client.credits                  # int
client.feature_allowed("...")   # bool
client.max_peptides_per_generation
client.rate_limit_per_minute

When a method requires a higher tier than the key carries, it raises LigandAITierError client-side, before sending the request.

Resource Namespaces

Namespace Endpoints What it does
client.account /api/auth/user, /api/user-credits, ... profile, credits, tier limits
client.receptors /api/receptordb/* search, browse, download PDBs
client.structures /api/structure/*, /api/gene-resolver/* gene → PDB / AlphaFold
client.proteins /api/protein-info/*, /api/protein-variants/* UniProt info, variants, custom PDBs
client.discovery /api/transcriptomics/*, /api/scrna/*, /api/geo-import/* tissue markers, scRNA, GEO import
client.diseases /api/disease-viewer/* disease search, mutations
client.peptides /api/ptf/parallel/*, /api/folding/*, /api/binder-scoring/* generate, fold, score
client.bivalent /api/ligandforge/bivalent/* bispecific design (pro+)
client.synthesis /api/synthesis-checkout/*, /api/adaptyv/* quote, cart, order
client.memory /api/episodic-memory/* memory search & save
client.programs /api/ptf/programs/*, /api/ptf/sessions/* programs, projects, sessions
client.charts /api/charts/* matplotlib chart generation
client.reports /api/reports/* PDF report generation
client.jobs /api/jobs/* list, cancel, stream

Long-Running Jobs

Generation, folding, and scoring submit GPU work and return a Job:

job = client.peptides.generate(gene="EGFR", num_peptides=300)
job.id              # str
job.status          # "queued" | "running" | "complete" | "failed"
job.progress        # 0-100 or None
job.estimated_credits

# Block until done
result = job.wait(timeout=1800, poll_interval=2.0)

# Or stream live progress events (SSE)
for event in job.stream():
    print(f"{event.stage}: {event.message} ({event.progress})")

# Cancel
job.cancel()

Async equivalents:

import asyncio
from ligandai import AsyncLigandAI

async def design_for_genes(genes):
    async with AsyncLigandAI() as client:
        jobs = await asyncio.gather(*[
            client.peptides.generate(gene=g, num_peptides=300) for g in genes
        ])
        results = await asyncio.gather(*[j.wait() for j in jobs])
        return results

results = asyncio.run(design_for_genes(["EGFR", "HER2", "KIT"]))

Errors

from ligandai import (
    LigandAIError,           # base
    LigandAIAuthError,       # 401 — invalid/expired/revoked key
    LigandAITierError,       # 403 — feature requires higher tier
    LigandAIRateLimitError,  # 429 — rate limit
    LigandAICreditError,     # 402 — insufficient credits
    LigandAINotFoundError,   # 404
    LigandAIServerError,     # 5xx (auto-retried)
    LigandAIValidationError, # 400/422
)

try:
    job = client.peptides.generate(gene="EGFR", num_peptides=10000)
except LigandAITierError as e:
    print(f"Need {e.required_tier}, you have {e.current_tier}")
except LigandAICreditError as e:
    print(f"Need {e.required} credits, have {e.available}")

Retry & Rate Limiting

The SDK automatically retries on 429, 5xx, and transient network errors with exponential backoff (configurable via max_retries=). It also respects Retry-After and X-RateLimit-Reset headers.

Per-tier rate limits:

Tier req/min
free 10
academia 30
pro 60
enterprise 300

ReceptorDB-restricted Client

For receptordb.com users, a thinner client exposes only browse / search / download (no API key required for read endpoints):

from ligandai import ReceptorDBClient

client = ReceptorDBClient()
hits = client.search("EGFR")
client.download_pdb(hits[0].complex_id, "egfr.pdb")

# With API key — fold/generate
client = ReceptorDBClient(api_key="lgai_basic_...")
job = client.fold(sequences=["MAEEPQSD..."], target_gene="EGFR")

Typed Models

All request/response shapes are pydantic models. IDE autocompletion works out of the box, including for nested fields:

from ligandai import BivalentTarget, LinkerConfig

session = client.bivalent.start(
    target1=BivalentTarget(gene="PDCD1", chain="A"),
    target2=BivalentTarget(gene="CD274", chain="A"),
    linker=LinkerConfig(position="C", length_min=8, length_max=20),
    binder_length_min=15,
    binder_length_max=40,
    num_designs=200,
)
print(session.id, session.status)

Examples

See examples/ for complete worked demos:

  • examples/01_quickstart.py — auth, tier check, simple search
  • examples/02_end_to_end.py — discovery → structure → generate → fold → score → cart
  • examples/03_bivalent.py — PD-1 / PD-L1 bispecific design
  • examples/04_async_parallel.py — design for many genes concurrently
  • examples/05_custom_variant.py — fold a mutation, save as variant, regenerate
  • examples/06_streaming.py — live SSE progress

Development

git clone https://github.com/ligandal/ligandai-python-sdk
cd ligandai-python-sdk
pip install -e ".[dev]"
pytest
mypy ligandai/
ruff check ligandai/

License

MIT — see LICENSE.

Project details


Download files

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

Source Distribution

ligandai-0.1.4.tar.gz (51.1 kB view details)

Uploaded Source

Built Distribution

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

ligandai-0.1.4-py3-none-any.whl (53.6 kB view details)

Uploaded Python 3

File details

Details for the file ligandai-0.1.4.tar.gz.

File metadata

  • Download URL: ligandai-0.1.4.tar.gz
  • Upload date:
  • Size: 51.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for ligandai-0.1.4.tar.gz
Algorithm Hash digest
SHA256 22e6655f4d6d6e5d182b1b1b9d129f8c22eca4e204db52d617268a544ad4b29e
MD5 ffb4ac2e1df82e7caf0047c70862286d
BLAKE2b-256 1b7f53fad41aec150dbb84d2ad5e86218aed6a9b74a33c4652caaa6cb5540e68

See more details on using hashes here.

File details

Details for the file ligandai-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: ligandai-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 53.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for ligandai-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 44414ff8c1a33460a5dd47cbfb191d4e4ca22d1756d5e1d7c7e33b4c3ac9992e
MD5 c64bce2e899121ce64c6735c3f210cc7
BLAKE2b-256 7554b4b9d89085c9b4bc1ba8ad5931cb894ad1afcaf76fc72e7422bfe672efe5

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