| name | xsai-sdk |
| description | xsAI SDK v0.4.x API reference - extra-small AI SDK with OpenAI-compatible API |
| globs | ["utils/ai-service.ts","hooks/useStreamProcessor.ts","hooks/useAiSummary.ts","hooks/useAiSettings.ts"] |
xsAI SDK v0.4.x Quick Reference
xsAI is an extra-small AI SDK with OpenAI-compatible API interface, similar to Vercel AI SDK but much smaller.
Project packages: @xsai/generate-text, @xsai/stream-text, @xsai/model
Core APIs
streamText (sync call, returns StreamTextResult)
import { streamText } from "@xsai/stream-text"
const { textStream } = streamText({
apiKey: "...",
baseURL: "https://api.openai.com/v1/",
model: "gpt-4o",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Hello" },
],
streamOptions: { includeUsage: true },
})
for await (const textPart of textStream) {
console.log(textPart)
}
Types:
interface StreamTextResult {
textStream: ReadableStream<string>
fullStream: ReadableStream<StreamTextEvent>
reasoningTextStream: ReadableStream<string>
messages: Promise<Message[]>
steps: Promise<CompletionStep[]>
usage: Promise<undefined | Usage>
totalUsage: Promise<undefined | Usage>
}
interface StreamTextOptions extends ChatOptions {
maxSteps?: number
onEvent?: (event: StreamTextEvent) => Promise<unknown> | unknown
onFinish?: (step?: CompletionStep) => Promise<unknown> | unknown
onStepFinish?: (step: CompletionStep) => Promise<unknown> | unknown
streamOptions?: { includeUsage?: boolean }
}
type StreamTextEvent =
generateText (async call)
import { generateText } from "@xsai/generate-text"
const { text, usage } = await generateText({
apiKey: "...",
baseURL: "https://api.openai.com/v1/",
model: "gpt-4o",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Why is the sky blue?" },
],
})
Types:
interface GenerateTextResult {
text?: string
usage: Usage
finishReason: FinishReason
messages: Message[]
steps: CompletionStep<true>[]
toolCalls: CompletionToolCall[]
toolResults: CompletionToolResult[]
reasoningText?: string
}
listModels (async call)
import { listModels } from "@xsai/model"
const models = await listModels({
apiKey: "...",
baseURL: "https://api.openai.com/v1/",
})
Shared Types
interface ChatOptions {
apiKey?: string
baseURL: string
model: string
messages: Message[]
}
interface Usage {
prompt_tokens: number
completion_tokens: number
total_tokens: number
}
type Message = SystemMessage | UserMessage | AssistantMessage | ToolMessage | DeveloperMessage
Breaking Changes from 0.2.0-beta.3
| Change | 0.2.0-beta.3 | 0.4.x |
|---|
streamText call | await streamText() (async) | streamText() (sync) |
StreamTextResult | { textStream, chunkStream } | { textStream, fullStream, usage: Promise, ... } |
| Usage retrieval | Iterate chunkStream chunks | await result.usage |
StreamTextChunkResult | Exists | Removed, replaced by StreamTextEvent |
textStream type | Required as unknown as AsyncIterable cast | Native ReadableStream, supports for await and pipeThrough() |
generateText result .text | string | string | undefined |
Utils
smoothStream (from @xsai/utils-stream)
import { smoothStream } from "@xsai/utils-stream"
const smoothed = textStream.pipeThrough(smoothStream({
delay: 20,
chunking: "line",
}))
toAsyncIterator (polyfill for Safari)
import { toAsyncIterator } from "@xsai/utils-stream"
const iterableStream = toAsyncIterator(textStream)
Reference Documentation
references/index.md - Full documentation index with all examples
references/docs/ - Individual package documentation (27 files with complete code examples)
references/type-defs/ - Deno Doc type definitions from esm.sh