# uip model-hub

> Syntax and options for `uip model-hub`, a read/configure view over LLM Gateway routing rules — organizations, tenants, custom-routings, routing-history, and policy-previews.

`uip model-hub` is a read/configure view over **LLM Gateway routing** — which model backs a given (product, feature) pair, in which region, and who can override that default. Five command groups: `organizations`, `tenants`, `custom-routings`, `routing-history`, `policy-previews`. All require the `OrganizationAdmin` role for AI Trust Layer.

See [`uip llm-gateway`](./uip-llm-gateway.md) for the discovery-side API this configuration ultimately feeds.

## Concepts

- **Product / feature / model.** A routing rule is keyed by a `--product` (e.g. `agenthub`), a `--feature` within it (e.g. `llm-call`), and a `--model` identifier. `tenants get` returns every rule for the current tenant, grouped by product.
- **Custom routing overrides the default.** `custom-routings create` upserts a rule that redirects a (product, feature, primary-model) tuple from its default region to a different model/region pair; if the target you set matches the GitOps default, the override is removed rather than stored as a redundant rule.
- **Regions.** The valid geography codes are `EU`, `CA`, `US`, `SI`, `JA`, `AU`, `IN`, `UK`, `CH`, `UAE`, `SK`, `GLOBAL` — passing anything else to a region option fails client-side before any network call.
- **Policy previews are read-only.** `policy-previews get` computes what `tenants get`'s shape *would* look like if a given governance policy were active — it does not apply anything.

## Synopsis

```
uip model-hub organizations get [--tenant <name>]
uip model-hub tenants get [--tenant <name>] [--force-refresh]
uip model-hub custom-routings get --product <name> --feature <name> --primary-model <id> --current-model <id> [--primary-model-region <region>] [--current-region <region>] [--tenant <name>]
uip model-hub custom-routings create --product <name> --feature <name> --primary-model <id> --primary-model-region <region> --current-model <id> --current-region <region> [--tenant <name>]
uip model-hub routing-history list --product <name> --feature <name> --model <id> [--tenant <name>]
uip model-hub policy-previews get <policy-id> [--tenant <name>]
```

All verbs also accept `--login-validity <minutes>` (override the interactive-login token lifetime).

## uip model-hub organizations get

Fetch the Model Hub organization overview — per-tenant model counts (total/active/custom/deprecating-soon) and blocked-entry totals.

### Options

| Long | Value | Description |
|---|---|---|
| `--tenant <name>` | string | Target tenant name (scopes which tenant's counts to include if the org spans several — otherwise informational). |
| `--login-validity <minutes>` | integer | Override the interactive-login token lifetime. |

### Example

```bash
uip model-hub organizations get
```

### Data shape (--output json)

```json
{
  "Code": "ModelHubOrganizationsGet",
  "Data": {
    "tenants": [
      {
        "tenantName": "DefaultTenant",
        "tenantId": "00000000-0000-0000-0000-000000000000",
        "region": "westeurope",
        "totalModels": 42,
        "activeModels": 38,
        "customModels": 2,
        "deprecatingSoonModels": 1,
        "blockedEntries": 0
      }
    ]
  }
}
```

## uip model-hub tenants get

Fetch the Model Hub tenant overview for the current tenant — every routing rule, grouped by product, with model/managed-by/status/BYO-onboarding state.

### Options

| Long | Value | Description |
|---|---|---|
| `--tenant <name>` | string | Target tenant name. |
| `--force-refresh` | flag | Bypass any cache backing this view (including the resolved policy) and re-fetch from source. Default `false`. |
| `--login-validity <minutes>` | integer | Override the interactive-login token lifetime. |

### Example

```bash
uip model-hub tenants get
```

### Data shape (--output json)

```json
{
  "Code": "ModelHubTenantsGet",
  "Data": {
    "products": [
      {
        "modelHubProduct": "agenthub",
        "rules": [
          {
            "feature": "agenthub-llm-call",
            "model": "anthropic.claude-sonnet-4-20250514-v1:0",
            "managedBy": "UiPath",
            "modelStatus": "Active",
            "isBlocked": false,
            "isFeatureOnboardedToByo": false
          }
        ]
      }
    ]
  }
}
```

## uip model-hub custom-routings get

Look up the per-region model-availability map for a (product, feature, primary-model) tuple — use this to pick valid `--current-model`/`--current-region` values before running `custom-routings create`.

### Options

| Long | Value | Required | Description |
|---|---|---|---|
| `--product <name>` | string | **yes** | Model Hub product, e.g. `agenthub`. |
| `--feature <name>` | string | **yes** | Feature within the product, e.g. `llm-call`. |
| `--primary-model <id>` | string | **yes** | Base rule's model identifier whose regional alternatives to enumerate. |
| `--current-model <id>` | string | **yes** | Required by server-side request validation and echoed back in the response — pass the same value as `--primary-model` if you have no other choice yet. |
| `--primary-model-region <region>` | `EU`\|`CA`\|`US`\|`SI`\|`JA`\|`AU`\|`IN`\|`UK`\|`CH`\|`UAE`\|`SK`\|`GLOBAL` | no | Sent for request-shape completeness; not used for the lookup itself. |
| `--current-region <region>` | `EU`\|`CA`\|`US`\|`SI`\|`JA`\|`AU`\|`IN`\|`UK`\|`CH`\|`UAE`\|`SK`\|`GLOBAL` | no | Sent for request-shape completeness; not used for the lookup itself. |
| `--tenant <name>` | string | no | Target tenant name. |
| `--login-validity <minutes>` | integer | no | Override the interactive-login token lifetime. |

### Example

```bash
uip model-hub custom-routings get \
  --product agenthub --feature llm-call \
  --primary-model gpt-5-mini-2025-08-07 --current-model gpt-5-mini-2025-08-07
```

### Data shape (--output json)

```json
{
  "Code": "ModelHubCustomRoutingsGet",
  "Data": {
    "organizationId": "00000000-0000-0000-0000-000000000000",
    "tenantId": "00000000-0000-0000-0000-000000000000",
    "modelHubProduct": "agenthub",
    "feature": "llm-call",
    "primaryModel": "gpt-5-mini-2025-08-07",
    "currentModel": "gpt-5-mini-2025-08-07",
    "availableModelsInRegions": {
      "EU": [{ "model": "gpt-5-mini-2025-08-07", "isBlockedByPolicy": false }],
      "US": [{ "model": "gpt-5-mini-2025-08-07", "isBlockedByPolicy": false }]
    }
  }
}
```

## uip model-hub custom-routings create

Upsert a custom routing rule for (product, feature, primary-model). If the requested target matches the GitOps default, the existing custom rule is removed instead. Returns the resulting tenant overview (same shape as `tenants get`).

### Options

| Long | Value | Required | Description |
|---|---|---|---|
| `--product <name>` | string | **yes** | Model Hub product. |
| `--feature <name>` | string | **yes** | Feature within the product. |
| `--primary-model <id>` | string | **yes** | Base rule's model identifier being overridden. |
| `--primary-model-region <region>` | `EU`\|`CA`\|`US`\|`SI`\|`JA`\|`AU`\|`IN`\|`UK`\|`CH`\|`UAE`\|`SK`\|`GLOBAL` | **yes** | Region of the base rule. |
| `--current-model <id>` | string | **yes** | Target model to route to (often the same as `--primary-model`). |
| `--current-region <region>` | `EU`\|`CA`\|`US`\|`SI`\|`JA`\|`AU`\|`IN`\|`UK`\|`CH`\|`UAE`\|`SK`\|`GLOBAL` | **yes** | Target region to route to. |
| `--tenant <name>` | string | no | Target tenant name. |
| `--login-validity <minutes>` | integer | no | Override the interactive-login token lifetime. |

Invalid region values on either region flag fail client-side, listing the accepted set, before any network call.

### Example

```bash
uip model-hub custom-routings create \
  --product agenthub --feature llm-call \
  --primary-model gpt-5-mini-2025-08-07 --primary-model-region US \
  --current-model gpt-5-mini-2025-08-07 --current-region EU
```

### Data shape (--output json)

Same shape as `tenants get`, reflecting the rule immediately after the upsert — e.g. the affected rule's `modelRouting`/`effectiveDefaultModelRouting` will show `"EU"`.

## uip model-hub routing-history list

List routing-rule change history for a (product, feature, model) — old/new model and region per change, the actor, and the timestamp.

### Options

| Long | Value | Required | Description |
|---|---|---|---|
| `--product <name>` | string | **yes** | Model Hub product. |
| `--feature <name>` | string | **yes** | Feature within the product. |
| `--model <id>` | string | **yes** | Model identifier whose history to retrieve. |
| `--tenant <name>` | string | no | Target tenant name. |
| `--login-validity <minutes>` | integer | no | Override the interactive-login token lifetime. |

### Example

```bash
uip model-hub routing-history list \
  --product agenthub --feature llm-call --model gpt-5.1-2025-11-13
```

### Data shape (--output json)

```json
{
  "Code": "ModelHubRoutingHistoryList",
  "Data": [
    {
      "product": "agenthub",
      "feature": "llm-call",
      "oldModel": "gpt-5.1-2025-11-13",
      "oldRegion": "EU",
      "oldConfigIsByo": false,
      "newModel": "gpt-5.1-2025-11-13",
      "newRegion": "CA",
      "newConfigIsByo": false,
      "actor": "User",
      "organizationId": "00000000-0000-0000-0000-000000000000",
      "tenantId": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-22T10:15:00.000Z"
    }
  ]
}
```

`actor` is `"System"` or `"User"`. `Data` is `[]` when there's no history for the tuple, not an error.

## uip model-hub policy-previews get

Preview the tenant Model Hub configuration that would result if a given governance policy were applied — same response shape as `tenants get`, computed against `<policy-id>` instead of the currently-active policy. Read-only; does not activate anything.

### Arguments

| Name | Required | Purpose |
|---|---|---|
| `<policy-id>` | yes | Governance policy ID to preview. |

### Options

| Long | Value | Description |
|---|---|---|
| `--tenant <name>` | string | Target tenant name. |
| `--login-validity <minutes>` | integer | Override the interactive-login token lifetime. |

### Example

```bash
uip model-hub policy-previews get 11111111-2222-3333-4444-555555555555
```

### Data shape (--output json)

```json
{
  "Code": "ModelHubPolicyPreviewsGet",
  "Data": {
    "products": [
      {
        "modelHubProduct": "agenthub",
        "rules": [
          {
            "feature": "llm-call",
            "model": "gpt-5-mini-2025-08-07",
            "managedBy": "UiPath",
            "modelStatus": "Active",
            "isBlocked": true,
            "isFeatureOnboardedToByo": false
          }
        ]
      }
    ]
  }
}
```

## Error behavior

Every verb fails the same way on an auth/permission problem: `Instructions: "Ensure you are logged in with 'uip login' and your account has the OrganizationAdmin role for AI Trust Layer."` — check `Message` for the specific underlying error. Region-flag validation on `custom-routings get`/`create` fails before any network call, listing the accepted `EU`/`CA`/`US`/`SI`/`JA`/`AU`/`IN`/`UK`/`CH`/`UAE`/`SK`/`GLOBAL` set.

## See also

- [`uip llm-gateway`](./uip-llm-gateway.md) — LLM model discovery, the read side of what this configures.
- [`uip llm-configuration`](./uip-llm-configuration.md) — BYO LLM connections referenced by BYO-onboarded routing rules.
- [Tools (plugins)](./concepts-tools.md)
- [Global options](./global-options.md)
- [Exit codes](./exit-codes.md)
