Skip to main content
useChat()useStream()useReactive()adapterstreamingChatContainerMessageInputBar<5KBanthropic()openai()send()stop()retry()data-ak-*onMessageonChunkheadlessthemehookscreateRuntime()RAGInkCLItoolsmemory
Open source · Extensible — React, terminal & headless

One agent toolkit for JavaScript

React · CLI · Runtime · RAG · Tools — same contracts everywhere

Pluggable adapters and shared types on @agentskit/core, optional UI. Start in React; reuse the same ideas in Ink, the CLI, or runtime— swap models in one line.

MIT · No signup · First streaming UI in under a minute · pnpm, yarn, or npm

CLI, Runtime, Ink, RAG — full install guide →

AgentsKit DemoLIVE
Starting demo...

How AgentsKit fits the landscape

A practical lens — not a performance benchmark. Choose what matches your stack and how much control you need.

This table is wide — scroll sideways on small screens to compare all columns.

DimensionVendor-tied or closed UI SDKsOpinionated web framework pathsAgentsKit
OwnershipOften bound to one vendor console, hosted-only features, or opaque upgrade paths.Open source with a strong “happy path” for a specific ecosystem (e.g. React streaming patterns).MIT, modular npm packages — you own deployment; swap adapters without rewriting the UI layer.
UI modelPre-built widgets; limited theming or escape hatches.Conventions and examples centered on one stack's idioms.Headless primitives (data-ak-*) plus optional theme — bring MUI, shadcn, or your design system.
SurfacesUsually web-first; terminal or headless agents are an afterthought.Web-first; depth outside the browser varies.Same contracts for React, Ink (terminal), CLI, and headless runtime.
ExtensionPlugin tiers, closed extension APIs, or vendor-specific tool schemas.Composable inside the framework's world.Shared core types — adapters, tools, memory, RAG, skills compose on @agentskit/core.

Best fit: one stack across browser, terminal, and headless agents, with control over adapters and tools. Skip if: a single vendor widget is enough, or you are fully committed to one framework's AI path.

Closed SDKs and opinionated paths slow you down

You still own streaming edge cases — unless your stack is built to compose

  • Vendor-tied or closed layers — upgrade schedules, hosted-only features, and opaque limits box you in when you need custom tools or self-hosted inference.
  • Highly opinionated frameworks — productive inside their happy path; painful when your product spans web, terminal, and headless workers with one contract.
  • Fragile hand-rolled streams — partial chunks, retries, and aborts still leak into UX (stuck “typing”, duplicated messages, lost tool results) when glue code diverges per surface.

AgentsKit is MIT-licensed and extension-first: adapters, tools, memory, and RAG sit on shared primitives so you keep control and swap pieces without rewriting the product narrative.

From ~50 lines of glue to ~10 lines of product

Less code to review, test, and regret when the API shape changes next month

Before — ~50 lines
const [messages, setMessages] = useState([])
const [input, setInput] = useState('')
const [streaming, setStreaming] = useState(false)
const abortRef = useRef(null)

const send = async () => {
  setStreaming(true)
  const userMsg = { role: 'user', content: input }
  setMessages(prev => [...prev, userMsg])
  const res = await fetch('/api/chat', {
    method: 'POST',
    body: JSON.stringify({ messages: [...messages, userMsg] }),
    signal: abortRef.current?.signal,
  })
  const reader = res.body.getReader()
  const decoder = new TextDecoder()
  let text = ''
  while (true) {
    const { done, value } = await reader.read()
    if (done) break
    text += decoder.decode(value)
    setMessages(prev => [...prev.slice(0,-1),
      { role: 'assistant', content: text }])
  }
  setStreaming(false)
}
// + error handling, auto-scroll, cleanup...
After — 10 lines with AgentsKit
import { useChat, ChatContainer, Message, InputBar }
  from '@agentskit/react'
import { anthropic } from '@agentskit/adapters'
import '@agentskit/react/theme'

function Chat() {
  const chat = useChat({
    adapter: anthropic({ model: 'claude-sonnet-4-6' })
  })
  return (
    <ChatContainer>
      {chat.messages.map(msg =>
        <Message key={msg.id} message={msg} />
      )}
      <InputBar chat={chat} />
    </ChatContainer>
  )
}

One architecture, every surface

Jump to the guide you need — each link matches an @agentskit/* package on npm.

Model providers — swap in one line

AnthropicOpenAIVercel AI SDKAny ReadableStream

Why AgentsKit?

Everything you need, nothing you don't — same story from UI to headless agents

🪝

3 Hooks

useStream, useReactive, useChat — that's the entire API. Learn it in 5 minutes.

<5KB Bundle

Tiny footprint. No virtual DOM overhead. Just reactive streams wired to the DOM.

🔌

Any Provider

Claude, GPT, Vercel AI SDK, or bring your own ReadableStream. Swap in one line.

🎨

Headless + Theme

Components ship with data-ak-* attributes. Import the theme or style your way.

🤖

Agent-Friendly

Entire API fits in 2K tokens. AI agents generate correct AgentsKit code first try.

🧩

Full toolkit

Runtime, Ink, CLI, RAG, memory, tools, skills, sandbox, eval — compose what you need, share types with @agentskit/core.

🌍

Works Everywhere

Next.js, Vite, Remix, TanStack Start — any React 18+ app. Zero config.

⏹️

Stop, retry, clear

Cancellation and retries on the chat controller — fewer stuck “typing…” states and duplicate assistant messages.

📡

Production visibility

Optional @agentskit/observability for traces across LLM calls, tools, and memory — OpenTelemetry-friendly when you need it.

🧪

Benchmark in CI

@agentskit/eval measures latency, cost, and success rate so agent regressions surface before users do.

10 Interactive Examples

Every example is a chat — because that's what AgentsKit does

See streaming work in under a minute

Run the quick start, then layer tools, memory, and RAG — the mental model does not change.

MIT · No signup · Open source — use it, fork it, or tell us what is missing

Young project, moving fast

AgentsKit is early-stage and expanding — try it, open an issue if something breaks, and help shape the roadmap.