# Using Private Workers

> Run tasks on your own hardware.

**URL:** https://inference.sh/docs/private/using
**Last updated:** 2026-09-25

---

Run tasks on your own hardware.

---

## In the workspace

Toggle to "Private" when running an app:

```
Run on: [○ Cloud] [● Private]
```

---

## Via API

```python
result = client.run({
    "app": "my-app",
    "input": {...},
    "infra": "private"
})
```

Use `infra: "private_first"` when you want private workers when available, with automatic cloud fallback:

```python
result = client.run({
    "app": "my-app",
    "input": {...},
    "infra": "private_first"
})
```

---

## Specific workers

Target exact workers:

```python
result = client.run({
    "app": "my-app",
    "input": {...},
    "infra": "private",
    "workers": ["my-server-gpu-0"]
})
```

---

## Agents on private

Agents can use private workers too.

When an agent calls a tool, it respects your infra setting.

---

## Monitoring

In the sidebar, open **Resources** → **Engines** ([`/engines`](https://app.inference.sh/engines)) to check status:

- Online/offline status
- Resource usage
- Running tasks
- **Drain** / **Update** — graceful maintenance (see [Updating](/docs/private/installing#updating))

To drain or upgrade an engine without killing in-flight tasks, see [Managing engines](/docs/private/managing-engines).

Use **Drain** before maintenance or **Update** for a safe binary upgrade (in-flight tasks finish first). The same operations are available via the [Engines API](/docs/api/rest/engines) or `client.engines.drain()` / `client.engines.updateBinary()` in the JavaScript SDK.

---

## Caching

The engine caches:
- App code
- Downloaded models
- Container images

Second runs are much faster.

---

## Next

| Guide | Topic |
|-------|--------|
| [Managing engines](/docs/private/managing-engines) | Drain, update, and restart |
| [Configuration](/docs/private/config) | Engine and worker settings |
| [Why private?](/docs/private/why) | When to use your own hardware |

→ [Back to Docs](/docs)
