@langchain/angular is designed around agent-brand inference: pass typeof agent to the hook and get typed state, tool calls, and (for DeepAgents) subagent state maps back. Plain state generics still work for graphs that aren't built with the agent helpers.
Pass typeof agent to infer state, tool-call union, and (for DeepAgents) subagent state map:
import { Component } from "@angular/core";
import type { agent } from "./agent";
import { injectStream } from "@langchain/angular";
@Component({
/* ... */
})
export class ChatComponent {
readonly stream = injectStream<typeof agent>({
assistantId: "agent",
apiUrl: "http://localhost:2024",
});
// stream.values() is inferred
// stream.toolCalls() is a discriminated union of your tools
// stream.subagents() carries discovery snapshots
}
The same inference works on injectStream<typeof agent>() and on the companion selector injectors when you pass a scoped target:
const messages = injectMessages(stream); // BaseMessage[]
const tools = injectToolCalls<typeof agent>(stream);
const state = injectValues<typeof agent>(stream);
For plain state shapes, pass the state directly. The second and third generic slots are InterruptType and ConfigurableType:
import { injectStream } from "@langchain/angular";
import type { BaseMessage } from "@langchain/core/messages";
interface MyState {
messages: BaseMessage[];
context?: string;
}
readonly stream = injectStream<MyState, { question: string }>({
assistantId: "my-graph",
apiUrl: "http://localhost:2024",
});
Use the Angular-facing StreamApi<T> name when you
need to annotate a stream handle in Angular app or library code.
UseStreamReturn<T> and
UseStreamResult<T> describe the same handle
shape, but are mainly useful in shared utilities that intentionally use
React-style naming.
StreamApi<T> — preferred Angular name for
the fully resolved return type of injectStream, provideStream,
useStream, and StreamService.UseStreamReturn<T> — same stream
handle shape, useful for utilities shared with other frontend
packages.AnyStream — type-erased handle. Use when
the child only forwards stream into selector injectors and doesn't
care about the underlying state shape.import type { AnyStream, StreamApi, UseStreamReturn } from "@langchain/angular";
import type { agent } from "./agent";
function acceptsAngularStream(stream: StreamApi<typeof agent>) {
return stream.values();
}
function acceptsSharedStream(stream: UseStreamReturn<typeof agent>) {
return stream.messages();
}
function passThroughToSelectors(
stream,
subgraph,
}: {
stream: AnyStream;
subgraph: SubgraphDiscoverySnapshot;
}) {
return injectValues(stream, subgraph);
}
| Helper | Use |
|---|---|
InferStateType<T> |
Unwraps a compiled graph / agent brand / agent tool array into its state shape. |
InferToolCalls<T> |
Derives a discriminated union of tool-call shapes. |
InferToolOutput<T> |
Derives a single tool's output type. |
InferSubagentStates<T> |
{ name: State, … } map derived from a DeepAgent brand. |
WidenUpdateMessages<T> |
Widens messages so both wire-format and BaseMessage instances typecheck in submit(). |
StreamSubmitOptions<State, Configurable> |
Options shape accepted by submit(). |
AgentServerAdapter / HttpAgentServerAdapter |
Custom-transport interface + convenience class. See Transports. |
SelectorTarget / SubagentDiscoverySnapshot / SubgraphDiscoverySnapshot |
For components that render scoped views. See Selectors / Subagents. |
AssembledToolCall, ToolCallStatus |
For rendering tool-call UI. |
MessageMetadata, UseSubmissionQueueReturn, SubmissionQueueEntry |
Companion-hook return shapes. See Selectors. |
Return shape of useStream — the Angular StreamApi.
Reactivity primitives follow Angular conventions:
Signal<T>; call them as functions in
templates (`stream.messages()Reactive tool handle for framework bindings (stream.toolCalls,
useToolCalls, injectToolCalls).
status, error, and output are plain values that the assembler updates in place as tool events arri
Metadata tracked per message id. Surfaced to applications via
useMessageMetadata(stream, messageId).
Unwrap the state shape from a compiled graph, a create-agent brand,
or a plain type. Used by useStream<T>() to resolve T = typeof agent into the state the values/messages projections observe.
Infer the discriminated union of AssembledToolCall handles from an agent brand, an array of LangChain tools, or fall back to the untyped default handle.
Pass typeof agent or typeof tools and narr
Infer the subagent → state map from a DeepAgent brand. Non-brands collapse to DefaultSubagentStates.
Widen an update type so its messages field also accepts
@langchain/core BaseMessage class instances (single or
array). Framework bindings apply this to submit() so callers can
write `stream.subm
Convenience alias — the fully-resolved return type of
useStream for a given source type T.
React-compatible alias for the fully-resolved stream handle type. Angular docs prefer StreamApi, but shared libraries can use this name across framework bindings.
Erased handle useful as a parameter type for helper components that
pass a stream through to selector primitives without reading
values directly. Mirrors the React/Vue AnyStream alias.
Widening
High-level outcome of a single tool call.
The lifecycle state of a tool call.
pending: Tool call received, awaiting resultcompleted: Tool execution finished successfullyerror: Tool execution failed (result.status === "error")Default tool call type when no specific tool definitions are provided.
Infer a union of tool call types from an array of tools.
Works with tools created via tool() from @langchain/core/tools.
Read-only map exposed via MessageMetadataTracker.store.