RE

Runs heavy computational tasks on remote clusters instead of locally.

Install

mkdir -p .claude/skills/remote-compute && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/17383" && unzip -o skill.zip -d .claude/skills/remote-compute && rm skill.zip

Installs to .claude/skills/remote-compute

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Run arbitrary scripts on KBase compute nodes via the CDM Task Service (CTS). Use when the user needs to move compute off their notebook or local machine — e.g., running bioinformatics tools, heavy data processing, or anything that benefits from dedicated CPU/memory on a remote node.
283 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Advanced

Key capabilities

  • Run arbitrary scripts on KBase compute nodes
  • Dispatch containerized jobs using pre-built tool images
  • Dispatch containerized jobs using generic Ubuntu scripts
  • Stage input files to MinIO
  • Monitor job status and retrieve results

How it works

The skill runs containerized jobs on remote KBase compute nodes via the CDM Task Service (CTS), supporting both pre-built tool images and custom Ubuntu scripts, with input files staged in MinIO.

Inputs & outputs

You give it
A script or command for a bioinformatics tool, along with input files staged in MinIO
You get back
Results from the executed script or tool on KBase compute nodes

When to use remote-compute

  • Run heavy bioinformatics tool
  • Batch process data
  • Execute long-running job

About this skill

Remote Compute Skill

Run containerized jobs on KBase compute nodes via the CDM Task Service (CTS).

Overview

CTS runs containerized jobs on remote compute clusters. Two execution paths are available:

PathWhen to use
Pre-built tool imageThe tool you need is already in the registry (CheckM2, Bakta, GTDB-Tk, etc.) — just pass args
Generic ubuntu scriptTool not in registry, or you need custom logic — write a bash script, install deps at runtime

Always discover the live image registry first before deciding which path to take:

# JupyterHub
tscli = get_task_service_client()
tscli.get_images()        # returns list of registered images
# curl (any environment)
AUTH_TOKEN=$(grep "KBASE_AUTH_TOKEN" .env | cut -d'"' -f2)
curl -s -H "Authorization: Bearer $AUTH_TOKEN" \
  https://berdl.kbase.us/apis/cts/images | python3 -m json.tool

The registry grows over time — always check live rather than relying on any static list in this document.

When to use remote compute vs JupyterHub:

  • JupyterHub: Interactive analysis, Spark SQL queries, exploratory work
  • Remote compute: Batch processing, CPU/memory-intensive tools (CheckM2, Bakta, GTDB-Tk), long-running jobs, anything that would block your notebook

Preconditions

  1. KBASE_AUTH_TOKEN set in environment or .env
  2. MinIO client (mc) installed — see berdl-minio skill for installation
  3. Proxy running (when off-cluster) — MinIO is not directly reachable from external networks. See the berdl-query skill's references/proxy-setup.md. The CTS API itself (https://berdl.kbase.us/apis/cts) does NOT require a proxy — only MinIO data staging does.
  4. CTS access and your S3 paths — run whoami before staging any files. It confirms your role and tells you the exact S3 path prefixes you are allowed to use for input_files and output_dir. Every example in this skill uses cts/io/<username>/... as a placeholder — whoami tells you what to substitute.
# JupyterHub
tscli = get_task_service_client()
tscli.whoami()
# Returns, e.g.:
# {
#   "user": "mcashman",                       ← your username; use this in place of <username>
#   "roles": ["cts_user"],                    ← confirms CTS access; must include "cts_user" or "full_admin"
#   "allowed_paths": [
#     {"path": "cts/io/mcashman", "perm": "write"},   ← you can read and write here
#     {"path": "cts/io/mcashman", "perm": "read"}
#   ]
# }
# The "path" values are the S3 prefixes you use for input_files and output_dir.
# Example: input_files=["cts/io/mcashman/input/genome.fna.gz"]
#          output_dir="cts/io/mcashman/output/bakta_run"
# curl equivalent
curl -s -H "Authorization: Bearer $AUTH_TOKEN" \
  https://berdl.kbase.us/apis/cts/whoami | python3 -m json.tool

If roles is empty or does not include cts_user or full_admin, you do not have CTS access — ask a CTS admin to grant the cts_user role.


Two Interfaces

Python client — JupyterHub only

tscli = get_task_service_client()    # CTS client
minio = get_minio_client()           # MinIO client for file staging

REST API (curl) — any environment

All endpoints at https://berdl.kbase.us/apis/cts. Auth via Bearer token:

AUTH_TOKEN=$(grep "KBASE_AUTH_TOKEN" .env | cut -d'"' -f2)

Stage Input Files to MinIO

This step is required for both Path A and Path B. CTS does not read files from your local machine or from the BERDL Lakehouse directly — all input files must be pre-uploaded to MinIO before job submission. Every file must carry a CRC64NVME checksum or the submission will be rejected.

Find your MinIO path prefix

Run tscli.whoami() (see Preconditions) to find your allowed_paths. Your input and output directories should be nested under the writable path — typically cts/io/<username>/.

Upload with the MinIO CLI (mc)

# Off-cluster only: set proxy so mc can reach MinIO
export https_proxy=http://127.0.0.1:8123
export no_proxy=localhost,127.0.0.1

# Upload a single file with a CRC64NVME checksum
mc cp --checksum crc64nvme genome.fna.gz berdl-minio/cts/io/<username>/input/

# Upload a directory of files (e.g. all .fna.gz in a folder)
mc cp --checksum crc64nvme --recursive ./input_genomes/ berdl-minio/cts/io/<username>/input/

# Verify what was staged
mc ls berdl-minio/cts/io/<username>/input/

The berdl-minio alias must be configured. See the berdl-minio skill for setup instructions.

Upload from Python (JupyterHub)

minio = get_minio_client()
import os

local_file = "genome.fna.gz"
minio_path = f"io/<username>/input/{local_file}"  # path within the "cts" bucket

# Upload a file — the MinIO client handles checksums automatically on JupyterHub
minio.fput_object("cts", minio_path, local_file)
print(f"Staged: cts/{minio_path}")

# List staged files to confirm
for obj in minio.list_objects("cts", prefix="io/<username>/input/", recursive=True):
    print(obj.object_name, obj.size)

Build your input_files list

After staging, construct the input_files list for submit_job from the staged paths:

# Option 1: list them explicitly
input_files = [
    "cts/io/<username>/input/genome1.fna.gz",
    "cts/io/<username>/input/genome2.fna.gz",
]

# Option 2: discover from MinIO (useful for large batches)
minio = get_minio_client()
objs = list(minio.list_objects("cts", prefix="io/<username>/input/", recursive=True))
input_files = [f"cts/{o.object_name}" for o in objs]
print(f"{len(input_files)} files staged and ready")

Path A: Pre-built Tool Images

Pre-built images have the tool already installed and set as the container entrypoint. You do not write a bash script — you pass arguments directly to the tool. Some images include large reference databases (refdata) that CTS mounts automatically.

What is refdata?

Some tools require large reference databases (e.g., CheckM2's marker gene sets, GTDB-Tk's genome sketches, Bakta's annotation database). These are pre-staged by the CTS admins and mounted read-only into the container at a fixed path. The image registration records which refdata bundle it needs and where to mount it (default_refdata_mount_point).

You do not pass a refdata_id to submit_job — it is determined by the image. You only need to know the mount path so you can reference it in your args if needed (e.g., --db /ref_data). Most images bake the path into the tool config or environment variables so you do not need to reference it at all — see the per-tool notes below.

If you want to override the default mount point, pass refdata_mount_point="/your/path" inside the params via the Python client's submit_job call. This is rarely needed.

General pattern — pre-built image

tscli = get_task_service_client()

job = tscli.submit_job(
    "<image>:<tag>",          # full image name from the registry
    input_files,              # list of MinIO paths: ["cts/io/<user>/input/file1.fna.gz", ...]
    "cts/io/<user>/output/run_name",  # MinIO output directory (bucket/prefix)
    cluster="kbase",          # compute site — "kbase" for on-prem KBase hardware
    output_mount_point="/out", # path inside the container where the tool must write output;
                               # CTS copies everything under this path to S3 after the job finishes
    args=[...],               # arguments appended after the image entrypoint command
    num_containers=1,         # how many parallel containers to run (see per-tool guidance)
    cpus=4,                   # CPU cores per container
    memory="8GB",             # RAM per container
    runtime="PT30M",          # ISO 8601 duration: PT5M=5min, PT1H=1hour, PT2H30M=2.5hours
)

print(f"Job ID: {job.id}")    # save this — needed to check status or retrieve results later

Available pre-built images

ToolImage name patternRefdataOne container per file?Special notes
CheckM2cdm_checkm2Yes (/ref_data)No — batchAuto-imports to Spark table; use declobber=True
MMseqs2cdm_mmseqs2NoNo — all-at-once for clusteringSubcommand is first arg
KofamScancdm_kofamscanYes (/ref_data/profiles, /ref_data/ko_list)No — batchMust pass profile/ko_list paths explicitly
PSORTbcdm_psortbNoYesnum_containers=len(input_files)
Baktacdm_baktaYes (/ref_data/db)Yes--force REQUIRED; BAKTA_DB auto-set
Bakta proteinscdm_bakta_proteinsYes (/ref_data/db)Yes--force REQUIRED; BAKTA_DB auto-set
GTDB-Tkcdm_gtdbtkYes (/ref_data/release232)No — always 1memory="128GB" minimum; num_containers=1 always
Skanicdm_skaniNoNoSubcommand is first arg
Skani GTDBcdm_skani_gtdbYes (/ref_data/release232/skani/database/)No — batchMust pass -d path explicitly
IQ-TREE 2cdm_iqtreeNoNo — 1 per alignment--prefix /out/tree; --redo recommended

Full per-tool examples, resource guidance, and special notes are in individual reference files under references/. Each tool has its own file named after the image pattern without the cdm_ prefix:

ToolReference file
CheckM2references/checkm2.md
MMseqs2references/mmseqs2.md
KofamScanreferences/kofamscan.md
PSORTbreferences/psortb.md
Baktareferences/bakta.md
Bakta proteinsreferences/bakta_proteins.md
GTDB-Tkreferences/gtdbtk.md
Skanireferences/skani.md
Skani GTDBreferences/skani_gtdb.md
IQ-TREE 2references/iqtree.md

Claude should Read only the specific tool's reference file after identifying the user's tool from get_images().


Path B: Generic Ubuntu Script

Use this path wh


Content truncated.

When not to use it

  • When performing interactive analysis or exploratory work on JupyterHub
  • When the `KBASE_AUTH_TOKEN` is not set
  • When the MinIO client (`mc`) is not installed

Prerequisites

KBASE_AUTH_TOKEN set in environment or .envMinIO client (mc) installedProxy running (when off-cluster)CTS access and your S3 paths

Limitations

  • All input files must be pre-uploaded to MinIO before job submission
  • Every file must carry a CRC64NVME checksum
  • MinIO is not directly reachable from external networks without a proxy

How it compares

This skill offloads CPU/memory-intensive tasks to remote compute nodes, providing dedicated resources and batch processing capabilities, unlike running them locally on a notebook.

Compared to similar skills

remote-compute side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
remote-compute (this skill)019dCautionAdvanced
azure-functions104moReviewIntermediate
bouffalo-sdk14moReviewIntermediate
domain-iot16moNo flagsAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry