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

我开发了一个人工智能代理,把我的平庸简历变成了面试金牌。

我开发了一个人工智能代理,把我的平庸简历变成了面试金牌。

这是提交给Auth0 人工智能代理挑战赛的作品。

我建造的

你肯定有过这样的经历:凌晨两点还在投简历,这周已经是第47次拼命修改简历了,结果谷歌文档却弹出个审视的提示:“确定要保存这些更改吗?” 瞧?没错,我开发了个工具来解决这个问题。

隆重介绍Resumify——一款人工智能简历助手,它不仅能帮你撰写简历,还能帮你自动生成简历。而且,它也不会因为你从 2015 年就开始用“精通 Microsoft Word”这一项而对你另眼相看。

演示

🎬 观看演示

看看 Resumify 如何在 2 分钟内将一份普通的简历变成一份针对 ATS 系统优化的杰作。

既然行动胜于雄辩(而且我妈说截图可以作为我工作效率高的证据):

🎥 快速概览

这就是带有渐变文字效果的着陆页:

Resumify 登录页面

是的,这是人工智能生成的专业简介。不,我也不知道它怎么会让我听起来这么有就业前景。

📸 没人要求但每个人都需要的潮流

第一步:身份验证(简单部分)
Auth0 登录

一个登录工具,搞定所有登录——Auth0 帮你处理繁重的工作,让我不用操心。

步骤 2:个人资料设置(“这应该很容易,但实际上并非如此”的部分)
个人资料管理

所有职业信息尽在掌握。Supabase 保障数据安全,Auth0 提供数据安全保障。

第三步:和你的新AI好朋友聊天
AI聊天界面

AI聊天界面

随便问它什么都行。真的。我让它吐槽我的简历,它居然真的吐槽了。而且吐槽得还挺准的。

第四步:见证奇迹发生
简历生成

从聊天记录到谷歌文档,只需几秒钟。就像瞬间移动一样,只不过这次是针对职业文档。

🔗 自己动手试试(如果你够胆的话)

在线演示https://resumify.varshithvhegde.in/

测试凭证:

  • 用户名testdevvarshith@gmail.com
  • 密码VarshithDev@2025

⚠️ 重要提示:

  • Google OAuth 限制:Google Cloud 帐户目前处于测试模式,因此新用户无法连接自己的 Gmail 帐户。请使用上方提供的测试凭据 - 所有权限均已配置。
  • 请保持尊重!此演示使用了受限的 OpenAI API 密钥。请避免过度使用聊天功能,以便其他人也能体验。
  • 简历演示链接:请使用此公开的 Google 文档进行测试:https://docs.google.com/document/d/16SOGaiJZwUP2EDObbitbJBJOwHgMyJo76sNrEdyAnbY/edit?usp=sharing
  • 使用您自己的简历
    • 您的简历必须为 Google 文档格式(不能是 PDF 或 Word 文档)。
    • 文档必须设置为“拥有链接的任何人都可以查看”。
    • 无论应用使用哪个帐户,都可以访问公开的 Google 文档。
    • 粘贴链接前,请确保已正确设置共享权限。

代码库https://github.com/Varshithvhegde/resume-ai

该仓库包含:

  • 完整的源代码(是的,包括所有令人尴尬的git提交记录)
  • 详细的设置说明(因为“在我的机器上可以运行”这样的描述没有帮助)
  • 环境配置示例(显然,密钥是虚构的)
  • 数据库架构(PostgreSQL 从未如此美观)

Supabase 数据库模式

我们都经历过的问题

说实话,找工作就像周五下午五点调试空指针异常一样无聊。你面临着:

  • 你的简历有多个版本,像魂器一样散落在谷歌云端硬盘里。
  • 自奥巴马执政以来,那个“已完成90%”的LinkedIn个人资料就一直处于这种状态。
  • 迫切需要针对每个应用程序进行定制,但却毫无精力去实际操作。
  • 因为忘记个性化设置,Gmail 草稿开头总是“尊敬的招聘经理”。

传统方法?将你的简历复制粘贴到你找到的每一个模板中,祈祷ATS系统能够眷顾你,并希望你作为“协同团队合作者”的经验能够引起某些人的共鸣。

剧透警告:通常不会。

解决方案(又名我的数字职业治疗师)

Resumify就像一个集职业顾问、文案撰稿人和人脉高手于一身的人工智能助手。但与那位朋友不同的是,它真的会回复你凌晨两点的紧急短信。

这只美丽的野兽会做以下这些事:

🤖 AI简历分析工具

可连接到您的Google文档,并以招聘经理本周审阅500份申请后的那种冷酷无情的效率分析您的简历。但它给出的建议却是建设性的。

👤 持久个人资料管理

还记得你在申请门户网站上输入的所有信息吗?没错,Resumify 也全部记住了。一次存储,终身使用。就像自动填充凭证一样,但它适用于你的整个职业生涯。

📄 定制简历生成:

粘贴职位描述,即可观看 AI 根据您的职位自动生成简历。这就像拥有一个变色龙,只不过是针对专业文档的。而且在聚会上解释起来也更自然。

📧 邮件自动化,听起来不像机器人

写的 这款通过 Gmail 生成的专业求职邮件,听起来就像是真人撰写的。人工智能巧妙地把握了我们都难以做到的“急切”和“自信”之间的微妙平衡。

🔐 Google Docs 集成(秘诀所在)

可直接在您的 Google 云端硬盘中创建针对 ATS 优化的简历。无需再下载 PDF、转换格式或为格式问题苦恼。

💬 实时AI聊天助手

一款真正理解“如何让这句话更悦耳”而不仅仅是堆砌流行语的AI。我知道,这简直是革命性的。

我如何使用 Auth0 开发 AI 代理

接下来才是真正棘手的部分。构建一个能够同时与谷歌文档、Gmail 和你的数据库交互,并且保证所有系统安全的 AI 代理,就像一边骑着独轮车一边耍电锯,而且还得冒着火,身处飓风之中。

Auth0 for AI Agents 基本上给了我一张安全网、一个头盔,以及如何避免把自己点着的说明。

代币交易的“圣杯”

还记得我说过 Resumify 可以连接到 Google Docs 和 Gmail 吗?关键在于:Google 服务需要 OAuth 令牌。你的 AI 代理需要代表用户发起这些 API 调用。如果你曾经尝试过手动管理 OAuth 令牌,你就会知道这就像给奶奶解释递归一样枯燥乏味。

进入Auth0的令牌交换魔法世界

// src/lib/auth0-ai.ts
import { getRefreshToken } from "@/lib/auth0"
import { Auth0AI } from "@auth0/ai-langchain"
import { getAccessTokenForConnection } from "@auth0/ai-langchain"

const auth0AI = new Auth0AI()

// This one line does more work than me on a Monday morning
export const withGoogleConnection = auth0AI.withTokenForConnection({
  connection: "google-oauth2",
  scopes: [
    "https://www.googleapis.com/auth/gmail.readonly",
    "https://www.googleapis.com/auth/gmail.compose",
  ],
  refreshToken: getRefreshToken,
})
Enter fullscreen mode Exit fullscreen mode

这里发生了什么?Auth0 的意思是:“嘿,你已经登录过一次了。现在我会在后台处理所有的令牌刷新、作用域管理和 OAuth 流程。你只需要专注于开发酷炫的东西。”

这就像拥有一个非常能干的助理,他能记住你的密码,了解你的所有凭证,而且从不请病假。只不过,这是代码,所以不需要咖啡休息。

AI代理:由Auth0的安全保障机制驱动

以下是AI代理与Auth0底层协同工作的原理:

// src/app/api/chat/route.ts
const gmailParams = {
  credentials: {
    accessToken: getAccessToken, // This function? Auth0-powered magic
  },
}

const gmailDraft = new GmailCreateDraft(gmailParams)
const gmailSend = new GmailSendMessage(gmailParams)
const gmailSearch = new GmailSearch(gmailParams)

const agent = createReactAgent({
  llm,
  tools: [
    readGoogleDocContent,
    createGoogleDocResume,
    getUserProfile,
    saveUserProfile,
    // These three? Wrapped in Auth0's secure token exchange
    withGoogleConnection(gmailDraft),
    withGoogleConnection(gmailSend),
    withGoogleConnection(gmailSearch),
  ],
})
Enter fullscreen mode Exit fullscreen mode

Auth0 在这里的实际作用(鲜为人知但值得深入的技术解析)

  1. 单点登录:用户通过 Auth0 登录一次。
  2. 令牌存储:Auth0 安全地存储 Google OAuth 令牌。
  3. 自动刷新:当令牌过期时,Auth0 会自动刷新它们。
  4. 权限范围管理:Auth0 确保代理仅获得其所需的权限。
  5. 安全性:所有令牌处理均在服务器端进行,并采用适当的加密技术。

这就像夜店里有个保安,他不仅要查身份证,还要记住每个人的酒水喜好,确保没人被下药。我知道这个比喻很具体,但安全很重要。

拯救我理智的中间件

Auth0 的中间件集成让路由保护变得异常简单:

// src/middleware.ts
export async function middleware(request: NextRequest) {
  const authRes = await auth0.middleware(request)

  // Auth routes? Auth0's got it
  if (request.nextUrl.pathname.startsWith("/auth")) {
    return authRes
  }

  const session = await auth0.getSession(request)

  // No session? Back to login, buddy
  if (!session) {
    return NextResponse.redirect(`${origin}/auth/login`)
  }
  return authRes
}
Enter fullscreen mode Exit fullscreen mode

三个字:有效。就是有效。

无需自定义 JWT 解析,无需手动验证令牌,也无需在凌晨 3 点进行“但昨天还好好的”调试。Auth0 会处理这一切,让我可以像正常人一样睡觉。

Google Docs 集成:这不应该这么容易的时刻

想知道最不可思议的是什么吗?那就是使用 Auth0 管理的令牌在 Google 文档中创建简历:

// src/lib/tools/gdocs.ts
export const readGoogleDocContent = tool(
  async ({ docId }) => {
    // Get token - Auth0 handles all the OAuth complexity
    const { token } = await auth0.getAccessTokenForConnection({
      connection: "google-oauth2",
    })

    const auth = new google.auth.OAuth2()
    auth.setCredentials({ access_token: token })

    const docs = google.docs({ version: "v1", auth })
    // Now we're cooking with gas (or electricity, it's 2025)
    const doc = await docs.documents.get({ documentId: docId })
    return doc.data
  }
)
Enter fullscreen mode Exit fullscreen mode

就是这样。这就是整个身份验证流程。Auth0 将原本需要 200 行的 OAuth 样板代码简化成了 5 行“开箱即用”的代码。

为什么这很重要(“那又怎样?”部分)

以下是Auth0 for AI Agents实际给我的结果:

为了安全起见

  • 我的代码库里没有像五彩纸屑一样到处乱飞的原始令牌。
  • 自动令牌轮换(因为我肯定会忘记)
  • 集中式权限管理(一站式管理)
  • 内置速率限制和滥用预防功能

提升开发者体验

  • 身份验证时间减少了 80%,功能开发时间增加了 80%。
  • 不使用自定义 OAuth 实现(我最不喜欢的实现方式)
  • 与 LangChain 工具即插即用
  • 这份文件不会让我哭泣

对于用户

  • 一次登录,即可访问所有内容
  • 不会每隔5分钟就弹出奇怪的权限提示
  • 他们的数据安全无虞(现在是Auth0的问题,不是我的)。
  • 服务之间的无缝集成

“啊哈!”时刻

真正的突破来自于我意识到:Auth0 不仅仅是处理身份验证,它还管理着我的 AI 代理、我的用户和第三方服务之间的整个信任关系。

想想看:我的人工智能代理需要:

  • 读取 Google 文档(需要用户权限)
  • 发送 Gmail 邮件(需要用户许可)
  • 访问个人资料数据(需要已验证的会话)
  • 所有这些都在服务器端运行(需要安全的令牌处理)

Auth0 统筹协调着这一切。这就像拥有一个真正了解自己在做什么的优秀项目经理。我知道,这样的人很少见。

经验教训和要点

“进展顺利之处”清单(出乎意料地长)

Auth0 简直是 MVP
说真的,Auth0 for AI Agents 帮我节省了好几周的开发时间。令牌管理?搞定了。OAuth 流程?搞定了。安全最佳实践?内置了。我大概只用了两个小时,就从“这得花多久时间”变成了“等等,它已经可以运行了?”

LangChain + Auth0 = 完美组合

LangChain 与 Auth0 的 AI Agents SDK 的集成比我在社交活动中的闲聊还要流畅。这个withTokenForConnection封装简直是天才之作——只需封装一下你的工具,它们就立刻安全了。这就像在菜肴中添加调味料,而不是重新制作整个菜。

AI 代理也需要身份认证
构建这个项目让我意识到:AI 代理不仅仅是运行在服务器上的函数。它们代表用户行事,访问敏感数据,并做出真正的决策。它们和人类一样,需要完善的身份管理。Auth0 深谙此道。

数据库架构很重要(谁能想到呢?):
Supabase 的 PostgreSQL 配置简直完美。将个人资料、工作经历、教育背景、项目和技能分别存储在不同的表中,大大简化了 AI 代理的工作。这就像整理衣橱——一开始可能很痛苦,但之后你会感谢自己的。

“哪里出了问题”清单(也出乎意料地长)

电子邮件中的 CSS 依然糟糕透顶

都 2025 年了,电子邮件中的 CSS 还停留在 2005 年的水平。Outlook 居然还用着微软 Word 的渲染引擎。没错,就是 Word!我花了三个小时调试,才搞清楚为什么我精心设计的渐变文本在 Gmail 里看起来像勒索信。解决方法?内联样式和祈祷。

令牌权限范围很棘手
一开始,我申请了太多 Google API 权限范围,结果用户看到权限页面时都吓坏了,感觉我好像要他们的肾似的。少即是多。只在需要的时候申请你真正需要的权限。

AI幻觉并非虚构

早期版本中,AI偶尔会凭空捏造出用户并不具备的技能。“精通Rust”听起来很棒,但当你意识到自己从未编写过一行Rust代码时,就会觉得很荒谬。我们通过改进提示设计和验证机制解决了这个问题。

速率限制确实存在:
谷歌的 API 有速率限制。谁会想到呢?(其实人人都知道。)测试时开始遇到限制。解决方案:添加缓存和请求限流。还学会了使用较小的数据集进行测试。

“在我机器上运行正常”纯属谎言
生产环境的环境变量与本地开发环境不同。Auth0 回调 URL 必须完全匹配。我之前部署的版本根本就……无法运行,才惨痛地吸取了教训。孩子们,一定要仔细检查文件.env

关键见解(我显得很聪明的部分)

1. 安全应该很枯燥

最好的安全就是让你感觉不到它的存在。Auth0 的安全机制如此无缝,以至于我都忘了自己正在开发一个安全应用。这并非疏忽,而是优秀的抽象化。我越少操心令牌管理,就越能专注于让 AI 代理真正发挥作用。

2. AI代理需要更好的身份验证模式

传统用户身份验证假定按钮是由真人点击的。而人工智能代理会自动发起数千次 API 调用。我们需要以下身份验证模式:

  • 处理高频请求
  • 管理多个服务集成
  • 提供细粒度的权限控制
  • 记录所有信息以备安全审计。

Auth0 for AI Agents 是我见过的首批真正满足这些需求的平台之一。它就像能读懂我的心思一样,而且没那么令人毛骨悚然,也更实用。

3. 最好的工具消失了

好的开发者工具应该像魔法一样好用。Auth0 就做到了。我不用考虑以下问题:

  • 令牌存储位置
  • 它们是如何加密的
  • 它们过期时
  • 它们是如何被刷新的

它就是……奏效了。这就是卓越工程的标志。

4. 构建功能,而非基础设施

我花了 2 个小时做身份验证,花了 2 周时间做 AI 功能。这个比例很合适。Auth0 让我能够专注于 Resumify 的独特之处(AI 简历优化),而不是一遍又一遍地重复发明 OAuth 流程。

5. 用户重视自己的数据

每一次权限请求都至关重要。你添加的每一个权限范围都会导致用户流失。Auth0 精细化的权限管理意味着我可以按需请求所需的权限。用户更信任这种方式,而不是一刀切的“交出所有数据”请求。

给未来建设者的建议(因为我现在年纪大了,也更有智慧了)

如果您正在构建人工智能代理

  • AI代理请使用Auth0。真的。别尝试自己实现OAuth管理。
  • 尽早测试令牌刷新流程。令牌会过期,你需要妥善处理。
  • 记录所有信息。当系统出现故障时(这种情况肯定会发生),你会想知道原因。
  • 首先从最小范围开始,仅在需要时才添加更多范围。

如果您要集成多个服务

  • 令牌交换是你的好帮手。学习它,爱上它,并使用Auth0的实现。
  • 每项服务的流量限制都不同,请据此规划。
  • 积极启用缓存。避免不必要的API调用。
  • 服务中断时,要有备用方案。

如果您正在使用 AI/LLM API

  • 及时响应工程设计占工作的80%。务必花时间做好这方面。
  • 务必验证人工智能的输出结果。GPT-4 很智能,但并非完美无缺。
  • 费用累积很快,请监控您的代币使用情况。
  • 关键操作需要人工监督。

如果你是新手

  • 选择一件事并做到极致。Resumify 最初是“人工智能简历分析”起家,并由此发展壮大。
  • 不要过度考虑基础设施。使用托管服务(Auth0、Supabase、Vercel)。
  • 尽早发布,快速迭代。我的第一个版本简单得令人尴尬。
  • 用户反馈永远比你的假设更重要。

元课程(这里要探讨哲学问题)

开发 Resumify 让我明白,现代开发与其说是编写代码,不如说是编排服务。我没有构建身份验证系统——我集成了 Auth0。我没有构建数据库——我使用了 Supabase。我没有训练 AI 模型——我使用了 OpenAI。

真正的诀窍在于如何将这些组件整合起来,从而创造价值。Auth0 for AI Agents 让最棘手的部分之一(AI 代理的安全令牌管理)变得几乎微不足道。

这就是开发的未来:强大的构建模块,让您专注于解决用户问题,而不是重复发明轮子。

底线

如果您正在构建需要访问用户数据或第三方服务的 AI 代理(说实话,哪个 AI 代理不需要呢?),那么 Auth0 for AI Agents 就不是可选项,而是必不可少的。

如果没有它,Resumify 就不会存在。好吧,它或许还能存在,但那将是一个靠胶带、祈祷和一套会让渗透测试人员痛哭流涕的安全模型勉强维持的临时系统。

相反,我拥有了一个安全、可扩展且真正能帮助人们找到工作的AI简历助手。而且,我知道Auth0会处理复杂的身份验证问题,所以我晚上可以安心入睡。

接下来是什么?

  • 增加更多简历模板(因为没有一种模板适合所有人)
  • 生成求职信(因为显然求职信仍然很重要)
  • 面试准备要点(熟能生巧,或者至少能减少尴尬)
  • 优化LinkedIn个人资料(因为人脉关系仍然很重要)
  • 简历支持多语言(指的是简历,而不是编程语言——虽然如果能支持编程语言也很棒)。

自己动手试试

代码是开源的,演示程序已经上线,而且Auth0还提供慷慨的免费套餐。构建你自己的AI代理,做好安全防护,或许,我们就能让求职变得不那么痛苦了。

现在请恕我失陪,我需要更新一下我的简历,加上“开发了一款比我更擅长写简历的人工智能”。这其中的讽刺意味我当然明白。


使用以下技术构建:Auth0、Next.js、TypeScript、OpenAI、LangChain、Supabase、Google APIs 以及过量的咖啡因。

源代码github.com/Varshithvhegde/resume-ai

在线演示resumify.varshithvhegde.in

有问题吗?请在下方留言或在推特上找到我,我可能正在那里抱怨CSS。


文章来源:https://dev.to/varshithvhegde/i-built-an-ai-resume-butler-that-actually-gets-you-interviews-auth0-made-it-possible-2n0d