Skip to content
PluginStats

@upstash/agentkit-ai-sdk weekly downloads statistics

By upstash (9 listings) · npm · AI SDKs

Upstash AgentKit adapter for the Vercel AI SDK: chat history, memory tools, Redis-Search tools, rate limiting, and cached tools.

View on npm Stale · Oct 18, 2026

@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.

Weekly downloads
9,701
Official API · Oct 18, 2026
7-day growth
-59.3%
-14.2K weekly downloads
30-day growth
-17.6%
-2.1K weekly downloads
90-day growth
+74523%
+9.7K weekly downloads
Rank
#970
Among tracked npm 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.

ImportFeature
createChatHistoryDurable chat history on Redis Search — save, list, and $smart-search a user's transcripts.
createMemoryToolsrecall_memory + save_memory tools so the model reads and writes long-term memory.
createSearchToolssearch / aggregate / count tools over a Redis Search index (this is how you do RAG).
createRateLimitA configured Upstash Ratelimit to call before the model.
cachedToolsMemoize 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 &amp; 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 }).

</details> <details> <summary>Security: <code>userId</code> is the tenant boundary</summary>

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.

</details>

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 &amp; the <code>userId</code> tenant boundary</summary>
  • userId (required) — a string, or (input, options) => string.
  • redis — defaults to Redis.fromEnv().
  • topK — max memories recall returns.
  • 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>.

</details>

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 with s from @upstash/redis.
  • redis — defaults to Redis.fromEnv().
  • indexName — defaults to "agentkit:search".
  • prefix — key prefix for indexed JSON docs (defaults to "<indexName>:").
  • defaultLimit — default page size for search (10).

The index is created (and waitIndexing-ed) reactively on first use — no setup step.

</details>

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

@upstash/agentkit-ai-sdk weekly downloads on npm, last 90 days: 9,701 weekly downloads as of Oct 18, 2026, +74523% over 90 days.@upstash/agentkit-ai-sdkWeekly downloads on npm · Last 90 days9,701downloads / week+74523% over 90 days010K20K30K40K50K60KJul 20Aug 4Aug 19Sep 3Sep 18Oct 3Oct 18downloads / weekobservedarchived (Internet Archive)no observationsJul 23, 2026 – Oct 18, 2026 · 88 observations · Updated Oc…pluginstats.com
@upstash/agentkit-ai-sdk weekly downloads on npm, last 90 days: 9,701 weekly downloads as of Oct 18, 2026, +74523% over 90 days.

7/30/90-day growth

@upstash/agentkit-ai-sdk weekly downloads growth on npm: -59.3% over 7 days, -17.6% over 30 days, +74523% over 90 days.@upstash/agentkit-ai-sdkWeekly downloads growth on npm9,701downloads / week now7-day growth-14,156 weekly downloads-59.3%30-day growth-2,070 weekly downloads-17.6%90-day growth+9,688 weekly downloads+74523%Growth vs. nearest observation to each baseline date · Updated Oct 18, 2026pluginstats.com
@upstash/agentkit-ai-sdk weekly downloads growth on npm: -59.3% over 7 days, -17.6% over 30 days, +74523% over 90 days.

Ranking history

@upstash/agentkit-ai-sdk npm ranking history: currently #970 (by weekly downloads).@upstash/agentkit-ai-sdknpm ranking · by weekly downloads · Last 90 days#970current rank#966#968#970#972#974#976#978#980#982Jul 23Aug 7Aug 22Sep 6Sep 21Oct 6Oct 21rankOct 18, 2026 – Oct 21, 2026 · 4 observations · Updated Oct 18, 2026pluginstats.com
@upstash/agentkit-ai-sdk npm ranking history: currently #970 (by weekly downloads).

Listing placement

All npm2,389 listings · 120 pages · 1,196 shown · page 49, #14 (overall #974)
All npm: every listing in weekly downloads order

Listing placement

AI SDKs264 listings · 14 pages · page 4, #1 (overall #61)
AI SDKs: every listing in weekly downloads order

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)
Recent weekly downloads observations for @upstash/agentkit-ai-sdk
Date (UTC)Weekly downloadsChange vs. previous
9,701+1.7K
7,993-2.1K
10,092+744
9,348-5.6K
14,909-7.4K
22,2930
22,293-1.6K
23,857-227
24,084-1.7K
25,737-5.5K
31,221-3.3K
34,559+360
34,199-8.8K
42,996—

Data 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.