{"id":"e69cfb78-db5d-43c9-beef-fa9cac899d71","shortId":"ZJkXLe","kind":"skill","title":"keldron-agent","tagline":"GPU monitoring with risk intelligence. Local + cloud fleet monitoring, health tracking, proactive alerts, and AI-powered fleet analytics.","description":"# Keldron Agent — GPU Monitoring with Risk Intelligence\n\n## 1. Overview\n\nKeldron Agent is a vendor-neutral GPU monitoring agent that runs locally and exposes real-time telemetry and risk scores via a Prometheus endpoint. It supports Apple Silicon (M1–M5), NVIDIA consumer GPUs (RTX 3090/4090/5090), NVIDIA datacenter (H100/B200), AMD GPUs, and any Linux machine.\n\n**Dual mode:** Use the **local agent** on `localhost:9100` for fast, real-time, single-device queries (works offline). Use **Keldron Cloud** (`https://api.keldron.ai`) for fleet overview, historical telemetry, analytics, and proactive fleet monitoring when an API key is configured.\n\n**No sudo required on any platform** for the agent binary. On Linux, Docker may require `sudo` or membership in the `docker` group — see [Docker post-install](https://docs.docker.com/engine/install/linux-postinstall/) or rootless Docker if you hit permission errors.\n\nUse this skill when the user wants to:\n\n- Monitor GPU temperature, power, utilization, or memory\n- Get risk assessments for their GPU\n- Track power costs\n- Set up alerts or watch a fleet (via cloud polling)\n- Open the real dashboard (local or cloud)\n- Ask fleet, history, or analytics questions\n\n### Mode detection (run at the start of an interaction)\n\nField names **differ by endpoint** — see [Cloud API field names](#cloud-api-field-names-jq-reference) before writing `jq` filters.\n\n```bash\n# Check 1: Is the local agent running?\nLOCAL_AGENT=$(curl -sf localhost:9100/healthz 2>/dev/null | jq -r '.status' 2>/dev/null)\n\n# Check 2: Is cloud configured? (env → ~/.keldron/credentials from login → YAML)\nCLOUD_KEY=\"${KELDRON_CLOUD_API_KEY:-}\"\nCLOUD_ENDPOINT=\"\"\nif [ -z \"$CLOUD_KEY\" ] && [ -f ~/.keldron/credentials ] && command -v jq &>/dev/null; then\n  CLOUD_KEY=$(jq -r '.api_key // \"\"' ~/.keldron/credentials 2>/dev/null)\n  CLOUD_ENDPOINT=$(jq -r '.endpoint // \"\"' ~/.keldron/credentials 2>/dev/null)\nfi\nif [ -z \"$CLOUD_KEY\" ]; then\n  if command -v yq &>/dev/null; then\n    CLOUD_KEY=$(yq '.cloud.api_key // \"\"' ~/.config/keldron/keldron-agent.yaml 2>/dev/null)\n    CLOUD_ENDPOINT=$(yq '.cloud.endpoint // \"\"' ~/.config/keldron/keldron-agent.yaml 2>/dev/null)\n  else\n    CLOUD_KEY=$(grep -A3 'cloud:' ~/.config/keldron/keldron-agent.yaml 2>/dev/null \\\n      | grep 'api_key:' | awk '{print $2}' | tr -d \"\\\"'\" | xargs 2>/dev/null)\n    CLOUD_ENDPOINT=$(grep -A3 'cloud:' ~/.config/keldron/keldron-agent.yaml 2>/dev/null \\\n      | grep 'endpoint:' | awk '{print $2}' | tr -d \"\\\"'\" | xargs 2>/dev/null)\n  fi\nfi\nCLOUD_ENDPOINT=\"${CLOUD_ENDPOINT:-https://api.keldron.ai}\"\nif [ -z \"$CLOUD_KEY\" ]; then\n  echo \"No cloud API key found. Run keldron-agent login, set KELDRON_CLOUD_API_KEY (non-interactive login or streaming), or add cloud.api_key to ~/.config/keldron/keldron-agent.yaml. Sign up at https://app.keldron.ai\"\nfi\n\n# Check 3: Does cloud respond? (only if we have a key)\nCLOUD_OK=\"\"\nif [ -n \"$CLOUD_KEY\" ]; then\n  CLOUD_OK=$(curl -sf \"${CLOUD_ENDPOINT}/health\" 2>/dev/null | jq -r '.status' 2>/dev/null)\nfi\n```\n\n**Mode priority:**\n\n- **Both** (healthy local + cloud) → Cloud for fleet, history, analytics, proactive fleet loops; local for instantaneous single-device metrics.\n- **Cloud only** → Use cloud for everything that needs the API; mention local agent if they want lower-latency realtime on that machine.\n- **Local only** → Use `localhost:9100` for realtime; naturally mention cloud for history, fleet, and alerts: *\"That needs historical data — connect at app.keldron.ai.\"*\n- **Neither** → Run the [Auto-setup flow](#3-auto-setup-flow).\n\n---\n\n## 2. Installation\n\nPrefer a [GitHub release](https://github.com/keldron-ai/keldron-agent/releases) binary (`keldron-agent`). To build from source, clone the repo and run `make build` (requires Go and Node.js for the full dashboard).\n\n### Mac (Apple Silicon)\n\n```bash\ncurl -sfL https://github.com/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-darwin-arm64 -o keldron-agent\nchmod +x keldron-agent\n```\n\n### Linux (AMD64)\n\n```bash\ncurl -sfL https://github.com/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-linux-amd64 -o keldron-agent\nchmod +x keldron-agent\n```\n\n### Linux (ARM64)\n\n```bash\ncurl -sfL https://github.com/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-linux-arm64 -o keldron-agent\nchmod +x keldron-agent\n```\n\n### Linux (Docker)\n\n```bash\ndocker rm -f keldron-agent 2>/dev/null || true\ndocker run -d --name keldron-agent --restart unless-stopped \\\n  -p 9100:9100 -p 9200:9200 -p 8081:8081 \\\n  -e KELDRON_OUTPUT_PROMETHEUS_HOST=0.0.0.0 \\\n  -e KELDRON_API_HOST=0.0.0.0 \\\n  -e KELDRON_HEALTH_BIND=0.0.0.0:8081 \\\n  ghcr.io/keldron-ai/keldron-agent:latest\n```\n\n### Verify installation\n\n```bash\n./keldron-agent --version\n```\n\n---\n\n## 3. Auto-setup flow\n\n**Trigger phrases:** \"monitor my hardware\", \"set up monitoring\", \"install keldron\", \"get started\", \"help me set up\"\n\n### Step 1: Detect environment\n\n```bash\nOS=$(uname -s)\nif [ \"$OS\" = \"Darwin\" ]; then\n  CHIP=$(sysctl -n machdep.cpu.brand_string 2>/dev/null || echo \"unknown\")\n  echo \"Detected: macOS with $CHIP\"\nelif command -v nvidia-smi &>/dev/null; then\n  GPU=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1)\n  echo \"Detected: Linux with NVIDIA $GPU\"\nelse\n  echo \"Detected: Linux (generic thermal monitoring)\"\nfi\n```\n\n### Step 2: Check if agent is running\n\n```bash\nif curl -sf localhost:9100/healthz | jq -e '.status == \"healthy\"' &>/dev/null; then\n  echo \"Keldron agent is already running. Skipping to Step 4.\"\n  exit 0\nfi\n```\n\n### Step 3: Install agent\n\nDownload the release binary for the OS/arch into the current directory, then start in local mode. Example:\n\n```bash\nARCH=$(uname -m)\n\nif [ \"$OS\" = \"Darwin\" ]; then\n  BINARY=\"keldron-agent-darwin-arm64\"\nelif [ \"$ARCH\" = \"x86_64\" ]; then\n  BINARY=\"keldron-agent-linux-amd64\"\nelse\n  BINARY=\"keldron-agent-linux-arm64\"\nfi\n\nif [ \"$OS\" = \"Darwin\" ]; then\n  curl -sfL \"https://github.com/keldron-ai/keldron-agent/releases/latest/download/${BINARY}\" -o keldron-agent\n  chmod +x keldron-agent\n  ./keldron-agent --local &\n  sleep 3\nfi\n\nif [ \"$OS\" = \"Linux\" ]; then\n  if command -v docker &>/dev/null; then\n    docker rm -f keldron-agent 2>/dev/null || true\n    if ! docker run -d --name keldron-agent --restart unless-stopped \\\n      -p 9100:9100 -p 9200:9200 -p 8081:8081 \\\n      -e KELDRON_OUTPUT_PROMETHEUS_HOST=0.0.0.0 \\\n      -e KELDRON_API_HOST=0.0.0.0 \\\n      -e KELDRON_HEALTH_BIND=0.0.0.0:8081 \\\n      ghcr.io/keldron-ai/keldron-agent:latest; then\n      echo \"Error: Failed to start keldron-agent container. Check Docker permissions and network.\"\n      exit 1\n    fi\n  else\n    curl -sfL \"https://github.com/keldron-ai/keldron-agent/releases/latest/download/${BINARY}\" -o keldron-agent\n    chmod +x keldron-agent\n    ./keldron-agent --local &\n  fi\n  sleep 3\nfi\n\ncurl -sf localhost:9100/healthz | jq -e '.status == \"healthy\"'\n```\n\nReport initial readings (temperature, utilization, risk score) from [Quick status queries](#8-quick-status-queries-local-real-time) once healthy.\n\n### Step 4: Offer cloud connection\n\nGuide the user conversationally:\n\n1. **Account:** Ask: *Do you have a Keldron Cloud account? You can sign up free at https://app.keldron.ai*\n2. **If yes:** *Run `keldron-agent login` — you can use email/password or paste your API key (option 2 in the menu).*\n3. **If no:** *Sign up at https://app.keldron.ai (GitHub login available), then run `keldron-agent login`.*\n4. **Verify:** *Run `keldron-agent whoami` to confirm you're connected.*\n5. **Restart** the agent so it picks up credentials and begins streaming.\n\nIf they are not yet interested, summarize value:\n\n```bash\nif [ -n \"$CLOUD_KEY\" ]; then\n  echo \"Cloud already connected.\"\nelse\n  echo \"Want to connect to Keldron Cloud?\"\n  echo \"  • 180-day telemetry history\"\n  echo \"  • Fleet analytics and device comparison\"\n  echo \"  • Device health tracking\"\n  echo \"  • Proactive fleet alerts\"\n  echo \"  • Dashboard at app.keldron.ai\"\nfi\n```\n\n### Step 5 optional: env or YAML without CLI login\n\n**Prefer [Step 4](#step-4-offer-cloud-connection) (`keldron-agent login`) for normal setup.** Use this path when the user cannot run the interactive CLI (CI, containers without TTY) or explicitly wants config-file or env-only configuration. For non-interactive login, set `KELDRON_CLOUD_API_KEY` or pipe the key via stdin: `echo \"$KEY\" | keldron-agent login`.\n\nWhen setting a key starting with `kldn_`, use a temporary environment variable — do not echo or paste the full key into commands or transcripts (see [Rules](#13-rules)).\n\n```bash\n# Store the user-provided key in a variable (do not inline the raw key)\nexport CLOUD_KEY=\"<paste key here or pass programmatically>\"\n\nmkdir -p ~/.config/keldron\n\n# Add or update cloud config in agent YAML\nif [ -f ~/.config/keldron/keldron-agent.yaml ]; then\n  if ! grep -q 'cloud:' ~/.config/keldron/keldron-agent.yaml; then\n    cat >> ~/.config/keldron/keldron-agent.yaml << EOF\n\ncloud:\n  enabled: true\n  api_key: $CLOUD_KEY\nEOF\n  else\n    # cloud: section exists — update or insert api_key under the cloud: block\n    awk -v key=\"$CLOUD_KEY\" '\n      /^cloud:/ { in_cloud=1; found=0; print; next }\n      in_cloud && /^[^ ]/ {\n        if (!found) { print \"  api_key: \" key; found=1 }\n        in_cloud=0\n      }\n      in_cloud && /^[[:space:]]+api_key:/ { $0=\"  api_key: \" key; found=1 }\n      { print }\n      END { if (in_cloud && !found) print \"  api_key: \" key }\n    ' ~/.config/keldron/keldron-agent.yaml > ~/.config/keldron/keldron-agent.yaml.tmp \\\n      && mv ~/.config/keldron/keldron-agent.yaml.tmp ~/.config/keldron/keldron-agent.yaml\n  fi\nelse\n  cat > ~/.config/keldron/keldron-agent.yaml << EOF\ncloud:\n  enabled: true\n  api_key: $CLOUD_KEY\nEOF\nfi\n\n# Restart agent\npkill -f './keldron-agent'\nsleep 2\n./keldron-agent --local &\nsleep 5\n\n# Verify cloud connection (optional — uses env var, not raw key)\ncurl -sf \"${CLOUD_ENDPOINT}/v1/fleet/overview\" \\\n  -H \"X-API-Key: $CLOUD_KEY\" | jq '.total_devices'\n```\n\nTell the user: *Cloud connected. Your device is streaming to Keldron Cloud. Dashboard: https://app.keldron.ai*\n\n---\n\n## 4. Cloud connection\n\n- **CLI (primary):** `keldron-agent login` — stores credentials under `~/.keldron/credentials`. For non-interactive use: set `KELDRON_CLOUD_API_KEY` or pipe via stdin.\n- **Environment variable:** `KELDRON_CLOUD_API_KEY` is also read when running the agent for cloud streaming (in addition to non-interactive login).\n- **Config file (alternative):** `~/.config/keldron/keldron-agent.yaml` under `cloud.api_key` (see [Step 5 optional](#step-5-optional-env-or-yaml-without-cli-login) for automation-only edits).\n- **HTTP header** for API calls: `X-API-Key: <key>`.\n- **Base URL:** `https://api.keldron.ai`\n\nNever store or paste a full API key into this skill file. When confirming configuration, show at most the first 8 characters, e.g. `kldn_liv…`.\n\n### Interaction patterns (cloud)\n\n| User says | Skill response |\n|-----------|------------------|\n| \"connect to cloud\" / \"set up cloud\" | Guide through `keldron-agent login` (email/password or paste API key); sign up at app.keldron.ai if needed. |\n| \"am I connected to cloud?\" | Have them run `keldron-agent whoami` (or use [Check 2](#mode-detection-run-at-the-start-of-an-interaction) for `CLOUD_KEY`). |\n| \"log out of cloud\" / \"disconnect\" | Run `keldron-agent logout`; note the agent falls back to local-only unless `KELDRON_CLOUD_API_KEY` or YAML still sets a key. |\n| \"how do I get my API key?\" | Sign in at app.keldron.ai — your API key is shown in the app. Or run `keldron-agent login` to authenticate without manually copying into YAML. |\n\n---\n\n## 5. Running the agent\n\nStart the agent in local mode:\n\n```bash\n./keldron-agent --local\n```\n\nThe agent auto-detects hardware. Basic use needs no config.\n\nVerify it is running:\n\n```bash\ncurl -sf localhost:9100/healthz | jq -e '.status == \"healthy\"'\n```\n\nA non-zero exit means the agent is not healthy or not running.\n\nMetrics:\n\n```bash\ncurl -s localhost:9100/metrics | grep keldron_\n```\n\n---\n\n## 6. Endpoints\n\n### Local agent (localhost)\n\n| Port | Path | Description |\n|------|------|-------------|\n| 9100 | `/metrics` | Prometheus metrics (all `keldron_*` gauges) |\n| 9100 | `/healthz` | Liveness check (JSON) |\n| 9200 | `/` | Local web dashboard (embedded UI) |\n| 9100 | `/api/v1/status` | Agent version, device name, active adapters |\n\n### Cloud API reference\n\nAll cloud routes use TLS, base URL `$CLOUD_ENDPOINT` (defaults to `https://api.keldron.ai`), header `X-API-Key: $CLOUD_KEY`.\n\n| Method | Path | Purpose |\n|--------|------|---------|\n| GET | `/health` | Cloud availability |\n| GET | `/v1/fleet/overview` | Fleet counts, worst device, per-device status |\n| GET | `/v1/devices/{device_id}/history?window=12h` | Historical points (window: `12h`, `24h`, …) |\n| GET | `/v1/devices/{device_id}/health?window=24` | Device health (**window = integer hours**) |\n| GET | `/v1/analytics/fleet-health?window=7d` | Fleet analytics + `ai_brief` (window: `7d`, `24h`, …) |\n\n### Dashboards\n\n- **Cloud connected:** Fleet: `https://app.keldron.ai/fleet` — Device: `https://app.keldron.ai/device/{device_id}` — Analytics: `https://app.keldron.ai/analytics`\n- **Local only:** `http://localhost:9200` — For fleet analytics and history, connect at `https://app.keldron.ai`\n\nWhen the user asks for a **dashboard**, **link** these URLs. Do not render ASCII art or fake terminal dashboards.\n\n### Cloud API field names (jq reference)\n\n**Do not assume names match across endpoints.**\n\n| Concept | Fleet overview | History (points) | Device status (e.g. nested `current`) | Health |\n|---------|----------------|-------------------|--------------------------------------|--------|\n| Temperature | `temperature_primary` | `temperature` | `temperature_primary` | `idle_temp_c`, `peak_temp_c` |\n| Power | `power_draw` | `power` | `power_draw` | — |\n| Composite score | `composite_risk_score` | `composite_score` | `composite_risk_score` | — |\n| Severity | `severity_band` | `severity` | `severity_band` | — |\n| Thermal sub | — | `thermal_sub` | `thermal_sub_score` | — |\n| Efficiency | — | — | — | `perf_per_watt.value` (not `perf_per_watt.perf_per_watt`) |\n\n**Window formats**\n\n- History: string with unit → `?window=12h`, `?window=24h`\n- Health: integer hours → `?window=24`\n- Analytics: string with unit → `?window=7d`, `?window=24h`\n\n**Health endpoint:** `thermal_stability` may be **omitted** when unavailable (not `null`). Use jq that tolerates a missing key. Use `idle_temp_c` / `peak_temp_c` — not `idle_baseline` / `peak_temp`.\n\n---\n\n## 7. Key metrics reference\n\n| Metric | Description |\n|--------|-------------|\n| `keldron_gpu_temperature_celsius` | GPU temperature in Celsius |\n| `keldron_risk_severity` | 0=normal, 1=warning, 2=critical |\n| `keldron_risk_composite` | Composite risk score (0–100) |\n| `keldron_risk_thermal` | Thermal risk score |\n| `keldron_risk_power` | Power risk score |\n| `keldron_risk_volatility` | Volatility risk score |\n| `keldron_risk_memory` | Memory-related risk score |\n| `keldron_power_cost_monthly` | Estimated power cost per month ($) |\n| `keldron_power_cost_daily` | Estimated power cost per day ($) |\n| `keldron_power_cost_hourly` | Estimated power cost per hour ($) |\n| `keldron_gpu_power_watts` | GPU power draw in watts |\n| `keldron_gpu_utilization_ratio` | GPU utilization 0–1 |\n| `keldron_gpu_memory_used_bytes` | GPU memory in use |\n| `keldron_gpu_memory_total_bytes` | GPU memory total |\n| `keldron_gpu_memory_pressure_ratio` | Memory pressure 0–1 |\n| `keldron_gpu_throttle_active` | 1 if throttled, 0 otherwise |\n| `keldron_system_swap_used_bytes` | System swap in use |\n| `keldron_agent_info` | Agent metadata (`device_model`, `device_name` labels) |\n\n---\n\n## 8. Quick status queries (local, real-time)\n\n### \"What's my GPU temperature?\"\n\n```bash\ncurl -s localhost:9100/metrics | grep 'keldron_gpu_temperature_celsius{' | awk '{print $2}'\n```\n\nExtract the `device_model` label from the metric line. Report as: *Your {device_model} is at {value}°C.*\n\n### \"Is my GPU at risk?\"\n\n```bash\ncurl -s localhost:9100/metrics | grep -E 'keldron_risk_(composite|severity|thermal|power|volatility|memory)' | grep -v '^#'\n```\n\nParse `keldron_risk_composite` (0–100) and `keldron_risk_severity` (0=normal, 1=warning, 2=critical). Report composite, severity, and which sub-score is highest.\n\nAssessment thresholds:\n\n| Score | Assessment |\n|-------|------------|\n| <30 | Looking good |\n| 30–60 | Moderate — keep an eye on it |\n| 60–80 | Warning — consider reducing load |\n| >80 | Critical — take action now |\n\n### \"Give me a quick status\"\n\n```bash\ncurl -s localhost:9100/metrics | grep -E 'keldron_(gpu_temperature|gpu_utilization|risk_composite|risk_severity|power_cost_monthly|gpu_memory_pressure)' | grep -v '^#'\n```\n\nFormat:\n\n```text\n🌡️ Temperature: XX°C\n⚡ Utilization: XX%\n🎯 Risk Score: XX/100 (severity)\n💰 Monthly cost: $X.XX\n🧠 Memory pressure: XX%\n```\n\n### \"What GPU do I have?\"\n\n```bash\ncurl -s localhost:9100/metrics | grep 'keldron_agent_info'\n```\n\nExtract `device_model` and `device_name` from labels. Report: *You're running a {device_model} ({device_name}).*\n\n### \"How much is my GPU costing me?\"\n\n```bash\ncurl -s localhost:9100/metrics | grep 'keldron_power_cost' | grep -v '^#'\n```\n\nReport hourly, daily, and monthly from `keldron_power_cost_*`.\n\n### \"How's my memory?\"\n\n```bash\ncurl -s localhost:9100/metrics | grep -E 'keldron_gpu_memory|keldron_system_swap' | grep -v '^#'\n```\n\nDerive pressure from `keldron_gpu_memory_used_bytes` / `keldron_gpu_memory_total_bytes`. On Apple Silicon, high swap means the workload likely exceeds unified memory — suggest a smaller or quantized model.\n\n---\n\n## 9. Cloud queries\n\nIf cloud is not configured or unreachable, say: *Fleet monitoring requires Keldron Cloud. Sign up at app.keldron.ai to see your whole fleet from anywhere.* For history-only questions without cloud: *I can only see real-time data locally. Connect to Keldron Cloud for historical queries — sign up at app.keldron.ai.*\n\n### \"How are my machines doing?\" / Fleet overview\n\nUse **fleet overview** field names (`composite_risk_score`, `severity_band`, `temperature_primary`, …).\n\n```bash\nFLEET=$(curl -s \"${CLOUD_ENDPOINT}/v1/fleet/overview\" \\\n  -H \"X-API-Key: $CLOUD_KEY\")\n\nTOTAL=$(echo \"$FLEET\" | jq '.total_devices')\nNORMAL=$(echo \"$FLEET\" | jq '.devices_normal')\nWARNING=$(echo \"$FLEET\" | jq '.devices_warning')\nCRITICAL=$(echo \"$FLEET\" | jq '.devices_critical')\nWORST=$(echo \"$FLEET\" | jq -r '.worst_device_id')\nWORST_SCORE=$(echo \"$FLEET\" | jq '.worst_score | floor')\n```\n\n**Response style:**\n\n- All healthy: *All {total} devices healthy. Highest risk is {worst} at {score}. Fleet looks good.*\n- Any warning: *Heads up — {device} is at Warning (score {score}). {Details}. Other {healthy_count} devices are normal.* Include dashboard: `https://app.keldron.ai/fleet`\n- Any critical: *{device} is Critical (score {score}). Immediate attention needed.* Link `https://app.keldron.ai/fleet` and the device URL if known.\n\n### \"Show me a dashboard\"\n\n- Cloud: *Your fleet dashboard: https://app.keldron.ai/fleet — Analytics: https://app.keldron.ai/analytics — Device detail: https://app.keldron.ai/device/{device_id}*\n- Local only: *Your local dashboard: http://localhost:9200 — Connect to Keldron Cloud at app.keldron.ai for fleet analytics and history.*\n\n### \"What happened overnight?\" / \"What happened while I was away?\"\n\nHistory points use `temperature`, `composite_score`, `severity` (not the fleet overview names).\n\n```bash\ncurl -s \"${CLOUD_ENDPOINT}/v1/devices/${DEVICE_ID}/history?window=12h\" \\\n  -H \"X-API-Key: $CLOUD_KEY\" | jq '{\n  points: .points | length,\n  max_temp: [.points[].temperature] | max,\n  min_temp: [.points[].temperature] | min,\n  max_score: [.points[].composite_score] | max,\n  any_warning: [.points[] | select(.severity != \"normal\")] | length\n}'\n```\n\nInterpret: quiet night vs events; cite min/max temp and whether any non-normal severities occurred.\n\n### \"Watch for an hour and report\" (history)\n\n```bash\ncurl -s \"${CLOUD_ENDPOINT}/v1/devices/${DEVICE_ID}/history?window=1h\" \\\n  -H \"X-API-Key: $CLOUD_KEY\" | jq '{\n  points: .points | length,\n  max_temp: [.points[].temperature] | max,\n  min_temp: [.points[].temperature] | min,\n  avg_temp: (if (.points | length) > 0 then ([.points[].temperature] | add / length) else null end),\n  max_score: [.points[].composite_score] | max,\n  warnings: [.points[] | select(.severity != \"normal\")] | length\n}'\n```\n\n### \"Compare my devices\" / \"Which device is the worst?\"\n\n```bash\ncurl -s \"${CLOUD_ENDPOINT}/v1/analytics/fleet-health?window=7d\" \\\n  -H \"X-API-Key: $CLOUD_KEY\" | jq '{\n  flagged: .total_flagged,\n  ai_brief: .ai_brief,\n  devices: [.devices[] | {\n    name: .hostname,\n    score: .current.composite_risk_score,\n    recovery: .current.recovery_seconds,\n    temp: .current.temperature_primary,\n    flags: [.flags[].message]\n  }]\n}'\n```\n\nReport `ai_brief` when present — it is a natural-language summary. Link `https://app.keldron.ai/analytics`.\n\n### \"How's {device} trending?\" / Device health\n\n`window` is **integer hours**. Use `idle_temp_c`, `peak_temp_c`, `perf_per_watt.value`. Handle missing `thermal_stability`.\n\n```bash\nDEVICE_ENCODED=$(echo \"$DEVICE_ID\" | jq -sRr @uri)\ncurl -s \"${CLOUD_ENDPOINT}/v1/devices/${DEVICE_ENCODED}/health?window=24\" \\\n  -H \"X-API-Key: $CLOUD_KEY\" | jq '{\n  idle_temp_c: .idle_temp_c,\n  peak_temp_c: .peak_temp_c,\n  perf_per_watt: .perf_per_watt.value,\n  thermal_stability: (if has(\"thermal_stability\") then .thermal_stability else null end)\n}'\n```\n\nReport in plain language using idle/peak temps and efficiency. If cloud is down, fall back to local realtime metrics and avoid dumping raw errors.\n\n---\n\n## 10. Proactive fleet monitoring\n\nUse **cloud** polling — not `localhost:9100` loops — for \"watch my fleet\" / \"alert me if anything changes\".\n\n### \"Watch my fleet\" / \"Alert me if anything changes\"\n\nSet `MAX_CHECKS` to limit the total number of iterations, including failed API calls (e.g., `MAX_CHECKS=60` for ~1 hour). Leave unset or `0` for unlimited.\n\n```bash\necho \"Fleet monitoring active. Checking every 60 seconds via Keldron Cloud.\"\necho \"Press Ctrl+C to stop.\"\n\ntrap 'echo \"\"; echo \"Fleet monitoring stopped by user.\"; exit 0' INT\n\nPREV_WORST=\"\"\nPREV_WORST_SCORE=0\nCHECK_COUNT=0\nMAX_CHECKS=\"${MAX_CHECKS:-0}\"\n\nwhile true; do\n  CHECK_COUNT=$((CHECK_COUNT + 1))\n\n  FLEET=$(curl -s \"${CLOUD_ENDPOINT}/v1/fleet/overview\" \\\n    -H \"X-API-Key: $CLOUD_KEY\" 2>/dev/null)\n\n  if [ -z \"$FLEET\" ]; then\n    if [ \"$MAX_CHECKS\" -gt 0 ] && [ \"$CHECK_COUNT\" -ge \"$MAX_CHECKS\" ]; then\n      echo \"Reached $MAX_CHECKS checks. Fleet monitoring stopped by timeout.\"\n      break\n    fi\n    sleep 60\n    continue\n  fi\n\n  WARNING=$(echo \"$FLEET\" | jq '.devices_warning // 0')\n  CRITICAL=$(echo \"$FLEET\" | jq '.devices_critical // 0')\n  WORST=$(echo \"$FLEET\" | jq -r '.worst_device_id')\n  WORST_SCORE=$(echo \"$FLEET\" | jq '.worst_score // 0 | floor')\n\n  if [ \"${CRITICAL:-0}\" -gt 0 ]; then\n    DEVICE_INFO=$(echo \"$FLEET\" | jq -r '.devices[] | select(.severity_band == \"critical\") | \"\\(.hostname): score \\((.composite_risk_score // 0) | floor), temp \\((.temperature_primary // 0) | floor)°C\"')\n    echo \"CRITICAL: $DEVICE_INFO\"\n    break\n  fi\n\n  if [ \"${WARNING:-0}\" -gt 0 ]; then\n    DEVICE_INFO=$(echo \"$FLEET\" | jq -r '.devices[] | select(.severity_band == \"warning\") | \"\\(.hostname): score \\((.composite_risk_score // 0) | floor), temp \\((.temperature_primary // 0) | floor)°C\"')\n    echo \"WARNING: $DEVICE_INFO\"\n  fi\n\n  if [ -n \"$PREV_WORST\" ] && [ \"$WORST\" = \"$PREV_WORST\" ]; then\n    SCORE_DELTA=$((WORST_SCORE - PREV_WORST_SCORE))\n    if [ \"$SCORE_DELTA\" -gt 20 ]; then\n      echo \"SPIKE: $WORST jumped from $PREV_WORST_SCORE to $WORST_SCORE\"\n    fi\n  fi\n\n  PREV_WORST=\"$WORST\"\n  PREV_WORST_SCORE=$WORST_SCORE\n\n  if [ \"$MAX_CHECKS\" -gt 0 ] && [ \"$CHECK_COUNT\" -ge \"$MAX_CHECKS\" ]; then\n    echo \"Reached $MAX_CHECKS checks. Fleet monitoring stopped by timeout.\"\n    break\n  fi\n\n  sleep 60\ndone\n```\n\n### \"Give me a morning report\"\n\n```bash\nANALYTICS=$(curl -s \"${CLOUD_ENDPOINT}/v1/analytics/fleet-health?window=24h\" \\\n  -H \"X-API-Key: $CLOUD_KEY\")\nFLEET=$(curl -s \"${CLOUD_ENDPOINT}/v1/fleet/overview\" \\\n  -H \"X-API-Key: $CLOUD_KEY\")\n\nTOTAL=$(echo \"$FLEET\" | jq '.total_devices')\nNORMAL=$(echo \"$FLEET\" | jq '.devices_normal')\nAI_BRIEF=$(echo \"$ANALYTICS\" | jq -r '.ai_brief')\nFLAGGED=$(echo \"$ANALYTICS\" | jq '.total_flagged')\n\necho \"Morning Fleet Report\"\necho \"--------------------\"\necho \"Fleet: $TOTAL devices, $NORMAL healthy\"\necho \"\"\necho \"$AI_BRIEF\"\necho \"\"\nif [ \"$FLAGGED\" -gt 0 ]; then\n  echo \"$FLAGGED device(s) flagged — https://app.keldron.ai/analytics\"\nelse\n  echo \"All devices healthy.\"\nfi\necho \"\"\necho \"Dashboard: https://app.keldron.ai\"\n```\n\n---\n\n## 11. Configuration & management\n\n### Changing config\n\nIf the user needs to change settings (e.g. electricity rate), tell them: **Edit `~/.config/keldron/keldron-agent.yaml` — the agent picks up changes on restart.** Avoid complex sed one-liners for YAML edits; prefer manual edits, YAML-aware tools like `yq`, or scoped awk scripts.\n\n### Multi-device / fleet\n\nAll devices that stream to the same cloud account appear in the fleet automatically.\n\n### Stop monitoring\n\n```bash\npkill -f './keldron-agent'\n```\n\nConfirm: *Agent stopped. GPU monitoring is off.*\n\n### Restart the agent\n\n```bash\npkill -f './keldron-agent'\nsleep 2\n./keldron-agent --local &\nsleep 3\ncurl -s localhost:9100/healthz\n```\n\nReport the `healthz` response to confirm it is up.\n\n---\n\n## 12. Proactive behavior\n\n- After setup, suggest cloud and dashboards: *Your agent is running. Ask how your fleet is doing, open https://app.keldron.ai/fleet, or use local metrics on this machine.*\n- For **alert** / **watch** on a **fleet**, run the cloud polling loop in [§10](#10-proactive-fleet-monitoring); for single-machine **realtime** questions, use [§8](#8-quick-status-queries-local-real-time).\n\n---\n\n## 13. Rules\n\n- **Always check agent health first.** Before any local query, verify: `curl -sf localhost:9100/healthz | jq -e '.status == \"healthy\"'`. Non-zero exit = agent down. Offer to start it or guide setup.\n- **Auto-detect mode.** Check for cloud API key: `KELDRON_CLOUD_API_KEY`, then `~/.keldron/credentials` (from `keldron-agent login`), then `cloud.api_key` in `~/.config/keldron/keldron-agent.yaml`. Optionally confirm with `keldron-agent whoami`. Use cloud for fleet, history, analytics; local for realtime single-device.\n- **Guide setup, don't just explain.** When the agent or cloud is not configured, walk through steps and run commands.\n- **If metrics return 0 for temperature, the agent may still be warming up.** Wait 30 seconds and retry once.\n- **Always include severity assessment.** Report severity (normal/warning/critical) alongside numeric scores where applicable.\n- **Cloud upsell is helpful, not pushy.** When a question needs cloud (history, fleet comparison), mention it naturally: *That needs historical data — connect at app.keldron.ai.*\n- **Proactive monitoring uses the cloud API.** Background poll loops use `api.keldron.ai`, not localhost metrics.\n- **Link to dashboards.** Include relevant links: `app.keldron.ai/fleet`, `app.keldron.ai/analytics`, or `http://localhost:9200` for local.\n- **API key security.** Never echo the full API key. Show only the first 8 characters: *Configured with key kldn_liv…*\n- **Fallback gracefully.** Cloud unreachable → fall back to local. Local unreachable → guide setup. Never show raw errors to the user.\n- **On Apple Silicon, high swap = model too large.** If swap is high, suggest a smaller or quantized model.\n- **The agent never requires sudo.** Runs unprivileged on all platforms. Docker on Linux may need sudo or docker-group.\n- **Use metric labels.** Extract `device_model` and `device_name` from Prometheus labels for personalized responses.\n- **When the user says \"alert me\" or \"watch\" (fleet),** set up the cloud polling loop and execute it.\n- **When the user says \"dashboard\",** link to the real dashboard. Do not render ASCII art.","tags":["keldron","agent","keldron-ai","agent-skills","claude-code","claude-skills","gpu-monitoring","hardware-monitor","openclaw","openclaw-skill","skill-md","skillsmp"],"capabilities":["skill","source-keldron-ai","skill-keldron-agent","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-gpu-monitoring","topic-hardware-monitor","topic-openclaw","topic-openclaw-skill","topic-skill-md","topic-skillsmp"],"categories":["keldron-agent"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/keldron-ai/keldron-agent","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add keldron-ai/keldron-agent","source_repo":"https://github.com/keldron-ai/keldron-agent","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 6 github stars · SKILL.md body (28,006 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:15:07.969Z","embedding":null,"createdAt":"2026-05-18T13:23:00.322Z","updatedAt":"2026-05-18T19:15:07.969Z","lastSeenAt":"2026-05-18T19:15:07.969Z","tsv":"'-0':3039,3127,3163 '-1':731 '-4':1136 '-5':1466 '/.config/keldron':1245 '/.config/keldron/keldron-agent.yaml':317,324,333,352,404,1256,1262,1265,1335,1339,1343,1457,3381,3589 '/.config/keldron/keldron-agent.yaml.tmp':1336,1338 '/.keldron/credentials':260,277,289,297,1416,3579 '/analytics':1821,2604,2840,3352,3709 '/api/v1/status':1724 '/dev/null':248,253,281,291,299,310,319,326,335,346,354,364,436,441,615,701,715,729,763,864,873,3062 '/device/':1815,2609 '/engine/install/linux-postinstall/)':147 '/fleet':1811,2569,2583,2600,3706 '/fleet,':3490 '/health':434,1757,1786,2879 '/healthz':1713 '/history':1774,2659,2727 '/keldron-agent':660,851,950,1358,1361,1649,3434,3448,3451 '/keldron-ai/keldron-agent/releases)':529 '/keldron-ai/keldron-agent/releases/latest/download/$':840,939 '/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-darwin-arm64':561 '/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-linux-amd64':578 '/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-linux-arm64':595 '/keldron-ai/keldron-agent:latest':656 '/keldron-ai/keldron-agent:latest;':915 '/metrics':1706 '/v1/analytics/fleet-health':1795,2790,3275 '/v1/devices':1771,1783,2656,2724,2876 '/v1/fleet/overview':1379,1761,2483,3053,3290 '0':776,1298,1313,1319,1994,2006,2076,2102,2111,2202,2208,2756,2994,3024,3031,3034,3071,3100,3107,3123,3129,3147,3152,3165,3183,3188,3242,3343,3632 '0.0.0.0':642,647,652,901,906,911 '1':30,235,684,932,994,1296,1310,1324,1996,2077,2103,2108,2210,2989,3047 '10':2942,3510,3511 '100':2007,2203 '11':3363 '12':3468 '12h':1776,1780,1931,2661 '13':1222,3532 '180':1100 '1h':2729 '2':247,252,255,290,298,318,325,334,341,345,353,359,363,435,440,521,614,700,728,747,872,1011,1029,1360,1562,1998,2157,2212,3061,3450 '20':3215 '24':1788,1938,2881 '24h':1781,1804,1933,1946,3277 '3':411,516,662,779,854,954,1033,3454 '30':2228,2231,3643 '3090/4090/5090':68 '4':774,986,1049,1134,1404 '5':1061,1124,1364,1463,1638 '6':1697 '60':2232,2239,2987,3004,3091,3262 '64':816 '7':1977 '7d':1797,1803,1944,2792 '8':975,1512,2132,3523,3524,3728 '80':2240,2245 '8081':635,636,653,894,895,912 '9':2404 '9100':86,491,629,630,888,889,1705,1712,1723,2951 '9100/healthz':246,758,959,1670,3458,3547 '9100/metrics':1694,2149,2185,2259,2305,2338,2362 '9200':632,633,891,892,1717,1825,2618,3712 'a3':331,350 'account':995,1003,3423 'across':1864 'action':2248 'activ':1729,2107,3001 'adapt':1730 'add':400,1246,2760 'addit':1448 'agent':3,24,33,41,83,126,239,242,386,476,533,565,570,582,587,599,604,613,623,750,767,781,810,821,828,845,850,871,882,924,944,949,1017,1047,1054,1064,1143,1194,1252,1355,1411,1443,1534,1557,1584,1588,1629,1641,1644,1652,1682,1700,1725,2123,2125,2308,3383,3436,3444,3478,3536,3556,3583,3595,3617,3636,3773 'ai':19,1800,2804,2806,2826,3310,3316,3337 'ai-pow':18 'alert':16,182,501,1117,2957,2965,3499,3811 'alongsid':3655 'alreadi':769,1089 'also':1438 'altern':1456 'alway':3534,3648 'amd':72 'amd64':572,823 'analyt':22,107,201,453,1106,1799,1818,1828,1939,2601,2627,3270,3313,3320,3602 'anyth':2960,2968 'anywher':2430 'api':114,219,224,268,287,337,380,391,473,645,904,1026,1182,1270,1282,1306,1317,1320,1332,1348,1383,1425,1435,1483,1487,1498,1539,1598,1611,1618,1732,1749,1854,2487,2665,2733,2796,2885,2982,3057,3281,3294,3572,3576,3689,3715,3722 'api.keldron.ai':101,371,1491,1745,3694 'app':1624 'app.keldron.ai':408,508,1010,1039,1121,1403,1544,1616,1810,1814,1820,1833,2423,2457,2568,2582,2599,2603,2608,2624,2839,3351,3362,3489,3683,3705,3708 'app.keldron.ai/analytics':1819,2602,2838,3350,3707 'app.keldron.ai/device/':1813,2607 'app.keldron.ai/fleet':1809,2567,2581,2598,3704 'app.keldron.ai/fleet,':3488 'appear':3424 'appl':60,554,2387,3755 'applic':3659 'arch':800,814 'arm64':589,812,830 'art':1848,3839 'ascii':1847,3838 'ask':197,996,1837,3481 'assess':173,2224,2227,3651 'assum':1861 'attent':2578 'authent':1632 'auto':513,518,664,1654,3566 'auto-detect':1653,3565 'auto-setup':512,663 'auto-setup-flow':517 'autom':1477 'automat':3428 'automation-on':1476 'avail':1042,1759 'avg':2751 'avoid':2938,3389 'awar':3403 'away':2638 'awk':339,357,1288,2155,3409 'back':1590,2932,3740 'background':3690 'band':1907,1910,2474,3140,3176 'base':1489,1739 'baselin':1974 'bash':233,556,573,590,607,659,687,753,799,1081,1224,1648,1666,1690,2145,2181,2255,2301,2334,2358,2477,2651,2719,2785,2863,2997,3269,3431,3445 'basic':1657 'begin':1071 'behavior':3470 'binari':127,530,785,807,818,825,841,940 'bind':651,910 'block':1287 'break':3088,3159,3259 'brief':1801,2805,2807,2827,3311,3317,3338 'build':535,544 'byte':2082,2091,2117,2380,2385 'c':1885,1888,1968,1971,2175,2283,2854,2857,2892,2895,2898,2901,3012,3154,3190 'call':1484,2983 'cannot':1154 'cat':1264,1342 'celsius':1986,1990,2154 'chang':2961,2969,3366,3373,3386 'charact':1513,3729 'check':234,254,410,748,926,1561,1715,2972,2986,3002,3032,3036,3038,3043,3045,3069,3072,3076,3081,3082,3240,3243,3247,3252,3253,3535,3569 'chip':695,708 'chmod':566,583,600,846,945 'ci':1159 'cite':2701 'cli':1130,1158,1407,1473 'clone':538 'cloud':10,100,188,196,218,223,257,264,267,270,274,283,292,303,312,320,328,332,347,351,367,369,374,379,390,413,421,425,428,432,448,449,464,467,496,988,1002,1084,1088,1098,1139,1181,1241,1249,1261,1267,1272,1276,1286,1291,1293,1295,1302,1312,1315,1329,1345,1350,1366,1377,1385,1393,1401,1405,1424,1434,1445,1519,1526,1529,1551,1574,1579,1597,1731,1735,1741,1751,1758,1806,1853,2405,2408,2419,2437,2450,2481,2489,2594,2622,2654,2667,2722,2735,2788,2798,2874,2887,2928,2947,3008,3051,3059,3273,3283,3288,3296,3422,3474,3506,3571,3575,3598,3619,3660,3670,3688,3737,3819 'cloud-api-field-names-jq-refer':222 'cloud.api':315,401,1459,3586 'cloud.endpoint':323 'command':278,307,710,861,1217,3628 'compar':2777 'comparison':1109,3673 'complex':3390 'composit':1895,1897,1900,1902,2002,2003,2190,2201,2215,2268,2470,2643,2686,2768,3144,3180 'concept':1866 'config':1167,1250,1454,1661,3367 'config-fil':1166 'configur':117,258,1173,1506,2411,3364,3622,3730 'confirm':1057,1505,3435,3464,3591 'connect':506,989,1060,1090,1095,1140,1367,1394,1406,1524,1549,1807,1831,2447,2619,3681 'consid':2242 'consum':65 'contain':925,1160 'continu':3092 'convers':993 'copi':1635 'cost':179,2036,2040,2045,2049,2054,2058,2272,2291,2332,2342,2353 'count':1763,2561,3033,3044,3046,3073,3244 'credenti':1069,1414 'critic':1999,2213,2246,2509,2514,2571,2574,3101,3106,3126,3141,3156 'csv':726 'ctrl':3011 'curl':243,430,557,574,591,755,836,935,956,1375,1667,1691,2146,2182,2256,2302,2335,2359,2479,2652,2720,2786,2872,3049,3271,3286,3455,3544 'current':791,1875 'current.composite':2813 'current.recovery':2817 'current.temperature':2820 'd':343,361,619,878 'daili':2046,2347 'darwin':693,805,811,834 'dashboard':193,552,1119,1402,1720,1805,1840,1852,2566,2593,2597,2616,3361,3476,3700,3829,3834 'data':505,2445,3680 'datacent':70 'day':1101,2051 'default':1743 'delta':3205,3213 'deriv':2373 'descript':1704,1982 'detail':2558,2606 'detect':204,685,705,733,740,1565,1655,3567 'devic':94,462,1108,1111,1389,1396,1727,1765,1768,1772,1784,1789,1812,1816,1871,2127,2129,2160,2170,2311,2314,2323,2325,2496,2501,2507,2513,2521,2537,2552,2562,2572,2586,2605,2610,2657,2725,2779,2781,2808,2809,2843,2845,2864,2867,2877,3098,3105,3114,3131,3137,3157,3167,3173,3193,3303,3308,3332,3347,3356,3413,3416,3608,3796,3799 'differ':214 'directori':792 'disconnect':1580 'docker':130,138,141,150,606,608,617,863,866,876,927,3782,3790 'docker-group':3789 'docs.docker.com':146 'docs.docker.com/engine/install/linux-postinstall/)':145 'done':3263 'download':782 'draw':1891,1894,2067 'dual':78 'dump':2939 'e':637,643,648,760,896,902,907,961,1672,2187,2261,2364,3549 'e.g':1514,1873,2984,3375 'echo':377,702,704,732,739,765,917,1087,1092,1099,1104,1110,1114,1118,1190,1210,2492,2498,2504,2510,2516,2525,2866,2998,3009,3016,3017,3078,3095,3102,3109,3118,3133,3155,3169,3191,3217,3249,3299,3305,3312,3319,3324,3328,3329,3335,3336,3339,3345,3354,3359,3360,3719 'edit':1479,3380,3397,3400 'effici':1918,2926 'electr':3376 'elif':709,813 'els':327,738,824,934,1091,1275,1341,2762,2915,3353 'email/password':1022,1536 'embed':1721 'enabl':1268,1346 'encod':2865,2878 'end':1326,2764,2917 'endpoint':57,216,271,293,296,321,348,356,368,370,433,1378,1698,1742,1865,1948,2482,2655,2723,2789,2875,3052,3274,3289 'env':259,1126,1171,1370,1469 'env-on':1170 'environ':686,1206,1431 'eof':1266,1274,1344,1352 'error':155,918,2941,3750 'estim':2038,2047,2056 'event':2700 'everi':3003 'everyth':469 'exampl':798 'exceed':2395 'execut':3823 'exist':1278 'exit':775,931,1679,3023,3555 'explain':3614 'explicit':1164 'export':1240 'expos':46 'extract':2158,2310,3795 'eye':2236 'f':276,610,868,1255,1357,3433,3447 'fail':919,2981 'fake':1850 'fall':1589,2931,3739 'fallback':3735 'fast':88 'fi':300,365,366,409,442,745,777,831,855,933,952,955,1122,1340,1353,3089,3093,3160,3195,3228,3229,3260,3358 'field':212,220,225,1855,2468 'file':1168,1455,1503 'filter':232 'first':1511,3538,3727 'flag':2801,2803,2822,2823,3318,3323,3341,3346,3349 'fleet':11,21,103,110,186,198,451,455,499,1105,1116,1762,1798,1808,1827,1867,2415,2428,2463,2466,2478,2493,2499,2505,2511,2517,2526,2545,2596,2626,2648,2944,2956,2964,2999,3018,3048,3065,3083,3096,3103,3110,3119,3134,3170,3254,3285,3300,3306,3326,3330,3414,3427,3484,3503,3514,3600,3672,3815 'floor':2530,3124,3148,3153,3184,3189 'flow':515,520,666 'format':725,1925,2279 'found':382,1297,1304,1309,1323,1330 'free':1008 'full':551,1214,1497,3721 'gaug':1711 'ge':3074,3245 'generic':742 'get':171,677,1609,1756,1760,1770,1782,1794 'ghcr.io':655,914 'ghcr.io/keldron-ai/keldron-agent:latest':654 'ghcr.io/keldron-ai/keldron-agent:latest;':913 'github':525,1040 'github.com':528,560,577,594,839,938 'github.com/keldron-ai/keldron-agent/releases)':527 'github.com/keldron-ai/keldron-agent/releases/latest/download/$':838,937 'github.com/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-darwin-arm64':559 'github.com/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-linux-amd64':576 'github.com/keldron-ai/keldron-agent/releases/latest/download/keldron-agent-linux-arm64':593 'give':2250,3264 'go':546 'good':2230,2547 'gpu':4,25,39,165,176,717,723,737,1984,1987,2062,2065,2071,2074,2079,2083,2088,2092,2096,2105,2143,2152,2178,2263,2265,2274,2297,2331,2366,2377,2382,3438 'gpus':66,73 'grace':3736 'grep':330,336,349,355,1259,1695,2150,2186,2196,2260,2277,2306,2339,2343,2363,2371 'group':139,3791 'gt':3070,3128,3164,3214,3241,3342 'guid':990,1530,3563,3609,3745 'h':1380,2484,2662,2730,2793,2882,3054,3278,3291 'h100/b200':71 'handl':2859 'happen':2631,2634 'hardwar':671,1656 'head':730,2550 'header':1481,1746 'health':13,650,909,1112,1790,1876,1934,1947,2846,3537 'healthi':446,762,963,984,1674,1685,2534,2538,2560,3334,3357,3551 'healthz':3461 'help':679,3663 'high':2389,3757,3765 'highest':2223,2539 'histor':105,504,1777,2452,3679 'histori':199,452,498,1103,1830,1869,1926,2433,2629,2639,2718,3601,3671 'history-on':2432 'hit':153 'host':641,646,900,905 'hostnam':2811,3142,3178 'hour':1793,1936,2055,2060,2346,2715,2850,2990 'http':1480 'id':1773,1785,1817,2522,2611,2658,2726,2868,3115 'idl':1883,1966,1973,2852,2890,2893 'idle/peak':2923 'immedi':2577 'includ':2565,2980,3649,3701 'info':2124,2309,3132,3158,3168,3194 'initi':965 'inlin':1236 'insert':1281 'instal':144,522,658,675,780 'instantan':459 'int':3025 'integ':1792,1935,2849 'intellig':8,29 'interact':211,395,1157,1177,1420,1452,1517,1572 'interest':1078 'interpret':2696 'iter':2979 'jq':227,231,249,280,285,294,437,759,960,1387,1671,1857,1959,2494,2500,2506,2512,2518,2527,2669,2737,2800,2869,2889,3097,3104,3111,3120,3135,3171,3301,3307,3314,3321,3548 'json':1716 'jump':3220 'keep':2234 'keldron':2,23,32,99,266,385,389,532,564,569,581,586,598,603,612,622,638,644,649,676,766,809,820,827,844,849,870,881,897,903,908,923,943,948,1001,1016,1046,1053,1097,1142,1180,1193,1400,1410,1423,1433,1533,1556,1583,1596,1628,1696,1710,1983,1991,2000,2008,2014,2020,2026,2034,2043,2052,2061,2070,2078,2087,2095,2104,2113,2122,2151,2188,2199,2205,2262,2307,2340,2351,2365,2368,2376,2381,2418,2449,2621,3007,3574,3582,3594 'keldron-ag':1,384,531,563,568,580,585,597,602,611,621,843,848,869,880,922,942,947,1015,1045,1052,1141,1192,1409,1532,1555,1582,1627,3581,3593 'keldron-agent-darwin-arm64':808 'keldron-agent-linux-amd64':819 'keldron-agent-linux-arm64':826 'key':115,265,269,275,284,288,304,313,316,329,338,375,381,392,402,420,426,1027,1085,1183,1187,1191,1199,1215,1230,1239,1242,1271,1273,1283,1290,1292,1307,1308,1318,1321,1322,1333,1334,1349,1351,1374,1384,1386,1426,1436,1460,1488,1499,1540,1575,1599,1605,1612,1619,1750,1752,1964,1978,2488,2490,2666,2668,2734,2736,2797,2799,2886,2888,3058,3060,3282,3284,3295,3297,3573,3577,3587,3716,3723,3732 'kldn':1202,1515,3733 'known':2589 'label':2131,2162,2317,3794,3803 'languag':2835,2921 'larg':3761 'latenc':482 'leav':2991 'length':2672,2695,2740,2755,2761,2776 'like':2394,3405 'limit':2974 'line':2166 'liner':3394 'link':1841,2580,2837,3698,3703,3830 'linux':76,129,571,588,605,734,741,822,829,858,3784 'liv':1516,3734 'live':1714 'load':2244 'local':9,44,82,194,238,241,447,457,475,487,796,852,951,980,1362,1593,1646,1650,1699,1718,1822,2136,2446,2612,2615,2934,3452,3493,3529,3541,3603,3714,3742,3743 'local-on':1592 'localhost':85,245,490,757,958,1669,1693,1701,1824,2148,2184,2258,2304,2337,2361,2617,2950,3457,3546,3696,3711 'log':1576 'login':262,387,396,1018,1041,1048,1131,1144,1178,1195,1412,1453,1474,1535,1630,3584 'logout':1585 'look':2229,2546 'loop':456,2952,3508,3692,3821 'lower':481 'lower-lat':480 'm':802 'm1':62 'm5':63 'mac':553 'machdep.cpu.brand':698 'machin':77,486,2461,3497,3519 'maco':706 'make':543 'manag':3365 'manual':1634,3399 'match':1863 'max':2673,2677,2683,2688,2741,2745,2765,2770,2971,2985,3035,3037,3068,3075,3080,3239,3246,3251 'may':131,1951,3637,3785 'mean':1680,2391 'membership':135 'memori':170,2028,2030,2080,2084,2089,2093,2097,2100,2195,2275,2293,2357,2367,2378,2383,2397 'memory-rel':2029 'mention':474,495,3674 'menu':1032 'messag':2824 'metadata':2126 'method':1753 'metric':463,1689,1708,1979,1981,2165,2936,3494,3630,3697,3793 'min':2678,2682,2746,2750 'min/max':2702 'miss':1963,2860 'mkdir':1243 'mode':79,203,443,797,1564,1647,3568 'mode-detection-run-at-the-start-of-an-interact':1563 'model':2128,2161,2171,2312,2324,2403,3759,3771,3797 'moder':2233 'monitor':5,12,26,40,111,164,669,674,744,2416,2945,3000,3019,3084,3255,3430,3439,3515,3685 'month':2037,2042,2273,2290,2349 'morn':3267,3325 'much':2328 'multi':3412 'multi-devic':3411 'mv':1337 'n':424,697,1083,3197 'name':213,221,226,620,724,879,1728,1856,1862,2130,2315,2326,2469,2650,2810,3800 'natur':494,2834,3676 'natural-languag':2833 'need':471,503,1546,1659,2579,3371,3669,3678,3786 'neither':509 'nest':1874 'network':930 'neutral':38 'never':1492,3718,3747,3774 'next':1300 'night':2698 'node.js':548 'nohead':727 'non':394,1176,1419,1451,1677,2708,3553 'non-interact':393,1175,1418,1450 'non-norm':2707 'non-zero':1676,3552 'normal':1146,1995,2209,2497,2502,2564,2694,2709,2775,3304,3309,3333 'normal/warning/critical':3654 'note':1586 'null':1957,2763,2916 'number':2977 'numer':3656 'nvidia':64,69,713,719,736 'nvidia-smi':712,718 'o':562,579,596,842,941 'occur':2711 'offer':987,1138,3558 'offer-cloud-connect':1137 'offlin':97 'ok':422,429 'omit':1953 'one':3393 'one-lin':3392 'open':190,3487 'option':1028,1125,1368,1464,1468,3590 'optional-env-or-yaml-without-cli-login':1467 'os':688,692,804,833,857 'os/arch':788 'otherwis':2112 'output':639,898 'overnight':2632 'overview':31,104,1868,2464,2467,2649 'p':628,631,634,887,890,893,1244 'pars':2198 'past':1024,1212,1495,1538 'path':1150,1703,1754 'pattern':1518 'peak':1886,1969,1975,2855,2896,2899 'per':1767,1922,2041,2050,2059,2903 'per-devic':1766 'perf':2902 'perf_per_watt.perf':1921 'perf_per_watt.value':1919,2858,2905 'permiss':154,928 'person':3805 'phrase':668 'pick':1067,3384 'pipe':1185,1428 'pkill':1356,3432,3446 'plain':2920 'platform':123,3781 'point':1778,1870,2640,2670,2671,2675,2680,2685,2691,2738,2739,2743,2748,2754,2758,2767,2772 'poll':189,2948,3507,3691,3820 'port':1702 'post':143 'post-instal':142 'power':20,167,178,1889,1890,1892,1893,2016,2017,2035,2039,2044,2048,2053,2057,2063,2066,2193,2271,2341,2352 'prefer':523,1132,3398 'present':2829 'press':3010 'pressur':2098,2101,2276,2294,2374 'prev':3026,3028,3198,3201,3208,3222,3230,3233 'primari':1408,1879,1882,2476,2821,3151,3187 'print':340,358,1299,1305,1325,1331,2156 'prioriti':444 'proactiv':15,109,454,1115,2943,3469,3513,3684 'proactive-fleet-monitor':3512 'prometheus':56,640,899,1707,3802 'provid':1229 'purpos':1755 'pushi':3665 'q':1260 'quantiz':2402,3770 'queri':95,722,974,979,2135,2406,2453,3528,3542 'query-gpu':721 'question':202,2435,3521,3668 'quick':972,977,2133,2253,3526 'quick-status-queries-local-real-tim':976,3525 'quiet':2697 'r':250,286,295,438,2519,3112,3136,3172,3315 'rate':3377 'ratio':2073,2099 'raw':1238,1373,2940,3749 're':1059,2320 'reach':3079,3250 'read':966,1439 'real':48,90,192,981,2138,2443,3530,3833 'real-tim':47,89,2137,2442 'realtim':483,493,2935,3520,3605 'recoveri':2816 'reduc':2243 'refer':228,1733,1858,1980 'relat':2031 'releas':526,784 'relev':3702 'render':1846,3837 'repo':540 'report':964,2167,2214,2318,2345,2717,2825,2918,3268,3327,3459,3652 'requir':120,132,545,2417,3775 'respond':414 'respons':1523,2531,3462,3806 'restart':624,883,1062,1354,3388,3442 'retri':3646 'return':3631 'risk':7,28,52,172,969,1898,1903,1992,2001,2004,2009,2012,2015,2018,2021,2024,2027,2032,2180,2189,2200,2206,2267,2269,2286,2471,2540,2814,3145,3181 'rm':609,867 'rootless':149 'rout':1736 'rtx':67 'rule':1221,1223,3533 'run':43,205,240,383,510,542,618,752,770,877,1014,1044,1051,1155,1441,1554,1566,1581,1626,1639,1665,1688,2321,3480,3504,3627,3777 'say':1521,2414,3810,3828 'scope':3408 'score':53,970,1896,1899,1901,1904,1917,2005,2013,2019,2025,2033,2221,2226,2287,2472,2524,2529,2544,2556,2557,2575,2576,2644,2684,2687,2766,2769,2812,2815,3030,3117,3122,3143,3146,3179,3182,3204,3207,3210,3212,3224,3227,3235,3237,3657 'script':3410 'second':2818,3005,3644 'section':1277 'secur':3717 'sed':3391 'see':140,217,1220,1461,2425,2441 'select':2692,2773,3138,3174 'set':180,388,672,681,1179,1197,1422,1527,1603,2970,3374,3816 'setup':514,519,665,1147,3472,3564,3610,3746 'sever':1905,1906,1908,1909,1993,2191,2207,2216,2270,2289,2473,2645,2693,2710,2774,3139,3175,3650,3653 'sf':244,431,756,957,1376,1668,3545 'sfl':558,575,592,837,936 'show':1507,2590,3724,3748 'shown':1621 'sign':405,1006,1036,1541,1613,2420,2454 'silicon':61,555,2388,3756 'singl':93,461,3518,3607 'single-devic':92,460,3606 'single-machin':3517 'skill':158,1502,1522 'skill-keldron-agent' 'skip':771 'sleep':853,953,1359,1363,3090,3261,3449,3453 'smaller':2400,3768 'smi':714,720 'sourc':537 'source-keldron-ai' 'space':1316 'spike':3218 'srr':2870 'stabil':1950,2862,2907,2911,2914 'start':208,678,794,921,1200,1569,1642,3560 'status':251,439,761,962,973,978,1673,1769,1872,2134,2254,3527,3550 'stdin':1189,1430 'step':683,746,773,778,985,1123,1133,1135,1462,1465,3625 'still':1602,3638 'stop':627,886,3014,3020,3085,3256,3429,3437 'store':1225,1413,1493 'stream':398,1072,1398,1446,3418 'string':699,1927,1940 'style':2532 'sub':1912,1914,1916,2220 'sub-scor':2219 'sudo':119,133,3776,3787 'suggest':2398,3473,3766 'summar':1079 'summari':2836 'support':59 'swap':2115,2119,2370,2390,3758,3763 'sysctl':696 'system':2114,2118,2369 'take':2247 'telemetri':50,106,1102 'tell':1390,3378 'temp':1884,1887,1967,1970,1976,2674,2679,2703,2742,2747,2752,2819,2853,2856,2891,2894,2897,2900,2924,3149,3185 'temperatur':166,967,1877,1878,1880,1881,1985,1988,2144,2153,2264,2281,2475,2642,2676,2681,2744,2749,2759,3150,3186,3634 'temporari':1205 'termin':1851 'text':2280 'thermal':743,1911,1913,1915,1949,2010,2011,2192,2861,2906,2910,2913 'threshold':2225 'throttl':2106,2110 'time':49,91,982,2139,2444,3531 'timeout':3087,3258 'tls':1738 'toler':1961 'tool':3404 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-gpu-monitoring' 'topic-hardware-monitor' 'topic-openclaw' 'topic-openclaw-skill' 'topic-skill-md' 'topic-skillsmp' 'total':1388,2090,2094,2384,2491,2495,2536,2802,2976,3298,3302,3322,3331 'tr':342,360 'track':14,177,1113 'transcript':1219 'trap':3015 'trend':2844 'trigger':667 'true':616,874,1269,1347,3041 'tti':1162 'ui':1722 'unam':689,801 'unavail':1955 'unifi':2396 'unit':1929,1942 'unknown':703 'unless':626,885,1595 'unless-stop':625,884 'unlimit':2996 'unprivileg':3778 'unreach':2413,3738,3744 'unset':2992 'updat':1248,1279 'upsel':3661 'uri':2871 'url':1490,1740,1843,2587 'use':80,98,156,466,489,1021,1148,1203,1369,1421,1560,1658,1737,1958,1965,2081,2086,2116,2121,2379,2465,2641,2851,2922,2946,3492,3522,3597,3686,3693,3792 'user':161,992,1153,1228,1392,1520,1836,3022,3370,3753,3809,3827 'user-provid':1227 'util':168,968,2072,2075,2266,2284 'v':279,308,711,862,1289,2197,2278,2344,2372 'valu':1080,2174 'var':1371 'variabl':1207,1233,1432 'vendor':37 'vendor-neutr':36 'verifi':657,1050,1365,1662,3543 'version':661,1726 'via':54,187,1188,1429,3006 'volatil':2022,2023,2194 'vs':2699 'wait':3642 'walk':3623 'want':162,479,1093,1165 'warm':3640 'warn':1997,2211,2241,2503,2508,2549,2555,2690,2771,3094,3099,3162,3177,3192 'watch':184,2712,2954,2962,3500,3814 'watt':1923,2064,2069,2904 'web':1719 'whether':2705 'whoami':1055,1558,3596 'whole':2427 'window':1775,1779,1787,1791,1796,1802,1924,1930,1932,1937,1943,1945,2660,2728,2791,2847,2880,3276 'without':1129,1161,1472,1633,2436 'work':96 'workload':2393 'worst':1764,2515,2520,2523,2528,2542,2784,3027,3029,3108,3113,3116,3121,3199,3200,3202,3206,3209,3219,3223,3226,3231,3232,3234,3236 'write':230 'x':567,584,601,847,946,1382,1486,1748,2486,2664,2732,2795,2884,3056,3280,3293 'x-api-key':1381,1485,1747,2485,2663,2731,2794,2883,3055,3279,3292 'x.xx':2292 'x86':815 'xarg':344,362 'xx':2282,2285,2295 'xx/100':2288 'yaml':263,1128,1253,1471,1601,1637,3396,3402 'yaml-awar':3401 'yes':1013 'yet':1077 'yq':309,314,322,3406 'z':273,302,373,3064 'zero':1678,3554","prices":[{"id":"baf9f0d5-9490-4c51-b7df-81519efa7645","listingId":"e69cfb78-db5d-43c9-beef-fa9cac899d71","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"keldron-ai","category":"keldron-agent","install_from":"skills.sh"},"createdAt":"2026-05-18T13:23:00.322Z"}],"sources":[{"listingId":"e69cfb78-db5d-43c9-beef-fa9cac899d71","source":"github","sourceId":"keldron-ai/keldron-agent","sourceUrl":"https://github.com/keldron-ai/keldron-agent","isPrimary":false,"firstSeenAt":"2026-05-18T13:23:00.322Z","lastSeenAt":"2026-05-18T19:15:07.969Z"}],"details":{"listingId":"e69cfb78-db5d-43c9-beef-fa9cac899d71","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"keldron-ai","slug":"keldron-agent","github":{"repo":"keldron-ai/keldron-agent","stars":6,"topics":["agent-skills","claude-code","claude-skills","gpu-monitoring","hardware-monitor","openclaw","openclaw-skill","skill-md","skillsmp"],"license":"apache-2.0","html_url":"https://github.com/keldron-ai/keldron-agent","pushed_at":"2026-04-06T07:16:20Z","description":"Vendor-neutral GPU monitoring agent with risk intelligence. Open source.","skill_md_sha":"7ac8387f532fdf8885e8a57cadcc1de220001307","skill_md_path":"SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/keldron-ai/keldron-agent"},"layout":"root","source":"github","category":"keldron-agent","frontmatter":{"name":"keldron-agent","description":"GPU monitoring with risk intelligence. Local + cloud fleet monitoring, health tracking, proactive alerts, and AI-powered fleet analytics."},"skills_sh_url":"https://skills.sh/keldron-ai/keldron-agent"},"updatedAt":"2026-05-18T19:15:07.969Z"}}