HappyOysterEngine configura el host y el modelo de Open Platform, actualiza el token de clave de API temporal de Model Studio y crea sesiones de Travel. Travel es el objeto de sesión devuelto por createTravel(); la sesión se ingresa e inicia solo después de llamar a travel.start(). Admite los modos de aventura, dirección y actuación.
HappyOysterEngine configura el host de Open Platform, actualiza el token de clave de API temporal de Model Studio y crea sesiones de Travel.
Travel es el objeto de sesión devuelto por createTravel(). La sesión se ingresa e inicia solo después de llamar a travel.start().
Terminología principal
Término | Significado | Notas |
|---|---|---|
token | Token de clave de API temporal de Model Studio: al llamar a los servicios de Model Studio desde entornos no confiables como navegadores o aplicaciones móviles, genere una clave de API temporal a través de un backend seguro para evitar exponer una clave de API permanente. El SDK envía este token a Open Platform como una credencial HTTP Bearer. | |
ticket | Credencial de Travel del mundo HappyOyster: su backend llama a la API de credenciales utilizando autenticación AK (encabezado de gateway) para obtener una credencial de Travel de corta duración ( |
Visión general
El SDK proporciona los siguientes objetos principales:
HappyOysterEngine
API | Descripción |
|---|---|
| Crea una instancia de Engine. |
| Actualiza el token de clave API temporal de Model Studio utilizado por las solicitudes posteriores de la API de Open Platform. |
| Crea una sesión de Travel. |
| La versión actual del SDK. |
| El nombre del paquete, la versión y el canal del paquete actuales del SDK. |
Viaje
API | Descripción |
|---|---|
| Inicia la sesión de Travel actual. |
| Se suscribe a los cambios de estado de la sesión. |
| Se suscribe a las notificaciones de URL del primer fotograma. |
| Se suscribe a los metadatos de sesión disponibles inmediatamente después de ingresar al travel. |
| Se suscribe a los errores de tiempo de ejecución de la sesión. |
| Verifica si la acción especificada se puede llamar actualmente. |
| Obtiene los metadatos de sesión disponibles; devuelve |
| Envía un comando de control en tiempo real. |
| Envía instrucciones de dirección o contenido de prompt. |
| Pausa la sesión actual. |
| Reanuda una sesión pausada. |
| Rebobina una sesión de dirección al tiempo especificado. |
| Finaliza la sesión actual y libera sus recursos. |
Otras exportaciones
Exportación | Descripción |
|---|---|
| El objeto constante de códigos de error exportado por el SDK. |
| Verifica si un error desconocido es un error estándar del SDK. |
Tipos | Tipos públicos como |
Ejemplo
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 es el punto de entrada del Web SDK. Configura el host de Open Platform, administra el token de clave de API temporal de Model Studio utilizado por las solicitudes subsiguientes y crea sesiones de Travel.
NotaUna instancia de Engine actualmente gestiona solo un Travel activo a la vez. Finalice el Travel actual antes de iniciar una nueva sesión.
Después de establecer un token, ya sea en el constructor o mediante updateToken(), el SDK obtiene internamente la configuración de Feature Gate. Esto permite a la plataforma deshabilitar remotamente el SDK o requerir que las versiones anteriores se actualicen. Si la solicitud falla, el SDK opera en modo abierto y no bloquea la experiencia normal.
API | Descripción |
|---|---|
| Crea una instancia de Engine con el host de API y modelo requeridos, y token y nivel de registro opcionales. |
| Actualiza el token de clave API temporal de Model Studio utilizado por las solicitudes posteriores de Open Platform. |
| Crea una sesión de Travel que aún no ha iniciado. |
new HappyOysterEngine
Crea una instancia de HappyOysterEngine.
Signature
new HappyOysterEngine(config: SDKConfig)
Parámetros
SDKConfig
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Host de la API de Open Platform. Debe ser un host simple, como |
|
| Sí | Identificador del modelo de Open Platform a utilizar. Obligatorio, sin valor predeterminado. Fijo para este Engine y compartido por todos sus Travels. |
|
| No | Token de clave de API temporal de Model Studio establecido durante la construcción. También se puede establecer posteriormente con |
|
| No | Nivel de registro del SDK. El valor predeterminado es |
|
| No | Tiempo de espera para que |
Establezca model en un identificador de modelo, como happyoyster-1.0-adventure, un modelo de Aventura. Utilice el identificador de modelo correspondiente a su entorno de servicio objetivo. El SDK no elige un modelo basándose en el mode de la experiencia ni lo infiere del ticket.
Un Engine tiene un APIHost + model fijo. Reutilícelo para Travels sucesivos dirigidos al mismo servicio y modelo. Antes de cambiar cualquiera de estos valores, finalice el Travel activo y utilice un Engine configurado para el nuevo objetivo. Cree el mundo y emita su ticket contra el mismo servicio objetivo.
Valores devueltos
Devuelve una instancia de HappyOysterEngine.
Errores
Si falta config, o si APIHost, model, token, logLevel o streamReadyTimeout tiene un tipo o valor no válido, se lanza sincrónicamente un SdkError con el código ErrorCode.INVALID_ARGUMENT (10010001). Pasar una URL completa, una cadena vacía o un valor con ruta como APIHost no es válido.
model es obligatorio y debe ser una cadena no vacía después de recortar espacios; null, los valores que no sean cadenas y las cadenas con solo espacios en blanco no son válidos. Omitirlo o pasar undefined también genera un error de argumento; el SDK no tiene un modelo predeterminado.
HappyOysterEngine.updateToken
Actualiza el token de clave API temporal de Model Studio utilizado por las solicitudes posteriores de la API de Open Platform.
Signature
updateToken(token: string): void
Parámetros
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Token de clave API temporal de Model Studio. Pasar una cadena vacía borra el token actual. |
Valores devueltos
No devuelve nada.
Errores
Si token no es una cadena, se lanza sincrónicamente un SdkError con el código ErrorCode.INVALID_ARGUMENT (10010001).
HappyOysterEngine.createTravel
Crea una instancia de sesión de Travel sin iniciarla.
Signature
createTravel(config: CreateTravelConfig): Travel
Parámetros
CreateTravelConfig
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Ticket utilizado para iniciar el Travel posteriormente. |
|
| Sí | El elemento |
|
| No | Duración máxima de la experiencia de Aventura, en segundos. Las sesiones de Dirección y Actuación ignoran este campo. Si se omite, el servidor aplica su valor predeterminado. |
Valores devueltos
Devuelve una sesión Travel creada pero aún no iniciada. El invocador debe ejecutar entonces await travel.start() para ingresar a la sesión y esperar a que el video esté listo para reproducirse.
Cada instancia de HappyOysterEngine puede tener solo un Travel activo a la vez. Llame a await travel.end() antes de crear otro Travel.
Errores
createTravel() genera un SdkError sincrónicamente en los siguientes casos:
ErrorCode | Descripción |
|---|---|
|
|
| Ya hay un Travel activo; llame primero a |
Los errores de inicio son expuestos por travel.start().
Travel
Travel representa una sesión creada por HappyOysterEngine.createTravel(). Inicialmente está inactiva. Después de llamar a travel.start(), el SDK ingresa a la sesión y espera a que el video esté listo para reproducirse.
Travel permite iniciar, pausar, reanudar, rebobinar y finalizar una sesión; enviar controles e indicaciones en tiempo real; y suscribirse a cambios de estado y errores de tiempo de ejecución.
Métodos
Método | Descripción |
|---|---|
| Inicia la sesión de Travel actual. |
| Se suscribe a los cambios de estado de la sesión. |
| Se suscribe a las notificaciones de URL del primer fotograma. |
| Se suscribe a los metadatos de sesión disponibles inmediatamente después de ingresar al travel. |
| Se suscribe a los errores de tiempo de ejecución de la sesión. |
| Verifica si la acción especificada se puede llamar actualmente. |
| Obtiene los metadatos de sesión disponibles; devuelve |
| Envía un comando de control en tiempo real. |
| Envía instrucciones de dirección o contenido de prompt. |
| Pausa la sesión actual. |
| Reanuda una sesión pausada. |
| Rebobina la sesión actual al tiempo especificado. |
| Finaliza la sesión actual y libera sus recursos. |
Status
Status | Descripción |
|---|---|
| La sesión no ha iniciado. |
| La sesión se está iniciando y esperando que el video esté disponible para reproducción. |
| La sesión se está ejecutando. |
| La sesión está en pausa y se puede reanudar o rebobinar. |
| La sesión ha finalizado normalmente y sus recursos han sido liberados. |
Eventos
Suscríbase a eventos con travel.on(event, handler). El método devuelve una función de cancelación de suscripción.
Evento | Callback | Descripción |
|---|---|---|
|
| El estado de la sesión cambió. |
|
| Emitido durante |
|
| Emitido después de que regresa enter-travel y antes de que se conecte RTC. |
|
| Un error de tiempo de ejecución de la sesión. |
Travel.can
Verifica si una acción está disponible para el estado actual y la capacidad de la sesión.
Signature
can(action: TravelAction): boolean
Parámetros
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Acción a verificar: |
Valores devueltos
Devuelve un boolean. true significa que la acción está disponible actualmente; false significa que el estado actual, el modo o la capacidad de la sesión no cumplen sus condiciones previas.
Disponibilidad
acción | Disponibilidad |
|---|---|
| Travel todavía está |
|
|
|
|
|
|
|
|
|
|
| Travel no se ha cerrado. |
Errores
Este método no genera errores de negocio. Las acciones desconocidas devuelven false.
Travel.start
Inicia la sesión de Travel actual.
Signature
start(): Promise<StartTravelResult>
Parámetros
Sin parámetros.
Valores devueltos
Devuelve un Promise<StartTravelResult>, que se resuelve después de que inicia la sesión y el video está disponible para reproducción.
Después de que regresa enter-travel, el SDK emite travelInfoReady antes de conectar RTC. Los suscriptores tardíos pueden llamar a travel.getInfo(); esta devuelve null antes de que los metadatos estén disponibles. Si la respuesta incluye un firstFrame no vacío, firstFrameGenerated se emitirá de todos modos.
StartTravelResult
Campo | Tipo | Descripción |
|---|---|---|
|
| ID de la sesión de Travel actual. |
|
| Modo de sesión: |
|
| Modelo de creación de mundo; los valores comunes son |
|
| URL de la imagen del primer fotograma; |
|
| Duración máxima de la experiencia de Aventura, en segundos. |
|
| Relación de aspecto de actuación; |
Errores
start() rechaza la promesa y emite un evento error en los siguientes casos. Utilice isSdkError(err) para verificar el error y leer err.code y err.message.
ErrorCode | Descripción |
|---|---|
| La función del SDK está deshabilitada ( |
| No se puede iniciar: el estado actual no lo permite, Open Platform no está configurada o falló el ingreso a la sesión |
| No se puede iniciar: la configuración de sesión devuelta por el servidor está incompleta |
| No se puede iniciar: falló la conexión de la transmisión de video o la solicitud de bandera de función del SDK |
| No se puede iniciar: se agotó el tiempo de espera para el stream de video (utiliza el mayor entre |
| No se puede iniciar: se agotó el tiempo de espera para que el video estuviera listo para reproducirse (controlado por |
| Error de parámetro, recurso o servidor de Open Platform |
Travel.on("statusChanged")
Se suscribe a los cambios de estado de la sesión.
Signature
on("statusChanged", handler: (status: TravelStatus) => void): () => void
Parámetros
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Callback invocado cuando cambia el estado. |
Valores devueltos
Devuelve una función de cancelación de suscripción. TravelStatus es uno de idle / prepare / running / paused / completed.
Errores
Este método no genera errores de negocio.
Travel.on("firstFrameGenerated")
Se suscribe a las notificaciones de URL del primer fotograma.
Signature
on("firstFrameGenerated", handler: (firstFrame: string) => void): () => void
Parámetros
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Callback invocado cuando la URL del primer fotograma está disponible. |
Valores devueltos
Devuelve una función para cancelar la suscripción.
Comportamiento
Se emite solo durante travel.start(). Después de que el SDK llama a enter-travel de Open Platform y recibe un firstFrame no vacío, emite el evento inmediatamente, generalmente después de statusChanged("prepare") pero antes de que start() se resuelva y el video esté listo para reproducirse. El evento no se emite si la respuesta no contiene una URL de primer fotograma.
Errores
Este método no genera errores de negocio.
Travel.onError
Se suscribe a los errores de tiempo de ejecución de la sesión.
Signature
onError(handler: (error: unknown) => void): () => void
Parámetros
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Callback invocado cuando ocurre un error de tiempo de ejecución. |
Valores devueltos
Devuelve una función de cancelación de suscripción. Use isSdkError para restringir el objeto de error a SdkError.
Errores
Este método no genera errores de negocio.
Travel.sendCommand
Envía un comando de control en tiempo real.
Signature
sendCommand(params: AdventureCommand): Promise<void>
Parámetros
AdventureCommand
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| No | Dirección de movimiento. El valor predeterminado es |
|
| No | Rotación de vista. El valor predeterminado es |
|
| No | Acción de interacción. El valor predeterminado es |
Referencia de comandos de control
translation — Dirección de movimiento
Describe el movimiento del personaje, admitiendo ocho direcciones y combinaciones.
Valor | Dirección |
|---|---|
| Adelante |
| Atrás |
| Izquierda |
| Derecha |
| Adelante-izquierda |
| Adelante-derecha |
| Atrás-izquierda |
| Atrás-derecha |
| Estacionario |
rotation — Rotación de vista
Simula la rotación de vista basada en mouse en ocho direcciones.
Valor | Dirección |
|---|---|
| Arriba |
| Abajo |
| Izquierda |
| Derecha |
| Arriba-izquierda |
| Arriba-derecha |
| Abajo-izquierda |
| Abajo-derecha |
| None |
interaction — Acción de interacción
Valor | Acción |
|---|---|
| Saltar |
| Atacar |
| Agacharse |
| Correr |
| None |
Valores devueltos
Devuelve un Promise<void> que se resuelve después de enviar el comando.
Errores
sendCommand() se rechaza en los siguientes casos:
ErrorCode | Descripción |
|---|---|
|
|
| El estado actual o el modo de sesión no permite comandos, o falló el comando de transmisión de video |
Travel.sendInstruct
Envía instrucciones de dirección o contenido de prompt.
Signature
sendInstruct(params: InstructData): Promise<void>
Parámetros
InstructData
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Contenido del prompt a enviar. |
Valores devueltos
Devuelve un Promise<void> que se resuelve después de que Open Platform recibe y procesa la instrucción.
Errores
sendInstruct() se rechaza y emite un evento error en los siguientes casos:
ErrorCode | Descripción |
|---|---|
| La sesión no ha iniciado |
| Error al enviar la instrucción de Directing |
| Error de parámetro, recurso o servidor de Open Platform |
Travel.pause
Pausa la sesión actual.
Signature
pause(): Promise<void>
Parámetros
Sin parámetros.
Valores devueltos
Devuelve un Promise<void> que se resuelve después de que se detiene la reproducción de video.
Errores
pause() se rechaza en los siguientes casos:
ErrorCode | Descripción |
|---|---|
| El estado actual, el modo de sesión o la capacidad de sesión no permiten pausar, o falló la solicitud de pausa |
| Tiempo de espera agotado esperando que el backend reporte la transmisión de video como pausada (15 segundos) |
| Error de parámetro, recurso o servidor de Open Platform |
Travel.resume
Reanuda una sesión pausada.
Signature
resume(): Promise<void>
Parámetros
Sin parámetros.
Valores devueltos
Devuelve un Promise<void> que se resuelve después de que el video vuelve a estar disponible para reproducción.
Errores
resume() se rechaza en los siguientes casos:
ErrorCode | Descripción |
|---|---|
| El estado actual, el modo de sesión o la capacidad de sesión no permiten reanudar, o falló la solicitud de reanudación |
| Tiempo de espera agotado esperando que el video esté disponible para reproducción nuevamente (15 segundos) |
| Error de parámetro, recurso o servidor de Open Platform |
Travel.rewind
Rebobina la sesión actual al tiempo especificado.
Signature
rewind(params: RewindTravelParams): Promise<RewindTravelResult>
Parámetros
RewindTravelParams
Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Tiempo objetivo en segundos. Solo se admiten múltiplos de 4 (por ejemplo, |
Valores devueltos
Devuelve un Promise<RewindTravelResult> que se resuelve después de completar el rebobinado y reanudar la reproducción.
RewindTravelResult
Campo | Tipo | Descripción |
|---|---|---|
|
| El tiempo real en segundos en el que el servidor reanudó la reproducción. |
Errores
rewind() se rechaza y emite un evento error en los siguientes casos:
ErrorCode | Descripción |
|---|---|
| La sesión no ha iniciado |
| No se puede rebobinar: primero se debe pausar la sesión y detener la reproducción de video, o bien falló la solicitud de rebobinado o la reconexión RTC |
| Tiempo de espera agotado esperando que el video se reanude después de rebobinar (15 segundos) |
| Error de parámetro, recurso o servidor de Open Platform |
Travel.end
Finaliza la sesión actual y libera sus recursos.
Signature
end(): Promise<void>
Parámetros
Sin parámetros.
Valores devueltos
Devuelve un Promise<void> que se resuelve después de finalizar la limpieza.
Errores
Los errores de limpieza no se lanzan al llamador; end() hace todo lo posible por liberar recursos.
Manejo de errores
El SDK expone errores de tiempo de ejecución mediante rechazos de Promise o eventos error. Los errores son objetos SdkError; utilice isSdkError(err) y lea err.code y err.message.
Los errores reconocidos de Open Platform se asignan al rango 10000001–10000012, y err.message contiene el mensaje de la plataforma. Consulte la sección de Errores de cada API de Travel para ver los códigos específicos de cada método.
Referencia de ErrorCode
Rangos de códigos de error:
100000xx: Errores mapeados de Open Platform1001xxxx: Errores del cliente Engine1002xxxx: Errores del cliente Travel
code | name | Descripción |
|---|---|---|
|
| Parámetros de solicitud no válidos (devueltos por Open Platform) |
|
| Recurso no encontrado (Travel faltante, no propio, en otro espacio de trabajo o artefacto no listo) |
|
| El mundo no existe, fue eliminado o no pertenece al desarrollador actual |
|
| Error del sistema |
|
| El ticket es inválido o ha expirado |
|
| El ticket ya ha sido utilizado (credencial de un solo uso) |
|
| El mundo no está listo y no se puede ingresar |
|
| Falló la asignación de recursos de inferencia (capacidad insuficiente, fallo en la creación del stream, fallo en la inicialización de la sesión, etc.) |
|
| Esta API acepta solo la clave API principal (las claves API temporales no son compatibles) |
|
| Entrada rechazada por moderación de contenido |
|
| La imagen de entrada infringe la política de derechos de autor o propiedad intelectual |
|
| La solicitud entra en conflicto con el estado actual del recurso |
|
| Falló la validación de argumentos del cliente SDK (no mapeado desde Open Platform) |
|
| La función del SDK está deshabilitada |
|
| Ya hay un Travel activo |
|
| Transmisión de video desconectada durante la reproducción |
|
| Error en la solicitud de inicio de sesión |
|
| Falta la configuración de la transmisión de video durante el inicio |
|
| Error en la conexión del flujo de video |
|
| Tiempo de espera agotado al esperar el flujo de video |
|
| Tiempo de espera agotado esperando que el video esté disponible para reproducción |
|
| Error en la solicitud de pausa |
|
| Tiempo de espera agotado al esperar que el video se pause |
|
| Error en la solicitud de reanudación |
|
| Tiempo de espera agotado al esperar que el video se reanude |
|
| Error en la solicitud de rebobinado |
|
| Tiempo de espera agotado esperando que el video se reanude después de rebobinar |
|
| Error al enviar el comando de control en tiempo real |
|
| Error al enviar la instrucción de Directing |
|
| Error en la solicitud de finalización de sesión |
Otras exportaciones
Exportaciones de tiempo de ejecución
Exportación | Tipo | Descripción |
|---|---|---|
|
| Cliente SDK que configura Open Platform, actualiza el token y crea sesiones de Travel. |
|
| La versión actual del SDK. |
|
| El nombre del paquete, la versión y el canal del paquete actuales del SDK. |
|
| El objeto constante de códigos de error exportado por el SDK. |
|
| Verifica si un error desconocido es un error estándar del SDK. |
ErrorCode
El objeto constante de códigos de error exportado por el SDK. Compárelo con SdkError.code en lugar de dispersar literales numéricos en el código de la aplicación.
import { ErrorCode } from '@happy-oyster/js-sdk'
isSdkError
Verifica si un error desconocido es un error estándar del SDK. Cuando devuelve true, TypeScript restringe el error a SdkError, lo que permite acceder de forma segura a code y 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.
}
}
Tipos públicos
Los siguientes tipos se exportan desde el punto de entrada del paquete y se pueden importar directamente desde @happy-oyster/js-sdk. Existen solo en tiempo de compilación de TypeScript y no generan código en tiempo de ejecución.
Tipo | Descripción |
|---|---|
| Tipo de parámetro del constructor de |
| Niveles de registro del SDK: |
| Metadatos del paquete SDK: |
| Canales de paquete del SDK: |
| Tipo de parámetro de |
| Metadatos de sesión de |
| Metadatos de sesión utilizados por |
| Relación de aspecto de actuación: |
| Contrato de sesión pública de |
| Estados de sesión locales del SDK: |
| Nombres de acción compatibles con |
| Tipo de parámetro de |
| Tipo de parámetro de |
| Tipo de parámetro de |
| Datos de |
| Estructura de error del SDK que contiene |
| Tipo de error que combina |
| Unión de todos los valores de código de error en el objeto |