LangChain Reference home pageLangChain ReferenceLangChain Reference
  • GitHub
  • Main Docs
Deep Agents
LangChain
LangGraph
Integrations
LangSmith
LangGraph
  • Web
  • Channels
  • Pregel
  • Prebuilt
  • Remote
  • Stream
  • Overview
  • Getting started
  • useStream
  • Selectors
  • Interrupts & headless tools
  • Subagents & subgraphs
  • Fork & edit from a checkpoint
  • Submission queue
  • Multimodal media
  • Transports
  • Suspense
  • provideStream & context
  • Type safety
  • Migrating to v1
LangGraph SDK
  • Client
  • Auth
  • React
  • Logging
  • React Ui
  • Server
LangGraph Checkpoint
LangGraph Checkpoint MongoDB
LangGraph Checkpoint Postgres
LangGraph Checkpoint Redis
  • Shallow
  • Store
LangGraph Checkpoint SQLite
LangGraph Checkpoint Validation
  • Cli
LangGraph API
LangGraph CLI
LangGraph CUA
  • Utils
LangGraph Supervisor
LangGraph Swarm
⌘I

LangChain Assistant

Ask a question to get started

Enter to send•Shift+Enter new line

Menu

LangGraph
WebChannelsPregelPrebuiltRemoteStream
OverviewGetting starteduseStreamSelectorsInterrupts & headless toolsSubagents & subgraphsFork & edit from a checkpointSubmission queueMultimodal mediaTransportsSuspenseprovideStream & contextType safetyMigrating to v1
LangGraph SDK
ClientAuthReactLoggingReact UiServer
LangGraph Checkpoint
LangGraph Checkpoint MongoDB
LangGraph Checkpoint Postgres
LangGraph Checkpoint Redis
ShallowStore
LangGraph Checkpoint SQLite
LangGraph Checkpoint Validation
Cli
LangGraph API
LangGraph CLI
LangGraph CUA
Utils
LangGraph Supervisor
LangGraph Swarm
Language
Theme
JavaScript@langchain/vueMultimodal media

Multimodal media

useAudio, useImages, useVideo, and useFiles assemble multimodal blocks from the protocol stream. Each hook returns an array of media handles (one per message containing a matching block in the target namespace).

Runnable example: The multimodal storybook in the streaming cookbook streams story text, generated images, audio narration, and video from scoped graph nodes.

Handle shape

Every media handle exposes the same core fields, plus media-specific extras:

Field Type Description
id string Stable id for the media block.
messageId string Owning message id.
partialBytes Uint8Array \| undefined Live-growing byte buffer during streaming.
blob Blob \| undefined Settled Blob — populated on message-finish.
objectURL string \| undefined Object URL for the settled Blob (auto-revoked).
error unknown Fail-loud error surface.
mimeType string \| undefined Declared MIME type.

Media-specific extras:

Hook Extras
useAudio transcript?: string, duration?: number, sampleRate?: number
useImages width?: number, height?: number
useVideo duration?: number, width?: number, height?: number
useFiles filename?: string, size?: number

Media hooks

import { useAudio, useImages, useVideo, useFiles } from "@langchain/vue";

const audios = useAudio(stream);
const images = useImages(stream);
const videos = useVideo(stream);
const files = useFiles(stream);

Each accepts an optional target argument (subagent / subgraph / { namespace }) to scope the subscription — see Selectors.

useMediaURL

useMediaURL turns a media handle into a stable blob URL you can pass to <audio/img/video src>. It owns the object URL lifecycle: URLs are created on demand and revoked when the host Vue scope unmounts or the input media changes.

<script setup lang="ts">
import { computed } from "vue";
import { useAudio, useAudioPlayer, useMediaURL } from "@langchain/vue";

const audio = useAudio(stream);
const latest = computed(() => audio.value.at(-1));
const player = useAudioPlayer(latest);
const downloadUrl = useMediaURL(latest);
</script>

<template>
  <button v-if="latest" @click="player.status === 'playing' ? player.pause() : player.play()">
    {{ player.status === "playing" ? "Pause" : "Play" }}
  </button>
  <a v-if="downloadUrl" :href="downloadUrl" download> Download </a>
</template>

useMediaURL(undefined) returns undefined — safe to call unconditionally.

useAudioPlayer / useVideoPlayer

useAudioPlayer and useVideoPlayer provide opinionated player handles with play/pause/seek state, built on top of the media hooks:

<script setup lang="ts">
import { computed } from "vue";
import { useAudio, useAudioPlayer } from "@langchain/vue";

const audio = useAudio(stream);
const latest = computed(() => audio.value.at(-1));
const player = useAudioPlayer(latest, { autoPlay: true });
</script>

<template>
  <div>
    <button @click="player.toggle">
      {{ player.isPlaying ? "Pause" : "Play" }}
    </button>
    <progress :value="player.currentTime" :max="player.duration" />
  </div>
</template>

useVideoPlayer mirrors the same shape for video handles.

API reference

Classes

Class

MediaAssemblyError

Typed error thrown through media.stream / rejected from media.blob / media.objectURL when a handle fails before its message completes. Carries the bytes accumulated up to the failure point on `p

Functions

Function

useAudio

Subscribe to a scoped audio-media stream. Each handle is yielded on its first matching content-block-start, exposes .partialBytes for live access, settles .blob / .objectURL / .transcript on

Function

useImages

Subscribe to a scoped image-media stream. Pair with useMediaURL for <img src>.

Function

useVideo

Subscribe to a scoped video-media stream. Pair with useMediaURL for <video src>.

Function

useFiles

Subscribe to a scoped file-media stream. Pair with useMediaURL for an <a download href> target.

Function

useMediaURL

Resolve the lazy MediaBase.objectURL promise into a reactive string suitable for <audio src>, <img src>, <video src>, or <a download href>. Returns undefined until the URL is available.

Lif

Function

useAudioPlayer

Progressive audio playback for AudioMedia handles with a uniform surface across PCM (streamed) and container (HTMLAudioElement) strategies.

See useAudioPlayer in the React binding for the full beha

Function

useVideoPlayer

Bind a VideoMedia handle to a caller-owned <video> element.

Vue idioms:

  • videoRef accepts a raw HTMLVideoElement, a Ref<...>, or a getter. Pair with <video ref="video" /> in the templa

Interfaces

Interface

AudioPlayerHandle

Player controls + live state returned by useAudioPlayer.

Live state is exposed as Vue refs so templates auto-unwrap; all imperative controls are plain functions.

Interface

VideoPlayerHandle

Controls + live state returned by useVideoPlayer. Mirrors AudioPlayerHandle on the shared subset so callers only ever learn one shape.

Interface

AudioMedia

Shared surface across every media handle returned by MediaAssembler.

The handle is live while its parent message is active:

  • partialBytes is a snapshot of all bytes received so far.
  • stream i
Interface

ImageMedia

Shared surface across every media handle returned by MediaAssembler.

The handle is live while its parent message is active:

  • partialBytes is a snapshot of all bytes received so far.
  • stream i
Interface

VideoMedia

Shared surface across every media handle returned by MediaAssembler.

The handle is live while its parent message is active:

  • partialBytes is a snapshot of all bytes received so far.
  • stream i
Interface

FileMedia

Shared surface across every media handle returned by MediaAssembler.

The handle is live while its parent message is active:

  • partialBytes is a snapshot of all bytes received so far.
  • stream i

Types

Type

AnyMediaHandle