Skip to main content

CLI and SDK for querying the Luca AI Evolutionary Database

Project description

Cadenza

Connect your W&B experiments to AI agents for autonomous ML research loops.

Cadenza imports your Weights & Biases runs into an Evolutionary Database, organizing them into genotypes, islands, and elites. AI agents can then query this structured view to decide what to try next — closing the loop between experiment tracking and autonomous research.

  • CLI and Python SDK primiarily for agents, but also for humans
  • LLM-ready async client that returns structured context for autonomous research loops
  • Lightweight: only two dependencies (httpx, pydantic)

Install

pip install cadenza

Or with uv:

uv pip install cadenza

Requires Python 3.11+.

Quickstart

1. Authenticate

Log in with your API token (generate one at www.myluca.ai):

cadenza login --token evodb_sk_...

2. Import a W&B project

First, make sure your W&B credentials are configured:

cadenza config wandb.entity my-team
cadenza config wandb.api-key my-wandb-api-key

Then import a project:

cadenza import my-wandb-project

Check import status:

cadenza import list

Or add a single run incrementally:

cadenza add --run_id abc123def

3. Explore your data

# List all projects
cadenza projects

# Set a default project so you don't have to pass -p every time
cadenza config defaults.project my-wandb-project

# View the genotype (search space + behavioral dimensions)
cadenza genotype

# List islands (subpopulations)
cadenza islands

# View the elite archive (top-performing experiments across all islands)
cadenza elites

# Get a compact JSON snapshot for agent consumption
cadenza sample

Python SDK

The SDK exposes an async client for programmatic access — designed for AI agent integrations.

import asyncio
from cadenza import CadenzaClient

async def main():
    async with CadenzaClient(token="evodb_sk_...", user_id="...") as client:
        # List projects
        projects = await client.list_projects()
        for p in projects:
            print(p.name, p.slug)

        # Get the search space definition
        genotype = await client.get_genotype("my-project")
        for dim in genotype.behavioral_dimensions:
            print(f"  {dim.name}: {dim.description}")

        # Browse islands and their experiments
        islands = await client.list_islands("my-project")
        for island in islands:
            print(f"{island.island_name}: {island.phenotype_count} phenotypes")

        experiments = await client.list_island_experiments(
            "my-project", islands[0].island_name
        )

        # Get the elite archive
        elites = await client.list_elites("my-project")

        # Get a compact, LLM-ready context snapshot
        context = await client.sample("my-project", top_phenotypes=3)
        print(context.model_dump())  # JSON-serializable dict

asyncio.run(main())

Agent loop pattern

The sample method is the key integration point for autonomous research loops. It returns a compact snapshot of the evolutionary state — genotype, islands, and elite archive — that fits in an LLM context window:

from cadenza import CadenzaClient

async def agent_step(client: CadenzaClient, project: str):
    # 1. Get current evolutionary state
    context = await client.sample(project, top_phenotypes=5)

    # 2. Feed to your LLM / agent
    #    context.genotype  — search space definition
    #    context.islands   — subpopulation summaries
    #    context.elite_archive — best solutions found so far

    # 3. Agent decides next experiment based on context
    # 4. Run experiment, log to W&B
    # 5. Re-import and repeat

Importing W&B data programmatically

result = await client.start_wandb_import(
    entity="my-team",
    api_key="my-wandb-api-key",
    projects=["project-a", "project-b"],
    max_behavioral_dimensions=8,
    elite_archive_size=10,
    max_islands=20,
)
for job in result.imports:
    print(f"{job.project}: {job.status}")

# Check import status
imports = await client.list_imports(status_filter="running")

Adding a single W&B run

Use add_wandb_run to incrementally add individual runs to an existing project:

result = await client.add_wandb_run(
    project_name="my-project",
    entity="my-team",
    api_key="my-wandb-api-key",
    wandb_project="my-wandb-project",
    run_id="abc123def",
)
for job in result.imports:
    print(f"{job.project}: {job.status}")

CLI Reference

Authentication

Command Description
cadenza login [--token TOKEN] [--url URL] Authenticate with an API token
cadenza status Show current auth status
cadenza logout Remove stored credentials

Configuration

cadenza config                        # List all config values
cadenza config <key>                  # Get a value
cadenza config <key> <value>          # Set a value

Data queries

Command Description
cadenza projects List all accessible projects
cadenza genotype [-p PROJECT] Show active genotype and behavioral dimensions
cadenza islands [-p PROJECT] List islands and population stats
cadenza experiments -i ISLAND [-p PROJECT] [--page N] List experiments in an island
cadenza elites [-p PROJECT] Show the elite archive
cadenza sample [-p PROJECT] [--top-phenotypes N] Generate LLM-ready JSON context

Import

Command Description
cadenza import <wandb-project> Start importing a W&B project
cadenza import list List active import jobs
cadenza add --run_id RUN_ID [-p PROJECT] [--wandb-project NAME] Add a single W&B run to an existing project

Utilities

Command Description
cadenza schema Output full command schema as machine-readable JSON

All data query commands accept -p/--project to specify the project. Set a default with cadenza config defaults.project <name> to omit it.

Configuration reference

Cadenza stores configuration in ~/.cadenza/config.toml. Manage it with cadenza config:

Key Type Description
wandb.entity string W&B team or username for imports
wandb.api-key string W&B API key for imports
defaults.project string Default project for all -p flags
sampling.p-explore float Exploration probability for sampling
sampling.p-exploit float Exploitation probability for sampling
evodb.max-dimensions int Max behavioral dimensions during import
evodb.elite-archive-size int Elite archive size during import
evodb.max-islands int Max islands created during import

Concepts

Cadenza organizes ML experiment data using evolutionary algorithm concepts:

  • Genotype — Defines the search space and behavioral dimensions for a project
  • Islands — Subpopulations of experiments, each exploring a different region of the search space
  • Phenotypes/Experiments — Individual ML runs with their metrics and behavioral coordinates
  • Elites — The top-performing experiments across all islands (the elite archive)
  • Sample — A compact JSON snapshot of the evolutionary state, designed for LLM consumption

License

Apache 2.0 — see LICENSE for details.

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

cadenza_cli-0.3.0.tar.gz (40.2 kB view details)

Uploaded Source

Built Distribution

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

cadenza_cli-0.3.0-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file cadenza_cli-0.3.0.tar.gz.

File metadata

  • Download URL: cadenza_cli-0.3.0.tar.gz
  • Upload date:
  • Size: 40.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.14

File hashes

Hashes for cadenza_cli-0.3.0.tar.gz
Algorithm Hash digest
SHA256 eff6115870f3c8ed09d41e24e9dd89430a0c5841c7ab7931da0d02b8c000cc87
MD5 9c49dff56b870e09f0ecd4f9845cf5d2
BLAKE2b-256 d184f0dba5ca7ea25e798fbcd82730fdfb510ff563b7f13a8cd2d7fcb74ba92f

See more details on using hashes here.

File details

Details for the file cadenza_cli-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cadenza_cli-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 265ae8de53e1a381e1710d4353316785a4d7a5f9b14fc7d5b78596ca67e69ded
MD5 14f4cd6e9aff3505b9c4ca7cd539cc82
BLAKE2b-256 c1c0a2838fa71ca669a3198b61952628d89ce952e9cf91a3c96ee8b861377109

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