@ai-sdk-tools/store
A high-performance drop-in replacement for @ai-sdk/react with advanced state management, built-in optimizations, and zero configuration required.
Performance Features
- 3-5x faster than standard @ai-sdk/react
- O(1) message lookups with hash map indexing
- Batched updates to minimize re-renders
- Memoized selectors with automatic caching
- Message virtualization for large chat histories
- Advanced throttling with scheduler.postTask
- Deep equality checks to prevent unnecessary updates
Installation
npm install @ai-sdk-tools/store
bun add @ai-sdk-tools/store
Debug Configuration
The store package includes a debug utility that can be configured to control logging:
Environment Variable
Set DEBUG=true to enable debug logging:
DEBUG=true npm run dev
DEBUG=true
By default, debug logging is disabled unless DEBUG=true is set.
Quick Start
1. Wrap Your App
import { Provider } from '@ai-sdk-tools/store';
function App() {
return (
<Provider initialMessages={[]}>
<ChatComponent />
</Provider>
);
}
2. Use Chat Hooks
import { useChat, useChatMessages } from '@ai-sdk-tools/store';
function ChatComponent() {
const { messages, sendMessage, status } = useChat({
transport: new DefaultChatTransport({
api: '/api/chat'
})
});
return (
<div>
{messages.map(message => (
<div key={message.id}>{message.content}</div>
))}
</div>
);
}
3. Access State from Any Component
function MessageCounter() {
const messageCount = useMessageCount();
const status = useChatStatus();
return <div>{messageCount} messages ({status})</div>;
}
Advanced Features
Message Virtualization
Perfect for large chat histories:
function VirtualizedChat() {
const visibleMessages = useVirtualMessages(0, 50);
return (
<div>
{visibleMessages.map(message => (
<MessageComponent key={message.id} message={message} />
))}
</div>
);
}
Memoized Selectors
Cache expensive computations:
function ChatAnalytics() {
const userMessageCount = useSelector(
'userMessages',
(messages) => messages.filter(m => m.role === 'user').length,
[messages.length]
);
return <div>User messages: {userMessageCount}</div>;
}
Fast Message Lookups
O(1) performance for message access:
function MessageDetails({ messageId }: { messageId: string }) {
const message = useMessageById(messageId);
return <div>{message.content}</div>;
}
Migration from @ai-sdk/react
Before:
import { useChat } from '@ai-sdk/react';
function Chat() {
const chat = useChat({ api: '/api/chat' });
return <div>{/* chat UI */}</div>;
}
After:
import { Provider, useChat } from '@ai-sdk-tools/store';
function App() {
return (
<Provider>
<Chat />
</Provider>
);
}
function Chat() {
const chat = useChat({
transport: new DefaultChatTransport({ api: '/api/chat' })
});
return <div>{/* chat UI */}</div>;
}
Performance Benchmarks
| 1000 messages | 120ms | 35ms | 3.4x faster |
| Message lookup | O(n) | O(1) | 10-100x faster |
| Complex filtering | 45ms | 12ms | 3.8x faster |
| Re-render frequency | High | Minimal | 5x fewer |
API Reference
Hooks
const chat = useChat(options)
const messages = useChatMessages()
const status = useChatStatus()
const error = useChatError()
const id = useChatId()
const message = useMessageById(id)
const count = useMessageCount()
const ids = useMessageIds()
const slice = useVirtualMessages(0, 50)
const result = useSelector(key, fn, deps)
const actions = useChatActions()
Provider
<Provider initialMessages={messages}>
<YourApp />
</Provider>
TypeScript Support
Full generic support with custom message types:
interface MyMessage extends UIMessage<
{ userId: string },
{ weather: WeatherData },
{ getWeather: { input: { location: string }, output: WeatherData } }
> {}
const chat = useChat<MyMessage>({
transport: new DefaultChatTransport({ api: '/api/chat' })
})
const messages = useChatMessages<MyMessage>()
Contributing
Contributions are welcome! See the contributing guide for details.
License
MIT