# Model Providers and Base Models

## Read Current State

```bash
curl --fail-with-body \
  -H "Authorization: Bearer $GATEWAY_ADMIN_TOKEN" \
  "$GATEWAY_BASE_URL/api/admin/catalog/providers"

curl --fail-with-body \
  -H "Authorization: Bearer $GATEWAY_ADMIN_TOKEN" \
  "$GATEWAY_BASE_URL/api/admin/catalog/base-models"
```

Public read-only catalog endpoints also exist at `/api/v1/public/catalog/providers` and `/api/v1/public/catalog/base-models`.

## Provider Catalog

Create a provider:

```bash
curl --fail-with-body \
  -H "Authorization: Bearer $GATEWAY_ADMIN_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "providerKey": "example-openai",
    "code": "example-openai",
    "displayName": "Example OpenAI Compatible",
    "providerType": "openai",
    "defaultBaseUrl": "https://api.example.com/v1",
    "defaultAuthType": "APIKey",
    "source": "gateway",
    "capabilitySchema": {},
    "defaultRateLimitPolicy": {},
    "metadata": {"protocol": "openai-compatible"},
    "status": "active"
  }' \
  "$GATEWAY_BASE_URL/api/admin/catalog/providers"
```

Use `PATCH /api/admin/catalog/providers/{providerID}` with the complete current provider body to update. `providerType` selects the runtime client through the platform candidate. Common supported values include `openai`, `gemini`, `volces`, `keling`, `minimax`, and `universal`. Unknown types may fall back to the OpenAI client, so never leave a custom integration type ambiguous.

Delete with `DELETE /api/admin/catalog/providers/{providerID}` only after checking platform references and obtaining confirmation.

## Base Model

Create a base model after its provider exists:

```bash
curl --fail-with-body \
  -H "Authorization: Bearer $GATEWAY_ADMIN_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "providerKey": "example-openai",
    "canonicalModelKey": "example-openai:example-chat",
    "providerModelName": "example-chat",
    "modelType": ["text_generate"],
    "modelAlias": "example-chat",
    "displayName": "Example Chat",
    "capabilities": {
      "text_generate": {
        "supportedApiProtocols": ["openai_chat_completions"]
      }
    },
    "baseBillingConfig": {
      "textInputPer1k": 0.001,
      "textOutputPer1k": 0.002
    },
    "defaultRateLimitPolicy": {},
    "runtimePolicyOverride": {},
    "metadata": {"description": "Example OpenAI-compatible chat model"},
    "catalogType": "custom",
    "defaultSnapshot": {},
    "pricingVersion": 1,
    "status": "active"
  }' \
  "$GATEWAY_BASE_URL/api/admin/catalog/base-models"
```

Use `PATCH /api/admin/catalog/base-models/{baseModelID}` with a complete body to update. Do not omit capabilities, billing, policy bindings, metadata, or status unintentionally.

Reset endpoints are destructive:

- `POST /api/admin/catalog/base-models/{baseModelID}/reset`
- `POST /api/admin/catalog/base-models/reset-all`

Only system-seeded models with default snapshots can be reset. Delete with `DELETE /api/admin/catalog/base-models/{baseModelID}` only after checking platform-model bindings.
