
xsAI
AI SDK, extra small.
One shape for every model. Web standards, nothing else.
Documentation | Getting started | Choose packages
Quick start
pnpm add xsai
import { generateText, responses } from 'xsai'
const model = responses({
apiKey: process.env.OPENAI_API_KEY,
baseURL: 'https://api.openai.com/v1/',
model: 'gpt-6-luna',
})
const { text } = await generateText(model, { input: 'Say hello.' })
console.log(text)
Streaming uses the same model. Each event is a typed TextEvent in a standard ReadableStream:
import { streamText } from 'xsai'
const { result, stream } = streamText(model, { input: 'Describe a quiet forest.' })
for await (const event of stream) {
if (event.type === 'text.delta')
process.stdout.write(event.delta)
}
await result
Why xsAI
- Small parts. Each package does one job. Every package is an ES module with no side effects, so your bundler removes the code that you do not use.
- A model belongs to a protocol, not to a provider. One adapter covers every service that speaks the same protocol. Change the service, keep your code.
- Web standards.
fetch,ReadableStream,AbortSignal, andFormData. The source imports no Node.js module. Replacefetchto add a proxy, a test double, or your own retries. - Typed from end to end. Options, results, events, and tool inputs have TypeScript types. Schemas follow Standard Schema, so you can keep the validation library that you already use.
One adapter per protocol
xsAI does not ship a package for each provider. It ships an adapter for each protocol, and many services and gateways speak at least one of them.
| Protocol | Package | Factory |
|---|---|---|
| OpenAI Responses | @xsai/text-responses |
responses() |
| Chat Completions | @xsai/text-chat |
chat() |
| Anthropic Messages | @xsai/text-messages |
messages() |
Every factory returns a LanguageModel, so generateText, streamText, and tool calls work the same with all three. If your service speaks another protocol, you can write a custom model.
Packages
Install xsai for everything, or only the packages that you use.
| Package | Provides |
|---|---|
@xsai/text |
generateText, streamText, loop, collect, and tool |
@xsai/audio |
Speech generation and transcription |
@xsai/decide |
Typed answers to yes-or-no, choice, and score questions |
@xsai/embed |
Text embeddings |
@xsai/image |
Image generation |
@xsai/model |
Model lists from a service |
@xsai/shared |
HTTP options, sendRequest, and error types |
xsschema |
Schema conversion and validation, as a separate package |
xsai |
One package that re-exports everything above except xsschema |
Runs anywhere
xsAI runs on any runtime with fetch and web streams: Node.js, Deno, Bun, Cloudflare Workers, and browsers.
Community projects
xsAI is used in community and in-house projects, including:
- moeru-ai/airi
- moeru-ai/arpk
- lingticio/neuri-js
- GramSearch/telegram-search
- yusixian/moe-copy-ai
- LemonNekoGH/flow-chat
Contributing
See CONTRIBUTING.md. To edit or build the docs, see documentation maintenance.