Install
openclaw skills install reveniumClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
MANDATORY budget check BEFORE EVERY OPERATION — read budget-status.json first, always, no exceptions. Enforces token spend limits, warns on threshold exceedance, halts autonomous agents on budget overrun.
openclaw skills install reveniumBefore you read ANY other part of this file, before you write ANY response, before you make ANY tool call:
~/.openclaw/skills/revenium/budget-status.jsonhalted fieldIf halted is true:
YOUR ENTIRE RESPONSE MUST BE EXACTLY THIS AND NOTHING ELSE:
Budget enforcement halt is active. $[currentValue] of $[threshold] used ([percentUsed]%). To resume:
bash ~/.openclaw/skills/revenium/scripts/clear-halt.sh
If halted is false, proceed to the Budget Check Procedure below.
This is not optional. This is not guidance. If you output ANYTHING other than the halt message when halted: true, you are violating this skill's requirements.
MANDATORY — execute before EVERY response, EVERY tool call, EVERY operation. This applies to ALL tasks — not just Revenium-related ones. Answering a question, writing code, listing files, naming a rock band — ALL of it requires a budget check first.
The budget status is maintained by a background cron job that checks Revenium every minute and writes the result to ~/.openclaw/skills/revenium/budget-status.json. You read this local file — do NOT call the Revenium API directly.
Read budget status. Read the file ~/.openclaw/skills/revenium/budget-status.json. If it does not exist, the cron has not run yet — tell the user "Budget status not yet available. The metering cron may not be installed. Run bash ~/.openclaw/skills/revenium/scripts/install-cron.sh to set it up." Then proceed with the operation.
Parse the status. Extract these fields from the JSON:
currentValue — current spend in the budget periodthreshold — the budget limitpercentUsed — percentage of budget consumedexceeded — boolean, whether the budget has been exceededhalted — boolean, whether the agent has been halted by budget enforcementlastChecked — when the cron last updated this fileEvaluate the result:
If halted is true: Follow the HALT CHECK instructions above — output ONLY the halt message and stop.
If exceeded is false (budget OK): Proceed silently. Do NOT mention the budget to the user.
If exceeded is true (budget blown): Read autonomousMode from ~/.openclaw/skills/revenium/config.json.
If autonomousMode is false or absent (default — interactive mode):
You MUST STOP. Do NOT execute any operation, do NOT generate a response. Tell the user:
"Your Revenium budget has been exceeded. You have spent $CURRENT_VALUE of your $THRESHOLD budget (PERCENT_USED%). Last checked: LAST_CHECKED. Would you like to continue anyway?"
Replace the values with the actual numbers from the file.
/revenium to adjust your budget."If autonomousMode is true and halted is false but exceeded is true: The user has explicitly cleared the halt — this is an approval to proceed. Continue with the operation.
All file paths in this skill use ~/.openclaw/skills/revenium/ as the skill directory. When using file tools (read, write, edit), pass paths with ~/ — the tool resolves ~ to $HOME automatically. When running shell commands via exec/bash, use the explicit $HOME/.openclaw/skills/revenium/ form so the shell expands $HOME correctly.
At the start of any operation, check: does ~/.openclaw/skills/revenium/config.json exist AND contain a non-empty alertId field?
alertId is absent/empty — e.g., post-install seeded a partial config with only autonomousMode and _comment): you MUST run the Setup Flow below before proceeding. Do NOT execute any operations until setup is complete.Follow these steps in order. If any step fails, STOP. Do NOT write an alertId into config.json. Do NOT proceed with operations.
Check for existing API key. Run:
revenium config show
The sandbox reads credentials from a read-only bind mount of the host's ~/.config/revenium/ (set up by post-install.sh with dangerouslyAllowExternalBindSources: true), so any value already set on the host is visible live inside the agent session. If revenium config show reports a non-empty API Key, skip to step 3.
If no API key is configured: credentials must be set on the HOST. The bind mount into the sandbox is read-only, so revenium config set ... run from inside the agent session will fail to persist — the CLI cannot write back through the bind.
Collect the following from the user:
Then instruct the user to run these commands in their HOST terminal (outside the agent session), one at a time:
revenium config set key API_KEY
revenium config set team-id TEAM_ID
revenium config set tenant-id TENANT_ID
revenium config set owner-id USER_ID
Because the sandbox sees host changes through the bind mount live, no post-install re-run or gateway restart is required — pause the setup flow while the user runs the commands on the host, then re-run revenium config show inside the agent session to confirm the API key is now visible. If it is still empty, STOP and tell the user to run /revenium when ready. Do NOT write an alertId into config.json.
Prompt for organization name (optional). Ask the user: "What is your organization name for Revenium reporting? (optional — press Enter to skip)" If the user provides a value, call it ORG_NAME. If they skip, leave it empty.
Prompt for budget amount. Ask the user: "What budget threshold would you like to set? (numeric amount, e.g., 5.00)" Wait for the user's response. Call this value AMOUNT.
Prompt for budget period. Ask the user: "Which budget period would you like?" and present these four options:
Wait for the user's selection. Call this value PERIOD.
Prompt for autonomous mode. First, read any pre-seeded value from ~/.openclaw/skills/revenium/config.json (post-install.sh writes a seed with autonomousMode and a _comment field before any agent session runs). If config.json exists and has an autonomousMode field, use that value as the DEFAULT for the prompt below — show it in the prompt, e.g. "(yes/no, default: yes — from post-install)". Otherwise the default is no.
Ask the user: "Will this agent run autonomously (without a user present)? If yes, budget exceedance will halt all operations and notify you. (yes/no, default: DEFAULT_VALUE)"
AUTONOMOUS_MODE to true. Then:
slack, discord, telegram, whatsapp, signal, googlechat, msteams, mattermost, imessageNOTIFY_CHANNEL.user:<id> or channel:<id>user:<id> or channel:<id>@username+E.164 or group:<id>NOTIFY_TARGET.AUTONOMOUS_MODE to false. Skip notification channel prompts.Generate the alert name. Set ALERT_NAME to "OpenClaw {Period} Budget" where {Period} is the title-cased version of the selected period:
Do NOT ask the user for a name. This is automatic.
Delete any existing budget alerts. Before creating a new alert, you MUST check for and remove pre-existing OpenClaw budget alerts to prevent duplicates. Run:
revenium alerts budget list --json
Parse the JSON output and look for any alerts whose name starts with "OpenClaw ". For EACH matching alert, delete it:
revenium alerts budget delete EXISTING_ALERT_ID --yes
If the list command fails or returns no results, that is fine — proceed to the next step. If a delete fails, log a warning but continue.
Create the budget alert. Run:
revenium alerts budget create --name "ALERT_NAME" --threshold AMOUNT --period PERIOD --json
If the exit code is non-zero: tell the user what went wrong, tell them to run /revenium when ready, and STOP. Do NOT write config.json.
"id" field. This is a short alphanumeric string (e.g., "75BjG5"). Call this value ALERT_ID.CRITICAL: Do NOT use anomalyId from budget get responses — that is an integer and will cause HTTP 400 errors when passed to budget get. The correct value is the string "id" from the budget create response.
To extract reliably, pipe the create output through:
python3 -c "import json,sys; d=json.load(sys.stdin); print(d['id'])"
_comment field seeded by post-install.sh (and any other unknown keys) is preserved, then merge in the values collected above:python3 -c "
import json, os
path = os.path.expanduser('~/.openclaw/skills/revenium/config.json')
try:
with open(path) as f:
config = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
config = {}
config['alertId'] = 'ALERT_ID'
org = 'ORG_NAME'
if org:
config['organizationName'] = org
autonomous = AUTONOMOUS_MODE # True or False
config['autonomousMode'] = autonomous
if autonomous:
config['notifyChannel'] = 'NOTIFY_CHANNEL'
config['notifyTarget'] = 'NOTIFY_TARGET'
else:
config.pop('notifyChannel', None)
config.pop('notifyTarget', None)
with open(path, 'w') as f:
json.dump(config, f, indent=2)
f.write('\n')
"
Replace ALERT_ID, ORG_NAME, AUTONOMOUS_MODE, NOTIFY_CHANNEL, and NOTIFY_TARGET with the actual values. If the user skipped the organization name, omit it. If autonomous mode is false, notifyChannel/notifyTarget are stripped. Any _comment or other pre-existing fields are carried through untouched.
bash ~/.openclaw/skills/revenium/scripts/install-cron.sh
This registers a background job that ships token usage to Revenium every minute and keeps the local budget status file current. If the cron is already installed, this is a no-op.
On ANY failure during the Setup Flow: report what went wrong, tell the user to run /revenium when they are ready to try again, and STOP. Do NOT retry. Do NOT write an alertId into config.json. The absence of an alertId field in config.json is the signal that setup has not completed — a pre-seeded config.json with only autonomousMode and _comment still means "setup not complete".
Reminder: After setup completes, check budget-status.json before your next response.
/revenium CommandWhen the user invokes /revenium:
alertId)Show budget status. Read alertId from ~/.openclaw/skills/revenium/config.json, then run:
revenium alerts budget get ALERT_ID --json
Display the current spend versus threshold to the user (current value, threshold, percent used, remaining).
Show autonomous mode status. Read ~/.openclaw/skills/revenium/config.json and display:
~/.openclaw/skills/revenium/budget-status.json and check the halted field. Display "ACTIVE (since HALTED_AT)" if halted is true, or "inactive" if halted is false or absent.bash ~/.openclaw/skills/revenium/scripts/clear-halt.sh"Offer actions. Ask the user: "Would you like to reset the budget (zero out current spend), reconfigure (change threshold/period), or done?" If the user declines or says done, STOP — no further action.
alertId)Run the Setup Flow from the Setup section above. The flow will honor any pre-seeded autonomousMode / _comment fields when writing the final config.
When the user requests reconfiguration:
Read existing alert ID. Read alertId from ~/.openclaw/skills/revenium/config.json. Call this value OLD_ALERT_ID.
Delete the old alert. Run:
revenium alerts budget delete OLD_ALERT_ID --yes
If this fails (e.g., alert already deleted or not found): log a warning but continue. The goal is to prevent orphaned alerts.
Clear the alertId field. Do NOT delete config.json — that would drop the operator-facing _comment and any pre-seeded autonomousMode default. Instead, strip just the alert-specific fields so the Setup Flow sees "alertId missing → setup incomplete":
python3 -c "
import json, os
path = os.path.expanduser('~/.openclaw/skills/revenium/config.json')
try:
with open(path) as f:
config = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
config = {}
for k in ('alertId', 'organizationName', 'notifyChannel', 'notifyTarget'):
config.pop(k, None)
with open(path, 'w') as f:
json.dump(config, f, indent=2)
f.write('\n')
"
Run the full Setup Flow from the Setup section above. This collects fresh API key, budget amount, period, and creates a new alert from scratch. The Setup Flow's step 12 merges the new values into the preserved config, keeping _comment and using the prior autonomousMode as the prompt default.
Reminder: After reconfiguration completes, check budget-status.json before your next response.
When the user requests a budget reset (zero out current spend without changing settings):
Read existing config. Read alertId, organizationName, autonomousMode, notifyChannel, and notifyTarget from ~/.openclaw/skills/revenium/config.json. Call the alert ID OLD_ALERT_ID.
Get current alert settings. Run:
revenium alerts budget get OLD_ALERT_ID --json
Extract name, threshold, and periodDuration from the response.
Delete the old alert. Run:
revenium alerts budget delete OLD_ALERT_ID --yes
If this fails: warn the user but continue.
Create a new alert with the same settings. Run:
revenium alerts budget create --name "ALERT_NAME" --threshold THRESHOLD --period PERIOD --json
Use the name, threshold, and periodDuration values from step 2.
Extract the new alert ID. From the create response, extract the "id" field. Call this NEW_ALERT_ID.
Update config.json. Replace alertId with NEW_ALERT_ID, preserving all other fields:
python3 -c "
import json
with open('$HOME/.openclaw/skills/revenium/config.json', 'r') as f:
config = json.load(f)
config['alertId'] = 'NEW_ALERT_ID'
with open('$HOME/.openclaw/skills/revenium/config.json', 'w') as f:
json.dump(config, f, indent=2)
f.write('\n')
"
Reset local budget status. Write a fresh budget-status.json with zeroed values and exceeded: false, halted: false.
Confirm to the user. Tell the user: "Budget reset. Spend counter is now $0.00 of $THRESHOLD (PERIOD). Alert ID: NEW_ALERT_ID."
Reminder: After budget reset completes, check budget-status.json before your next response.
If revenium is not found on PATH:
revenium CLI is not installed or not on your PATH. Install it from https://docs.revenium.io/for-ai-agents and ensure it is available in your shell."If revenium config show reports no API key or an invalid key:
~/.config/revenium/, so fix them on the host: run revenium config set key <KEY> (plus team-id, tenant-id, owner-id as needed) in your HOST terminal. The change is picked up live — no post-install re-run or gateway restart needed. Then run /revenium to resume setup."If any revenium CLI command fails due to network issues:
Reminder: Check budget-status.json before your next response.