---
title: "agents.install@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/agents.install"
updated: null
---

# agents.install@1 · OpenVibe.Services

HTML: [agents.install@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/agents.install)

# AgentsInstall `agents.install@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: actor
- Visibility: public
- Status: active
- Compatibility: backward
- Decision: [ADR-044](/docs/adr/ADR-044)
- Schema: [`https://openvibe.network/contracts/agents/install.v1.json`](/docs/contracts/agents.install.json)

agents.install@1 (agent-blueprints.md, 2026-11-12): a person's own agent made from one blueprint version. AGENT is the agent it made (actor.agent@1's id), BLUEPRINT the version it runs, INPUTS what the person filled in, AGREED the asks the install screen showed and the person accepted (openvibe-sdk/agents/blueprint asks(), by key), PLACES the machines the person chose for the blueprint's places (their own, or shared with them by a grant), UPDATES whether a new version that asks for no more is taken without asking (a version that asks for more always waits for a yes). Keys and grants are the person's own and are never copied into an install.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `agent` | string | yes |  | - `pattern ^agt_[A-Za-z0-9]{6,40}$` |
| `owner` | object | yes |  | - `no other fields` |
| `owner.type` | const | yes |  | - `= "user"` |
| `owner.id` | string | yes |  | - `pattern ^usr_[A-Za-z0-9]{6,40}$` |
| `blueprint` | string | yes |  | - `pattern ^bp_[A-Za-z0-9_-]{3,40}@[1-9][0-9]{0,5}$` |
| `inputs` | object |  |  |  |
| `agreed` | array of string | yes | The keys of the asks agreed to (hands:ov:live.chat.post, places:own, when:event:live.stream.started, …). | - `maxItems 120`<br>- `unique items`<br>- `items: pattern ^[a-z]+:[^\s]{1,1900}$` |
| `places` | object |  |  | - `no other fields` |
| `places.own` | array of string |  | The person's own Link machines. | - `maxItems 20`<br>- `unique items`<br>- `items: minLength 1`<br>- `items: maxLength 160` |
| `places.shared` | array of string |  | Machines shared with the person; each use still needs that machine's grant. | - `maxItems 20`<br>- `unique items`<br>- `items: minLength 1`<br>- `items: maxLength 160` |
| `updates` | enum | yes |  | - `one of "ask", "same-or-less"` |
| `pending` | string \| null |  | A newer version that waits for the person's yes. | - `pattern ^bp_[A-Za-z0-9_-]{3,40}@[1-9][0-9]{0,5}$` |
| `installed_at` | string | yes |  | - `format date-time` |
| `updated_at` | string |  |  | - `format date-time` |

## Examples

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

 Valid: a-wider-version-waiting

~~~~
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@2",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "ask",
  "pending": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@3",
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z"
}
~~~~

Valid: clip-finder-for-a-streamer

~~~~
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@3",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "same-or-less",
  "pending": null,
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z"
}
~~~~

Rejected: a-blueprint-without-a-version

~~~~
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "same-or-less",
  "pending": null,
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z"
}
~~~~

Rejected: keys-copied-in

~~~~
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@3",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "same-or-less",
  "pending": null,
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z",
  "keys": {
    "gemini": "not-a-real-key"
  }
}
~~~~

## Validate

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