LangChain Reference home pageLangChain ReferenceLangChain Reference
  • GitHub
  • Main Docs
Deep Agents
LangChain
LangGraph
Integrations
LangSmith
LangGraph
  • Web
  • Channels
  • Pregel
  • Prebuilt
  • Remote
  • Overview
  • Getting started
  • injectStream
  • Selectors
  • Interrupts & headless tools
  • Subagents & subgraphs
  • Fork & edit from a checkpoint
  • Submission queue
  • Multimodal media
  • Transports
  • Dependency injection
  • Type safety
  • Migrating to v1
LangGraph SDK
  • Ui
  • Client
  • Auth
  • React
  • Logging
  • React Ui
  • Utils
  • Server
  • Stream
LangGraph Checkpoint
LangGraph Checkpoint MongoDB
LangGraph Checkpoint Postgres
  • Store
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
WebChannelsPregelPrebuiltRemote
OverviewGetting startedinjectStreamSelectorsInterrupts & headless toolsSubagents & subgraphsFork & edit from a checkpointSubmission queueMultimodal mediaTransportsDependency injectionType safetyMigrating to v1
LangGraph SDK
UiClientAuthReactLoggingReact UiUtilsServerStream
LangGraph Checkpoint
LangGraph Checkpoint MongoDB
LangGraph Checkpoint Postgres
Store
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/angularMultimodal media

Multimodal media

injectAudio, injectImages, injectVideo, and injectFiles 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
injectAudio transcript?: string, duration?: number, sampleRate?: number
injectImages width?: number, height?: number
injectVideo duration?: number, width?: number, height?: number
injectFiles filename?: string, size?: number

Media hooks

import { injectAudio, injectImages, injectVideo, injectFiles } from "@langchain/angular";

const audios = injectAudio(stream);
const images = injectImages(stream);
const videos = injectVideo(stream);
const files = injectFiles(stream);

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

injectMediaUrl

injectMediaUrl turns a media handle into a stable blob URL you can pass to <audio/img/video src>:

import { injectAudio, injectMediaUrl } from "@langchain/angular";

function AudioReply({ stream }: { stream: AnyStream }) {
  const audios = injectAudio(stream);
  const latest = audios.at(-1);
  const url = injectMediaUrl(latest);
  return url ? <audio controls src={url} /> : null;
}

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

injectMediaUrl / injectMediaUrl

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

import { injectAudio, injectMediaUrl } from "@langchain/angular";

function AudioPlayer({ stream }: { stream: AnyStream }) {
  const audio = injectAudio(stream).at(-1);
  const player = injectMediaUrl(audio, { autoPlay: true });

  return (
    <div>
      <button onClick={player.toggle}>{player.isPlaying ? "Pause" : "Play"}</button>
      <progress value={player.currentTime} max={player.duration} />
    </div>
  );
}

injectMediaUrl mirrors the same shape for video handles.

API reference

Classes

Class

MediaAssemblyError

Typed error thrown through media.stream / rejected from

Functions

Function

injectAudio

Subscribe to a scoped audio-media stream. Each handle is yielded

Function

injectImages

Subscribe to a scoped image-media stream. Pair with

Function

injectVideo

Subscribe to a scoped video-media stream. Pair with

Function

injectFiles

Subscribe to a scoped file-media stream. Pair with

Function

injectMediaUrl

Resolve the lazy MediaBase.objectURL promise into a string

Interfaces

Interface

AudioMedia

Shared surface across every media handle returned by

Interface

ImageMedia

Shared surface across every media handle returned by

Interface

VideoMedia

Shared surface across every media handle returned by

Interface

FileMedia

Shared surface across every media handle returned by

Types

Type

AnyMediaHandle