skills/akash/SKILL.md
Build, validate, and deploy workloads to the Akash Network — the decentralized cloud marketplace. Covers SDL syntax & examples, choosing a deployment method (Console API, CLI, TypeScript/Go SDKs), authentication (API key, JWT, self-custody wallets), deployment lifecycle, fetching logs/events via the provider proxy, and fee grants/authz. Also covers AkashML — the managed inference surface for calling open-source LLMs on Akash compute via OpenAI/Anthropic-compatible APIs. Use for "deploy to Akash", "Akash SDL", "Akash Console API", "Akash CLI deploy", "Akash API key", "x-api-key", "Akash deploy logs", "stream Akash logs", "integrate Akash into my app", "@akashnetwork/chain-sdk", "@akashnetwork", "AkashML", "managed inference on Akash", "call an LLM on Akash", "playground.akashml.com", "api.akashml.com".
npx skillsauth add akash-network/akash-skill akashInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill covers everything needed to deploy and operate a workload on the Akash Network: writing SDL, picking a deployment method, authenticating, creating the deployment, accepting bids, and reading logs/events from the live deployment.
For running an Akash provider, use the akash-network:akash-provider skill. For running a full node or validator, use akash-network:akash-node.
NEVER use :latest or omit image tags. Always specify explicit version tags so deployments are reproducible.
# CORRECT
image: nginx:1.25.3
image: postgres:16
# WRONG
image: nginx:latest
image: nginx # implies :latest
Akash has two tokens — don't conflate them.
uakt, 1 AKT = 1,000,000 uakt) is the chain token. Used for gas fees (--gas-prices, minimum-gas-prices, SDK WithGasPrices), staking (self-delegation, validator bonds, slashing), and validator rewards. Self-custody wallets hold AKT.uact, 1 ACT = 1,000,000 uact) is the deployment-payment token. Used for SDL pricing (denom: uact), deployment deposits and escrow, bid prices (the rate the provider offers), and lease payments. Note: the provider-side bid deposit (anti-spam collateral on MsgCreateBid, the bidMinDeposit config) is uakt, not uact — providers operate exclusively in AKT for chain operations and earn ACT from leases. Deployers don't deal with this directly.For self-custody deployers: you must mint ACT by burning AKT before you can deposit to a deployment. Acquire AKT first (exchange / faucet for testnet), then convert a portion to ACT via the burn/mint mechanism. Console API users skip this entirely — Console funds the managed wallet with ACT directly (Stripe → USD → ACT server-side).
When you see --gas-prices 0.025uakt, that's correct (gas is paid in AKT). When you see denom: uact, amount: 1000 in an SDL, that's also correct (lease pricing is in ACT). Both denoms coexist in normal commands.
This is the most important decision in this skill — and the one most easily gotten wrong.
Default behavior: recommend + proceed, don't interrogate. If the user gave any reasonable cue (see the cue table below), commit to that path silently and start producing code. If you must ask, ask one short question, give a recommendation, and offer to switch — don't build a multi-step decision tree before the user has seen any commands. The goal is to get them running code fast, not to make them answer a quiz.
Only stop and ask when the prompt is genuinely silent about everything (no language signal, no wallet signal, no CI signal). Even then, recommend + offer to switch rather than presenting an open menu of equals.
Once a path is chosen, stay on it for the rest of the conversation. Do not silently switch. If the user explicitly asks to switch later, do so cleanly.
There are four deployment paths (you host the workload) plus one consumption path (you call a hosted model):
| # | Method | Wallet model | Auth | When to use |
|---|---|---|---|---|
| 1 | Console API | Managed (Console account owns the wallet) | x-api-key header | CI/CD, server-to-server, any backend that wants HTTP + an API key. No private-key handling. |
| 2 | Akash CLI | Self-custody (you hold the keys) | Local key + signature | Shell scripting, manual workflows, full control. |
| 3 | TypeScript SDK | Self-custody (browser wallet, hardware, or local key) | SDK signs locally | dApps, Node.js services, anywhere you want JS/TS code to deploy. |
| 4 | Go SDK | Self-custody | SDK signs locally | Backend Go services, custom tooling. |
| 5 | AkashML (consumption, not deployment) | Managed (AkashML account, USD credits) | Authorization: Bearer | You want to call an LLM, not host one. OpenAI/Anthropic-compatible REST. No SDL, no wallet, no ACT. |
Rows 1–4 are paths to host your own workload on Akash. Row 5 is the answer when the user wants to consume inference instead — different problem, different surface. See @rules/deploy/akashml/overview.md for the full split.
A Console account is a wallet. When you sign up on console.akash.network and generate an API key, that API key authenticates as your Console account — and your account has a managed wallet underneath it. Deployments spend from that wallet. There is no separate "Console API + bring your own wallet" mode.
If a user has a self-custody wallet (Keplr or Ledger) and wants to deploy from that wallet, they need the CLI or an SDK. The Console API will not sign with an external wallet.
console.akash.network — managed wallet. This is what the Console API in this skill operates on.console-air.akash.network; users clone the repo and run it locally or on their own infrastructure. Out of scope for this skill (it is a UI, not an API). If a user wants a UI with self-custody, point them at the repo and stop; programmatic self-custody users go CLI or SDK.If you see any of these signals, commit to the matching path silently and start producing code. Don't ask for confirmation; the cue is the confirmation.
| If the user mentions… | Commit to… |
|---|---|
| "I have an API key", "$AKASH_API_KEY", "x-api-key", "curl", "CI/CD", "GitHub Actions", "backend", "server-to-server", "deploy from CI", "automate" | Console API |
| "Keplr", "Ledger", "hardware wallet", "my wallet", "self-custody", "provider-services keys add", "my mnemonic" | CLI or SDK (ask only if they didn't also signal a language) |
| "React app", "Next.js", "akashjs" (legacy), "@akashnetwork/chain-sdk", "my dApp", "in the browser" | TypeScript SDK |
| "Go service", "golang", "cosmos-sdk Go", "my Go backend" | Go SDK |
| "AkashML", "akml-...", "managed inference", "call an LLM", "hosted LLM on Akash", "OpenAI-compatible", "Anthropic-compatible", "playground.akashml.com", "api.akashml.com", ANTHROPIC_BASE_URL pointing at AkashML | AkashML (consumption path) |
| "Console Air", "web UI for my Keplr wallet", "GUI" + "self-custody" | Console Air (out-of-scope; one-line point to repo, then stop) |
| "easiest", "simplest", "first time", "just want to try" + no wallet/keys signal | Console (UI or API — recommend the UI for a one-off, the API for a script) |
Ambiguity on LLMs — ask one short question. If the user says "run an LLM on Akash" without saying "my own" or "call", that cue is genuinely split between AkashML (call a hosted model) and self-deploy with GPU SDL (host the model yourself). One line: "Do you want to call a hosted LLM, or run your own instance?" — then commit. The two answers go to completely different files (AkashML vs rules/sdl/examples/gpu-workload.md).
Only ask when the prompt is genuinely empty of signals — no language hint, no wallet hint, no CI/automation hint. When you do ask, the question is one line: "Do you want this in a script (Console API) or a UI (Console for managed wallet, Console Air for self-custody)?" — then proceed with their answer.
A "first small deploy" with no other signals → just recommend Console UI and write the SDL; offer to switch to API/CLI in one line at the end. Do not make the user pick from a 4-row table before seeing any commands.
Once on the Console API path, pick the integration language from cues. Ask only as a last resort.
| Cue | Use |
|---|---|
| "curl", "bash", "shell", "GitHub Actions", "GitLab CI", any .sh reference, no app stack mentioned | curl + Bash |
| "Node", "Next.js", "Express", package.json, .ts/.js file, "my Node app" | TypeScript / Node fetch |
| "Python", requirements.txt, .py, "FastAPI", "Django", "Flask" | Python requests or httpx |
| "Go", go.mod, .go, "my Go service" | Go net/http |
| "Rust", Cargo.toml | Rust reqwest |
Default to curl + Bash when the language is unstated and the surrounding context is automation/CI (the most common case for API-key users). Don't ask unless you have a positive reason to believe the user wants a specific other runtime — and even then, write curl first and offer to translate. Curl is the universal lingua franca for HTTP and translates trivially to any language.
Skip the question entirely if:
"curl", "shell", "CI", or anything implying scripts — they want Bash.Only ask when there are zero signals — e.g. "deploy to Akash via the API" with no other context. Then it's one line: "Want this as curl/Bash, Node, Python, or Go?" — and produce the response in their answer.
This is a separate gate from the deployment-method selection. Once both are chosen, stay on both for the rest of the conversation.
Two non-negotiable rules, applied silently:
$AKASH_API_KEY (Bash), process.env.AKASH_API_KEY (Node), os.environ["AKASH_API_KEY"] (Python), os.Getenv("AKASH_API_KEY") (Go).$AKASH_API_KEY in the response and add one sentence at the top: "I've used $AKASH_API_KEY in the code below — export your key as that env var before running."When to add extra guidance (only one of these — pick the smallest one that applies):
-e) and not baked in via ARG/ENV. One sentence..env file → one-line .gitignore reminder. Don't assume they need a tutorial.Stay silent on key handling when:
$AKASH_API_KEY or ${{ secrets.AKASH_API_KEY }} or similar — they've got it. Don't repeat the rules.A pitfall table at the end of a code response can mention "don't use Authorization: Bearer for the API key" since that's a real common error — but keep it to one row, not a discourse on secret management.
provider-services keys add, don't suggest mTLS certs (deprecated for Console API — see rules/deploy/cli/mtls-legacy.md), don't suggest provider-services query market bid list — every read is an HTTP call with x-api-key in whatever language the user picked./v1/deployments HTTP calls. Don't suggest API keys. Stay on provider-services tx ... / provider-services query ....uact/uakt/leases/bids. The user is calling a hosted inference API, not deploying. Stay on Authorization: Bearer $AKASHML_API_KEY and https://api.akashml.com/{v1,anthropic} calls. If they later say "actually I want to host my own", then switch cleanly to one of the four deployment paths.
GET https://api.akashml.com/v1/models — pricing (per-million tokens), context_length, supported_features, supported_sampling_parameters, max_output_length, quantizationGET https://api.akashml.com/anthropic/v1/models — Anthropic-shape list (returns IDs aliased with --)If the user asks to switch ("can we do this via the API instead?"), acknowledge the switch, and from that point on apply the new path's rules.
Every SDL has four required sections (plus optional endpoints for IP leases):
version: "2.0" # or "2.1" for IP endpoints
services: # Container definitions
profiles: # Compute resources & placement
deployment: # Service-to-profile mapping
version: "2.0"
services:
web:
image: nginx:1.25.3
expose:
- port: 80
as: 80
to:
- global: true
profiles:
compute:
web:
resources:
cpu:
units: 0.5
memory:
size: 512Mi
storage:
size: 1Gi
placement:
dcloud:
pricing:
web:
denom: uact
amount: 1000
deployment:
web:
dcloud:
profile: web
count: 1
overview.md — base URL, auth, response shapeauthentication.md — API key (x-api-key), JWT minting, API Keys CRUDdeployment-endpoints.md — full curated endpoint referenceapi-key-quickstart.md — linear walkthrough from "I have an API key" to a running deploymentaccount-and-funding.md — Console account model, programmatic balance reads, per-deployment auto-top-up (bootstrap + Stripe funding + arbitrary tx signing are UI-only)operations.md — JWT + provider proxy + logs/events/status/shellmtls-legacy.md — Legacy mTLS auth for CLI/SDK direct provider calls (deprecated for Console API)overview.md — base URLs, when to use AkashML vs self-deploy GPU, billing differencesauthentication.md — akml-... keys, Authorization: Bearer, env-var rulesapi-reference.md — OpenAI + Anthropic surfaces with curl + SDK examplesquickstart.md — Linear walkthrough from signup to first inference callaccount-and-billing.md — USD credits (off-chain, distinct from uact), per-key RPM/TPM limitsclaude-code-integration.md — Point Claude Code's Anthropic client at AkashML via ANTHROPIC_BASE_URLservices:
app:
env:
- "DATABASE_URL=postgres://..."
- "NODE_ENV=production"
profiles:
compute:
app:
resources:
storage:
- size: 10Gi
attributes:
persistent: true
class: beta2
profiles:
compute:
ml:
resources:
gpu:
units: 1
attributes:
vendor:
nvidia:
- model: a100
amount: 1000), deployment deposits, and lease payments. uakt is only accepted via a rare burn-mint (BME) fallback, not a normal alternative.testing
Set up and operate an Akash Network provider — the supply side of the decentralized cloud. Covers Kubernetes prerequisites, provider installation, attributes and pricing configuration, bid engine tuning, monitoring, and troubleshooting. Use for "run an Akash provider", "set up Akash provider", "Akash provider Kubernetes", "Akash provider attributes", "Akash provider pricing", "Akash provider bid engine", "Akash provider not getting bids", "Akash provider audit", "provider lease monitoring".
tools
Run an Akash Network full node or validator. Covers hardware and network requirements, full-node installation, state sync, becoming a validator, validator operations, slashing avoidance, key management (consensus key + operator key), monitoring, and sentry node patterns. Use for "Akash validator", "Akash full node", "Akash state sync", "Akash validator setup", "Akash sentry node", "Akash slashing", "Akash consensus key", "Akash node upgrade".
tools
DEPRECATED — this standalone skill has been split into three skills and repackaged as the `akash-network` Claude Code plugin. Install the plugin and uninstall this standalone skill. See the repo README for migration instructions.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.