HappyOysterEngine は Open Platform のホストとモデルを設定し、Model Studio 一時 API キートークンを更新し、Travel セッションを作成します。Travel は createTravel() によって返されるセッションオブジェクトで、travel.start() を呼び出した後にのみセッションへの参加と開始が行われます。adventure、directing、acting モードをサポートしています。
HappyOysterEngine は Open Platform ホストを設定し、Model Studio 一時 API キートークンを更新し、Travel セッションを作成します。
Travel は createTravel() によって返されるセッションオブジェクトです。セッションへの参加と開始は、travel.start() が呼び出された後にのみ行われます。
主要用語
用語 | 意味 | 備考 |
|---|---|---|
token | Model Studio 一時 API キートークン: ブラウザやモバイルアプリなどの信頼されていない環境から Model Studio サービスを呼び出す際は、永続的な API キーの露出を避けるため、安全なバックエンドを通じて一時的な API キーを生成してください。SDK はこのトークンを HTTP Bearer 認証情報として Open Platform に送信します。 | |
ticket | HappyOyster ワールド Travel 認証情報: バックエンドが AK 認証(ゲートウェイヘッダー)を使用して認証情報 API を呼び出し、クライアントがルームに入るために使用する短命の Travel 認証情報( |
概要
SDKは以下の主要オブジェクトを提供します:
HappyOysterEngine
API | 説明 |
|---|---|
| Engineインスタンスを作成します。 |
| 後続のOpen Platform APIリクエストで使用されるModel Studio一時APIキートークンを更新します。 |
| Travelセッションを作成します。 |
| 現在のSDKバージョン。 |
| 現在のSDKパッケージ名、バージョン、およびパッケージチャネル。 |
Travel
API | 説明 |
|---|---|
| 現在のTravelセッションを開始します。 |
| セッションステータスの変更を購読します。 |
| 最初のフレームURL通知を購読します。 |
| Travel入場直後に利用可能になるセッションメタデータを購読します。 |
| セッションの実行時エラーを購読します。 |
| 指定されたアクションを現在呼び出せるかどうかを確認します。 |
| 利用可能なセッションメタデータを取得します。利用可能になる前は |
| リアルタイム制御コマンドを送信します。 |
| ディレクション指示またはプロンプトコンテンツを送信します。 |
| 現在のセッションを一時停止します。 |
| 一時停止中のセッションを再開します。 |
| ディレクションセッションを指定された時間に巻き戻します。 |
| 現在のセッションを終了し、そのリソースを解放します。 |
その他のエクスポート
エクスポート | 説明 |
|---|---|
| SDKによってエクスポートされるエラーコード定数オブジェクト。 |
| 不明なエラーが標準SDKエラーかどうかを確認します。 |
型 |
|
例
import { HappyOysterEngine, isSdkError } from '@happy-oyster/js-sdk'
const engine = new HappyOysterEngine({
APIHost: 'open-platform.example.com',
model: 'happyoyster-1.0-adventure', // Required; Adventure model shown as an example
token: 'bailian-temporary-api-key-token',
logLevel: 'warn',
streamReadyTimeout: 15_000,
})
const videoElement = document.getElementById('player') as HTMLVideoElement
const travel = engine.createTravel({
ticket: 'travel-ticket',
videoElement,
maxExperienceTimeSec: 90,
})
const unsubscribeStatus = travel.on('statusChanged', (status) => {
console.log('Travel status:', status)
})
const unsubscribeFirstFrame = travel.on('firstFrameGenerated', (firstFrame) => {
console.log('First frame URL:', firstFrame)
})
const unsubscribeInfo = travel.on('travelInfoReady', (info) => {
console.log('Travel info is ready before RTC playback:', info)
})
const unsubscribeError = travel.onError((error) => {
console.error('Travel error:', error)
})
try {
const { encryptedTravelId, mode, creationModel, firstFrame, maxExperienceTimeSec, aspectRatio } = await travel.start()
// Adventure (mode 1)
await travel.sendCommand({
translation: 'Front',
rotation: 'Mouse_Left',
interaction: 'Jump',
})
// Directing (mode 2) or Acting (mode 3; not scriptlist)
await travel.sendInstruct({ content: 'Turn the camera toward the castle and have the protagonist start running' })
await travel.pause()
await travel.resume()
} catch (err) {
if (isSdkError(err)) {
console.error('SDK error:', err.code, err.message)
} else {
console.error('Unexpected error:', err)
}
} finally {
unsubscribeStatus()
unsubscribeFirstFrame()
unsubscribeInfo()
unsubscribeError()
await travel.end()
}
engine.updateToken('new-bailian-temporary-api-key-token')
HappyOysterEngine
HappyOysterEngine は Web SDK のエントリーポイントです。Open Platform ホストを設定し、後続のリクエストで使用される Model Studio 一時 API キートークンを管理し、Travel セッションを作成します。
注記Engine インスタンスは、現在一度に 1 つのアクティブな Travel のみを管理します。新しいセッションを開始する前に、現在の Travel を終了してください。
コンストラクタまたは updateToken() を通じてトークンが設定された後、SDK は内部で Feature Gate 設定を取得します。これにより、プラットフォームはリモートで SDK を無効化したり、古いバージョンにアップグレードを要求したりできます。リクエストが失敗した場合、SDK はフェイルオープンとなり、通常の体験をブロックしません。
API | 説明 |
|---|---|
| 必須のAPIホストとモデル、およびオプションのトークンとログレベルを指定してEngineインスタンスを作成します。 |
| 後続のOpen Platformリクエストで使用されるModel Studio一時APIキートークンを更新します。 |
| まだ開始されていないTravelセッションを作成します。 |
new HappyOysterEngine
HappyOysterEngineインスタンスを作成します。
シグネチャ
new HappyOysterEngine(config: SDKConfig)
パラメータ
SDKConfig
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | Open Platform API ホスト。 |
|
| はい | 使用する Open Platform モデルの識別子です。必須で、デフォルト値はありません。この Engine で固定され、そのすべての Travel で共有されます。 |
|
| いいえ | 構築時に設定される Model Studio 一時 API キートークンです。後から |
|
| いいえ | SDKログレベル。デフォルトは |
|
| いいえ |
|
modelをモデル識別子(Adventureモデルであるhappyoyster-1.0-adventureなど)に設定します。対象のサービス環境に対応するモデル識別子を使用してください。SDKは体験用modeからモデルを選択したり、ticketからモデルを推測したりすることはありません。
Engine には固定の APIHost + model があります。同じサービスとモデルを対象とする連続した Travel には再利用してください。いずれかの値を切り替える前に、アクティブな Travel を終了し、新しいターゲット用に設定された Engine を使用してください。ワールドの作成とそのチケットの発行は、同じサービスターゲットに対して行ってください。
戻り値
HappyOysterEngineインスタンスを返します。
エラー
config が欠落している場合、または APIHost、model、token、logLevel、streamReadyTimeout の型や値が無効な場合、コード ErrorCode.INVALID_ARGUMENT (10010001) の SdkError が同期的にスローされます。完全な URL、空の文字列、またはパスを含む値を APIHost として渡すことは無効です。
model は必須であり、トリム後に空でない文字列である必要があります。null、文字列以外の値、および空白のみの文字列は無効です。これを省略するか undefined を渡しても引数エラーが発生します。SDK にはデフォルトのモデルがありません。
HappyOysterEngine.updateToken
後続のOpen Platform APIリクエストで使用されるModel Studio一時APIキートークンを更新します。
シグネチャ
updateToken(token: string): void
パラメータ
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | Model Studioの一時APIキートークン。空文字列を渡すと現在のトークンがクリアされます。 |
戻り値
何も返しません。
エラー
token が文字列でない場合、コード ErrorCode.INVALID_ARGUMENT (10010001) の SdkError が同期的にスローされます。
HappyOysterEngine.createTravel
開始せずにTravelセッションインスタンスを作成します。
シグネチャ
createTravel(config: CreateTravelConfig): Travel
パラメータ
CreateTravelConfig
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | 後でTravelを開始するために使用するチケット。 |
|
| はい | セッションビデオのレンダリングに使用される |
|
| いいえ | Adventure の最大体験時間(秒単位)。Directing および Acting セッションではこのフィールドは無視されます。省略した場合、サーバーのデフォルトが適用されます。 |
戻り値
作成済みだがまだ開始されていない Travel セッションを返します。その後、呼び出し元は await travel.start() を実行してセッションに参加し、ビデオが再生可能になるまで待機する必要があります。
各 HappyOysterEngine インスタンスは、一度に 1 つのアクティブな Travel のみを持つことができます。別の Travel を作成する前に await travel.end() を呼び出してください。
エラー
createTravel() は以下のケースで同期的に SdkError をスローします:
ErrorCode | 説明 |
|---|---|
|
|
| Travelは既にアクティブです。先に |
起動エラーは travel.start() によって公開されます。
Travel
Travel は HappyOysterEngine.createTravel() によって作成されたセッションを表します。初期状態では非アクティブです。travel.start() が呼び出された後、SDK はセッションに参加し、ビデオが再生可能になるまで待機します。
Travel は、セッションの開始、一時停止、再開、巻き戻し、終了、リアルタイム制御とプロンプトの送信、およびステータス変更とランタイムエラーのサブスクライブをサポートしています。
メソッド
メソッド | 説明 |
|---|---|
| 現在のTravelセッションを開始します。 |
| セッションステータスの変更を購読します。 |
| 最初のフレームURL通知を購読します。 |
| Travel入場直後に利用可能になるセッションメタデータを購読します。 |
| セッションの実行時エラーを購読します。 |
| 指定されたアクションを現在呼び出せるかどうかを確認します。 |
| 利用可能なセッションメタデータを取得します。利用可能になる前は |
| リアルタイム制御コマンドを送信します。 |
| ディレクション指示またはプロンプトコンテンツを送信します。 |
| 現在のセッションを一時停止します。 |
| 一時停止中のセッションを再開します。 |
| 現在のセッションを指定された時間に巻き戻します。 |
| 現在のセッションを終了し、そのリソースを解放します。 |
ステータス
ステータス | 説明 |
|---|---|
| セッションが開始されていません。 |
| セッションは開始中で、ビデオが再生可能になるのを待っています。 |
| セッションは実行中です。 |
| セッションは一時停止中で、再開または巻き戻しが可能です。 |
| セッションは正常に終了し、そのリソースは解放されました。 |
イベント
イベントの購読には travel.on(event, handler) を使用します。このメソッドは購読解除関数を返します。
イベント | コールバック | 説明 |
|---|---|---|
|
| セッションステータスが変更されました。 |
|
| Open Platform が空でない最初のフレーム URL を返した際に |
|
| enter-travel が戻った後、RTC が接続される前に発火します。 |
|
| セッションの実行時エラー。 |
Travel.can
現在のステータスとセッション機能に対してアクションが利用可能かどうかを確認します。
シグネチャ
can(action: TravelAction): boolean
パラメータ
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | 確認対象のアクション: |
戻り値
boolean を返します。true はアクションが現在利用可能であることを意味し、false は現在のステータス、モード、またはセッション機能がその前提条件を満たしていないことを意味します。
利用条件
action | 利用条件 |
|---|---|
| Travelがまだ |
|
|
|
|
|
|
|
|
| 巻き戻しをサポートするディレクションセッションにおける |
| Travelがクローズされていません。 |
エラー
このメソッドはビジネスエラーをスローしません。不明なアクションの場合は false を返します。
Travel.start
現在のTravelセッションを開始します。
シグネチャ
start(): Promise<StartTravelResult>
パラメータ
パラメータはありません。
戻り値
Promise<StartTravelResult> を返し、これはセッションが開始されビデオが再生可能になった後に解決されます。
enter-travel が戻った後、SDK は RTC に接続する前に travelInfoReady を発火します。遅れてサブスクライブする場合は travel.getInfo() を呼び出すことができますが、メタデータが利用可能になる前は null を返します。レスポンスに空でない firstFrame が含まれている場合でも、firstFrameGenerated は引き続き発火します。
StartTravelResult
フィールド | タイプ | 説明 |
|---|---|---|
|
| 現在のTravelセッションID。 |
|
| セッションモード: |
|
| ワールド作成モデル。一般的な値は |
|
| 最初のフレーム画像URL。サーバーから返されない場合は |
|
| Adventure の最大体験時間(秒単位)。Directing および Acting セッションの場合、またはサーバーがこのフィールドを返さない場合は |
|
| アクトのアスペクト比。他のモードの場合やサーバーから返されない場合は |
エラー
以下のケースでは start() が reject され、error イベントが発火します。エラーを確認するには isSdkError(err) を使用し、err.code と err.message を読み取ってください。
ErrorCode | 説明 |
|---|---|
| SDK機能が無効になっています( |
| 開始できません:現在のステータスでは許可されていないか、Open Platform が設定されていないか、セッションへの参加に失敗しました |
| 開始できません:サーバーから返されたセッション設定が不完全です |
| 開始できません:ビデオストリーム接続に失敗したか、SDK機能フラグのリクエストに失敗しました |
| 開始できません:ビデオストリームの待機中にタイムアウトしました( |
| 開始できません:ビデオが再生可能になるまでの待機中にタイムアウトしました( |
| Open Platformのパラメータ、リソース、またはサーバーエラー |
Travel.on("statusChanged")
セッションステータスの変更を購読します。
シグネチャ
on("statusChanged", handler: (status: TravelStatus) => void): () => void
パラメータ
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | ステータス変更時に呼び出されるコールバックです。 |
戻り値
購読解除関数を返します。TravelStatus は idle / prepare / running / paused / completed のいずれかです。
エラー
このメソッドはビジネスエラーをスローしません。
Travel.on("firstFrameGenerated")
最初のフレームURL通知を購読します。
シグネチャ
on("firstFrameGenerated", handler: (firstFrame: string) => void): () => void
パラメータ
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | 最初のフレームURLが利用可能になったときに呼び出されるコールバックです。 |
戻り値
購読解除関数を返します。
動作
travel.start() 中にのみ発火します。SDK が Open Platform の enter-travel を呼び出し、空でない firstFrame を受信した後、通常は statusChanged("prepare") の後ですが start() が解決してビデオが再生可能になる前に、イベントが即座に発火します。レスポンスに最初のフレーム URL が含まれていない場合、イベントは発火しません。
エラー
このメソッドはビジネスエラーをスローしません。
Travel.onError
セッションの実行時エラーを購読します。
シグネチャ
onError(handler: (error: unknown) => void): () => void
パラメータ
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | ランタイムエラー発生時に呼び出されるコールバックです。 |
戻り値
購読解除関数を返します。isSdkError を使用してエラーオブジェクトを SdkError に絞り込むことができます。
エラー
このメソッドはビジネスエラーをスローしません。
Travel.sendCommand
リアルタイム制御コマンドを送信します。
シグネチャ
sendCommand(params: AdventureCommand): Promise<void>
パラメータ
AdventureCommand
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| いいえ | 移動方向。省略時のデフォルトは |
|
| いいえ | 視点回転。省略時のデフォルトは |
|
| いいえ | インタラクションアクション。省略時のデフォルトは |
制御コマンドリファレンス
translation — 移動方向
キャラクターの移動を表し、8方向とその組み合わせをサポートします。
値 | 方向 |
|---|---|
| 前進 |
| 後退 |
| 左 |
| 右 |
| 左前 |
| 右前 |
| 左後 |
| 右後 |
| 静止 |
rotation — 視点回転
マウス操作による8方向の視点回転をシミュレートします。
値 | 方向 |
|---|---|
| 上 |
| 下 |
| 左 |
| 右 |
| 左上 |
| 右上 |
| 左下 |
| 右下 |
| None |
interaction — インタラクションアクション
値 | 操作 |
|---|---|
| ジャンプ |
| 攻撃 |
| しゃがむ |
| ダッシュ |
| None |
戻り値
コマンド送信後に解決される Promise<void> を返します。
エラー
sendCommand() は以下のケースで reject されます:
ErrorCode | 説明 |
|---|---|
|
|
| 現在のステータスまたはセッションモードではコマンドが許可されていないか、ビデオストリームコマンドが失敗しました |
Travel.sendInstruct
ディレクション指示またはプロンプトコンテンツを送信します。
シグネチャ
sendInstruct(params: InstructData): Promise<void>
パラメータ
InstructData
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | 送信するプロンプトの内容。 |
戻り値
Open Platformが指示を受信して処理した後に解決される Promise<void> を返します。
エラー
sendInstruct() は以下のケースで reject され、error イベントを発行します:
ErrorCode | 説明 |
|---|---|
| セッションが開始されていません |
| ディレクション指示の送信に失敗しました |
| Open Platformのパラメータ、リソース、またはサーバーエラー |
Travel.pause
現在のセッションを一時停止します。
シグネチャ
pause(): Promise<void>
パラメータ
パラメータはありません。
戻り値
ビデオ再生停止後に解決される Promise<void> を返します。
エラー
pause() は以下のケースで reject されます:
ErrorCode | 説明 |
|---|---|
| 現在のステータス、セッションモード、またはセッション機能では一時停止が許可されていないか、一時停止リクエストが失敗しました |
| バックエンドがビデオストリームの一時停止を報告するのを待っている間にタイムアウトしました(15秒) |
| Open Platformのパラメータ、リソース、またはサーバーエラー |
Travel.resume
一時停止中のセッションを再開します。
シグネチャ
resume(): Promise<void>
パラメータ
パラメータはありません。
戻り値
ビデオが再び再生可能になった後に解決される Promise<void> を返します。
エラー
resume() は以下のケースで reject されます:
ErrorCode | 説明 |
|---|---|
| 現在のステータス、セッションモード、またはセッション機能では再開が許可されていないか、再開リクエストが失敗しました |
| ビデオが再び再生可能になるのを待っている間にタイムアウトしました(15秒) |
| Open Platformのパラメータ、リソース、またはサーバーエラー |
Travel.rewind
現在のセッションを指定された時間に巻き戻します。
シグネチャ
rewind(params: RewindTravelParams): Promise<RewindTravelResult>
パラメータ
RewindTravelParams
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
|
| はい | ターゲット時間(秒単位)。4 の倍数のみがサポートされています(例: |
戻り値
巻き戻しが完了して再生が再開された後に解決される Promise<RewindTravelResult> を返します。
RewindTravelResult
フィールド | タイプ | 説明 |
|---|---|---|
|
| サーバーが再生を再開した実際の時刻(秒単位)。 |
エラー
rewind() は以下のケースで reject され、error イベントを発行します:
ErrorCode | 説明 |
|---|---|
| セッションが開始されていません |
| 巻き戻しできません:先にセッションを一時停止してビデオ再生を停止する必要があります。または、巻き戻しリクエストもしくは RTC 再接続に失敗しました |
| 巻き戻し後にビデオが再開するのを待っている間にタイムアウトしました(15秒) |
| Open Platformのパラメータ、リソース、またはサーバーエラー |
Travel.end
現在のセッションを終了し、そのリソースを解放します。
シグネチャ
end(): Promise<void>
パラメータ
パラメータはありません。
戻り値
クリーンアップ完了後に解決される Promise<void> を返します。
エラー
クリーンアップエラーは呼び出し元にスローされません。end() はリソース解放のために最善の努力を行います。
エラー処理
SDK は Promise の reject または error イベントを通じてランタイムエラーを公開します。エラーは SdkError オブジェクトです。isSdkError(err) を使用して err.code と err.message を読み取ってください。
認識された Open Platform エラーは 10000001–10000012 の範囲にマッピングされ、err.message にはプラットフォームのメッセージが含まれます。メソッド固有のコードについては、各 Travel API の Errors セクションを参照してください。
ErrorCodeリファレンス
エラーコード範囲:
100000xx:マップされたOpen Platformエラー1001xxxx:Engineクライアントエラー1002xxxx:Travelクライアントエラー
code | name | 説明 |
|---|---|---|
|
| 無効なリクエストパラメータ(Open Platformから返される) |
|
| リソースが見つかりません(Travelが存在しない、所有権がない、別のワークスペースにある、またはアーティファクトの準備ができていない) |
|
| ワールドが存在しない、削除された、または現在の開発者に属していません |
|
| システムエラー |
|
| チケットが無効または期限切れです |
|
| チケットは既に使用されています(ワンタイムクレデンシャル) |
|
| ワールドの準備ができていないため、入場できません |
|
| 推論リソースの割り当てに失敗しました(キャパシティ不足、ストリーム作成失敗、セッション初期化失敗など) |
|
| このAPIはプライマリAPIキーのみを受け付けます(一時APIキーはサポートされていません) |
|
| コンテンツモデレーションにより入力が拒否されました |
|
| 入力画像が著作権またはIPポリシーに違反しています |
|
| リクエストが現在のリソース状態と競合しています |
|
| SDKクライアントの引数検証に失敗しました(Open Platformからはマッピングされません) |
|
| SDK機能が無効になっています |
|
| Travelはすでにアクティブです |
|
| 再生中にビデオストリームが切断されました |
|
| セッション開始リクエスト失敗 |
|
| 起動時にビデオストリーム設定が見つかりません |
|
| ビデオストリーム接続失敗 |
|
| ビデオストリームの待機中にタイムアウトしました |
|
| ビデオが再生可能になるのを待っている間にタイムアウトしました |
|
| 一時停止リクエスト失敗 |
|
| ビデオの一時停止待機中にタイムアウトしました |
|
| 再開リクエスト失敗 |
|
| ビデオの再開待機中にタイムアウトしました |
|
| 巻き戻しリクエスト失敗 |
|
| 巻き戻し後にビデオが再開するのを待っている間にタイムアウトしました |
|
| リアルタイム制御コマンドの送信に失敗しました |
|
| ディレクション指示の送信に失敗しました |
|
| セッション終了リクエスト失敗 |
その他のエクスポート
ランタイムエクスポート
エクスポート | タイプ | 説明 |
|---|---|---|
|
| Open Platformの設定、トークンの更新、およびTravelセッションの作成を行うSDKクライアント。 |
|
| 現在のSDKバージョン。 |
|
| 現在のSDKパッケージ名、バージョン、およびパッケージチャネル。 |
|
| SDKによってエクスポートされるエラーコード定数オブジェクト。 |
|
| 不明なエラーが標準SDKエラーかどうかを確認します。 |
ErrorCode
SDK からエクスポートされるエラーコード定数オブジェクトです。アプリケーションコード全体に数値リテラルを散在させるのではなく、SdkError.code と比較してください。
import { ErrorCode } from '@happy-oyster/js-sdk'
isSdkError
未知のエラーが標準的な SDK エラーかどうかを確認します。これが true を返す場合、TypeScript はエラーを SdkError に絞り込み、code と message への安全なアクセスを可能にします。
isSdkError(error: unknown): error is SdkError
try {
await travel.start()
} catch (err) {
if (isSdkError(err) && err.code === ErrorCode.OPEN_PLATFORM_TICKET_INVALID) {
// Request a new Travel ticket, then create a new Travel.
}
}
パブリック型
以下の型はパッケージのエントリーポイントからエクスポートされており、@happy-oyster/js-sdk から直接インポートできます。これらは TypeScript のコンパイル時にのみ存在し、ランタイムコードは生成しません。
タイプ | 説明 |
|---|---|
|
|
| SDK ログレベル: |
| SDKパッケージメタデータ: |
| SDKパッケージチャネル: |
|
|
| Promise解決時に返される |
|
|
| アクトのアスペクト比: |
| メソッドによって返される |
| ローカル SDK セッションステータス: |
|
|
|
|
|
|
|
|
| Promise解決時に返される |
|
|
| ランタイム |
|
|