@laplace.live/persona-sdkはPersonaプラグインAPIの公式TypeScript/JavaScriptクライアントライブラリであり、通信プロトコルスキーマの正式な型定義元です。本ページは型定義およびAPIの完全なリファレンスを提供します。サーバーの有効化、APIキー管理、および利用可能なRPCメソッドの一覧についてはプラグインAPIを参照してください。
本SDKはNode.js 22+、Bun、モダンWebブラウザ、OBSブラウザソースなど多様な実行環境で動作します。実行時の外部依存は通信スキーマの定義と検証を担うzodのみです。
npm install @laplace.live/persona-sdk以下のリファレンス表はSDKがエクスポートする型定義と厳密に一致しています。すべての型およびユーティリティ関数はパッケージルートからエクスポートされており、import type { … } from '@laplace.live/persona-sdk'で直接利用可能です。
何が構築できるか
Persona Consoleは本SDKを用いて構築された公式リファレンス実装です。シーン、レイヤー、素材インベントリ、表情、モーション、パラメータマッピング、ショートカット、トラッキングソース、全体設定のすべてを単一のブラウザタブで集中管理でき、配信中にスマートフォンなどのタッチ端末から快適に操作できるよう最適化されています。
Webコンソールはデスクトップ側の独自コードに一切依存せず、すべての操作をプラグインAPI経由で実行しています。そのため、本SDKを用いることで同等の操作を行うツールや連携システムを自由に構築できます。
クライアント実装時には以下の設計パターンの採用を推奨します。
- モデル形式やバージョン番号ではなく、機能ケイパビリティに基づいて判定する:各インスタンスの操作UIは、
InstanceRuntime.capabilitiesを確認した上で動的に有効・無効を切り替えます。これにより、非対応フォーマットに対する呼び出しエラー(unsupported-for-format)の発生を防ぎます。 - 再接続時はキャッシュを破棄して状態を同期し直す:WebSocket切断中に発生したイベントは再送されないため、ローカルキャッシュがサーバー側の最新状態と乖離する可能性があります。再接続確立時はキャッシュを破棄し、必要な状態データを再取得してください。
- 恒久的な切断コード(Terminal Close Code)を適切にハンドリングする:
4001(キー失効)および4002(強制切断)を受信した場合は再接続を中止します。それ以外の切断時は自動再試行を行います。 - イベント購読のライフサイクルをSDKに委ねる:
persona.on(…)によるイベントリスナーは再接続時に自動で再登録されるため、呼び出し側で個別に再購読処理を記述する必要はありません。
HTTPSページから暗号化されていないws://プロトコルで接続する場合、ブラウザのセキュリティ制限によりローカルホスト(127.0.0.1)上のPersonaにのみ接続可能です。ローカルネットワーク上の別端末に接続する場合は、ページをHTTPで配信するか、Personaの前段にTLSリバースプロキシを設置してください。詳細はWebコンソールの接続説明を参照してください。
LLMプロンプト
以下のプロンプトをLLMに提供するか、プロジェクトのCLAUDE.mdやAGENTS.mdなどのルールファイルに追加することで、プラグイン開発に必要な完全なコンテキストを提供できます。
You are helping me build a plugin for LAPLACE Persona, a desktop VTuber app
(https://laplace.live/persona). Persona exposes a local WebSocket server called the
Plugin API, and `@laplace.live/persona-sdk` is its typed client.
Before writing any code, fetch the reference documents listed at the end — they are
the single source of truth for method names, events, error codes and types. Do not
rely on memory and do not invent names.
## Setup
- Install `@laplace.live/persona-sdk`. Isomorphic: Node 22+, Bun, browsers and OBS
browser sources. Its only runtime dependency is zod.
- The user enables the server in Persona under Settings → Plugin API and creates an
API key there. Tokens look like `sk-lp-v1-…`. Default endpoint: `ws://127.0.0.1:25034`.
- Everything — values and types — is exported from the package root; there is no
other entry point.
## Client
```ts
import { PersonaClient } from "@laplace.live/persona-sdk";
const persona = new PersonaClient({
token: "sk-lp-v1-…", // required; everything else is optional
clientInfo: { name: "My Plugin", version: "1.0.0" }, // display-only identity
});
await persona.connect();
const { scenes, activeSceneId } = await persona.call("scene.list");
await persona.call("scene.patch", {
background: { mode: "color", color: "#00ff00", imageAssetId: null },
});
persona.on("motion.started", (m) => console.log("playing", m.group));
const mouth = persona.driveParameter("MouthOpen", 0.8); // parameter lease
mouth.set(0.3);
mouth.release();
```
`call(method, params?)` is fully typed — the method name determines the request and
response shapes.
Methods cover scenes, model instances, stage objects, expressions, motions, speech,
hotkeys, automations, model and asset registration, settings, tracking and pose
input, per-key storage and parameter injection. Events notify you of scene,
selection, expression, motion, speech, tracking and registry changes.
The exact method and event names, parameter shapes, error codes and limits live in
the reference below — look them up instead of guessing. Gate features on the
capabilities reported by `app.info` and `instance.list`, never on version strings.
## Reference
Fetch these before writing code. The documentation is served as raw Markdown —
append `.mdx` to any page URL (`.en.mdx` for English):
- https://laplace.live/persona/plugin-api.en.mdx — server setup, API keys, and every
method, event, error code and limit
- https://laplace.live/persona/sdk.en.mdx — the SDK client: options, auth modes and
every exported typeクライアント
import { PersonaClient } from "@laplace.live/persona-sdk";
const persona = new PersonaClient({ token: "sk-lp-v1-…" });
await persona.connect();
const { scenes, activeSceneId } = await persona.call("scene.list");
await persona.call("scene.patch", {
background: { mode: "color", color: "#00ff00", imageAssetId: null },
});
persona.on("motion.started", (m) => console.log("playing", m.group));PersonaClientは以下のオプションでインスタンス化します。tokenのみ必須です。
Prop
Type
ClientInfo
clientInfoはデスクトップアプリの設定画面(接続中のクライアント)に表示されるクライアント識別子を宣言します。この項目は任意設定の表示用メタデータであり、認証認可の判定には使用されません。SDKは再接続時にこの情報を自動で再通知します。
const persona = new PersonaClient({
token,
clientInfo: { name: "My Overlay", version: "1.2.0", developer: "You" },
});Prop
Type
認証方式
ブラウザ環境では、APIトークンはURLクエリパラメータ?token=経由で渡されます(ブラウザ標準WebSocket APIの仕様制約による)。Node.jsやBunなどのサーバー環境では、カスタムのcreateWebSocketフックを利用してAuthorization: Bearerヘッダー経由でトークンを渡すことが可能です(wsパッケージ併用)。
import WebSocket from "ws";
const persona = new PersonaClient({
token,
auth: "header",
createWebSocket: (url, headers) => new WebSocket(url, { headers }),
});WebSocketLikeはcreateWebSocketが返却すべきSocketの抽象インターフェースです。ブラウザ標準のWebSocketおよびwsクライアントは型アサーションなしで本インターフェースを満たします。
Prop
Type
Node.js 22以降では、グローバルのWebSocketがWebSocketInit拡張を通じてハンドシェイクヘッダーを送信できます。SDKのヘルパー関数createNodeClientは、これを使ってクライアントを作成します。
auth: 'header'を設定します。- Node.jsのグローバル
WebSocketを使用します。 - 接続タイムアウトを5秒に設定します。
- SDKの警告と恒久的な切断(APIキーの失効やサーバー側からの切断)を、渡された
log関数に出力します。
import { createNodeClient } from "@laplace.live/persona-sdk";
const persona = createNodeClient({
token: "sk-lp-v1-…",
log: console.warn,
});
await persona.connect();Prop
Type
パラメータリース駆動
driveParameterはモデルの特定パラメータに値を継続的に書き込むためのインターフェースで、操作用のInjectionHandleを返します。SDKがバックグラウンドでリースのキープアライブを自動維持し、最後の書き込みから約1秒後にリースが自動期限切れとなってパラメータが初期値へ安全に復帰します。これにより、クライアントプロセスの予期せぬ終了時にもモデルが停止したままになるのを防ぎます。
const mouth = persona.driveParameter("MouthOpen", 0.8);
mouth.set(0.3);
mouth.release();同一パラメータを同時にリースできるセッションは1つのみです。他のセッションが重複してリースを要求した場合はconflictエラーが返されます。
第3引数には重み係数(weight)およびバックグラウンドのキープアライブ失敗時に呼ばれるonErrorコールバックを指定できます。
Prop
Type
切断ハンドリング
onCloseはサーバーまたはネットワークに起因する切断を検知します。コールバックにはSocketのクローズコード、理由文字列、および再接続の試行が終了したかを示すterminalフラグが渡されます。
- 内部のクリーンアップ処理が完了した後に呼び出されるため、ハンドラー内で
close()を安全に呼び出せます。 - クライアント自身が明示的に呼んだ
close()では呼び出されません。 onCloseを指定すると、恒久的な切断はonWarningからは報告されなくなります。
Prop
Type
PersonaClientStateとクライアントエラー
type PersonaClientState = "closed" | "connecting" | "open" | "reconnecting";
type ClientErrorReason =
| "connect-timeout"
| "connection-closed"
| "client-closed"
| "not-connected"
| "request-timeout";クライアント自身またはトランスポート層でconnect()やcall()が失敗した場合、Promiseはreason: ClientErrorReason(CLIENT_ERROR_REASONSのいずれか)を持つPersonaClientErrorで拒否されます。サーバーがエラーフレームを返した場合は、call()がPersonaApiError(code: ApiErrorCode)で拒否されます。詳細はプラグインAPI:エラーコードを参照してください。
Prop
Type
定数定義
| エクスポート名 | 値 | 説明 |
|---|---|---|
PROTOCOL_VERSION | 4 | 通信プロトコル仕様の互換性破壊時にインクリメント。サーバーのhelloで報告 |
DEFAULT_API_HOST | 127.0.0.1 | デフォルトのループバック待受アドレス(ローカルネットワークアクセス無効時) |
DEFAULT_API_PORT | 25034 | デフォルトのWebSocketポート番号 |
SCENE_ACTIVATION_TIMEOUT_MS | 120000 | requestTimeoutMs未指定時のscene.activateのタイムアウト時間 |
ASSET_IMPORT_PROMPT_MS | 45000 | asset.importでプラグインフォルダ外のファイルをインポートする際、デスクトップ側でユーザー確認を待つタイムアウト時間(requestTimeoutMs未指定時、asset.importの既定タイムアウトは55000ミリ秒) |
CLOSE_KEY_REVOKED | 4001 | 恒久的切断コード:APIキーがサーバー側で失効 |
CLOSE_FORCE_DISCONNECTED | 4002 | 恒久的切断コード:ユーザーによって接続セッションが切断 |
CLOSE_SERVER_STOPPING | 1001 | 一時的切断コード:サーバープロセス停止中。復帰後に自動再接続 |
INJECT_LEASE_TTL_MS | 1000 | 注入パラメータの最終書き込み後のリース有効期間(TTL) |
INJECT_HEARTBEAT_MS | 100 | SDKがリースのキープアライブを再送するインターバル |
STORAGE_KEY_MAX_LENGTH | 128 | プラグインストレージのキー名の最大文字数 |
STORAGE_VALUE_MAX_LENGTH | 65536 | シリアライズ後のストレージ値の最大バイト数 |
STORAGE_KEYS_MAX | 256 | APIキーごとに保存可能なキーの最大数 |
SPEECH_URL_MAX_LENGTH | 8000000 | speech.playのurl最大長(約40秒のBase64エンコードWAV音声に相当) |
SDKは以下の値リストとヘルパーもエクスポートしています。
API_ERROR_CODES、CLIENT_ERROR_REASONS、EVENT_NAMES、INPUT_NAMES、TIME_INPUT_NAMES、RANDOM_PULSE_INPUT_NAMES、MODIFIER_TOKENS、APP_CAPABILITIES、FPS_LIMIT_PRESETS、EFFECTS_QUALITY_LEVELS:as const配列です。UIのセレクト項目などで有効な値をすべて列挙できます。isApiErrorCode、isEventName、isAppCapability、isTimeInputName、isRandomPulseInputName:対応するTypeScriptの型ガードです。injectTargetKey:正規化された注入ターゲット文字列を構築します。personaWsUrl:{ host, port, secure }(PersonaAddress、hostには純粋なホスト名またはIPアドレスのみを指定)またはユーザーが入力したアドレス文字列(ホスト名のみ、host:port、IPv4/IPv6アドレス、完全なws:///wss://URL)からWebSocket URLを組み立てます。APIトークンは接続時にPersonaClientが自動で付加します。parseHost、parsePort、isValidPort:純粋なホスト名・IPアドレス(角括弧あり・なしのIPv6に対応し、スキーム・ポート・パス・ゾーンIDを含む場合はnullを返す)およびポート番号を検証します。requestTimeoutMs(method, fallbackMs):メソッド名に応じたリクエストタイムアウトを返します(scene.activateとasset.importではそれぞれの長時間タイムアウトを適用)。
モデルと素材
モデルおよび一般素材は共通のメタデータ定義構造を持ちます。kindはアセット種別を示し、originはアセットの出所(bundledはアプリ同梱の素材およびPersonaカタログからオンデマンドでダウンロードした素材、userはユーザー登録素材)を示します。
Prop
Type
type ModelFormat = "live2d" | "vrm";
type ContentOrigin = "bundled" | "user";
type AssetKind =
| "image"
| "video"
| "audio"
| "prop"
| "ibl"
| "lut"
| "animation"
| "cameraMotion"
| "lyrics";
type InventoryKind = ModelFormat | AssetKind | "effect" | "addon";effectはディスク上のファイルに対応しない仮想アセット種別で、インベントリ内で組み込みエフェクトを列挙するために利用されます。addonはアプリケーション自体を拡張するオプションのアドオン(ウェブカメラトラッキングのアドオンなど)を表し、シーンのレイヤーには追加されません。
model.listはModelRef配列、asset.listはAssetRef配列を返します。どちらも、kindをそれぞれModelFormatとAssetKindに絞り込んだContentRefです。
どちらも真偽値のexistsを持ちます。AssetRefでは対象ファイルがディスク上に存在するかを示し(移動または削除された場合はfalse)、ModelRefではモデルのエントリーファイルが見つからない場合にfalseになります。
Prop
Type
Prop
Type
Prop
Type
CatalogItem
CatalogItemはピッカーUIなどで利用されるプロトコル非依存のコンテンツメタデータ構造です。ローカルレジストリとリモートカタログの両方がこの型に正規化され、多言語の紹介文description(LocalizedText)とカタログ属性を持ちます。download(CatalogDownload)は未インストール素材の取得情報を表し、省略されている場合はローカルに存在することを示します。
Prop
Type
Prop
Type
Prop
Type
カタログおよび多言語テキストのヘルパー:
CATALOG_FORMAT、MARKETPLACE_ITEMS_PATH、CATALOG_KINDS:カタログマニフェスト形式バージョン、公開カタログAPIパス(/api/items)、および対応するアイテム種別の一覧です。isCatalogId、healCatalog、healCatalogItem、healCatalogRows、healSha256:リモートまたはローカルのカタログマニフェストを検証・正規化します。payloadEntryPath、payloadEntryKey、catalogMediaFile(引数はCatalogMediaRole):展開されたカタログアセットのエントリパスと、ソース内のレンダリング済みサムネイルおよびプレビュー動画のファイル名(.thumbnail.avifと.preview.webm)を解決します。pickLocalized(text, locale)、healLocalizedText:LocalizedTextから表示言語に合った文字列を取得し、多言語テキストマップを正規化します。
配置とトランスフォーム
2Dスクリーン空間はピクセル単位で、ステージ中央を原点とします(+y方向が下)。3Dワールド空間はメートル単位を使用します。プロトコル上の回転値はすべてラジアン単位で表現されます(UI上では度数法で表示)。
Prop
Type
Prop
Type
Place2DおよびPlace3Dはシーンオブジェクト向けの配置構造であり、位置パラメータに加えてopacity(不透明度)チャンネルを持ちます。
シーンアイテム
シーン設定内のitems配列は描画深度(Zオーダー)順にモデルとオブジェクトを管理します。
type SceneItem = SceneModelItem | SceneObjectItem;Prop
Type
Prop
Type
Prop
Type
ObjectContent
オブジェクトレイヤーが保持するコンテンツの内部データ構造はkindフィールドにより識別されます。capture(画面キャプチャ)を除き、すべての種別はデスクトップUIから直接追加可能です。詳細はレイヤー管理を参照してください。
type ObjectContent =
| { kind: "image"; assetId: string }
| {
kind: "video";
assetId: string;
loop: boolean;
muted: boolean;
volume: number;
}
| { kind: "prop"; assetId: string }
| {
kind: "web";
url: string;
width: number;
height: number;
fps: number;
transparent: boolean;
css: string;
layer: WebLayer;
shutdownWhenHidden: boolean;
}
| { kind: "capture"; source: CaptureKind; sourceId: string; label: string };
type ObjectSpace = "2d" | "3d";
type WebLayer = "behind" | "front";
type CaptureKind = "display" | "window";Prop
Type
アタッチ
Prop
Type
AttachAnchor
type AttachAnchor =
| { kind: "root" }
| { kind: "bone"; bone: string }
| {
kind: "artMesh";
id: string;
verts: [number, number, number];
weights: [number, number, number];
};object.anchorsは親モデルが提供するアタッチ可能なアンカー一覧をAnchorOption構造として返します。VRMモデルはルートおよび人型ボーン、Live2Dモデルはルートおよび各ArtMesh(描画順order付き)を提供します。
AttachDepth
type AttachDepth =
{ kind: "front" } | { kind: "behind" } | { kind: "artMesh"; id: string };depthは親Live2Dモデル内部でのLive2Dアイテムの重なり順を制御します(背後、前面、または特定ArtMeshの直上)。instance.attachで指定します。
Prop
Type
アタッチ用のヘルパー関数は以下のとおりです。
depthStops(meshes):奥から手前への深度段階一覧(モデルの背後、描画順に各ArtMeshの直上、モデルの前面)を返します。depthStopIndex(meshes, depth):指定した深度がどの段階に該当するかを算出します。関連するArtMeshが存在しない場合は最前面として扱います。pinRiders(items, instanceId):instanceIdに直接または間接的にアタッチされているすべてのインスタンスを返します。循環アタッチの防止に使います。pinnableParents(models, items, instanceId):アタッチ可能な親候補一覧を生成し、循環参照となる対象にridesThisを付与します。defaultAttach(parentInstanceId, screenSpace?):初期状態のアタッチ設定(ルートにアンカー、前面に配置、分割なし、物理パラメータなし)を生成します。screenSpaceを指定した場合(Live2Dモデルまたは2Dオブジェクト)は、既定の反応でホストの頭の動きにも追従します。
Prop
Type
Prop
Type
シーン
Prop
Type
Prop
Type
Prop
Type
背景
Prop
Type
type BackgroundMode = "color" | "image";カメラ
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
cameraDistanceLimits(environment, radius)はマウス操作によるオービットカメラの許容距離範囲を算出します(デフォルト最小値DISTANCE_MINは0.35m、最大値DISTANCE_MAXは20m)。3D環境のバウンディング半径が標準空間(約10m)と大きく異なる場合、制限値が動的にスケーリングされます。radiusはscene.inspectのenvironment.radiusから取得されます。
ライティング
Prop
Type
type SceneLightType = "directional" | "point" | "ambient" | "area" | "spot";
type ShadowQuality = "off" | "low" | "medium" | "high" | "ultra";
type ShadowFilter = "pcf" | "pcss";SCENE_LIGHT_TYPES、SHADOW_QUALITY_LEVELS、SHADOW_FILTERSは光源タイプ、影の品質、フィルターモードを定義するas const配列です。
ライトをカメラに追従させるには、SceneLightの次の3つのフィールドを使います。
followCamera:ライトの位置と角度をカメラ視線に連動させます。followCameraOptions:カメラの動きに連動させる自由度を選択します。DEFAULT_LIGHT_FOLLOW_CAMERA_OPTIONSではすべて有効です。followCameraReference:連動しない軸の基準姿勢を保持します。
ライトの照射角を保ったまま連動モードを切り替えるには、これらのフィールドを直接変更せず、scene.setLightFollowCameraヘルパーメソッドを利用してください。詳細はライティングを参照してください。
Prop
Type
Prop
Type
iblAssetIdとmodelAssetIdは、それぞれ環境マップ(IBL)と3Dステージ環境モデルを指定します。environment-map-modelケイパビリティを持つビルドでは両方を同時に設定できます。
- 環境設定の更新には
environmentWithAsset()ヘルパーの利用を推奨します。新しいアセットを設定し、もう一方の既存アセットを保持したうえで、旧モデルに紐づくライトのオーバーライドをリセットします。 - 環境マップを選択すると
bakeFromModelが自動的にオフになります。ベイクがデフォルトで有効になるのは、空の環境に3Dモデルを読み込んだ場合のみです。 environmentClearPatch(environment, slot)は'model'または'map'をクリアするパッチを生成します。slotがnullの場合は両方をクリアします。applyEnvironmentLighting()とapplyEnvironmentLook()はUI上のボタンに対応するヘルパーで、それぞれ環境ライティングとEnvironmentLookのスタイルを適用します。
Prop
Type
Prop
Type
Prop
Type
Prop
Type
ボリューメトリック効果はライトごとにSceneLight.volumetricで個別に設定します。関連するヘルパーは以下のとおりです。
SCENE_VOLUMETRIC_LIGHTING_SPECS:ボリューメトリックフォグの各スライダーの数値範囲を定義します。defaultSceneVolumetricLighting():デフォルトのフォグ設定を返します。healSceneVolumetricLighting():範囲外の値を有効範囲に収めます。sceneLightCanHaze(type):ライトの種類が散乱効果に対応しているかを判定します。sceneLightHazes(light):ライトが現在ボリューメトリック効果を発生させているかを判定します。
エフェクト
SceneEffectsはフラットなデータ構造を採用しており、オン・オフとパラメータを持つ各ポストプロセス効果がトップレベルプロパティとして配置されています。これにより、汎用的な反復処理やリフレクションが容易になります。
Prop
Type
レイヤー一覧におけるエフェクトの表示順序はenvironment.effectLayers(ToggleEffectKey配列)で個別に管理されます。これはエフェクト自体のenabledフラグからは独立しており、Patchでエフェクトを有効化すると自動的にレイヤー項目が追加されます。
type SceneToneMapping = "none" | "neutral" | "aces" | "agx";Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
グラデーションはEffectBlendModeで定義される24種類のブレンドモードに対応し、EFFECT_BLEND_MODESに列挙されます。
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
rain(雨)およびsnow(雪)はデータ構造上他のエフェクトと共通ですが、動作特性が異なります。画面全体のポストプロセスではなく、シーン内に配置される3Dパーティクルジオメトリとしてレンダリングされます。詳細は雨エフェクトおよび雪エフェクトを参照してください。
モデルおよびオブジェクトレイヤーも独自のエフェクトパイプラインを備えています。SceneModelItemおよびSceneObjectItemのeffectsとeffectLayersはシーン全体のエフェクトに先立って評価され、instance.setEffectsから設定できます。
- レイヤーエフェクトは
LayerEffectKeyで定義されるサブセット(color、levels、colorWheels、colorShift、selectColors、gradient、blur、bloom、diffusion、sketch、rim、outline、dropShadow)に対応します。 - ブルームのカラー選択はレイヤー単位でのみ機能します。詳細はレイヤーエフェクトを参照してください。
トランジション
transitionはシーン切り替え時の視覚効果を設定します(要scene-transitionsケイパビリティ)。詳細はシーントランジションを参照してください。SCENE_TRANSITION_TYPESは利用可能なすべてのトランジション種別を列挙します。
Prop
Type
environment.itemTransitionはシーン内のモデルやオブジェクトの出現・消失アニメーションを制御します。詳細は表示と非表示を参照してください。ITEM_TRANSITION_STYLESはサポートされるスタイル一覧を定義します。
Prop
Type
シーンプリセット
presetsはシーンに保存されたシーンプリセットを表示順に列挙します(scene-presetsケイパビリティ非対応のバージョンでは提供されません)。アクティブなシーンのプリセットはpreset.create、preset.update、preset.rename、preset.setTransition、preset.delete、preset.applyで管理します。詳細はプラグインAPI:シーンプリセットを参照してください。
SCENE_PRESET_TRANSITIONS:すべての切り替え効果を列挙します。scenePresetIsCurrent():ステージの現在の配置がプリセットと一致するかを判定します。デスクトップアプリとWebコンソールはこれをもとに該当プリセットをハイライト表示します。capturePresetItems():レイヤー配置を取得します。presetStep():プリセット適用時の各レイヤーの変化を算出します。
Prop
Type
Prop
Type
ランタイム状態
instance.listはステージ上に存在する各インスタンスが実際にサポートする機能ケイパビリティ一覧を動的に返します。クライアントはこれにより、非対応のUIコントロールを事前に無効化できます。
Prop
Type
type InstanceCapability =
| "motions"
| "expressions"
| "placement-2d"
| "placement-3d"
| "mtoon"
| "idle-clips"
| "idle-motions"
| "pose"
| "breath"
| "expression-weights"
| "live2d-params"
| "speech"
| "post-fx";speech(音声合成対応)は読み込み済みのLive2Dモデルでのみ報告されるため、静的なファイル形式からではなくランタイム能力表から判定する必要があります。アプリ全体の機能特性はhelloハンドシェイクおよびapp.infoから取得し、バージョン番号の文字列比較ではなくケイパビリティフラグで機能の利用可否を判定してください。
type AppCapability =
| "storage"
| "speech"
| "automations"
| "controllers"
| "model-editing"
| "asset-inspection"
| "layer-effects"
| "scene-transitions"
| "light-area"
| "light-spot"
| "light-camera-follow"
| "light-shadow-filter"
| "environment-map-model"
| "stage-spawn"
| "idle-tracking-lost"
| "motion-stop"
| "stage-capture"
| "object-pin-depth"
| "object-text"
| "camera-follow"
| "camera-aim"
| "camera-focus"
| "camera-handheld"
| "object-video-sound"
| "object-chroma-key"
| "model-movement"
| "model-movement-pivot"
| "layer-effects-2d"
| "scene-presets"
| "background-alpha"
| "binding-calibration"
| "binding-random-pulses"
| "expression-groups"
| "expression-groups-hide-first"
| "model-history"
| "automation-editing"
| "automation-transport"
| "asset-import";canonicalAppCapabilityユーティリティ関数は、旧バージョンの機能フラグ(area-lights、spot-lights、camera-follow-lights、shadow-filters、spawn、tracking-lost、text-objects、video-soundなど)を現在の標準名称に正規化します。PersonaClientはサーバーから受信した機能リストを自動的に正規化して処理します。
stage.capture(要stage-captureケイパビリティ)は{ dataUrl, width, height }を返します。ステージ描画結果をアルファチャンネル付きPNG画像として取得し、長辺はmaxEdge(64~2048、既定値1024)以内に収められます。ヘッドレスな自動化ツールやAIアシスタントによる視覚確認に利用されます。
Prop
Type
files配列はモデル定義内の元のモーションインデックス順を保持します。ファイルが存在しないスロットは空文字列で埋められ、後続のインデックスがずれないよう設計されています。motionSlots(files)は再生可能な項目とそのインデックスを返します。Live2Dモデルではmodel3.jsonに未登録の.motion3.jsonファイルも自動検出され、ファイル名に基づいたグループとして追加されます。
motion.stop(要motion-stopケイパビリティ)は現在再生中の単発モーションを終了し、モデルをなめらかに待機状態へ復帰させます。motion.playingのoneShotフラグは、そのモーションがstopで停止可能なワンショット再生かどうかを示します。
Prop
Type
Prop
Type
Prop
Type
表情グループ
expression.getGroupsとexpression.setGroups(要expression-groupsケイパビリティ)はモデルの表情グループを取得・更新し、ExpressionGroupsを返します。ルールはプラグインAPI:表情グループを参照してください。
Prop
Type
Prop
Type
Prop
Type
EXPRESSION_GROUP_FADE_SECONDS_MAX(2)はメンバーのフェード時間の上限、EXPRESSION_GROUP_FADE_SECONDS_DEFAULT(0.2)は新しいメンバーの既定値です。foldExpressionKeyはVTSと同じ規則(大文字・小文字を区別しない)で表情キーを正規化し、2つのキーが同じ表情を指すかの判定に使い、firstByExpressionKey(items, keyOf)は正規化したキーごとに最初に現れた項目を保持するMapを返します(VTSが表情キーを解決する順序と同じです)。newVtsIdはVTS形式のID(32桁の小文字16進数)を生成し、新しいグループに使えます。
ショートカット
Prop
Type
Prop
Type
HotkeyConfigはregisteredフラグを除いた設定用データ構造で、hotkey.setの引数として使用されます。registeredには、Personaがバックグラウンドにあるときに現在も反応するショートカットが列挙されます。デスクトップはOSにグローバルホットキーを登録せずキーの状態を直接読み取るため、単独キーを含むどの組み合わせもバックグラウンドで動作でき、hotkeyRunsInBackgroundでショートカットがバックグラウンド動作に設定されているかを判定できます。組み合わせは同時に押されている入力の集合として判定されるため、comboKey(accelerator)は順番に依存しない組み合わせの識別子を返し、duplicateAcceleratorsはそれを使って複数のショートカットに割り当てられた組み合わせを検出します。acceleratorLabel(accelerator, platform, mouseLabels?)は標準の修飾キー順(MODIFIER_TOKENS:Control、Alt、Shift、Super)で組み合わせをキートップ表示用のラベル配列に整形し、helloが報告するデスクトップ側のapp.platformに応じて記号を切り替えます('darwin'では⌃・⌥・⇧・⌘、それ以外ではCtrl・Alt・Shift・Win。マウスボタンは既定でMOUSE_TRIGGER_LABELSを使い、翻訳ラベルの指定も可能)。
ステージ上の各アバターは独立したショートカット設定を保持します。
hotkey.list、hotkey.set、hotkey.triggerは省略可能なmodelIdを受け取り、省略時はメインモデルが対象となります。hotkey.stateはモデル単位で更新を通知します。hold、fadeSeconds、deactivateAfterSeconds、stopsOnLastFrameは新しいプロトコルで追加された項目です。hotkey.setで省略した項目は既存の設定値を維持します。
SDKにはステージ上の全モデルのショートカットキーを列挙するヘルパー関数が含まれています。listSceneHotkeys(client)は現在のアクティブシーン内の全モデルのショートカット(プライマリモデルが先頭)を取得します。listModelHotkeys(client, scene)はステージ上の各モデルに対してPromise<ModelHotkeys>の配列を返し、個別の非同期処理を可能にします。
Prop
Type
オートメーション
オートメーションは個々のモデルではなくアプリケーション全体に属するワークフロー機能です。各オートメーションは一連のアクション操作を持ち、ショートカット、イベント、またはAPI呼び出しによりトリガーされます。automation.listで一覧を取得し、automation.runで実行し、automation.stateで変更通知を受信します(要automationsケイパビリティ)。詳細はプラグインAPI:オートメーションを参照してください。
Prop
Type
type AutomationActionKind =
| "effect-toggle"
| "effect-params"
| "effect-clip"
| "camera-pose"
| "camera-reset"
| "camera-motion-play"
| "camera-motion-stop"
| "camera-follow"
| "camera-aim"
| "camera-focus"
| "camera-handheld"
| "layer-visibility"
| "preset-apply"
| "text-set"
| "lyrics-play"
| "stream-mode"
| "scene-switch"
| "expression-toggle"
| "motion-play"
| "audio-play"
| "audio-control"
| "expression-clear"
| "model-load"
| "model-position";actionKindsおよびtriggerKindsは新しいサーバーとの互換性を保つため、固定のユニオン型ではなく開放的なstring[]として定義されています。アクション種別はカテゴリを先頭に置いた名前に統一されており、古いホストから送信された旧形式の名前はクライアント側で自動的に正規化されます。
automationActionLabel:各アクション種別の英語ラベルを返します。automationLabel:オートメーション全体の要約ラベルを生成します。titleがあればそれを使い、なければ各アクションのラベルを·でつなぎます。AUTOMATION_SETUP_KINDS、isAutomationSetup(およびisAutomationSetupAction):タイムライン開始前に先行実行される準備アクション(scene-switchやmodel-load)を識別します。AUTOMATION_BOUNDARY_KINDSとisAutomationBoundaryは非推奨の別名です。isAutomationMediaAction、isAutomationSourcedAction、isAutomationSampledClip、isAutomationContentAction:タイムライン上の動作に応じてアクションを分類します(メディアクリップ、sourceInMsオフセットを持つクリップ、スクラブ時にプレビューされるクリップ、通常のタイムラインアクション)。
タイムライン編集と再生制御
automation-editing機能に対応している場合、automation.get、automation.create、automation.update、automation.deleteで完全なAppAutomationタイムライン定義を読み書きできます。automation-transport機能に対応している場合、automation.controlとautomation.statusでタイムライン再生を制御し、AutomationRunStatusを取得できます。詳細はプラグインAPI:オートメーションを参照してください。
Prop
Type
Prop
Type
Prop
Type
Prop
Type
AutomationDefinitionSchema、AppAutomationSchema、automationTimelineActionSchemas、automationTriggerSchemas:タイムライン定義、各アクション種別、各イベントトリガー種別のZodスキーマです。validateAutomationTimeline、automationTimelineLimit:タイムラインの長さと各クリップの時間範囲を検証し、タイムラインの終了時刻を算出します。AUTOMATION_TRANSPORT_COMMANDS、AUTOMATION_RUN_PHASES、AUTOMATION_STEP_STATES:再生制御コマンド(play、pause、stop、seek、prepare)、実行フェーズ、ステップ状態のas const配列です。MAX_AUTOMATION_DURATION_MS、MAX_AUTOMATION_EFFECT_FADE_MS、MAX_AUTOMATION_HOLD_MS、MAX_AUTOMATION_COOLDOWN_MS:タイムライン長、エフェクトクリップのフェード時間、ホールド時間、トリガークールダウンの上限定数です。AUDIO_RETRIGGER_MODES、PLAYBACK_COMMANDS、MAX_AUDIO_FADE_MS、MAX_AUDIO_REPEAT_COUNT:audio-playおよびaudio-controlアクションで使用される再トリガーモード、再生制御コマンド、音声パラメータの上限です。
システム設定
Prop
Type
SettingsPatchは設定のうち更新可能な部分で、すべてのフィールドが省略可能です(lipSync、controllerのenabledフラグのみ、window、ui、performance)。トラッキングおよびポーズ関連パラメータはtracking.*およびpose.*経由で個別に設定します。
SettingsとSettingsPatchは、SDKがエクスポートするZodスキーマ(SettingsSchemaおよびSettingsPatchSchema)から導出されています。
- パッチの検証時には、未知のプロパティと読み取り専用のプロパティが自動的に除去されます。
- サーバーの応答を解析する際は、拡張プロパティもそのまま受け入れます。
PersonaClient自体は、送信前にクライアント側で検証を行いません。
type TrackingSourceId = "persona-ios" | "ifacialmocap" | "vts-ios";
type PoseSourceId = "vmc" | "mocopi";
type TrackingSourceKind = TrackingSourceId | PoseSourceId | "mediapipe";
type TrackingStatus = "off" | "waiting" | "tracking" | "no-face";
type PoseStatus = "off" | "waiting" | "tracking";
type EffectsQuality = "low" | "medium" | "high";トラッキングソース設定
tracking.sourcesは設定済みのすべての入力ソース(ネットワーク顔トラッキング、ポーズ入力、Webカメラ)を列挙します。複数のソースが並行動作可能で、モデルインスタンスはSceneModelItemのfaceSourceId、poseSourceId、handSourceIdを通じて各ソースにIDでバインドされます。
Prop
Type
tracking.source、pose.source、pose.portはマルチソース移行前のレガシー互換用プロパティであり、各チャンネルの最初のソースをミラーリングします。新規開発ではsourcesを利用してください。
mediapipeWebカメラトラッキングソースは専用の設定パラメータを持ち、デフォルト値はDEFAULT_MEDIAPIPE_CONFIGに定義されています。
Prop
Type
type HandTrackingMode = "arms" | "fingers";単一の入力ソースが複数のデータチャンネルを同時に供給可能です(たとえば、1台のWebカメラから顔・手・身体のすべてを供給できます)。sourceSupportsChannel(source, channel)は現在の設定で指定チャンネルに対応しているかを判定し、sourceChannelEnabled(source, channel, masters)は個別スイッチと全体マスタースイッチを考慮した有効状態を判定します。
リップシンク設定
settings.lipSyncとlipSync.configureは同一のLipSyncConfig構造を共有し、マイク音声処理に対応します。マイクによるリップシンクをサポートしない環境では、Settingsから本項目が除外されます。
Prop
Type
lipSync.stateおよびlipSync.calibrateはLipSyncStateを返します。キャリブレーション手順についてはマイクによるリップシンクを参照してください。
Prop
Type
SceneModelItem内のlipSyncModeはモデルごとの音声同期動作を制御します。
type LipSyncMode = "off" | "always" | "when-untracked";モデル全体移動設定
model.getMovementおよびmodel.setMovementはModelMovementConfig設定構造を使用し、顔トラッキングに連動するLive2Dモデル全体の平行移動と拡大縮小(VTube StudioのMovement Configに相当)を制御します。水平・垂直・深度スライダーの設定範囲は−50~50です。pivot(前後の拡大中心、要model-movement-pivotケイパビリティ)はLive2Dキャンバスの正規化座標で拡大縮小の中心点を指定します。
Prop
Type
バージョン履歴
model.*Version*メソッドとmodel.restoreFiles(要model-historyケイパビリティ)は、モデルの保存済みバージョンを取得・管理します。デスクトップのバージョン履歴に相当し、各メソッドの引数とエラーの意味はプラグインAPI:バージョン履歴を参照してください。
Prop
Type
Prop
Type
Prop
Type
type ModelVersionKind = "first" | "saved" | "backup";
type ModelVersionUnsavedAction = "save" | "discard";
type ModelVersionChangeStatus = "added" | "modified" | "deleted" | "unchanged";MODEL_VERSION_KINDS、MODEL_VERSION_UNSAVED_ACTIONS、MODEL_VERSION_CHANGE_STATUSES:上記の型に対応するas const配列MODEL_VERSION_CURRENT('current'):バージョンIDを受け付ける場所でディスク上の現在のファイルを表す(model.compareVersionsのfromやtoなど)MODEL_VERSION_NAME_MAX_LENGTH(80)、MODEL_VERSION_NOTES_MAX_LENGTH(2000):バージョン名とメモの最大文字数MODEL_VERSIONS_LIST_MAX(500)、MODEL_VERSIONS_LIST_DEFAULT(50):1回のmodel.listVersionsで返すバージョン数の上限と既定値
プラグインストレージ
storage.* APIは任意のJSONデータをキーバリュー形式で保存できます。容量制限については定数定義を、詳細な仕様についてはプラグインストレージを参照してください。
type JsonValue =
string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };パラメータ注入
Prop
Type
type InjectTargetType = "input" | "live2d-param" | "vrm-expression";InjectTargetはvalueとweightを除いた注入ターゲットの定義です。
入力名
inputターゲットのidには、下表の入力名を指定します。INPUT_NAMESには下表のすべての名前が含まれ、そのうちVTube StudioとARKitの名前はモデルの.vtube.jsonの命名と一致します。注入したinputの値はLive2Dモデルにのみ反映されます。
| カテゴリ | 入力 |
|---|---|
| VTube Studio | VTS互換の主要21チャンネル:FaceAngleX FaceAngleY FaceAngleZ FacePositionX FacePositionY FacePositionZ EyeOpenLeft EyeOpenRight EyeLeftX EyeLeftY EyeRightX EyeRightY Brows BrowLeftY BrowRightY MouthSmile MouthOpen MouthX CheekPuff JawOpen TongueOut |
| ARKit | 残りの52チャンネル。ARKitプレフィックスに続けて、ARKitブレンドシェイプ名をPascalCase形式で付けます(ARKitJawOpen、ARKitMouthSmileLeft、ARKitEyeBlinkRightなど) |
| コントローラー | BASE_CONTROLLER_INPUT_NAMES。1台目のコントローラーのVTS互換の入力名で、左右スティック(ControllerStickLeftX/Y、ControllerStickRightX/Y)とスティック押し込み、十字キー軸と4方向ボタン(ControllerDPadUp/Down/Left/Right)、フェイスボタン、ショルダー、トリガー、Options、Home、PlayStationタッチパッドクリック(ControllerTouchPadPress)、VTS由来の親指・人差し指位置(ControllerThumbPosLeft/Right、ControllerFingerPosLeft/Right)、左右ボタン状態・押下数(ControllerButtonsAnyLeft/Right、ControllerButtonCountLeft/Right)、コントローラーの傾き(ControllerLean)を含みます |
| 手 | HAND_INPUT_NAMES。VTS準拠の26種類の手チャンネルにHandLeftAngleYとHandRightAngleYを加えたもので、手の存在フラグ、位置座標、回転角、手の開閉、各指の屈曲度(HandLeftFinger_1_Thumbなど)、BothHandsFound、HandDistanceを含みます |
| 音声 | VOICE_INPUT_NAMES。VTSのVoiceVolume、VoiceFrequency、VoiceVolumePlusMouthOpen、VoiceFrequencyPlusMouthSmile、VoiceA~VoiceO、VoiceSilenceに、VoiceMouthOpenと符号付きのVoiceMouthSpreadを加えたものです |
| マウス | MOUSE_INPUT_NAMES。MousePositionXとMousePositionYで、マウスカーソルの画面上の位置を−1..1に正規化した値です(右方向と上方向が正。FacePositionYと同じ向き) |
| 時刻 | TIME_INPUT_NAMES。Time24hとTime12hで、範囲は0..1です(TIME_INPUT_RANGES) |
| ランダム | RANDOM_PULSE_INPUT_NAMES。RandomPulse1~RandomPulse8で、範囲は0..1です(RANDOM_PULSE_INPUT_RANGES) |
ARKitプレフィックスは、VTSがすでに使用しているJawOpen、CheekPuff、TongueOutとの名前の衝突を避けるためのものです(.vtube.jsonの入力名の照合は大文字と小文字を区別しません)。この3つはARKIT_TWINSとして扱われ、対応するARKitチャンネルと同じ浮動小数点値を共有します。どちらの名前で値を注入しても、内部ではARKitチャンネルとして処理されます。INPUT_RANGESは各チャンネルの標準入力レンジを定義します。頭部・手の回転角は度単位、ARKitチャンネルは0..1、その他は正規化された無次元値です。CONTROLLER_THUMB_POSITIONS、CONTROLLER_FINGER_POSITIONS、isControllerPositionInputは親指・人差し指位置の入力に対応します。2台目以降のコントローラーはControllerの後にインデックス番号が付き(例:Controller2StickLeftX、Controller12Cross)、台数に制限はありません。controllerInputNameは番号付きの入力名を生成し、getInputRangeは各入力のレンジを返します(Y軸は上方向が正)。- マウス入力は顔トラッキングのスイッチとは独立して動作します。
- 時刻入力は顔トラッキングとは独立してデスクトップのローカル時計を毎フレームサンプリングし、Live2DとVRMの両方のパラメータバインディングに対応します。詳細は時刻パラメータの割り当てを参照してください。
isTimeInputNameは対応する型ガードです。 - ランダムパルス入力は顔トラッキングとは独立して、それぞれの発動設定に従い
0(待機)と1(最大)の間で自動的に変化します(詳細はパラメータの割り当てとプラグインAPI:パラメータバインディングを参照)。RandomPulseSchedulesはカスタム発動設定を入力名ごとに保持し、未設定のパルスはDEFAULT_RANDOM_PULSE_SCHEDULE(間隔0.5~4.5秒、持続時間0.58秒、フェードイン・フェードアウト各0.29秒で、VTube Studioの自動まばたきと同じ)で動作します。RANDOM_PULSE_MIN_SECONDS(0.1)とRANDOM_PULSE_MAX_SECONDS(3600)は時間範囲の上下限を定義し、sanitizeRandomPulseとsanitizeRandomPulsesは設定の検証と正規化、isPulseBinding、pulseRest、pulseHoldsRest、firePulseBinding、bindingOutputRangeはパルスバインディングの重ね合わせ計算を行います。
Prop
Type
Live2Dモデル内での入力マッピングの詳細についてはパラメータの割り当てを参照してください。
プロトコルメッセージ形式
低レベルのWebSocketプロトコルを直接実装する場合のエンベロープ形式は以下のとおりです。
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
Prop
Type
ApiErrorCodeはErrorMessage.codeに格納されるエラーコードの列挙型です。詳細はエラーコードリファレンスを参照してください。SDKのcall実行時に例外として送出されるPersonaApiErrorはこのコードをカプセル化しています。
最終更新日:2026年11月7日