Tutorials
Cloud Labs

Cloud Labs Tutorial

Litmus integrates with automated cloud laboratories for hands-off experiment execution. This tutorial covers submitting experiments to cloud labs like Enko Cloud Lab (ECL) and Strateos.

What Are Cloud Labs?

Cloud labs are automated facilities where robotic systems execute experiments. Benefits include:

  • Consistency — Robotic precision reduces variability
  • Speed — 24/7 operation with no scheduling delays
  • Scalability — Run many experiments in parallel
  • Documentation — Automatic logging of all steps

Supported Providers

ProviderProtocol FormatBest For
Enko Cloud Lab (ECL)SLLCell-based assays, qPCR
StrateosAutoprotocolHigh-throughput screening

Checking Provider Capabilities

List Providers

curl https://api.litmus.science/cloud-labs/providers \
  -H "Authorization: Bearer YOUR_TOKEN"

Get Provider Details

curl https://api.litmus.science/cloud-labs/providers/ecl \
  -H "Authorization: Bearer YOUR_TOKEN"

Response:

{
  "id": "ecl",
  "name": "Enko Cloud Lab",
  "supported_experiment_types": [
    "CELL_VIABILITY_IC50",
    "MIC_MBC_ASSAY",
    "QPCR_EXPRESSION"
  ],
  "capabilities": {
    "cell_lines": ["HeLa", "HEK293", "A549"],
    "plate_formats": ["96-well", "384-well"]
  },
  "turnaround_days": {"min": 3, "max": 7}
}

The Translation Process

Cloud labs require experiments in specific protocol formats. Litmus handles translation automatically:

Your Experiment → Interpretation → Translation → Cloud Lab Protocol

Step 1: Validate Compatibility

Before translating, check if your experiment is compatible:

curl -X POST https://api.litmus.science/cloud-labs/validate \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "intake": {
      "experiment_type": "MIC_MBC_ASSAY",
      "mic_mbc_assay": {
        "target_organisms": ["Escherichia coli"],
        "test_compounds": [
          {"name": "Compound X", "concentrations_ug_ml": [0.5, 1, 2, 4, 8, 16, 32]}
        ]
      }
    },
    "provider_id": "ecl"
  }'

Response:

{
  "valid": true,
  "provider_id": "ecl",
  "warnings": [],
  "estimated_cost_usd": 250,
  "estimated_turnaround_days": 5
}

Step 2: Translate to Protocol

curl -X POST https://api.litmus.science/cloud-labs/translate \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "intake": {...},
    "provider_id": "ecl"
  }'

Response (ECL/SLL format):

{
  "provider_id": "ecl",
  "protocol_format": "sll",
  "protocol": {
    "name": "MIC Assay - Compound X",
    "steps": [
      {"operation": "dispense", "source": "media", "destination": "plate", "volume": "100uL"},
      {"operation": "serial_dilution", "compound": "Compound X", "factor": 2, "steps": 7},
      {"operation": "inoculate", "organism": "E. coli", "density": "5e5 CFU/mL"},
      {"operation": "incubate", "temperature": "37C", "duration": "18h"},
      {"operation": "measure", "method": "absorbance_600nm"}
    ]
  },
  "estimated_cost_usd": 250
}

Step 3: Submit Experiment

Submit your experiment to Litmus first:

curl -X POST https://api.litmus.science/experiments \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "experiment_type": "MIC_MBC_ASSAY",
    "hypothesis": {
      "statement": "Compound X inhibits E. coli growth"
    },
    "compliance": {"bsl": "BSL1"},
    "mic_mbc_assay": {...}
  }'

Step 4: Trigger Cloud Lab Translation

curl -X POST https://api.litmus.science/cloud-labs/experiments/exp_abc123/translate \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "provider_id": "ecl"
  }'

This creates a CloudLabSubmission record tracking the execution.

Tracking Submissions

List Submissions

curl https://api.litmus.science/cloud-labs/submissions \
  -H "Authorization: Bearer YOUR_TOKEN"

Get Submission Status

curl https://api.litmus.science/cloud-labs/submissions/sub_abc123 \
  -H "Authorization: Bearer YOUR_TOKEN"

Submission Status Values

StatusDescription
pendingCreated, not yet sent
submittedSent to cloud lab
queuedWaiting in cloud lab queue
runningExperiment in progress
completedResults available
failedExecution error
cancelledCancelled by user

Protocol Formats

SLL (Symbolic Lab Language)

Used by Enko Cloud Lab. Declarative steps:

{
  "steps": [
    {"operation": "dispense", "source": "reservoir", "destination": "plate", "volume": "100uL"},
    {"operation": "incubate", "temperature": "37C", "duration": "24h"}
  ]
}

Autoprotocol

Used by Strateos. JSON with refs and instructions:

{
  "refs": {
    "plate": {"new": "96-pcr", "store": {"where": "cold_4"}}
  },
  "instructions": [
    {"op": "dispense", "object": "plate", "reagent": "media", "volume": "100:microliter"}
  ]
}

Complete Workflow Example

import requests
 
API_URL = "https://api.litmus.science"
headers = {"Authorization": "Bearer YOUR_TOKEN"}
 
# 1. Define experiment
intake = {
    "experiment_type": "MIC_MBC_ASSAY",
    "hypothesis": {
        "statement": "Compound X inhibits E. coli with MIC < 32 μg/mL"
    },
    "compliance": {"bsl": "BSL1"},
    "mic_mbc_assay": {
        "target_organisms": ["Escherichia coli"],
        "test_compounds": [
            {"name": "Compound X", "concentrations_ug_ml": [0.5, 1, 2, 4, 8, 16, 32]}
        ]
    }
}
 
# 2. Validate for cloud lab
validation = requests.post(
    f"{API_URL}/cloud-labs/validate",
    json={"intake": intake, "provider_id": "ecl"},
    headers=headers
).json()
 
if not validation["valid"]:
    print("Validation errors:", validation["errors"])
    exit(1)
 
print(f"Estimated cost: ${validation['estimated_cost_usd']}")
 
# 3. Submit experiment
experiment = requests.post(
    f"{API_URL}/experiments",
    json=intake,
    headers=headers
).json()
 
exp_id = experiment["experiment_id"]
print(f"Created experiment: {exp_id}")
 
# 4. Translate for cloud lab
submission = requests.post(
    f"{API_URL}/cloud-labs/experiments/{exp_id}/translate",
    json={"provider_id": "ecl"},
    headers=headers
).json()
 
print(f"Cloud lab submission: {submission['id']}")
print(f"Protocol format: {submission['protocol_format']}")

Handling Validation Errors

When validation fails:

{
  "valid": false,
  "errors": [
    {
      "field": "mic_mbc_assay.target_organisms",
      "message": "Organism 'Custom strain' not available at ECL"
    }
  ]
}

Common issues:

  • Unsupported organism/cell line — Check provider capabilities
  • Invalid concentrations — Must match available stock dilutions
  • Missing required fields — Fill in all protocol parameters

Best Practices

  1. Validate first — Always validate before submitting
  2. Check costs — Cloud labs may cost more than manual execution
  3. Review translations — Verify the protocol matches your intent
  4. Monitor submissions — Track status for timely results
  5. Use webhooks — Get notified when experiments complete

Next Steps