发布于 2026-01-06 2 阅读
0

KeyPilot – 具有实时 AI 路由和缓存功能的语义 API 网关 DEV's Worldwide Show and Tell Challenge Presenting by Mux: Pitch Your Projects!

KeyPilot – 具有实时 AI 路由和缓存功能的语义 API 网关

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

这是Redis AI 挑战赛:超越缓存的参赛作品

我建造的

只需一个请求,一个意图,KeyPilot 就能准确地知道要调用哪个 API。

想象一下,你同时管理着五种不同的AI服务。
每种服务都有自己的API密钥、自己的接口和各自的特性。
现在,每次你想构建某个东西时,你都得停下来思考:
“我应该用哪个密钥?哪个服务处理这个请求更便宜?哪个服务甚至支持我需要的功能?”

一幅卡通风格的插图,描绘了一位忧心忡忡的开发人员坐在办公桌前,面前摆着一台笔记本电脑。

这时KeyPilot就派上用场了……

我构建了一个语义 API 网关,它可以监听你的实际需求,
例如“总结此文档”或“生成山村图像”
,并立即为你选择正确的 API 密钥和端点。
无需查阅文档,也无需手动切换。

这就是神奇之处:

  • Redis 向量搜索能够理解您的请求背后的意图。
  • Redis 缓存会记住我们之前是否回答过这个问题。
  • 并在几毫秒内将数据返回,无需再次调用 API。
  • 既省时又省钱,而且集成速度更快。

借助 KeyPilot,我不只是路由请求,
我还让 API 集成构建得更快、运行成本更低,并且每次使用都更智能。

关键飞行员


演示 - 在您开始之前……

我知道你在想什么……
“乔尔,直接把链接给我,我马上点开玩!” 😏

登录密钥飞行员

但问题是——如果没有登录凭证,你最终只会盯着登录界面发呆,纳闷到底哪里出了问题。
然后……你还得回到这里查找详情。

所以,咱们就省去这尴尬的一步吧?😉


👉 在线应用 - https://smartkeypilot.vercel.app/


快速提示

这是一个演示应用,快速搭建,旨在向您展示核心理念。它并非一个封闭的、生产级别的系统。您可以把它看作是一个足以令人印象深刻的炫酷原型,但​​并非您用来管理银行账户的理想之选。

几条基本原则:

  • 请不要提供个人 API 密钥。🙅‍♂️ 我已经为您提供了演示用的密钥。
  • 如果你必须使用自己的密钥,请确保它们是临时的且可撤销的。
  • 演示环节持续8分钟。时间到后,所有按键都会被清除。
  • 请善待系统❤️——禁止垃圾信息、禁止滥用,让我们共同维护流畅的使用体验。

🔐 演示登录

遵循以下简单模式:

Username: demo + 1–3 digits → (Example: demo123)

Password: pass + the same digits → (Example: pass123)
Enter fullscreen mode Exit fullscreen mode

选择任意数字组合,只需遵循格式即可。登录后,即可使用内置的演示 API 密钥自由探索。✅
无需设置。✅ 无风险。✅ 即刻畅享乐趣。

使用演示密钥

该应用已内置演示 API 密钥,因此您可以立即体验语义意图匹配、路由和缓存等所有功能。
如果您添加了自己的密钥,请记住,它们会在会话过期后立即失效。

本地运行(可选)

如果你在点击试玩链接之前就来到这里……我已经开始欣赏你了。🤝

来自 giffy

为了获得最佳性能,请将其连接到 Redis Cloud 作为连接字符串,这样可以实现超快的向量搜索和缓存(快速且简单)。

前端代码库:https://github.com/Joeljaison391/KeyPilot-Frontend

后端代码库:https://github.com/Joeljaison391/KeyPilot

⏱ 时间紧迫?

没问题,我来帮你。
这里有个简短的介绍视频,你可以不用动手就能观看演示:


屏幕截图

欢迎使用 KeyPilot

这是我们的着陆页——简洁明了,引人入胜。
我们的目标是让您立即了解 KeyPilot 的功能,并让您能够快速上手。


入门

这是登录页面,简单明了,没有任何困惑。
只需登录即可,或者您也可以使用演示模式进行体验,无需创建帐户。


几分钟内即可完成入职

刚接触我们?
我们的入门教程将引导您了解基本知识,从查找 API 密钥到使用测试环境,让您立即开始高效工作。


你的任务控制中心——仪表盘

进入系统后,控制面板就是您的控制中心。
您可以在这里查看钥匙、使用统计数据和快捷操作。


添加密钥

需要新的 API 密钥?“添加密钥”模态框让一切变得简单。
选择一个提供商模板,设置限制,定义允许的来源,即可完成。
密钥经过加密,并在到期时自动过期。


由 Redis 提供支持

在幕后,Redis Cloud 为从存储加密密钥到缓存 API 响应的一切提供支持。
下图是 Redis Cloud 控制面板,它确保一切运行如闪电般快速。


实时测试 API

欢迎来到 API 测试游乐场,您可以调整有效负载、更改意图,并观看 KeyPilot 使用语义匹配选择最佳模板。


意图测试(无需花费代币)

想知道你的请求会触发哪个模板,但又不想调用真正的 API?
意图测试工具可以让你无需实际调用 API 就能进行检查。


智能缓存兼顾成本和速度

为什么要为同一个 API 调用支付两次费用?
KeyPilot 使用语义缓存,如果之前已经发出过类似的请求,它会立即提供已存储的响应,从而节省成本和时间。


监控与洞察
最后,通过 API 使用情况监控来跟踪所有信息,从使用的令牌和正常运行时间/停机时间,到成功率和缓存命中率。


技术栈

以下是该版本运行所需的技术:

前端
——我选择了Vite + React ,因为我追求极致的开发速度和流畅的生产环境构建。样式方面我用了Tailwind CSS ,毕竟凌晨三点写纯 CSS 实在太折磨人了
所有代码都托管在 Vercel 上,所以部署也只需轻轻一点。

后端
—— 服务器运行在 Node.js + Express.js 上,为了保证类型安全,使用 TypeScript 编写。我把它托管在 Render 上,这意味着我可以专注编码不用操心服务器

数据层
——精彩之处就在这里。Redis Cloud是我的数据库,它在向量搜索和缓存方面都表现出色。为了实现超低 延迟操作,我还维护了一个 Redis 内存实例,因为毫秒级的延迟至关重要

工作流程——
版本控制 ?显然是 Git。头脑风暴团队规划?用 Notion,让想法从“如果……会怎样…… ”变成“发布”。


我如何使用 Redis 8

为什么选择 Redis?为什么不选择“普通”数据库?

大多数人在开发应用程序时都会想到 PostgreSQL、MySQL 和 MongoDB 之类的数据库。
它们非常适合长期结构化存储,但对于这个项目,我需要一些不同的东西。

  • ⚡ 速度至上——我想要亚毫秒级的查找速度。
  • 🕒 内置过期功能 – 会话和 API 密钥应在几分钟后自动销毁,无需定时任务。
  • 🔐 简单、原子操作——设置、获取、删除。无需复杂的连接。
  • 🧠 可用作缓存和数据库——为什么还要管理两个系统,一个系统就能同时完成这两项任务呢?

如果我使用的是普通数据库:

  • 我需要编写额外的代码来删除过期的会话。
  • 由于需要进行基于磁盘的查询,每次 API 调用都会变慢。
  • 无论如何,缓存都需要一个单独的 Redis 实例。

因此,为了避免这种双系统带来的麻烦,我决定全面采用 Redis 8 作为该应用程序的完整主数据库。

KeyPilot 如何运作 Redis

我说 Redis 是骨干网,我的意思是它实际上运行着所有的一切,从登录到存储 API 密钥,再到确保你的会话在 8 分钟后礼貌地消失,而我无需做任何事。

身份验证路由——“您已登录!”

我们使用 Redis 的字符串和哈希表来存储用户会话和加密的 API 密钥,并设置了 TTL 自动过期,以便在不再需要时自动删除。
这意味着无需手动清理,避免了过期登录信息,并可实现即时访问。

await redis.setEx(`user:${userId}`, 480, JSON.stringify(sessionData));
await redis.expire(`keys:${userId}:${template}`, 480);
Enter fullscreen mode Exit fullscreen mode

API密钥管理——“你的密钥,你的规则”

每个 API 密钥都存储在 Redis 哈希表中,并附带创建时间和描述等元数据。
没有重复的密钥,也没有过时的条目——只有干净、加密的存储。

await redis.hSet(`keys:${userId}:${template}`, {
  encrypted_key: encrypted,
  description,
  created_at: Date.now()
});
Enter fullscreen mode Exit fullscreen mode

代理和语义缓存——“最优路由胜出”

Redis RediSearch + Vector Index 让我们能够根据语义(而不仅仅是关键词)将正确的 API 密钥与正确的请求匹配起来。
获取到的响应会被缓存,以便快速重放。

const results = await redis.ft.search(
  'idx:intents',
  '*=>[KNN 1 @vector $query_vector]',
  { PARAMS: { query_vector } }
);
await redis.setEx(`cache:${userId}:${intentHash}`, 3600, JSON.stringify(apiResponse));
Enter fullscreen mode Exit fullscreen mode

分析与实时追踪——“实时掌握动态”

我们结合了 Redis 发布/订阅、流和计数器来实时跟踪每个请求。

  • 发布/订阅功能会立即向仪表盘广播“已接收”和“已完成”事件。
  • 流会按时间顺序保留活动和缓存请求的历史记录。
  • 计数器汇总每日和每周统计数据,以便快速查看摘要。
// Live event broadcasts
await redis.publish('channel:request:received', JSON.stringify({ userId, intent, ts: Date.now() }));
await redis.publish('channel:request:completed', JSON.stringify({ userId, latency, cacheHit, ts: Date.now() }));

// Activity stream (last 50 events)
await redis.xAdd(`analytics:activity:${userId}`, '*', { event: 'request:success', intent, latency: String(ms) });
await redis.xTrim(`analytics:activity:${userId}`, 'MAXLEN', 50);

// Daily counters
await redis.incr(`analytics:daily_requests:${userId}:${date}`);
Enter fullscreen mode Exit fullscreen mode

分析仪表盘——“了解热门趋势”

我们使用有序集合统计用户触发的每一个意图。
这让我们能够即时生成热门请求排行榜,非常适合发现规律。

await redis.zIncrBy(`intent_trends:${userId}:daily`, 1, intent);
const topIntents = await redis.zRange(`intent_trends:${userId}:daily`, -5, -1, { REV: true });
Enter fullscreen mode Exit fullscreen mode

缓存管理——“一次清理,全部清除”

Redis 让批量查找和清除旧的缓存键变得轻而易举。
无需编写繁琐的 SQL 查询,只需快速扫描并删除即可。

const keys = await redis.scanIterator({ MATCH: `cache:${userId}:*` });
for await (const key of keys) await redis.del(key);
Enter fullscreen mode Exit fullscreen mode

意图追踪与趋势——“用户现在想要什么”

我们使用有序集持续统计每周的用户意图。
这帮助我们预测用户接下来会提出什么请求,几乎就像读懂了他们的心思一样。

await redis.zIncrBy(`intent_trends:${userId}:weekly`, 1, detectedIntent);
Enter fullscreen mode Exit fullscreen mode

通过结合 Redis 8 的多项功能,我们替换了五个不同的系统

  • 会话无需额外的 SQL 数据库
  • 不支持 Elasticsearch 搜索
  • 事件流无需 Kafka
  • 没有用于清理的定时任务
  • 没有单独的分析数据库

那些试图让我慢下来(但最终没能)的事情💪

极简界面,极致清晰——
原则简单如果有人需要查阅使用手册,就是我 失误。所以不断删减多余文字,随意调整界面布局,简洁的图标替换冗长解释。只想让用户打开应用后立刻 知道该怎么做。

时间压力(黑客马拉松模式)——时钟
滴答 键盘的敲击声还大。一个决定面临一个问题追求 完美,还是只求能用选择只求能用

语义匹配与提供商模板
- - - - - - - - - - - - - - - - - - - - - - - - - - -想法很简单:用简单的英语输入你想要的内容,应用会自动找出要调用的 API。听起来很简单……但实际
操作起来却并非如此。
我必须为不同的服务创建灵活的模板,并且还要保证它们的准确性。最终,我在编写代码的同时,听了超过 150 首歌,还看了 60 多个 Spotify 广告。

速度优化实战
—— 亚毫秒级”很容易,但真正做到却难得多。几个小时调整Redis查询减少数据 设置缓存同时还要确保其他功能不受影响

关键飞行员完成

团队

特别感谢abelboby对前端开发做出的贡献,并帮助实现了用户体验。

感谢阅读

如果你看到了这里,非常感谢!🚀
我真心感谢你抽出时间来了解这个项目,并一路关注它的进展。

文章来源:https://dev.to/joeljaison394/keypilot-semantic-api-gateway-with-real-time-ai-routing-caching-2b94