@agentskit/angular
Profile: concise-package

Angular 18+ service (Signal + RxJS) + headless chat components. Same ChatReturn contract every AgentsKit framework binding ships.

Tags: ai · agents · llm · agentskit · angular · signals · rxjs · chat · streaming
Verified proof
How this fits the ecosystem
@agentskit/angular brings the shared AgentsKit chat contract to Angular with Signals, RxJS, streaming, tools, and memory.
- AgentsKit: compose it with the other packages in this repo to build agents from small, swappable parts.
- Registry: look for ready agents and templates that already use this layer at registry.agentskit.io.
- Playbook: learn the production patterns behind this layer at playbook.agentskit.io.
- AKOS: run the same concepts with enterprise deployment, governance, and observability at akos.agentskit.io.
Docs: package guide · agent handoff
Why
- One contract, every framework —
AgentskitChat service surfaces the exact same shape as the React / Vue / Svelte / Solid / RN / Ink bindings.
- Angular-native reactivity — state exposed as
Signal; events as RxJS Observable.
- Headless by default — components emit
data-ak-* attributes; style with your design system.
- Streaming, tools, HITL — all core features work identically to
@agentskit/react.
Install
npm install @agentskit/angular @agentskit/adapters
Peers: @angular/core ^18 || ^19 || ^20 || ^21, rxjs ^7.
Quick example
import { Component, inject } from '@angular/core'
import { AgentskitChat, ChatContainerComponent, MessageComponent } from '@agentskit/angular'
import { anthropic } from '@agentskit/adapters'
@Component({
standalone: true,
imports: [ChatContainerComponent, MessageComponent],
template: `
<ak-chat-container>
@for (m of chat.state()?.messages ?? []; track m.id) {
<ak-message [message]="m" />
}
</ak-chat-container>
<form (submit)="$event.preventDefault(); chat.send(chat.state()?.input ?? '')">
<input [value]="chat.state()?.input ?? ''" (input)="chat.setInput($any($event.target).value)" />
</form>
`,
})
export class ChatWidget {
protected readonly chat = inject(AgentskitChat)
constructor() {
this.chat.init({
adapter: anthropic({ apiKey: process.env['NG_APP_ANTHROPIC_API_KEY']!, model: 'claude-sonnet-4-6' }),
})
}
}
Published as partial-Ivy AOT via ng-packagr (APF FESM2022 + .d.ts, ESM-only).
Works in AOT production apps — no JIT-only caveat. The package intentionally
does not ship dual CJS; Angular Package Format is ESM.
init(config) wires the controller and returns a ChatReturn snapshot; read live
state from the state Signal (chat.state()) or the stream$ Observable.
Async actions return the underlying controller Promises. Call destroy() (or rely
on ngOnDestroy) to unsubscribe + stop; both are idempotent and safe to re-init.
API
AgentskitChat service — DI-friendly. init(config) returns a ChatReturn snapshot and starts the session; state: Signal<ChatState | null> and stream$: Observable<ChatState | null> expose live state. Full action surface: send(text), setInput(v), stop, retry, clear, approve, deny(id, reason?), edit, regenerate, proposeToolCall, destroy.
- Headless standalone components at parity with
@agentskit/react (data-ak-* only): ChatContainerComponent (<ak-chat-container>), MessageComponent, InputBarComponent, MarkdownComponent, CodeBlockComponent, ToolCallViewComponent, ThinkingIndicatorComponent, ToolConfirmationComponent.
Ecosystem
Contributors
License
MIT — see LICENSE.
Docs
Full documentation · GitHub
Maturity and compatibility
- Stability: beta — see docs/STABILITY.md
- Node.js 20+ and TypeScript strict mode
- Published as
@agentskit/angular
Contributing
See CONTRIBUTING.md and the monorepo LICENSE.