---
title: "ai.model-list@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/ai.model-list"
updated: null
---

# ai.model-list@1 · OpenVibe.Services

HTML: [ai.model-list@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/ai.model-list)

# AiModelList `ai.model-list@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

- Version: 1.0.0
- Owner: ai
- Visibility: first-party
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/ai/model-list.v1.json`](/docs/contracts/ai.model-list.json)

ai.model-list@1: paginated list of model catalog entries returned by GET /v1/models.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `models` | [ai.model](/docs/contracts/ai.model) | yes |  |  |
| `count` | integer | yes | Number of models in this response. | - `minimum 0` |
| `cursor` | string \| null |  | Opaque cursor for the next page. |  |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

 Valid: empty

~~~~
{
  "models": [],
  "count": 0,
  "cursor": null
}
~~~~

Valid: two-models

~~~~
{
  "models": [
    {
      "provider_key": "qwen",
      "model_key": "qwen3-9b-abliterated",
      "type": "chat",
      "status": "active",
      "cost": {
        "in_per_mtok": 3,
        "out_per_mtok": 15,
        "cached_per_mtok": 0.3
      },
      "supports": {
        "json": true,
        "tools": true,
        "streaming": true,
        "vision": false
      },
      "id": "qwen/qwen3-9b-abliterated:q4_k_m@3f2a1c9",
      "family": "qwen3",
      "variant": "abliterated",
      "quant": "q4_k_m",
      "revision": "3f2a1c9",
      "sha256": "aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899",
      "license": "apache-2.0",
      "context": 32768,
      "capabilities": {
        "tools": true,
        "json": true,
        "vision": false,
        "stream": true
      },
      "modalities": [
        "text"
      ],
      "retail_rate": {
        "version": "rr-2026-11-03-001",
        "input_nano_usd_per_m": "3000",
        "cached_read_nano_usd_per_m": "300",
        "cache_write_nano_usd_per_m": "3000",
        "output_nano_usd_per_m": "15000",
        "per_request_nano_usd": "0"
      },
      "availability": "available"
    },
    {
      "provider_key": "meta-llama",
      "model_key": "llama_3.1_8b_instruct",
      "type": "chat",
      "status": "active",
      "cost": {
        "in_per_mtok": 2,
        "out_per_mtok": 10,
        "cached_per_mtok": 0.2
      },
      "supports": {
        "json": true,
        "tools": true,
        "streaming": true,
        "vision": false
      },
      "id": "meta-llama/llama_3.1_8b_instruct:fp16@bca2580",
      "family": "llama3.1",
      "variant": "original",
      "quant": "fp16",
      "revision": "bca2580",
      "sha256": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
      "license": "llama3.1",
      "context": 131072,
      "capabilities": {
        "tools": true,
        "json": true,
        "vision": false,
        "stream": true
      },
      "modalities": [
        "text"
      ],
      "retail_rate": {
        "version": "rr-2026-11-03-002",
        "input_nano_usd_per_m": "2000",
        "cached_read_nano_usd_per_m": "200",
        "cache_write_nano_usd_per_m": "2000",
        "output_nano_usd_per_m": "10000",
        "per_request_nano_usd": "0"
      },
      "availability": "available"
    }
  ],
  "count": 2,
  "cursor": null
}
~~~~

Rejected: bad-model

~~~~
{
  "models": [
    {
      "provider_key": "qwen",
      "model_key": "qwen3-9b-abliterated",
      "type": "chat",
      "status": "active",
      "cost": {
        "in_per_mtok": 3,
        "out_per_mtok": 15,
        "cached_per_mtok": 0.3
      },
      "supports": {
        "json": true,
        "tools": true,
        "streaming": true,
        "vision": false
      },
      "retail_rate": {
        "input_nano_usd_per_m": "3000.5"
      }
    }
  ],
  "count": 1,
  "cursor": null
}
~~~~

Rejected: missing-required

~~~~
{
  "models": [
    {
      "provider_key": "qwen",
      "type": "chat",
      "status": "active",
      "cost": {
        "in_per_mtok": 3,
        "out_per_mtok": 15,
        "cached_per_mtok": 0.3
      },
      "supports": {
        "json": true,
        "tools": true,
        "streaming": true,
        "vision": false
      }
    }
  ],
  "count": 1,
  "cursor": null
}
~~~~

Rejected: negative-count

~~~~
{
  "models": [],
  "count": -1,
  "cursor": null
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('ai.model-list@1', value);   // { valid, errors: [{ path, message }] }
~~~~
