@upstash/agentkit-ai-sdk has 9,701 recorded weekly downloads on npm, a decrease of 17.6% over the past 30 days, ranking #970 of 2,391 tracked listings.
About @upstash/agentkit-ai-sdk
@upstash/agentkit-ai-sdk
Vercel AI SDK adapter for Upstash AgentKit —
drop-ins for generateText / streamText. redis defaults to Redis.fromEnv(), so you import only
from this package.
| Import | Feature |
|---|---|
createChatHistory | Durable chat history on Redis Search — save, list, and $smart-search a user's transcripts. |
createMemoryTools | recall_memory + save_memory tools so the model reads and writes long-term memory. |
createSearchTools | search / aggregate / count tools over a Redis Search index (this is how you do RAG). |
createRateLimit | A configured Upstash Ratelimit to call before the model. |
cachedTools | Memoize a map of AI SDK tools' results in Redis. |
pnpm add @upstash/agentkit-ai-sdk @upstash/redis ai
Chat history
A Redis-backed ChatHistory<UIMessage>, the durable source of truth for your conversations. userId
comes from your auth session; chatId is the useChat id that the client posts. Save the full
transcript from your route's onFinish:
// app/api/chat/route.ts
import { convertToModelMessages, createUIMessageStreamResponse, streamText, toUIMessageStream } from "ai";
import { createChatHistory } from "@upstash/agentkit-ai-sdk";
const history = createChatHistory();
export async function POST(req: Request) {
const userId = await getSessionUserId(req); // your auth session — never trust a client-sent id
const { id: chatId, messages } = await req.json(); // useChat posts its chat id + the full transcript
const result = streamText({ model, messages: convertToModelMessages(messages) });
return createUIMessageStreamResponse({
stream: toUIMessageStream({
stream: result.stream,
originalMessages: messages,
onFinish: ({ messages }) =>
history.saveChat({ userId, sessionId: chatId, messages, title: "New chat" }),
}),
});
}
To load a chat, take chatId from the page route and userId from the session, then seed useChat:
const chat = await history.getChat({ userId, sessionId: chatId }); // full transcript, or null
const chats = await history.listChats({ userId, limit: 50 }); // summaries, no messages
const hits = await history.searchChats({ userId, query: "headphones", target: "both", limit: 20 });
// client: useChat({ id: chatId, messages: chat?.messages ?? [] })
<details>
<summary>Config & how it's stored</summary>
createChatHistory({
redis, // optional: defaults to Redis.fromEnv()
prefix: "agentkit:chat", // optional: base key prefix
indexName: "agentkit_chat", // optional: Redis Search index name (defaults to the prefix)
ttlSeconds: 60 * 60 * 24 * 30, // optional: per-chat TTL (default: no expiry)
});
Each chat is one JSON doc at agentkit:chat:<userId>:<sessionId> (keyed per user, so two users can't
collide on a sessionId), indexed over userId + sessionId (filters) and userMessages +
modelMessages ($smart fuzzy text); the raw messages array rides along unindexed. saveChat
overwrites the whole array (no delta merge) — useChat sends the full conversation. Other methods:
getChat / deleteChat ({ userId, sessionId }), listChats / searchChats ({ userId }).
Every method takes a single object; userId is required, non-empty, and may not contain :.
Derive it from a verified server-side auth source — the subject/user id from your auth provider
(Clerk, Auth.js/NextAuth, Supabase Auth, Auth0, …) — and never from a client-supplied header, query
param, or body (read it from the session in your route, not the request the browser controls). A chat
can't be read or overwritten under a different userId.
Agent memory
recall_memory and save_memory tools so the model reads and writes its own long-term memory.
import { createMemoryTools } from "@upstash/agentkit-ai-sdk";
import { generateText, stepCountIs } from "ai";
const tools = createMemoryTools({ userId });
await generateText({ model, tools, stopWhen: stepCountIs(5), prompt: "What do you know about me?" });
<details>
<summary>Options & the <code>userId</code> tenant boundary</summary>
userId(required) — a string, or(input, options) => string.redis— defaults toRedis.fromEnv().topK— max memoriesrecallreturns.minScore— BM25 relevance floor.recallToolName/saveToolName— override the tool names.
userId is the only tenant boundary (required, non-empty, no :). Derive it from a verified
server-side auth source (Clerk, Auth.js/NextAuth, Supabase Auth, Auth0, …) — never a client-supplied
value. Memories are stored at agentkit:memory:<userId>:<id>.
Search tools
search / aggregate / count over an Upstash Redis Search index; the model-facing descriptions are
generated from your schema. Use these over your own documents for RAG.
import { s } from "@upstash/redis";
import { createSearchTools } from "@upstash/agentkit-ai-sdk";
import { generateText, stepCountIs } from "ai";
const schema = s.object({ name: s.string(), age: s.number(), city: s.string().noTokenize() });
const tools = createSearchTools({ schema, indexName: "users" });
await generateText({ model, tools, stopWhen: stepCountIs(5), prompt: "How many users named Ada live in London?" });
<details>
<summary>Options</summary>
schema(required) — built withsfrom@upstash/redis.redis— defaults toRedis.fromEnv().indexName— defaults to"agentkit:search".prefix— key prefix for indexed JSON docs (defaults to"<indexName>:").defaultLimit— default page size forsearch(10).
The index is created (and waitIndexing-ed) reactively on first use — no setup step.
Rate limiting…
Description from the npm listing.
- upstash
- ai-sdk
- vercel
- ai
- agent
- memory
- rag
- llm
- cache
- tools
README badge
Show your rank in a README or on your website. The badge updates automatically.
Charts
Images: 30d · 1y · all time · 1600×900 dark
Adoption over time
7/30/90-day growth
Ranking history
Listing placement
Listing placement
Filled points are observed values; hollow points come from Internet Archive snapshots of the listing page. Dashed segments span periods with no observations — values between points are not interpolated.
Each band is one page of 20. Weekly downloads on a linear scale. Placement is projected from weekly downloads, so it can differ from the marketplace's own sort order. Hover a dot to see the listing.
Recent observations
Full history (122)Similar npm AI SDKs plugins
All 20 @upstash/agentkit-ai-sdk alternativesData source
Weekly downloads (trailing 7 complete days) come from the official npm downloads API. Downloads include CI and mirrors and are not equivalent to installs or users. npm publishes no ratings.
Listing: https://www.npmjs.com/package/@upstash/agentkit-ai-sdk. First seen Oct 16, 2026; last successful collection Oct 21, 2026. See the methodology.