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

# ai.me-preferences@1 · OpenVibe.Services

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

# AiMePreferencesV1 `ai.me-preferences@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/me-preferences.v1.json`](/docs/contracts/ai.me-preferences.json)

ai.me-preferences@1 (OpenVibe.AI; L36 Y1/Y3): how one person's AI runs route, stored per person under GET/PUT /api/v1/me/ai/preferences. \`only\_my\_keys\` means exactly that: a failed or missing key is never quietly replaced by a paid route. \`free\_first\` puts free tiers ahead of paid ones. \`price\_ceiling\_usd\_per\_mtok\` caps the network's paid fallback per million tokens; the person's own keys are never capped. Each default is a model id or \`auto\`.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `only_my_keys` | boolean | yes |  |  |
| `free_first` | boolean | yes |  |  |
| `price_ceiling_usd_per_mtok` | number \| null | yes |  | - `minimum 0`<br>- `maximum 1000` |
| `defaults` | object | yes |  | - `no other fields` |
| `defaults.text` | `https://openvibe.network/contracts/ai/me-preferences.v1.json#/$defs/modelChoice` | yes |  |  |
| `defaults.code` | `https://openvibe.network/contracts/ai/me-preferences.v1.json#/$defs/modelChoice` | yes |  |  |
| `defaults.vision` | `https://openvibe.network/contracts/ai/me-preferences.v1.json#/$defs/modelChoice` | yes |  |  |
| `defaults.image` | `https://openvibe.network/contracts/ai/me-preferences.v1.json#/$defs/modelChoice` | yes |  |  |
| `defaults.search` | `https://openvibe.network/contracts/ai/me-preferences.v1.json#/$defs/modelChoice` |  |  |  |
| `updated_at` | string \| null |  |  | - `format date-time` |

## Examples

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

 Valid: defaults

~~~~
{
  "only_my_keys": true,
  "free_first": true,
  "price_ceiling_usd_per_mtok": 5,
  "defaults": {
    "text": "auto",
    "code": "claude-sonnet-5-5",
    "vision": "auto",
    "image": "auto"
  },
  "updated_at": "2026-10-31T09:00:00.000Z"
}
~~~~

Rejected: missing-image

~~~~
{
  "only_my_keys": false,
  "free_first": false,
  "price_ceiling_usd_per_mtok": null,
  "defaults": {
    "text": "auto",
    "code": "auto",
    "vision": "auto"
  }
}
~~~~

## Validate

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