📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

How to build full-stack apps with OpenAI o1 pro - Part 1

Mckay Wrigley3:58:45

Transcription

非常快速地,在我们开始这个视频之前,我只想提一下,这将是两部分系列的第一部分,所以这将是初学者入门版本,我们基本上将教授提示系统,我们将教授如何设置您的项目,我们将介绍工作流程的基础版本,然后在第二部分,我们将有一个更高级的版本,我将向您展示如何将我们在第一部分中学到的一切实际应用于更专业的应用程序。我们将构建一些看起来比您在这里看到的项目复杂得多的东西,但您将在第一部分这个特定的研讨会中看到的项目将为我们在第二部分将要做的所有事情奠定基础,所以只是想在开头提到这一点。这个视频将是一个关于如何使用我的 o1 Pro 模板系统来构建像我们在这个视频中将要构建的收据 AI 项目这样的全栈应用程序的研讨会,使用 OpenAI 的 o1 Pro 模型。在我看来,这是目前 OpenAI 提供的最强大的模型,自 12 月发布以来,我一直非常广泛地使用它。这是世界上最强大的代码编写模型。我将向您展示我称之为“六提示系统”的东西,我认为这个系统对任何人来说都非常容易上手,所以无论您是初学者还是经验丰富的开发人员,我认为您都可以从中获得很多东西。再次,我们将从零开始完全构建这个收据 AI 项目,使用我的模板。所以这个工作流程实际上是关于采用我拥有的这个开源入门模板,这实际上是我个人用来开始我的新项目的。我已经将其开源了,我试图弄清楚如何构建一个提示系统,将我的模板与所有这些不同的提示结合起来,使构建这些应用程序更加容易。所以,这对于初学者来说非常棒,因为您实际上不需要了解任何代码就可以开始。这感觉有点像去健身房锻炼您的大脑。但今天学习的绝妙之处在于,您拥有这些人工智能模型,它们就像私人导师一样。因此,任何时候您遇到困难或有疑问,您都可以打开 ChatGPT、Claude、Google AI Studio,或者您喜欢的任何聊天应用程序,提出问题,粘贴您的代码,您就可以开始使用了。这个工作流程很大程度上基于我大约 10 天前发布的一篇文章。基本上,我给我的一位朋友买了一个 ChatGPT Pro 订阅,他们帮了我一个忙,所以我也帮了他们一个忙,我为他们买了一个订阅。他们最终用它构建了一个合法的应用程序,这个应用程序实际上有真正的客户,而他们不是开发人员,他们不懂编程,他们在销售部门工作。所以我的工作流程试图将我从那件事中学到的所有东西,以及他们的经验,与大家分享。我认为这是一种非常有效的构建方式,即使您不一步一步地使用我将要教您的这个系统,您也可以学到很多关于人工智能代码生成以及关于提示的一般知识。这些提示非常详细,让我们快速来看一个例子。这是一个相当大的提示,有很多内容,有分步说明,有 XML,还有模板变量,各种各样的东西,所以有很多东西可以学习。在这个研讨会中的所有内容都将带有时间戳。这个视频会很长,所以我们会为所有内容添加时间戳。我们还将把它作为一个课程格式提供在 Takeoff 上。Takeoff 是我教授人工智能技能的平台。如果您想加入我们的课程论坛,您可以注册,进入课程,然后在研讨会部分,您将看到“使用 o1 Pro 模板系统构建应用程序”。这显然对您来说是公开的,然后您可以按课程进行。跟踪您的进度等等。这是我收到的大量请求。我们当然在 Takeoff 上有许多不同的课程,人们想知道的是:我的教学风格是什么样的?内容有什么例子?这样我就可以看看我是否真的想加入并做所有其他事情。所以这有点旨在回答这个问题。所以,这显然将是我们的一个真实世界课程的开源版本,我们认为它将对大家非常有价值。所以,如果您觉得这有帮助,如果您能点赞,如果您能转发,如果您在 YouTube 上观看此视频,请点赞并订阅,这对我非常有帮助,能让我做很多免费内容、免费教程和指南等。所以,如果您觉得这有帮助,请与您的朋友分享,我希望得到您的支持,这样我就可以继续做这些。好了,让我们继续讨论这个工作流程是为谁准备的,它的目标是什么,如何进行,以及一般的工作流程。让我们先来演示一下我将要展示如何构建的内容。值得注意的是,您不必构建相同的想法,如果您只想跟随工作流程并处理您自己的想法,那也完全没问题。但这个收据 AI 应用程序基本上是一个应用程序,让我们快速演示一下。让我们进入仪表板,您会看到我上传了几张收据,已验证。当我点击这个“上传收据”按钮时,我会将我最新的订阅收据拖到这里,然后点击上传按钮。这将在后端执行很多操作。您可以看到我的收据正在上传。很快就会收到成功消息。这实际上是在调用 GPT-4o 来提取一些数据。所以,如果我转到验证页面,您会看到我们上传了带有收据的图片,您会看到所有这些数据都已填充到这里,用于这前四类。所有这些数据都是从 GPT-4o 中提取的。这是 OpenAI 的模型之一,它使用其 LLM 从该图像中提取数据,正确地填写了所有内容,看起来数据都是正确的。所以我们不需要更新它,我们只需将其归类为软件并确认。好的,现在我们的收据已验证。然后,如果我们转到仪表板,您应该会看到它已被添加,并且我们的仪表板已更新。好了,我们将构建一些看起来非常简单、非常熟悉的东西。显然,根据您使用的应用程序想法,无论您是跟随我的做法还是做自己的想法,您的结果都会有所不同。所以,这只是为了让您能够构建一个连接了后端、前端、身份验证和支付等功能的全栈应用程序,这样您就可以开始构建您自己的个人想法了。整个工作流程将向您展示如何做所有事情,您将能够自定义工作流程并调整事物以适应您的工作方式,以适应您的想法,所有这些。但这是一个快速的例子,说明我们将要构建什么。我已经稍微提到了这一点,但我想更多地谈谈这个工作流程将适合谁。所以,这对于初学者来说将是极好的,因为你们中的大多数人都是第一次开始使用这些 AI 工具,并且您实际上能够使用 ChatGPT、Cursor 等工具构建软件。您能够将这些想法从脑海中提取出来,并将其变成现实。所以,我们希望为所有初学者做的事情是:让我们熟悉最佳的提示实践。这是您可以从这些 AI 模型中获得更好结果的一种方式。所以,让我们教您一个围绕它的工作流程。让我们教您全栈应用程序开发,这样您就可以学习前端、后端以及它们之间的所有不同部分。这是你们所有人接近事物的一个很好的方式,因为您不必知道如何编写任何代码就可以开始。您只需要知道,嘿,我可能会遇到几次困难,我可能会有点迷失,我只需要问 LLM 问题。我会打开我的 AI 导师,以及我喜欢的任何应用程序,我会问它问题,我会粘贴我的代码,我会尝试跟随这个教程,到最后,您将有一个很好的起点。这是我个人认为最好的学习方式。您不想通过参加一些无聊的课程来学习如何构建项目,比如“嘿,这是一个 for 循环,这是一个 if 语句”。通过实际构建项目来开始学习。这就是这个工作流程的全部意义。我们想教您一个项目。对于经验丰富的开发人员来说,尤其是如果您还没有真正接触过 AI 代码生成工具,在我看来,现在是您真正需要开始关注这些东西的时候了。因为过去,您可以忽略这些东西,因为模型不够好。但现在的模型非常好,上下文窗口也越来越长。所以,如果您是一名专业开发人员,并且您不使用,您不必使用我的确切工作流程,但如果您不使用这些东西的一部分,如果您不学习如何很好地提示模型,如果您不学习如何使用 Cursor 或 WindSurf 等 AI 原生 IDE 工具,坦率地说,您将被甩在后面。所以,现在确实是您应该关注这些东西的时候了,如果您还没有的话。如果您已经关注了,恭喜您,那太好了,您就像我一样,能够利用这些东西。但特别是如果您还没有在 Copilot 等方面获得良好结果,那么这将对您有很大帮助。所以,这对于初学者来说将是极好的,因为你们中的许多人想第一次构建出自己的想法,我们将教您如何做到这一点。它也对经验丰富的开发人员非常有用,因为你们中的许多人还没有跟上 AI 代码生成工具等方面的最佳实践。所以,这个工作流程将为您提供很多有趣的新见解,您可以从中提取并应用于您自己的工作、您自己的工作流程等等。让我们稍微谈谈课程目标。所以,显然,在课程结束时,您应该能够使用 AI 构建全栈应用程序,这是本次研讨会的主要收获。您还可以获得一些其他东西。您将学会构建更高级的提示。所以,如果您是那种觉得“我就是不擅长提示,我觉得我从这些模型那里得不到很好的结果来写代码”的人,我们将引导您完成。所以,您将学会如何成为一名更好的提示者。您将学到一些关于使用 Cursor 等 AI 工具的知识。所以,我们将在本课程中使用 Cursor。如果您不使用 Cursor,至少要使用 WindSurf。WindSurf 是另一个很棒的 AI 代码编辑器。但您将能够学到一些关于使用这类工具集的实用技能。显然,您将学会如何导航全栈应用程序。所以,您将学到如何使用数据库,比如 Supabase。您将学到如何使用 Stripe 等工具将支付集成到您的应用程序中。所以,您将能够掌握您在这里学到的所有这些不同的技能,并希望能够真正构建出您的想法。有很多人只想构建个人项目和爱好项目,我觉得这很棒。我认为 AI 软件被低估的一件事是,您可以利用这个 GitHub 仓库,您可以开始为自己构建这些东西。所以,如果您有这些小小的工具,或者只是想创造、构建、玩乐的东西,您就可以做到。如果您实际上是想创业或开始一项业务,您有一个想法,您实际上将能够从中获得所有可行的见解和工作流程,并且您将能够追求这种目标。所以,您将在这里获得各种各样的技能,我们只是想让您能够使用 AI 进行构建。所以,我们当然会在接下来的课程和章节中深入探讨所有不同的步骤。我想做的一件事来开始这个概述部分,就是我想在高层次上谈谈工作流程。所以,这里的工作方式是,如果我回到提示,我们将使用六提示系统,实际上是五个,其中两个您可以选择。所以,这里的工作方式是,我们将从克隆我的应用程序模板开始。这是一个入门应用程序模板,它包含了所有的代码,我们可能称之为“粘合代码”,这将为您节省大量时间。您不想经历诸如跳转到应用程序文件夹之类的事情。您会注意到我们有一个集成的 Stripe API,它已经为您设置好了,这样您就不必编写 Stripe 代码了。如果您想在您的应用程序中实现订阅,我们已经为您准备好了代码,您只需要创建一个 Stripe 帐户,获取您的 API 密钥,添加它们,然后您就可以准备好订阅了。所以,应用程序模板的优势在于,它为您提供了一个很好的入门模板,可以节省您在开始新项目时通常会遇到的许多烦人的小启动工作。使用高质量的入门模板的另一个好处是,当您将入门模板提供给 AI 模型并要求代码时,您将所有这些上下文注入到一个已经结构化的应用程序中。所以,AI 将几乎像您团队中的一名开发人员一样工作。这就是我想让您作为一种锚点来使用 o1 Pro 的方式。在整个课程和研讨会的剩余时间里,您应该将 o1 Pro 视为您团队中的一名开发人员,而不是一个普通的 AI 模型。o1 Pro 确实是第一个几乎感觉像是在执行任务的实际开发人员的模型。所以,我们将给它一些步骤,正如您在规划工作流程和规划提示部分将看到的。您会看到,当我们向 AI 模型提供每个步骤以及我们模板中的代码时,它将能够在此基础上进行添加,您将看到该工作流程变得多么流畅。但基本上,我们将从一个小的请求提示开始。我们将与 AI 模型进行迭代,以确定我们将用于其余提示的请求。一旦我们完成了请求提示,我们将使用该请求来生成技术规范。这将极大地影响 AI 在构建您的应用程序时的方式。当您生成一个具有非常复杂的输出的文本规范时,您可以看到这个提示的示例。当然,我们将详细讨论每个提示。现在,这仍然是高层次的。但您将获得文本规范,然后您可以将规范和您的请求输入到规划器提示中。所以,这基本上是工作流程的第三步。一旦您有了规划器提示,AI 模型将充当任务规划器。它将把每个步骤分解成大约,取决于您的想法,取决于您迭代的次数,可能大约有十几个步骤,这就是我们在这里要构建的内容的步骤数。一旦您从规划器提示中获得了步骤,您就可以使用这两个代码生成示例之一。我们将在此课程中坚持使用常规版本。我将在到达该部分时讨论 XML 版本。但这是 AI 模型,这是 o1 Pro 将充当您的开发人员的地方,就像您的个人助理一样,每月 200 美元。o1 Pro 当然有点贵。我会在那里提到一些您可能可以使用的其他模型。但您将能够使用您的项目请求、您的项目规则(我已经为您编写了模板的一部分)来提供这个代码生成提示。这是模板的另一个优点。您将提供文本规范,您将提供实现计划,然后您将提供您现有的代码(它来自您开始使用的模板)。您将看到如何一步一步地提供这个代码生成提示以及所有其他信息,它将能够构建您的应用程序,这将非常酷。在最后,您将能够执行最后一个审查步骤。这个步骤有点可选,只是为了清理一些收尾工作。这将真正帮助您开始,您将获得一个实际的全栈应用程序,这将非常酷。所以,这就是工作流程的大致情况。我知道这可能感觉非常快。请记住,我们将在接下来的内容中详细介绍每个提示,所以不用担心,我感觉已经迷失了。我们只是在回顾一下步骤的样子。这只是一个六步系统,其中代码生成提示尤其是一个需要根据您获得的步骤数进行多次循环的步骤。但这就是工作流程的样子,这就是我们将要教您的。我们将教您如何插入所有这些不同的技术,所有这些堆栈的不同部分,以便您可以让这个 AI 模型为您工作来生成您的应用程序。这个工作流程将分为几个部分。我们刚刚完成了概述部分,现在将进入工具部分。我们将介绍用于此工作流程的所有核心工具。然后我们将进入提示部分。我们将涵盖我们将在此工作流程中使用的所有六个提示。一旦我们涵盖了工具和提示,我们将进入项目设置部分。在这里,我们将介绍设置帐户等所有您需要做的事情。好消息是,除了 o1 Pro 之外,您将使用的所有帐户都将是免费的。您不必向许多不同的公司支付信用卡费用。这些都是免费的。然后我们将构建应用程序,然后我们将进行一个很好的总结部分。我们将要谈论的第一个工具是我们实际将要使用的入门模板。所以,整个课程的工作方式是,我们将为您提供所有链接。所以,使用 Takeoff 的一个好处是,您将拥有每个课程,您可以点击观看视频,在每个视频下方,我们都有文本部分和链接等。这使得一切都井井有条。显然,你们中的许多人将在 X 和 YouTube 上观看开源版本,所以我们会确保为你们所有人提供所有链接。在 X 上,我们将把它放在原始帖子的下方,在 YouTube 上,我们将把它放在描述中。我们希望确保所有这些链接对在这两个平台上观看的所有人来说都尽可能容易访问。但您首先需要关注的链接是此项目的实际 GitHub 存储库。这是一个基于我原始应用程序模板的存储库。所以,我想在开头指出这两个之间的区别。如果您正在跟随这个特定的工作流程视频和教程,我建议您将从这个存储库克隆。我们将在接下来的课程中一步一步地向您展示如何做到这一点。我只想稍微谈谈。如果您感觉更舒适,我的 McKay 应用程序模板是我主要的应用程序模板,我将继续更新它,它有一些额外的功能,比如测试和分析等。所以,如果您感觉更高级,并且随着时间的推移想跟上最新信息,想开始新项目,那么您可能想使用我一直在更新的实际应用程序模板。您可以看到我最近一次更新是两天前。我确实会及时更新这个。这个特定项目中的那个我只是将其冻结在时间里,因为可能会发生的是,我不想在 6 个月后有人观看这个视频,而我通常使用的应用程序模板已经过时,与我们在这里使用的不同。所以我只是将其冻结在这里。这可能是您想为此视频使用的。它稍微缩小了范围,去掉了像测试和分析这样的一些复杂性,只是为了保持简单,让主要的东西保持主要。您知道我的意思吗?所以,值得注意的是,在这个存储库中,我们有一个非常详尽的自述文件,其中包含许多不同的链接。所以,再次,如果您是那些在 X 和 YouTube 上观看此视频的人,自述文件将是另一个很棒的地方,您可以在那里找到许多链接。如果您不在 Takeoff 课程论坛中,您可能会错过这些链接。我们已经尽力为您提供详尽的信息,让您知道如何克隆入门模板,了解哪些环境变量,了解您需要哪些帐户等等。所以,我几分钟前又提到了这一点,使用入门模板的主要好处是,您只是给了 AI 大量的代码供它开始使用。所以,您不是从零开始,您不必做所有这些琐碎的任务,比如“哦,我必须进行数据库设置,我必须设置我的前端,我必须从 Shad CN 或您喜欢的任何 UI 库下载我的入门组件”。这只是开箱即用,它将为您节省大量时间。所以,请确保您能够找到这个 GitHub 存储库,因为这是我们接下来将要做的所有事情的中心真相来源。显而易见的问题是 o1 Pro。所以,让我们稍微谈谈 o1 Pro,因为它将是一个非常昂贵的模型。要使用 o1 Pro,您实际上需要订阅 ChatGPT 的 Pro 订阅级别,每月 200 美元,这显然对于业余爱好者、学生来说非常昂贵。Takeoff 有很多学生用户,等等。所以,让我稍微谈谈 o1 Pro,然后我将简要谈谈您可能使用的替代模型,因为我们希望使其尽可能易于访问。但我会,我会在自述文件中提到这一点。您会看到我说,虽然我强烈推荐 o1 Pro 用于此工作流程,但您也可以使用像 Claude 3.5 Sonnet、Gemini 2.0 Pro、DeepSeek R1 这样的模型。问题是,您将在此特定工作流程中遇到问题,这就是为什么我推荐使用 Pro。这是目前市场上最好的模型。值得注意的是,我不是 OpenAI 或本视频中任何公司的赞助商。我只是想说清楚。如果我做任何赞助,我从来没有做过,我会非常坦诚地告诉大家。显然,我现有的粉丝都知道我的风格。但我猜会有很多新观众会观看这个视频,所以我想重申一下,很多人会皱起眉头,用好奇的眼神看着我,因为这看起来可能像是赞助的,但它不是。这只是我目前与 Claude 3.5 Sonnet 一起使用最多的模型,它为我的 Cursor 使用提供支持。这就是我发现最多价值的地方。所以,如果您是专业人士,非常值得。每月 200 美元,这基本上就像一个同事。它不仅提供代码生成,还提供深度研究等功能,这是一个新功能。但显然,这里的重点将是 o1 Pro 的代码生成能力,这才是关键。所以,您从 o1 Pro 中获得的一些东西,它也是驱动这个工作流程的原因。A. 如果您考虑模型的强大程度和模型的智商,o1 Pro 是目前您可以公开访问的最强大的模型。所以,如果您想做复杂的代码生成,它就是完美模型。它是我们最聪明的模型。它在各方面都远远领先。如果您没有尝试过这个模型,您真的错过了。我无法足够强烈地说。所以,一些更实际的事情。因为您可能会想,好吧,您说它是一个更聪明的模型,但我认为其他模型也很聪明。我告诉您,它是一个更聪明的模型,但如果您尝试将其他模型用于此工作流程,您会遇到以下问题。o1 Pro 拥有极其长的上下文窗口,而且不仅仅是上下文窗口长,上下文窗口的利用率也非常高。例如,像谷歌的模型,比如 Gemini 2.0 Pro,这个模型有数百万个 token 的上下文。您可能会想,Gemini 的上下文更长,为什么不使用它呢?问题是,它会遇到与其他模型相同的问题,那就是一旦您超过大约 20 万个 token,上下文窗口的利用率就会迅速下降,也就是说,它从数百万个 token 中提取上下文的能力就会迅速下降。而 o1 Pro 拥有非常好的上下文窗口利用率,这意味着如果您一次输入 10 万个 token 的代码,这就是我们在这个工作流程中将要做的,那么 o1 Pro 可以看到一些非常晦涩的文件,位于 4 万个 token 的位置,然后是另一个位于 7.5 万个 token 位置的晦涩文件,它实际上能够从中提取并编写代码。我还没有在其他模型中看到这种情况持续发生。这是使此工作流程奏效的一个重要因素,因为为了将大量代码输入到模型中并让它实际编写所有需要编写的内容,它确实需要能够使用您提供给它的上下文中的所有内容。而 o1 Pro 在这方面表现出色。另一件非常重要的事情是,o1 Pro 的输出 token A 非常连贯,B 并且可以很长。这个东西可以可靠地输出 2 万个 token 的代码。所以,如果您在这个工作流程中的某个步骤中,13 个不同的文件正在被编辑,那么它实际上能够输出所有这 13 个文件,并且它会准确地完成。而许多其他模型可能可以为您完成几个文件,但一旦您超过了两位数,它们就会真正挣扎。而 o1 Pro 能够轻松做到这一点。所以,我之前提到过,您真的应该将 o1 Pro 视为不仅仅是一个 AI 模型,而更像是一个 AI 同事。与它一起工作就像您团队中的一名开发人员一样。这就是我们将如何对待它。所以,您当然需要自己尝试这个工作流程,才能真正相信我的观点。我告诉您,我从事 AI 代码生成工作比我可能在世界上大多数人身上花费的时间还要多。这实际上是我每天都在做的事情。所以我对这些东西有很好的直觉。您要么需要相信我的话,尝试一下,然后您就会觉得“哦,是的,o1 Pro 很棒”,或者您就会错过。所以,我建议尝试这个模型。如果您想使用其他模型,当然 Claude 3.5 Sonnet 是一个非常棒的代码模型。您可以通过 Claude 每月 20 美元的订阅等方式访问它。这是一个很棒的模型。您当然可以使用 ChatGPT 03 mini,特别是 03 mini high 是一个很好的模型。我提到了 Gemini 2.0 Pro,另一个很棒的模型。然后还有 DeepSeek R1,如果您更倾向于开源模型等。R1 也是一个模型。正如我提到的,您会遇到一些问题,因为会有上下文长度限制,模型输出的代码不够多,不够连贯。也许它错过了一些应该包含的文件。所以,对于那些使用这些模型的人来说,您可能需要调整这个工作流程才能使其与这些模型一起工作。但最好至少尝试一下其他模型并解决问题,而不是完全不做。所以,这就是我对模型的看法。再次,我强烈推荐使用 o1 Pro。之所以称之为 o1 Pro 模板系统,是因为这个工作流程就是为此模型而设计的。我知道这可能是一段关于模型等的长篇大论,但要理解这个工作流程的力量,您真的需要理解这个模型尤其是一个必需品。当然,希望在接下来的几个月里,我们可以以更便宜的价格获得这个模型,或者获得其他同样强大但更便宜的模型,无论是来自 OpenAI 还是其他实验室。这些 LLM 的好处是成本会随着时间的推移而降低。所以,如果您在第一天看到这个,您可能负担不起,但也许一个月、两个月、三个月后,市场上可能会有同等价格但更便宜的东西。也许甚至订阅费会下降。我不知道会发生什么。但请留意,我们将会在 2025 年获得更好的模型,所以继续尝试这个提示系统,以及我们今年将获得的一些新模型,这将是令人兴奋的。我们要谈论的下一个工具是 repo prompt,您可以在 repo prompt.com 上找到它。这是一个免费的应用程序,您可以使用它来帮助管理您的上下文。一个说明,我希望它能尽快解决。您会注意到这是一个 Mac OS 原生应用程序。所以,Windows 和 Linux 用户,我们将看看是否能找到一些可以替代的东西。所以,如果您正在观看这个视频,特别是如果您在 X 或 YouTube 上,如果您知道任何对 Windows 和 Linux 用户来说与 repo prompt 类似的工具,请在评论中告诉我。如果您能点赞并投票您找到的替代方案的评论,那将非常有帮助。我们当然希望确保 Windows 和 Linux 用户能够轻松地使用这个工作流程。我们将如何使用 repo prompt 来完成这个工作流程是,它将帮助我们管理我们的上下文。所以,我们将要做的一件事是,因为我们将一遍又一遍地输入我们代码库的巨大块,我们将不得不管理,哪些文件夹将被包含,哪些文件将被包含,等等。repo prompt 就是为了帮助我们解决这个问题而构建的。所以,Mac OS 用户,请确保您获取 repo prompt,它将是您使用的最有用的工具之一。希望 Windows 和 Linux 用户也能很快在官方应用程序上使用它。但希望我们能找到社区成员来帮助您找到替代方案。如果有人找不到一个,这将是一个很棒的开源项目。所以,如果您想引起轰动,也许您是一个独立黑客、独立开发人员,您想建立一个受众或想走红,您应该为 Windows 或 Linux 构建这个。这是您可以为该社区提供的最有价值的东西之一。所以,一个额外的挑战,一个额外的挑战中的额外挑战将是尝试使用我们在这个研讨会中使用的这个工作流程来实际构建这个。但这就是 repo prompt,我们当然会在接下来的课程中介绍如何使用它。最后,在工具方面,我们将在这门课程中全程使用 Cursor。所以,我们将通过 AI 代码生成工具进行交互的主要方式是通过 o1 Pro,通过 ChatGPT。我们不会大量使用 Cursor,但值得注意的是,我们将在本工作流程视频的其余部分使用的代码编辑器将是 Cursor。Cursor 有一个免费的 2 周 Pro 试用期。他们有一个业余爱好者级别,提供相当慷慨的完成次数,您可以看到 2000 次完成,这相当不错。所以,如果您从未尝试过 Cursor,我强烈推荐它。这是我一直推荐的东西之一,特别是对于初学者,因为它将为您提供所有强大的工具,您可以在 IDE 中直接使用聊天、代码生成等功能。这只会让您的生活更轻松。显然,考虑到他们有免费计划,几乎不可能拒绝。显然,Cursor 现在是全球最受欢迎的 AI 工具之一,所以大多数人可能都知道这一点。还值得注意的是,我们在这周刚刚更新了我们在 Takeoff 上的 Cursor 课程 2.0。所以,如果您觉得“哦,Cursor 太棒了,我想从中获得更多”,这是一个 3 小时的课程,如果您已经在 Takeoff 上,您可以完全掌握所有内容。所以,我们还将在几天内举办一个关于 Cursor Agent 的研讨会。Cursor 刚刚在应用程序中发布了大量新的代理式 AI 编码功能,它们非常棒。所以,我们将在此类视频中进行另一个类似的研讨会。所以,一定要留意。我只想快速推荐另外两个 AI 工具:Perplexity。Perplexity 是另一个非常受欢迎的 AI 工具,你们中的许多人都熟悉,许多人已经喜欢并使用它。Perplexity 之所以如此棒,是因为任何时候您需要最新的软件库等文档时,您都可以问 Perplexity,获取最新的网络信息,这样您就可以说“哦,我不知道如何使用 OpenAI 的文档来做这件事”。Perplexity 可以搜索它,找出答案,并很快给您一个答案。所以,这是一个非常好的工具。他们也有一个相当慷慨的免费套餐。然后另一个非常棒的套餐或工具是 VZ。所以,如果您喜欢大量迭代 UI,VZ 可能会对您非常有价值。我们在这里不会深入探讨,但绝对值得查看 VZ 的免费套餐,看看您是否喜欢。这可以帮助很多人,特别是那些从未真正构建过 UI 的初学者。他们使用 Vzer 做了很多很棒的事情。所以,Cursor、Perplexity 和 Vzer 构成了我们要谈论的最后一个工具。现在,让我们来谈谈所有的提示,让我们来谈谈提示模板系统。现在我们将稍微放慢一点速度。我们一直在快速前进,一直在谈论推荐的工具和概述。现在,我们将进入研讨会的真正核心。现在,我们将开始讨论我们的六个提示中的每一个。这是一个非常非常精心设计的提示系统,它将最大限度地发挥您从 o1 Pro 中获得的内容。这些提示的工作方式是,它们将依次从一个提示馈送到下一个,再到下一个。每个提示都建立在彼此之上,以构建一个非常全面的系统,o1 Pro 可以从中工作。所以,让我们从请求提示开始。请求提示基本上是您与 AI 模型合作来构思您的想法的地方。所以,我建议您做的一件事是,我们将逐个提示进行。我建议您在开始阅读每个提示的开头,或者在我分析每个提示的开头,暂停视频,自己阅读一遍,这样您就可以对正在发生的事情有一个大致的了解,然后我将引导您进行分析。所以,花点时间暂停一下,阅读这个提示。太棒了。所以,我们将在这里看看发生了什么。您可以看到开头我说“我有一个 Web 应用程序的想法,我想开发。这是我的概念”,看到“idea”用大写字母写在两个花括号之间。我们将在这里实际放入我们的请求。我们将会在应用程序部分的步骤一中完成所有这些。我们将在这里涵盖所有提示。

然后我们将涵盖您需要从所有不同服务中进行的所有设置步骤,然后我们将开始构建应用程序,所以我们将在该部分实际使用这些提示,但这里的想法是您基本上将复制此提示并将其粘贴到 01 Pro 中,您将在其中放入您的想法,然后这是唯一真正会进行协作的提示,这将是一个回合制提示,所以您可以看到我们甚至在提示模型,让它知道这些交流将是回合制的,我们基本上是在说,在每次交流后返回此格式,这就是所谓的输出格式规范,这基本上是在您的提示中告诉 AI 模型您希望它给您什么输出,所以这是我们将一直使用的一种技术,我们将设法强制它为我们提供结构化输出,我可能不应该使用结构化输出这个词,因为它在与 AI 模型一起工作的上下文中实际上有其他含义,但您可以看到这里,我们基本上是在要求 AI 模型为我们返回项目名称、项目描述,我们将与它一起处理目标受众,我们希望定义我们期望的功能,好的,所以这就是我们将要告诉 AI 我们实际想要在我们的应用程序中确切的内容,我们甚至会给它一些设计任务,所以关于设计的一点说明,AI 模型在设计方面仍然不是那么好,这仍然是它们需要走很长的路,这有点讽刺,因为在很多方面,今年它们开始在代码方面变得非常出色,就像它们真的是竞争性程序员中的前 0.1% 一样,所有这些模型,比如 01 Pro 绝对是,但它们的设计有些基础,但它仍然足够好开始,而且肯定不算差,但您可以通过指定您想要的语言等来积极影响设计,当然,这也会受到您的目标受众的一点影响,但当我们实际使用这个提示时会发生什么,我们将说,我们将继续迭代和完善这个请求,直到它完成并准备好,所以这基本上将是我们与某种 AI 模型进行的互动,有趣的是,这将是我们不与 01 Pro 使用的提示,因为任何时候您在做一些非常回合制且稍微轻量级的事情时,您都不想使用 01 Pro 的全部功能,它将非常慢,而且对于这项任务来说有点大材小用,所以我们将使用 GPT 40 在 Chad GPT 的标准内,实际上是针对这个,但一定要通读这个提示,稍微研究一下,当我们进入应用程序部分的步骤一的时候,这个提示会再次派上用场,所以让我们实际上转到我们工作流程中的下一个提示,一旦我们从 AI 模型那里获得了请求提示生成,我们就进入规范提示,所以规范提示只是文本规范的缩写,技术规范,这就是我们将根据我们的审查提示构建一个更健壮、更详细的规范,所以暂停此视频并快速阅读此提示,您会注意到的一件事是,我们实际上将我们的项目请求直接馈送到规范提示中,所以我提到这些提示中的每一个都建立在彼此之上,它使用了来自我们使用的旧提示的答案和生成,这是第一个例子,所以我们实际上要做的是,我们将从请求提示中获取 AI 模型返回的最终请求,我们将将其注入到我们的规范提示中,所以您会看到我们正在使用这些标签,这被称为 XML 提示,您可以提供给 AI 模型的一些输入之一是,您可以将它们包含在这些括号中,放入 XML 标签中,它只是帮助模型识别上下文片段,特别是如果它们很大,所以您会注意到这是我们在 01 Pro 系统中相当频繁使用的模式,所以您在这里要做的一件事是,您将再次在此处输入您的请求,我们将通过实际的实时示例来完成这个,而发生的是,您的审查提示或您的请求结果,所以有很多提示,我必须确保我给你们正确的信息,所以您的请求结果将在这里,第二个提示将使用它来生成规范,这也不是这个模型或这个提示将用于生成规范的唯一信息,它还将接收项目规则和入门模板本身,所以让我们稍微谈谈项目规则,因为这是您必须了解的这个工作流程的一个非常关键的事情,这不仅对这个工作流程特别有用,对于您进行的任何涉及 AI 和代码生成的活动都很有用,所以如果我们回到这个项目的 GitHub 存储库,您会看到一个 .cursor rules 文件,所以 cursor 有一个东西,它实际上正在被弃用,取而代之的是另一种 cursor rules 格式,幸运的是,我们在该存储库中都涵盖了,所以无论如何您都会得到满足,但是您可以使用 cursor rules 文件的一件事是,您可以基本上将这些关于您的代码库的巨大规则文本文件馈送到 AI,所以您可以看到这个 cursor 文件,特别是 643 行,我们涵盖了一切,所以只是快速浏览一下,您应该在这里暂停视频,然后也许只是浏览一下这个文件,然后我们会回来,所以希望您实际上已经看过并查看了它,所以您可以看到我们在这个规则文件中做了各种各样的事情,我们给 AI 一点介绍,我们提供了我们使用的技术栈的上下文,我们让它了解我们实际上如何喜欢组织我们的代码,所以这将派上用场,因为它基本上会告诉 01 Pro,嘿,这是我喜欢我的代码组织的方式,而且事实证明,01 Pro 实际上将以您在这里定义的方式编写代码,您可以让它变得相当广泛,您不必过于具体,但定义一些项目结构是有帮助的,然后您可以看到我们正在进入一些通用规则,我们正在谈论,嘿,这里有一些通用规则,这是我希望我的环境变量如何管理,这是如何,这是一个基于 TypeScript 的,所以这是我希望类型如何处理,您可以看到我们甚至在做一些事情,比如给它代码示例,看看我们实际上如何编写代码,而且事实证明,当您给 AI 代码示例时,这是对一些少样本提示的运用,它实际上会遵循您希望代码编写的风格,您可以看到我们正在做前端代码,所以这是我们希望组件如何处理,这是我们希望事物如何组织,这是我们希望数据如何获取,您知道有客户端组件和服务器组件,我们给出了两者的代码示例,我不会详细介绍整个事情,否则我只是在读这个文件给你听,这可能非常无聊,但您可以看到,我们正在为付款添加一些规则,为存储添加规则,当我们到达 Superbase 和存储时,这是我们用于存储的所有规则,而发生的是,当模型,让我们回到我们的规范提示,当模型正在生成技术规范时,如果您将规则馈送给它,它将对它需要生成的实际文本规范有一个更好的感觉,所以我们将这样做的原因是,我们将馈送我们的请求,作为我们想要的上下文,我们将馈送这些规则,所以它知道,好的,这是我应该如何构建这个东西,这是创建者想要使用的技术栈,等等,然后我们还将通过 repo 提示馈送整个入门模板,所以整个存储库,我们将馈送它,我想说这大约是 40,000 个 token 的入门应用程序,然后规范将能够查看我们的代码并知道如何进行,所以这就是我们将输入到规范提示的所有上下文,这很酷,然后您可以看到我们正在变得相当详细,我们给了它 11 件不同的事情,我们希望它处理,您可以看到我们甚至要求它将它的思考过程包装在规范规划标签中,所以这是我们开始使用 01 Pro 时的一个有趣的事情,这是一个推理模型,所以它本身就已经会使用所谓的推理时间计算来实际思考答案,有些人不推荐这样做,我完全不同意他们,我认为您应该两者都做,我认为这实际上会带来更好的答案,所以您在这里看到的一件事是,您可以看到所有这些提示都非常,你们都可以通过查看所有这些提示来学习很多关于提示的知识,顺便说一句,我对这些结果非常满意,所以您可以看到我们正在定义输出,我们再次说,嘿,这是我们想要的所有不同的东西,我们非常全面,我们说,嘿,请确保定义数据库应该如何设置,您可以向下看,这是我们希望我们的身份验证如何设置,再次,它将从这些规则中提取,它将从起始代码中提取,它将从您刚刚通过请求提示生成的请求中提取,然后您可以看到在最后,我们基本上告诉 AI,嘿,我们希望规范非常详细,包括示例,我们希望它以规范规划开始,这就是我刚才说的关于这个规范规划标签的事情,并设法让它思考,我们正在做所有这些不同的事情,您将看到这些相同的技术也用于即将到来的提示,所以再次,这是我可以坐在这里喋喋不休一整天的事情之一,但如果我们开始使用它,那将更有帮助,但一定要花时间查看这些提示中的每一个,否则您可能会错过一些细节,所以让我们继续前进,这样我们就可以越来越接近实际构建我们的应用程序,在我们实际进入代码生成提示之前,我们需要使用的最后一个提示是规划器提示,所以这是三个步骤,抱歉,三个步骤,这三个步骤构成了 AI 如何实际弄清楚它需要传递给代码生成器的所有步骤,所以它是步骤一请求,步骤二规范,步骤三提示,您将这三个结果中的每一个都馈送到代码生成提示,所以让我们谈谈最后一个,规划器,所以规划器在这里要做的事情是,您可以看到最开始,我们正在进行基于角色的提示,所以我们说,您是一个 AI 任务规划师,负责将复杂的 Web 应用程序开发项目分解为可管理的步骤,所以再次暂停此视频并快速阅读其余的提示,您可以看到我们正在做的事情与我们在规范提示中所做的非常相似,我们正在传递我们之前从 AI 那里获得的结果,所以 01 Pro 将为我们提供这些结果,我们将把它们传递到我们的新提示中,我们将继续迭代,所以您可以看到我们的项目请求,来自第一个请求提示,它正在被传递,项目规则,我们正在做同样的事情,我们刚刚与规范提示一起做的,项目,在哪里,项目规则,我们还将传递入门模板,就像我们与规范提示一样,我们要添加的新东西是技术规范,所以这将是您从规范提示中获得的结果,所以您基本上将把我们之前使用的所有四件事馈送到规划器提示,而 AI 任务规划师在这里要做的事情是,它将创建一个详细的逐步计划,该计划将指导基于提供的技术规范的完整功能 Web 应用程序的代码生成过程,所以我们在这里真的试图非常具体地说明我们想要什么,再次,如果您向下滚动,您会看到我们继续定义模型作为此提示结果返回给我们的输出,在这种情况下,我们想要一个实现计划,对于实现计划,我们想要一系列步骤,所以希望您通读了这个提示,您可以看到我们的方向,但这里的想法是,我们将为 AI 模型,在这种情况下是 01 Pro,决定我们需要完成的任务分解的所有不同步骤形成这个步骤格式,然后我们将要做的是,对于代码生成提示,下一个即将到来的提示是,我们将把这些步骤中的每一个都馈送到代码生成过程中,而这基本上将是 AI 将要做的工作,一次一个步骤,我们将不断地与 01 Pro 进行迭代,直到它构建出我们的应用程序,所以这基本上是规划器提示的要点,您基本上试图将您之前所做的一切都馈送到这个规划器提示中,它将吐出一个实现计划,然后您将把所有这些数据,包括请求,包括规范,包括计划,您最终将把它馈送到下一个提示,即代码生成系统,到目前为止,一切都基本上导向了我们的代码生成提示,所以让我们谈谈这个家伙,但在我们谈论它之前,让我们让您暂停视频并阅读它,所以您可以看到这里,我们再次在最开始使用基于角色的提示,我们给了 AI 一个角色,在这种情况下,我们说,您只是一个负责构建 Web 应用程序的 AI 代码生成器,然后我们给它任务,即一次一个地系统地实现计划中的每个步骤,所以我们将比以前的提示更深入地探讨这个提示,因为这是真正重要的提示,它将为您带来您想要的代码生成结果,所以快速开始,您可以看到,再次,我们正在使用我们从以前的步骤获得的所有结果,我们正在回收它们来继续构建我们的上下文,基本上给 AI 尽可能多的上下文,关于我们真正想要什么,所以您可以看到项目请求仍然被馈送,项目规则仍然被馈送,技术规范,这次我们添加了我们刚刚从规划器提示获得的实现计划,而这次不是入门模板,所以您会记得以前我们馈送了入门模板,那么现在代码生成步骤会发生什么,此时您应该拥有您的现有代码库,它现在正在经历这个迭代的逐步过程,所以对于第一步,它将是起始模板,因为您还没有让 AI 真正编写任何代码,但是一旦您进入第二步,您想确保您做的是,您想确保现在您正在馈送更新后的代码,当然,我们很快就会向您展示如何做到这一点,所以我们告诉 AI 要做的下一件事是,我们说,嘿,您需要从计划中识别下一个未完成的步骤,所以发生的是,我们将把我们的实现计划馈送给 AI,这就是所有这些不同的实现步骤将是什么,当我们不断地迭代这些步骤中的每一个与代码生成提示时,发生的是,我们将在每个步骤的末尾添加一个 X,您想继续将整个计划,甚至已完成的步骤都馈送给 AI,因为当您开始创建新的聊天时,它会让 AI 知道,哦,好的,这是我以前实际做的事情,所以它会有一个更连贯的想法,它从头到尾做了什么,而如果您删除这些步骤,而不是只是在这里添加一个 X 来标记它们已被选中,您将失去一些非常重要的上下文,我们要求 AI 模型识别下一个未完成的步骤的原因是,如果我们做我们的工作,并且我们标记了哪些已完成,您可以看到我们说,嘿,标记为,这是 markdown 的待办事项上下文或格式,如果您不熟悉的话,所以这只是让 AI 知道它需要处理哪个步骤,然后我们将说,为该步骤中的所有文件生成必要的代码,所以正如您在分析规划器提示时可能读到的那样,我们要求 AI 模型做的一件事是识别哪些文件实际上需要编辑,而这只会给代码生成步骤一些关于它需要处理的实际文件的上下文,然后最后但同样重要的是,当然要返回生成的代码,我们在这里指定的一件事是,我们说,实现计划是一个建议,通过说它是一个建议,我们正在阻止模型陷入错误的思考,因为比如,如果我们的规划器步骤错过了一个文件,或者比如我们的代码生成提示在运行代码时,它实际上正在编写代码,它意识到,哦,原来我实际上需要另一个文件,那么通过说计划是一个建议,它基本上给了模型允许它在计划范围之外行事的权限,所以它不觉得它必须只做计划所说的,您基本上是在说,这是一个指南,但如果您需要绕过它,请随意,然后我们正在做的是,对于您修改或创建的每个文件,您必须完成文件的全部内容,所以这非常重要,因为这个工作流程将如何运作是,您基本上只是复制粘贴 01 Pro 为您所做的,然后您将其作为文件粘贴到您的代码库中,您将为它生成的或更新的每个文件执行此操作,而我们需要完整的文件代码的原因是,这样您就不必每次编辑某事,每次创建某事时都要弄清楚一切在哪里,它将为您提供完整的文件代码,所以您可以直接复制粘贴,这使得过程非常顺畅,所以您可以看到每个文件都应该包装在一个代码块中,并以其文件路径作为标题,所以这是我们将要做一些有点不寻常的事情的地方,我认为这非常有效,特别是如果您是初学者,如果您是更高级的人,您可能不想使用我在这里要教的注释技术,但我认为它实际上非常有帮助,因为它允许模型在您注入当前现有代码时,每一步它都将能够读取一个记录良好的代码库,以便它可以编写更好的代码并对代码库有更好的全面理解,所以我在谈论什么技术,所以您会看到在这里,在每个代码的开头,您将看到您要求模型做几件事,所以基本上它必须生成文件的描述,它必须识别文件的关键功能,它必须识别文件的依赖项,然后有一个额外的记事本区域,它可以写更多笔记,您还定义了一些文档要求,这将添加诸如注释之类的东西,遍布您的代码,您希望它记录类型等等,您可以看到甚至文件级别的文档解释了目的和范围,这就是这个,然后在这些注释下方,您说,好的,用广泛的内联注释和文档编写其余的代码,所以当我们实际构建应用程序时,您就会明白我的意思,这取决于您是否喜欢这个,我建议,即使您不喜欢它生成的所有注释,并且您不想将它们保留在您的代码库中,我认为至少在生成步骤中它很有帮助,因为注释几乎就像额外的思考令牌,它们将能够指导模型编写更好的代码,所以这就是我对那个的抱怨,当我们实际构建应用程序时,我们会更多地谈论它,所以您可以看到,然后我们基本上给了模型更多指导,一次只处理一个步骤,包括所有代码,确保它遵循我们的规则,确保它遵循我们的技术规范,所有这些东西,然后我们基本上只是说,开始识别计划中下一个未完成的步骤,我已经提到了,但不断地向模型重申它必须做什么,永远不会有坏处,然后生成所需代码,您可以看到再次,我们正在重申完整的文件内容和文档,我们还在这些文件中的每一个之上,您将看到当我们实际开始使用 01 Pro 时,为什么这如此有用,但我们说,我们还希望您说,这是我所做的,以及为什么,因为我们想确保我们在使用 01 Pro 时所做的一件事是,我们实际上保持对我们代码中实际发生的事情的某种程度的理解,可能会发生什么,您会知道,人们可能听过“氛围编码”这个词,当您进行氛围编码时,您只是接受所有这些 AI 生成,突然您的项目膨胀了,您最终会陷入一个您不知道发生了什么的地步,所以当您有“这是我所做的以及为什么”的解释,对于这些文件中的每一个,您可以阅读它,所以当您将这些东西复制粘贴到您的代码库中时,您实际上是在学习发生了什么,这对于构建这些应用程序来说非常有用,特别是如果您正在构建一个真实的商业或初创项目,您有付费客户,您想了解您的代码库,所以绝对推荐传统的代码生成提示,这就是我们将在本次研讨会的其余部分中使用的,但是如果您感觉有点疯狂,请务必查看此提示的 XML 版本,我们有可用的工作流程视频,如果您想变得有点疯狂,最后但同样重要的是审查提示,这个实际上有点可选,我喜欢将这个提示视为一种清理步骤,您将在代码生成迭代的所有不同步骤完成后使用审查提示,所以基本上当 AI 完成构建您的应用程序的初始版本的绝大部分时,您可以运行审查提示,看看是否可以获得一些关于清理建议的帮助,关于一些事情,也许在所有不同步骤的实现之后,模型基本上说,嘿,您可能可以清理一下,您可能可以优化一下,也许可以将这些东西移到一起,如果这有点重复,所以这就是这个提示的目标,所以您可以看到,与规划器提示不同,让我们快速看一下规划器提示,所以我们正在生成这些实现步骤,所以审查提示的输出将非常相似,它将是这些优化计划步骤,它看起来与您从规划器提示等获得的结果非常相似,这在直觉上是有意义的,因为当我们从 AI 模型那里得到响应时,我们将要做的事情,所以一旦 01 Pro 完成审查您的东西,制定计划,然后您可以实际回到代码生成提示一次,这次不是使用实现计划,您将添加审查计划而不是实现计划,您将做与实现计划相同的事情,除了您将对所有这些优化步骤运行它,所以这是一个可选的步骤,我不确定我们实际上会做多少,我认为我们实际上可能会生成审查提示,然后我可以向您展示您会做什么,因为这是您可以做的一些奖励任务,只是为了清理一些东西,优化一些东西,但它不是,它不是获得 MVP 版本应用程序的必要条件,它有点像一个伸展目标类型的东西,所以我们将在此结束,显然,再次暂停视频并实际阅读此提示,所有这些提示的优点在于它们是基于指令的,因为它们非常清晰,所以很容易弄清楚它们在做什么,所以让我们结束提示部分,让我们稍微总结一下,让我们实际开始设置您开始构建应用程序所需的所有不同内容,我们现在将开始进行项目设置,所以现在我们终于在说了很长时间之后,我们将开始构建东西,您需要转到这个项目的 GitHub 存储库,我们将为您提供链接,取决于您所在的平台,但一旦您来到这个页面,当然,您会看到它现在是锁定的,一旦视频上线,我就会公开它,但这是我们将克隆代码并获取我们的入门模板的地方,您会记得我们刚才看过的所有不同的提示,它们都有入门模板,这就是入门模板的来源,所以只是提醒您,将来您可能想使用我的标准 McKay 的应用程序模板,我将随着时间的推移保持它的更新,我大约每周添加一两次,但为了本教程的目的,我们将继续使用 01 Pro 模板系统存储库,因为我可以将其冻结在时间中,以便观看此视频的每个人都将使用与我相同的版本,以及此视频的当前状态,所以您要做的就是点击这个绿色的代码按钮,您将复制这个 URL,您可以选择将代码库下载为 zip 文件夹,我建议您开始熟悉 Git,它不像看起来那么棘手,所以一旦我们将其复制到剪贴板,我将在 Mac 上,所以我将滑过去,我只是在我的 Mac 终端中,所以您只需要在您正在使用的任何操作系统上打开您的终端,当然,如果您愿意,您可以在光标内完成此操作,但我将要做的是,我将输入 git clone 并粘贴我的 URL,我将称之为,我将称之为 01 Pro 工作流程教程,显然您可以称之为任何您想要的名字,这个最后的参数将定义您的文件夹名称,所以我将按回车键,您可能想称之为您的应用程序 ID 或您的应用程序名称之类的,我将要做的是,我将输入 cd,意思是更改目录,我将输入这个,所以如果我只输入 o1,我实际上将按 Tab 键,因为我有自动完成功能,但您只需要输入您想要的文件夹名称,您将在您喜欢的 IDE 中打开该目录,我们将使用光标,我有一个快捷方式,所以我将输入 cursor.,这实际上将打开我的光标,您很可能在您的计算机上没有这个快捷方式,所以您只需要打开光标或 wind surf 或您喜欢的代码编辑器,我仍然推荐使用光标,我认为 wind surf 真的很好,所以如果您使用 wind surf,我不会因此而生气,我认为只要您使用其中一个即可,但出于演示目的,我们将使用光标,所以请确保您在光标中打开该文件夹,我将使用我的快捷方式,您应该能够看到从该链接下载到您机器上的代码库,这就是我们所说的克隆存储库,您应该在光标中打开它,您应该能够看到主分支上的所有代码,与存储库链接上的当前状态相同,在接下来的几课中,我们将要做的是,如果您点击 env.example 文件,您会注意到我们有很多环境变量,这是一个非常重要的学习内容,我将开始讨论环境变量,同时解决安全性问题,所以您需要确保您做的是,您看到的这里的所有值,您都想保密,您想将它们保密,您需要将它们视为密码,举个例子,如果您泄露了您的 OpenAI API 密钥,会发生什么,任何人拥有该密钥,比如您不小心将其上传到您的代码库,或者您在社交媒体截图上分享了它,那么会发生什么,坏人可以拿到您的密钥,他们可以耗尽您账户中的积分并将其用于自己的目的,我们如何解决这个问题,在代码库中,我们将创建一个称为 .gitignore 的文件,这已经为您处理好了,所以您不必担心,但是您在这里看到的一件事是,在我们的 .gitignore 中,您实际上有这一行,它说 env.,这基本上意味着任何 env.local 文件,我们将忽略它,我们不会将其添加到我们的 git 存储库中,所以您要做的就是,我们将打开我们的终端,在光标中,您甚至可以打开底部的面板,通过这个按钮,我们将进入终端,我们将输入 cp,意思是复制,我们将输入 gov.example,所以我们将复制我们的示例文件,并将其复制到 env.local 文件中,然后我们将按回车键,您将看到左边的文件浏览器,这将创建一个 env.local 文件,其中包含我们示例文件中的所有相同值,所以我们现在可以关闭示例文件,您会看到这里的文件浏览器中,它有点变灰,它变灰是因为它在我们的 gitignore 中,这意味着这个文件永远不会被推送到我们的代码库,所以它永远不会被上传到 GitHub,假设您正确使用了 gitignore,这已经为您处理好了,这是非常标准的,如果您使用入门模板,几乎总会保证在那里,所以我们现在需要做的就是,在接下来的每一课中,我们实际上需要获取每个服务的相应密钥,所以在我们实际做之前,我们将做几件事,我们将安装我们在这个包或这个代码库中使用的所有软件库,在这个 package.json 文件中,您可以滚动并看到所有这些,所以我们将在我们的终端中做的就是,我们将运行 npmi,有些人可能需要运行 npmi --force,我将与您一起这样做,我们将运行这个,这将安装我们项目中使用到的所有开发依赖项和所有标准依赖项,您可以看到一旦完成,这个消息就会清除,您会重置,所以我可以输入 clear 并按回车键,然后清理一下,现在我们已经安装了我们需要的所有东西,您应该能够做的是,您应该能够运行 npm run dev,如果我实际上将 localhost:3000 拉进来,所以您应该看到,好的,看起来我有一个正在运行的应用程序,忽略我目前正在做的事情,忽略这个,我将再次运行命令,让我实际清除一下,好的,所以忽略我刚才做的事情,npm run dev,这应该在 localhost:3000 上运行,太棒了,您应该希望看到的是,您应该希望在您的 Web 浏览器中的 localhost:3000 上看到这个 Receipt AI 应用程序,您会遇到一些问题,您可能会收到错误消息,可能是因为密钥没有被注入,或者其他什么,所以比如,如果您点击这个仪表板路由,它实际上会构建那个路由,您会看到我们收到一个 404 错误,这是因为我们的代码库中还没有这个,所以这里会发生的是,这就是我们将要使用的这个工作流程将如何构建我们的应用程序,以构建这个 Receipt AI 应用程序,所以我们显然需要去获取这些环境变量并为每个服务注册,我将带您完成所有这些,但这应该就是您在这里需要做的所有事情了,所以我将继续,然后结束这一部分,我们将开始注册 Superbase,我意识到在我们实际谈论 Superbase 之前,我们应该让您注册 GitHub,所以让我们开始吧,您需要去 github.com 注册一个账户,您可以免费创建一个账户,所以创建您的 GitHub 账户后,您可以去 github.com/new,这将带您到新的存储库区域,这就是您将创建自己的代码存储库的地方,您的代码将存储在这里,您可以随意命名,所以我可以将其命名为 01 Pro 教程视频,就像我为文件夹所做的那样,您绝对要确保将其设为私有,它默认为公共,所以请确保您的设置为私有,您当然以后可以将其设为公共,如果您想做开源的东西,那很棒,强烈推荐这样做,特别是对于那些试图有所作为的创作者来说,通过开源可以为 AI 社区添加很多很棒的实用工具,所以如果您想做一些有趣的开源项目,然后真的

了解一些人,肯定会推荐做一些开源的东西,但我们要做一个私有项目,然后你会想点击“创建仓库”。这将启动你的仓库,然后你会看到一个像这样的菜单。对初学者来说,这看起来真的很令人困惑,我保证它不是。我将向你展示你需要做的 exactly。对于有经验的开发者来说,你们显然知道该怎么做。所以我们要在这里做的是,我们要回到我们的项目,然后我实际上会点击这个小加号按钮,只是为了在这里创建一个新的终端,这样我就可以让我的应用程序在本地主机 3000 上运行在一个终端窗口中,然后在另一个终端中,我可以做一些 Git 的事情。所以我要做的是,因为我们从我的模板克隆了这个仓库,如果你输入 `git remote -v`,它会显示你的分支。所以你应该能看到 origin,因为你克隆了。所以你要做的是,你要输入 `git remote rename origin upstream`。这将把你的 origin 分支重命名为 upstream。好的,我们不会在这里介绍 Git 工作流程,因为我不想让你们感到困惑。这只会让你们更容易设置。所以如果你遇到一个有趣的事实,这实际上是一件很棒的事情,我意识到我已经有一个 upstream 了,因为我实际上正在使用一个与我刚刚克隆的不同的仓库。所以如果你实际上在光标中,这里有一个快速的光标奖励技巧,如果你实际上在控制台中收到这个错误消息,我能做的一件事就是我可以把它添加到聊天中,然后我说“请去掉 upstream”,然后看看会发生什么。所以这是使用光标或使用 wind surf 的一个很棒的地方,你可以在你的代码仓库中嵌入这些 AI 工具,你只需要问它关于代码的问题,你就能得到答案。所以如果你是初学者,光标是一个很棒的工具,不仅仅是因为代码生成的原因,像我这样的专业开发者,我显然想用它来写代码,而且还因为它能帮助理解代码,在聊天中等等,它非常有帮助。所以看,它基本上给了我需要的命令,我只需要点击运行。这将在我的终端中运行它,然后我在这里可以做的是,我可以继续运行我之前尝试做的命令,现在它奏效了。所以如果我按向上箭头键回到 `git remote -v`,你会看到我们现在有一个 upstream,它解决了问题。好的,一个快速的光标技巧给你们。但是我们现在实际上可以做的是,正如你在这里看到的,你可以实际执行 `git remote add origin`。所以我们实际上可以做的是,我们可以粘贴这个,然后按回车键,这将把这个添加为我的 origin。然后你们要做的就是,你们要复制这个。这将创建一个名为 main 的 Git 分支,然后它会将它推送到你的 origin 的 main 分支,这只是指向你的代码库的链接。然后会发生的是,你会看到这个。一切都完成了。现在如果我们刷新仓库,你可以看到所有的代码都在这里,你也会看到你的代码在这里。这就是你的代码将要存放的地方,这非常重要,因为当我们进入到提示系统中的代码步骤时,我们将把每个步骤提交,以保存我们的进度,你将要确保你使用 Git 来完成这个。所以确保你到达了这一步,确保你把你的代码上传到了 GitHub,然后你就可以开始了。我们将一步一步地在我们的 `.env.local` 文件中进行。好的,所以如果你不在这里,请确保你打开这个文件。记住,这是我们从示例环境变量复制到这个本地文件中的文件,这样我们的应用程序就可以实际注入这些。另一个提醒,记住这些是秘密。我们会经常重复这一点,因为我真的想确保没有初学者在这里吃亏。另外请注意,相信我,我非常清楚环境变量是如何工作的。我将向你们展示我的环境变量,尽管我告诉你们要将它们视为秘密,因为我经常这样做,我知道如何做这些教程。在我实际发布之前,我会删除我所有的密钥并重置它们。所以会有一些有经验的开发者说,“ McKay,不要发布你的环境。” 各位,完全没问题。在我上传之前,我会删除这些。我们都很好。我感谢你们的关心,但请相信我,我知道我在做什么。但是为了你们,请确保你们不要与任何人分享这些,因为我们在这里经历的事情不同。所以总是默认将它们保密。好的,那么让我们去获取我们的 Superbase 变量。所以那将是这个 DB 变量和我们的 Superbase 变量。所以我们要做的就是,我们要去创建一个 Superbase 账户。所以你需要做的是,你需要去 `superbase.com`。你将能够为这个项目使用他们的免费套餐。所以 Superbase 是我们将要使用的,不仅是我们的数据库,我们将使用一个 PostgreSQL 数据库,这是一种非常流行的 SQL 数据库。你们中的许多熟悉 AI 编码工具的人可能已经熟悉 Superbase,因为你知道,许多流行的 AI 工具,例如 Bolt,就使用 Superbase 等等。所以这是一个非常流行的工具,我们将使用 Superbase 的数据库,PostgreSQL 数据库。我们还将使用 Superbase 作为我们的存储。所以我们可以做像上传收据到 Superbase 存储这样的事情,这将工作得非常好。好的,所以请确保你注册一个免费账户,然后我马上回来。好的,一旦你的账户设置好了,你要在这里做的是,你需要在你的一个组织中创建一个新项目。所以在这个例子中,我将创建一个新项目,我将称之为 `01-pro-tutorial`。我该叫它什么?`01-pro-workflow-tutorial`,我想我一直在用这个。你应该在这里使用微型尺寸。如果你是免费用户,我想你有两个这样的。我是一个专业用户,所以我的会显示额外的计算成本,因为我有很多不同的项目。然后你要做的是,你要点击生成密码,或者你可以自己创建一个。我建议生成一个,它更安全。然后你要复制这个值。这就是秘密开始的地方。所以请确保为了你自己,不要暴露它。但我只是暂时把它粘贴到我的环境变量文件中。我们将在接下来的一个步骤中处理它。你要选择一个离你近的区域。所以我将默认使用美国西部,因为它离我相当近。然后你要点击创建项目。Superbase 将为你启动一个项目,他们将设置好你的数据库,他们将设置好你需要的一切。你可以看到有一个小旋转器说“正在设置项目”,你只需要稍等片刻,让它运行。通常需要 2 到 3 分钟,然后我们就会回来。所以正如你所见,我的项目现在已经设置好了。你可以看到它是一个微型实例。看起来我的项目状态仍在解析中,但我们将继续。这应该很快就会完成。我们要确保我们获取我们的环境变量,以便我们能够工作。所以这是你需要去的地方。在最上面,你会看到我们有一个“连接”按钮。你要点击那个按钮。这将弹出一个小窗口。我们实际上要做的就是,我们正在使用一个 ORM。我们不会在这个视频中深入介绍 ORM,只是为了降低复杂性。但你会看到我们有一个 ORM。我们要点击它,然后从 Prisma 切换到 Drizzle。所以我们将在这个特定的模板中使用 Drizzle。你实际上要做的就是,你要复制引号之间的这段文本。所以你要复制这个,然后粘贴到“database URL”的地方。你要像这样粘贴它。你应该看到,我只是在这里换行。你可以看到这实际上只有一行,只是为了适应这里。然后你要做的是,你要剪切这个。光标标签一直在试图预测我正在做什么。你要剪切你在设置步骤中生成的密码。你要删除你的密码,带上那些括号,删除,然后你要粘贴你的密码。所以你应该有一个数据库 URL 字符串,看起来像这样。记住,不要放那些引号。确保你输入你的密码,然后你就可以开始了。所以现在我们只需要获取。我们实际上只需要获取这两个值。我们实际上现在不需要使用它。甚至有可能,取决于 AI 的操作,我甚至可能在你们看到它之前就把它删除了。但我们肯定会获取这两个值,现在就使用它们。所以你要做的就是,你要点击项目设置。你要去配置,然后你想点击数据 API。所以一旦你进入数据 API,你就会看到项目 URL。所以你要复制它,然后粘贴到你的项目 URL 这里。然后你要去项目 API 密钥,然后你实际上要获取这个 `service_role` 密钥。你可以看到他们再次强调这是秘密。确保所有这些值都保密。你要点击显示,复制那个值。这就是你的角色密钥。然后你要把它粘贴在这里。确保你保存文件。现在你应该有了你的数据库 URL,你的 Superbase URL,以及你的 Superbase `service_role` 密钥。我们应该一切就绪,能够设置我们的数据库东西,一旦我们开始处理应用程序。所以现在让我们继续处理 Clerk 进行身份验证。接下来我们将使用 Clerk 进行身份验证。所以我可能会经常被问到的一个问题是,为什么是 Clerk 进行身份验证而不是 Superbase?我们已经有一个 Superbase 账户了。我认为 Clerk 功能更全面。Clerk 本身就是一个身份验证产品,而 Superbase 是,你知道,很多东西合二为一。所以我认为 Clerk 在某些方面更深入。我将要指出的一点是,如果你有一个病毒式传播的应用程序,有很多免费用户,Superbase 在定价方面可能更好。在这种情况下,Clerk 的定价可能会有点贵。但如果你要做的是像一个 B2B 工具,你是一个试图真正做一个,你知道,B2B 产品之类的人,Clerk 在这方面功能更全面。所以无论你的决定如何,我们显然会在这段视频中做 Clerk。但实际上,这两种在实践中都很好。但请确保你注册一个免费的 Clerk 账户,然后我们就可以开始。好的,就像 Superbase 一样,Clerk 有一个非常慷慨的免费套餐,足够我们这个教程使用。所以我们要在这里做的是,你应该有你的组织。你应该进入“创建应用程序”屏幕。我们将创建一个新应用程序。我将继续将其命名为 `01-pro-workflow-tutorial`。你可以选择所有这些不同的身份验证方法。所以他们有内置的这些不同的方法。我将只保留电子邮件和 Google 作为开始。这些显然是世界上最流行的身份验证方法。大多数你将在宇宙中看到的应用程序都将使用这两种。所以我们将创建一个应用程序。这将启动一个身份验证实例。你实际上不需要担心这一步。我们已经为你安装好了。这是在我们进行代码设置步骤时完成的,我们已经完成了 `npm install`,它已经处理好了。你需要做的是,你需要去第二步,你需要设置你的环境变量。所以你将点击这个复制按钮。我们将回到我们的代码。这两行值,我们将高亮显示它们,然后我们将直接粘贴到它们上面。然后我们将拥有我们的 Clerk 可发布密钥和我们的 Clerk 秘密密钥。再说一遍,我将继续令人讨厌地重申这一点。确保你保守这些值的秘密。然后这些只是配置选项,它们将使你的注册体验更好。所以只是不要删除它们,因为它们与我们模板中的身份验证设置方式配合得很好。好的,一旦你有了这些,你应该一切就绪。我们的中间件实际上已经更新了。我们已经有了 `ClerkProvider` 在我们的应用程序中。再说一遍,这是,你知道,当我谈到模板有多方便的时候。如果我们进入我们的应用程序代码,进入这个布局,你会看到我们已经设置好了 `ClerkProvider`。所以当你使用模板并开始新项目时,它可以非常方便,不必一遍又一遍地做这些事情。这就是为什么开始使用模板如此有帮助。我实际上认为一个非常有价值的事情是,你当然非常欢迎使用我的模板。它是开源的,免费的,MIT 许可的,这意味着它非常宽松,你可以用它做任何你想做的事情。但是创建你自己的模板可能很有帮助,因为你可能不喜欢某些结构的组织方式。也许你使用,你知道,也许以身份验证为例,你使用 Superbase OAuth 而不是 Clerk OAuth。所以你的模板将与我的不同。所以无论如何,这只是关于模板的力量的一个小小的离题话。但是你应该能够做的是,如果我们实际上,让我快速拉起我的应用程序。所以 `localhost:3000`。提醒一下,如果你实际上需要构建你的应用程序,你只需要运行 `npm run dev`。这将在你的本地主机 3000 上运行你的开发环境。你应该得到应用程序。现在有了 Clerk,你应该能够登录了。现在你已经输入了你的环境变量密钥并创建了你的 Clerk 应用程序,这现在应该允许你登录了。所以如果你实际上点击仪表板中的“用户”,你会看到没有用户。所以我要做的是,我要去登录。你可以看到我们现在正在为教程获取登录信息。所以我们可以创建一个电子邮件或使用 Google 进行身份验证。我将快速使用 Google 进行身份验证。好的,我通过了 Google 身份验证屏幕。我只需要验证我不是人类。显然,这将带我们回到应用程序。然后你会看到右上角,我们现在有一个小用户图标。所以你可以看到,这是我的 takeoff 电子邮件。我已登录。我们去用户,点击刷新,我们应该看到一个用户。然后就有了。我们现在有了身份验证。多酷啊。所以我们现在有了数据库设置,身份验证设置。让我们开始设置付款,这样你们就可以实际,你知道,获得付费客户。有一点需要注意,当我们谈论所有这些设置和技术栈时,在 takeoff 上,我们有一个“使用 AI 构建全栈应用程序”的课程。所以如果你感到有点迷茫,想深入了解其中一些内容,这是一个大约 8 小时的课程。你当然不需要上完整个课程,如果你想更深入地了解一些内容。但是我们的第一部分,“技术栈”部分,是一个 41 分钟的部分。然后我们的“你的第一个应用程序”部分,更深入地介绍了我们在这里谈论的所有内容。所以设置前端、GitHub 和环境变量、后端等等。我们在这里都讲到了。许多人发现这非常有帮助,尤其是初学者,他们会学习光标课程,然后学习“使用 AI 构建全栈应用程序”。我们当然在这里尝试做这个的免费版本,以帮助尽可能多的人。但是对于那些说,“哇,我真的想更深入地了解一下,”那实际上是一个非常棒的资源。所以接下来,我们将跳到 Stripe。这就是我们将要使用的付款方式。Stripe 的好处是你可以很快注册。所以请快速注册一个账户,然后回来。好的,一旦你的账户设置好了,Stripe 的好处是你不需要输入你所有的业务细节等等。所以如果你想,“嗯,我实际上不知道我是否想向人们收费,或者其他什么,”你可以跳过这个。至少你可以只使用测试模式,这就是我们要做的。这非常好,因为你不需要像我说的注册一个企业。你只需要开始使用你的 API,并在你的开发环境中进行本地测试,这非常棒。所以我将创建一个新账户,就称之为 `A1-pro-workflow-tutorial`。很棒。这将启动一个新账户。我们将直接进入仪表板。你可以看到最上面写着“你正在使用测试数据。要接受付款,请完成你的业务资料。”所以当然,如果你想真正获得付费客户,你将不得不进入 Stripe 的实时模式。所以这包括,你知道,你将不得不完成你的业务资料,并实际向 Stripe 注册,并遵循 KYC 法规等等,这取决于你住在哪里。我们不需要为这个特定的研讨会做任何这些。我们只会使用测试数据。我将向你展示你需要的密钥。如果我们回到我们的应用程序,你会看到我们需要一个 Stripe 秘密密钥,我们需要一个 Stripe Webhook 秘密。然后我们将获取这两个付款链接,我们将用于 Stripe Checkout 链接,以便轻松添加订阅。所以我们将有一个月度计划和一个年度计划。好的,设置很简单。但到最后,你应该能够将我们在这里所做的一切连接起来,包括你的 Superbase 数据库,你的 Clerk 身份验证,以及你的 Stripe 付款,来拥有一个基本的 SaaS,这很酷。所以让我们开始处理吧。所以你要在上面的搜索栏里做的是,你要输入 `dev`,然后去开发者。所以这是 Stripe 的开发者区域,我们将在这里获取我们的密钥。所以如果你点击 API 密钥,你会看到我们有一个秘密密钥。这是一个秘密测试密钥。显然,所有环境变量都很重要。Stripe 尤其重要。你想确保你的环境变量保持秘密,因为你不想让人们访问你的付款信息。这可能会非常糟糕。所以再次提醒一下。所以让我们复制我们的秘密密钥。我们要做的就是,我们要把它粘贴到写着“stripe secret key”的地方。然后对于 Webhook 秘密,我们将做一些不同的事情。所以我们将要使用 Stripe CLI。CLI 代表命令行界面。你需要做的是,我们将当然会提供链接给你们。你需要把它安装在你的机器上。所以根据你的操作系统,你会有很多不同的选择。Stripe 有最好的文档之一,他们有世界一流的文档。所以你将能够很容易地设置好。你只需要按照这里的说明操作。我会在这些步骤之间插入一些内容,因为有时会暴露环境变量等等。所以我想在这里做的是,我想在尝试教育你如何尽可能安全的同时,引导你完成这个过程。所以安装 CLI,无论你在哪个操作系统上,然后回来。好的,在我们开始使用 CLI 之前,值得注意的是,你不一定必须在 CLI 上开发。你实际上可以直接在一个已部署的应用程序的开发实例中进行开发,或者其他什么。我们不会在这个视频中介绍这个。这有点超出了我们想要做的范围,关于 DevOps 方面的事情。试图让这个设置尽可能直接和简单。所以我们要在这里做的是,我们要去我们的终端,然后我将输入 `stripe login`,因为我已经安装了我的 Stripe CLI。然后我将点击这个,然后我们将切换到下一步。所以你应该得到一个配对码和一个链接。所以你要做的是,你要遵循那个链接。所以让我,这实际上刚刚在屏幕外打开了。所以我要做的就是,这实际上只是在屏幕外引导我完成流程。我只是通过我的 CLI 登录,或者通过我得到的链接登录。然后你应该看到,让我把它拖进来,你应该看到配对码与你的账户在测试模式下匹配,无论代码是什么。然后你应该允许访问。你应该获得访问权限。你可以关闭这个窗口,回到 CLI,然后就有了,我们有一个账户 ID,用于我们的测试账户。然后我们应该能够做的是,我们实际上将运行这个。我们将输入 `stripe listen --forward-to`。所以这将把我们的 Stripe 请求转发到 `localhost:3000`。所以这将是同一个服务器,我们的应用程序正在运行。我稍后会解释原因。`/api/stripe/webhooks`。一旦你输入了所有内容,你就可以按回车键。这将把你的所有 Stripe 请求转发到你的本地主机 API。我们之所以这样做,是因为我们之前提到了,但是如果你去你的 API 路由,我们实际上有我们的 Stripe API 路由,它将处理我们所有与订阅相关的事件所需的一切,这真的很酷。所以它将转发到我们本地机器上运行的本地实例。我们就可以通过这种方式进行 Webhook。所以如果这有点太复杂了,别担心,你不是一个人。用 Stripe 设置付款有时可能是最难学的东西之一。再次提醒,任何时候你有关于事情的问题,去光标中的聊天,或者 Wind Surf 中的聊天,或者 ChatGPT 中的聊天,或者任何你喜欢问 AI 问题的地方,然后问这个东西一百万个问题。复制粘贴你的代码,它可以回答你关于付款的任何问题。我们还将向你展示如何解决这个问题。所以如果你卡在这些东西上,你说,“哦,糟糕,我不知道发生了什么,”别担心,我将向你展示一个解决方法,你可以使用它来继续测试你的应用程序,而无需担心这个问题。但是你会看到的是,你应该得到一个 Webhook 秘密密钥。所以你看,它只是 Webhook,然后是 seek,代表 secret。然后你要复制这个值,回到 `.env.local`,然后把它粘贴到你的 Stripe Webhook 秘密中。所以现在这个 Webhook 秘密将与你在这里运行的版本相关联,这将非常棒。好的,所以我们可以做的是,我们可以继续让它运行。绝对要让它运行,因为如果你关闭你的终端或者其他什么,你将不得不重新启动它,这样这些事件才能转发到你的本地主机。然后我们应该能够做的就是,我们应该能够现在去创建我们的付款链接,看看它是否真的在工作。所以你可以做的一件事来验证你的 Webhook 是否被转发到你的本地主机,就是点击 Webhook。你应该看到“本地监听器”,你应该看到你的设备与 `localhost:3000/api/stripe/webhooks`。所以这正是我们刚才做的。你可以看到状态是“正在监听”。这意味着它是实时的,它正在运行。你应该一切就绪。所以你需要在 Stripe 中做的是,你实际上需要点击“产品目录”。这就是我们将要创建的第一个产品。所以这很酷。所以我将创建一个新产品,我将称之为“Receipt AI”。我将称之为“Receipt AI Pro”。我们要为这个创建两个不同的价格。所以我将只做每月 10 美元。我将添加产品。我们将回到我们的产品,然后我们将添加一个价格。所以你看我们有这个定价部分。我将点击加号,然后我们将把每月改为每年。我们将只做每年 100 美元。然后我们将创建价格。所以我们现在有两个价格。最后但同样重要的是,这一点非常重要,有些人不可避免地会错过这一点。你需要在元数据中点击它。你要做的是,你要点击它。键将是 `membership`,值将是 `Pro`。然后你要保存它。所以为什么我们需要这个?所以接下来会发生什么,我们将在几分钟内运行这一步。如果我们去我们的数据库文件夹,打开我们的 schema,然后打开我们的 profile schema。所以这个 profiles 表是我们保存 Stripe 客户信息和会员资格的地方。所以会发生的是,当一个用户注册并付款时,Stripe 会转发。你可以看到,我们正在收到事件。这很酷。所以会发生的是,Stripe 会向我们的 API 路由发送一个事件。所以这个路由,我之前给你看过的。然后它将创建一个,它将更新一个现有的配置文件,包含他们的 Stripe 客户 ID,他们的 Stripe 订阅 ID,然后会员资格将在这里添加。这将从免费变为 Pro,如果他们实际付款。而这样做的方式是通过这个,这个会员资格元数据。所以如果你不这样做,用户付款了,那么这个将永远不会改变,他们将是一个免费用户,然后你将有很多支持票要处理,而这就是原因。所以我们接下来需要做的是,我们实际上需要去付款。然后我们实际上想点击付款链接。所以我们要做的就是,我们现在要去创建我们的付款链接。所以我们可以创建一个测试付款链接。我们将添加我们的月度产品。我们将创建链接。我们将复制这个。所以我们要复制这个链接。我们将回到我们的环境变量,然后将其粘贴为我们的月度链接。然后我们将再做一次。付款链接,新。我们将为我们的年度价格这样做。创建链接。复制它。然后粘贴为年度。现在我们有了所有这些值。所以有一件事我也会很快向你们展示,如果你对 Stripe CLI 的东西感到卡住,你可以做的另一件事是,如果你实际上能够把它托管在 Vercel 上,我们将在研讨会中继续讨论。如果你实际上回到 `dev`。所以我们将在搜索栏中输入开发者,Webhook。你实际上可以添加一个端点。我稍后会向你们展示如何做到这一点。但是你将在这里添加你的端点 URL。你将选择事件。我们将在稍后实际为一个真正的生产版本做这个。但这是获取那些 Webhook 秘密密钥的另一种方式。所以希望你能够跟上。我非常清楚,这可能是初学者特别难以跟上的事情之一,考虑到我们正在运行一个命令行界面。所以你可能需要几次迭代才能让它运行起来。如果你觉得你想暂时跳过付款,完全没问题。我们只是想增加额外的价值,因为你们中的许多人会想,你知道,构建实际有付费用户的产品。所以我们想让你朝着正确的方向前进。但是你应该注意到的是,所以如果我实际上点击回到我的另一个终端面板。我们要做的就是,我们实际上需要生成我们的数据库迁移。因为会发生的是,你会看到你收到这个创建配置文件的错误。这是因为我们的数据库中的表。所以现在我们只有这个 profiles schema。再说一遍,这不是我们写的代码。这是入门模板的一部分。如果你稍后去 Superbase,你会注意到我们没有那些表。所以让我,让我快速打开 Superbase。我将去获取它。我有很多显示器,你们。我有四台显示器。所以让我把它从我的另一个屏幕上拉过来,然后获取它。因为我们现在需要做的就是,我们实际上需要生成这里的表。所以你会注意到,如果我们去这个 Superbase 项目,然后去表编辑器,你会看到我们没有任何表。所以下一步要做的事情就是改变这一点。所以你需要做的是,你需要去一个空白的终端。所以我将点击加号按钮,打开另一个终端。然后我们要运行两个命令。所以我们去 `package.json`。你会看到我们有两个数据库脚本。我们有一个 `generate` 脚本和一个 `migrate` 脚本。所以 `generate` 将生成我们的数据库 schema。所以在这里,你会注意到我们目前没有 migrations 文件夹。看看会发生什么。我们要做的就是,我们要运行 `npm run`。之前我们一直在运行 `dev`,因为它启动了下一个 `dev` 命令,它在我们的电脑上启动了我们的本地应用程序。这次我们将运行 `generate` 命令。所以我们要输入 `db:generate`。这将生成我们的第一个 migrations 文件。所以你会看到我们得到了这个文件。你的名字会随机生成,就像我的名字一样。所以如果你得到一个不同的名字,那完全正常。你会看到我们得到了 SQL 代码。然后我们现在可以运行这个其他脚本,也就是 `npm run db:migrate`。所以现在如果我们输入 `npm run db`,抱歉,空格 `db:migrate`。这将把这个 SQL 迁移文件应用到我们的 Superbase 数据库。所以我们应该能够做的就是,我们应该能够跳回到 Superbase。然后你现在会看到,我们在我们的项目中有一个 profiles 表。你可以看到,这里所有的列类型都与我们从这个迁移文件中生成的相对应。而这个迁移文件是从我们的 profiles schema 生成的,它是在 Drizzle 中编写的。这是一个很好的 ORM,它使在我们的项目中创建和管理表变得更加容易。所以我们接下来可以做的是,我们可以去测试付款是否成功。我们可以去我们的 `localhost:3000`,或者应用程序正在运行。我将刷新一下。只是为了验证所有你需要确保完成的事情才能让它工作。你的应用程序应该在 `localhost:3000` 上运行。你的 Stripe CLI 应该将那些 Webhook 指向 `localhost:3000/api/stripe/webhooks`。应该收到这些事件。如果你在这里登录了,那么你应该会得到一个配置文件,它应该被创建。所以你可以看到,这是我的用户 ID,这是来自 Clerk。所以现在我们的身份验证通过 Clerk。如果我实际上去用户,点击我的用户配置文件。你会看到这个用户 ID。这现在对应于这个配置文件。而这实际上只是作为我们模板代码的一部分完成的。所以你甚至不需要为它写任何代码,这非常棒。你可以看到我们的会员资格是免费的,Stripe 客户 ID 是 null,Stripe 订阅 ID 是 null。让我们看看是否能改变它。这将测试我们的系统是否正常工作。所以如果你实际上去定价,你会注意到我们有一个月度计划和一个年度计划。这些链接直接对应于我们在 Stripe 中创建的两个付款链接。所以如果我们点击其中一个链接。你会注意到,我们现在正在进入一个 Stripe Checkout 页面。所以这真的很好。所以我在这里做的就是,我用一些测试数据填写了这个表格。有趣的事实是,如果你使用 Stripe 的测试模式,你实际上可以一遍又一遍地输入 4242。这是一个假的卡,用于假的付款。所以如果我,如果你实际上输入了,这是很多假数据。然后点击订阅。你应该看到“感谢订阅”。然后如果一切顺利,你会注意到我们这里有一个发票已支付。所以你可以看到一些事件正在触发到我们正在运行的本地 API。然后如果我们去我们的 Superbase 表。你应该看到会员资格被改为 Pro。你应该有一个 Stripe 客户 ID。你应该有一个 Stripe 订阅 ID。然后就有了。我们现在有一个付费用户,这非常酷。显然,这是假钱。这是在 Stripe 的测试模式下,这不是真的。所以我们回到了应用程序。现在理论上这个用户是一个 Pro 用户。所以现在你可以根据他们是免费用户还是 Pro 用户来限制某些路由和功能。好的,这很酷,对吧?现在你的身份验证,你的付款,你的数据库,所有这些都在工作。所以作为一个快速的概览,我们做了什么。我们进入了 Superbase,创建了我们的 Superbase 项目。我们把所有的环境变量都粘贴到了我们的 `.env.local` 文件中。好的。然后我们为 Clerk 做了同样的事情。创建了我们的 Clerk 账户,设置好了一切,把这两个环境变量粘贴到这里。然后我们通过 Stripe 完成了整个过程。然后我们把所有东西都连接起来,就像我们刚才做的那样。现在我们有一个包含用户数据的实时表,这些数据来自 Clerk,付款来自 Stripe。所有这些都完美地协同工作。现在我们的应用程序几乎都设置好了。唯一我们需要做的就是,如果我们想实际部署到生产环境,或者部署到云端的开发实例。所以把它变成一个不是本地主机 URL 的东西。把它放在一个实际的网站上。我们可以注册 Vercel。我们接下来需要做的另一件事是,我们将去注册 OpenAI。所以让我们先做 OpenAI 步骤,然后我们再做 Vercel。获取 OpenAI API 密钥实际上非常简单。所以你只需要做的是,你需要去 `platform.openai.com/api-keys`。我们当然会提供一个链接。一旦你注册了 API,你需要在 API 界面中。所以在这个仪表板界面中,你会看到左边有 API 密钥。一旦你完成了注册流程,或者如果你已经有一个账户,你就会看到这个“创建新的秘密密钥”。你将创建它。你将给它一个名字。我将称之为“Dev”。然后我们将创建一个密钥。提醒一下,保守秘密。确保它被当作密码对待。我将复制它。我们将回到我们的光标。回到 `.env.local` 文件。我们将粘贴这个 OpenAI API 密钥。然后我们就一切就绪了。这真的是你需要做的所有事情。现在我们可以继续 Vercel。在设置方面,最后但绝不是最不重要的,我们要做的就是,我们要把我们的仓库部署到 Vercel。所以你要做的第一件事是,你至少需要注册 Vercel 的免费 Hobby 套餐。这应该包含你所需的一切。再次,如果你正在构建一个企业或其他什么,你可能想升级到 Pro 套餐,当你准备好部署给实际用户时。但 Hobby 套餐现在足够了。所以请注册 Hobby 套餐,然后回来。好的,一旦你注册了,你应该在你的仪表板里。所以我要在这里做的是,你会看到我在这里的 takeoff 项目团队。这是我的 Pro 套餐之一。但是,如果你是 Hobby 套餐,那完全没问题。你要做的是,你要去“添加新”,然后点击“项目”。所以你可能需要做一些连接步骤。这将为你做的是,它将允许你直接从你的 Vercel 项目创建页面选择你的 Git 仓库。所以如果你有一个连接到 GitHub 的区域,请完成它。一旦你完成了,你将要连接到你正在推送代码的任何仓库。所以我实际上要去 `A1-pro-template-system`。我将导入我的仓库。我将验证这是否是正确的团队。项目名称是正确的。你会看到框架预设设置为 `nextjs`,这是从我的代码中推断出来的,这很好。然后我能做的就是,你会看到我们有这个环境变量选项卡。我将打开这个小下拉菜单。我们要做的就是,我们要回到我们的 `.env.local` 文件。然后你只需要复制整个东西。所以我将复制整个东西。我将把它粘贴到我的环境变量中。然后你会看到它填充了所有内容。很流畅。关于这个有几点说明。所以我们要做的就是,我们将创建一个开发实例。所以通常在一个生产工作流程中,你会有一个开发服务器和一个生产服务器。所以基本上,你将要为你需要的那种实例部署你的密钥。例如,如果你要部署给实际用户,你显然不想使用你的 Stripe 测试密钥。你实际上会去创建一个实际的业务 Stripe 账户,而不是测试模式。你不想测试模式。你将不得不去获取你的生产密钥并更改它们。所以任何时候,无论你是在开发实例还是生产实例上工作,你都要确保你有适当的密钥。一旦你有了环境变量,你要做的就是,你要打开构建目录。在你的安装命令中,我们将要更改它。所以你要点击这个切换按钮。然后你需要用 `npm i -f` 来做。使用这个特定的模板。原因是,我们正在使用 `nextjs 15` 和 `react 19`。并且在依赖关系的变化方面有一些小的调整。你将需要覆盖这个安装命令。暂时是这样。然后你将

您将想要点击部署,这将启动您的应用程序的新部署。所以,如果我们向下看,您会看到它正在排队部署,它正在构建我们的应用程序。这需要一两分钟,然后我们将在此处获得一个部署摘要,然后它将实际为我们分配一个实时域,以便我们实际看到我们的托管应用程序。所以我将让它构建,然后我会回来。

好的,所以正如您所见,我已成功部署。好的,这太棒了。我将继续到仪表板,我将向您展示一些需要注意的事项。所以,您会看到我们有一个域。嗯,这显然是我们想要为我们的开发环境测试的东西。所以,这是您需要小心的事情之一,因为如果您泄露了您的开发环境或类似的东西,那么实际上会发生什么呢?例如,我在这里使用我的 OpenAI API 密钥。所以,如果我们有一个 AI 聊天应用程序或类似的东西,我们不希望互联网上的随机人能够找到它。所以,Vercel 确实有办法隐藏这一点,这样您的团队成员就必须实际登录他们的 Vercel 帐户之类的。这远远超出了本教程的范围。所以,我们将在这里保持相对简单。但这是您需要注意的事情。但我可以点击这个 URL,我实际上可以看到我已部署的应用程序,这很酷。我将能够登录。事实上,让我们继续这样做。我现在就去登录。好的,我将继续使用 Google。我将继续完成这个过程。砰,就这样,您可以看到我已登录。所以,我们所有的东西都在正常工作。如果您愿意,您甚至可以测试付款。我现在假设它有效,并且只是继续前进。但您会注意到的一件事是,如果我们实际上转到 Vercel 仪表板,如果您转到设置,您可以更改您的域,这很酷。任何时候您需要调整您的环境变量,您可以转到此环境变量选项卡。您可以向下滚动并实际编辑它们。值得注意的是,任何时候您更改环境变量,为了让它们更新到您的实际应用程序,您需要触发新的部署,因为如果您只是在这里更改它们,您的已构建应用程序实际上不会包含它们。所以,您需要做的是,您需要转到这里的部署。您需要点击这里的下拉菜单,您需要创建一个新的部署来获取您更改的环境变量。这是我看到初学者特别苦苦挣扎的地方,因为他们转到设置,他们调整环境变量,他们没有意识到他们需要再次部署。所以,这是需要记住的事情,我们可能会在本视频过程中在某个时候看到这种工作流程。

所以,这就是部署您的应用程序到 Vercel。此时,您拥有一个正常工作的数据库,您拥有正常工作的身份验证,您拥有正常工作的付款,您已将您的网站部署到互联网上的真实 URL。所以,现在我们可以终于开始使用我们的 01 Pro 模板系统和我们之前看到的六个提示来构建应用程序了。所以,让我们开始构建这个东西吧。我正在添加这个,我意识到这是一个测试付款的绝佳机会,因为您知道会发生什么。它实际上会失败。所以,我能发现这一点真是太好了,否则你们中的许多人都会因为您的 Stripe 仪表板出了什么问题而头疼。所以,当您实际想要测试已部署版本时,您需要回到您的 Stripe Webhook。您需要这样做。所以,我们现在需要做的是,我们首先需要转到开发者页面,转到这里的 Webhook。您实际上需要添加一个端点。所以,之前当我们处理本地开发环境时,我们只是将我们的 Webhook 指向 localhost,对吧?事情就是这样运作的。所以,当事物已部署时,如果 Webhook 指向 localhost,它对您不会有太大帮助,对吧?因为您正在尝试使用已部署的实例。所以,您需要做的是点击添加端点。我们将要做的是,我们将获取已部署的 Vercel URL 并将其粘贴在此处,然后我们将执行 /api/stripe/webhooks,就像我们对 localhost 版本所做的那样。

您将想要做的一件事是,您将想要选择三个事件。您将想要选择订阅创建,您将想要在这里执行订阅更新,并且您将想要执行 checkout session completed。您将需要这三个事件。这些实际上对应于,如果我们在这里打开我们的代码,转到 app/api/route,您会看到我们实际上有这三个事件正在被监听。哦,你知道,我们实际上需要做 subscription.deleted。我撒谎。让我们快速更改这些事件并添加订阅。我们将取消选中创建,我们将执行删除。看,连我有时也会犯错。所以,您应该有更新的订阅,删除的订阅和会话完成,以匹配我们这里的 route.ts 文件中的相关事件。一旦您准备好,您将点击添加端点,并且您需要做另一件事。所以,我们将点击 Webhook 返回这里。所以,您现在需要做的一件事是,而不是仅仅使用来自 localhost 的 Webhook 密钥,我们实际上需要为我们的新 Webhook 生成一个密钥。所以,我们将要做的是,我们将点击这里的 Webhook,然后您将想要点击签名密钥,您将显示它,这就是我们这个特定路由的新 Webhook 密钥。所以,请记住我刚才在 Vercel 中关于环境变量的讨论。这就是它的用武之地。我们将回到我们的 Vercel 项目,我们将转到设置,我们将转到环境变量。现在,我们想找到 Stripe Webhook 密钥。我们将点击这三个点,我们将编辑此值,使其成为这个新值。我们将保存它。好的,所以我们现在有了更新的环境,并且 Vercel 有这个很棒的小提示。我们将点击重新部署。我们想重新部署。我们将执行预览环境很棒。我们甚至可以执行生产,然后将其部署到我们的生产实例。这将启动新的构建,我提到的新部署。您甚至可以点击查看部署来查看该过程。我们实际上将转到我们项目的首页。您可以看到这里正在构建和部署。所以我将在这里稍等片刻,直到它构建完成,然后我就会回来。

所以,您可以看到它花了 1 分 15 秒进行部署。好的,所以我们可以点击这个部署。您可以看到这应该会重新部署我们的应用程序。所以,我们可以回到 Superbase。我实际上已经这样做了,但是您可以做的是,Superbase 的表编辑器非常棒,因为您可以实际编辑这些值。之前我是一个 Pro 用户,对吧?所以我所做的就是进入这个列,将其更改为 free,并将此设置为空值,并将此设置为空值,以便我可以在这里测试已部署版本的付款系统。所以,让我们继续这样做。我将点击定价。我们将再次选择月度订阅。这应该会打开我的付款链接,对吧?我们可以用我们的假数据填写这个表格。所以我现在就去这样做。

填写完假数据后,我将点击订阅。理论上,如果我们正确设置了 Webhook,这应该会奏效。所以,让我们来验证一下。所以,如果我回到我们的 Superbase 表,点击刷新,砰,您可以看到 Pro,带有客户 ID,带有 Stripe 订阅 ID。所以,为什么现在奏效了?它奏效是因为我们在 Stripe 仪表板中创建了这个新的 Webhook。所以,它现在正在监听我们已部署的 API。它不再是 localhost,而是匹配我们已部署的 Vercel URL。这在直觉上是合理的。我们确保获取了新的签名密钥以匹配此路由。所以,我们不得不将 Webhook 密钥从之前的版本切换到新版本。我们这样做的方式是,我们转到我们的项目,转到设置,转到环境变量,进行了那个调整,我们重新部署了我们的构建。所以,现在我们所有的 Webhook 都指向我们应用程序的这个已部署实例,并带有适当的密钥。这一切都已连接到我们的数据库,因为我们的数据库环境变量已经在我们的 Vercel 项目中。所以,现在我们的付款都已连接。很高兴我解决了这个问题,因为有些人会遇到这个问题。所以,当您在 localhost 上工作时,您希望将 Webhook 指向您的 localhost API。您可以看到我的现在已断开连接。我将不得不再次运行该 CLI。所以,如果我回到 Stripe,我将不得不关闭这个。再次转发该 Webhook。我们应该再次看到正在监听。所以,当我们在这里本地测试 localhost 时,您希望确保它已连接、正在监听并且处于活动状态。如果您在实际的生产实例或开发实例中进行测试,您将需要确保您设置了适当的 Webhook 端点,并带有正确的密钥。这就是您需要做的。

所以,此时我们已准备好开始构建我们的应用程序。所以,让我们开始吧。所以,只是为了确认,您希望确保您的应用程序正在 localhost 3000 上运行。所以,如果我回到光标,您可以看到,果然,我们的应用程序正在运行。再次,运行它的方法是 npm run dev,如果您需要启动它。好的,太棒了,它启动了。您需要确保您的 Stripe 正在运行。所以,请确保使用 localhost 参数运行该 Stripe 监听转发。我们将确保在自述文件中包含这一点,以便您知道如何操作。然后我们将创建一个更多的终端窗口,这样我们就可以处理。我甚至会把它缩小一点,给我们多一点空间来实际编写代码。所以,我们将要做的第一件事,在我们实际的工作流程中,这将是第一步,我们需要最终使用请求提示。所以,我们将要这样做的方式,这实际上是我通常的工作方式。我将在这里拥有我的代码编辑器,我将拥有一个运行着我的 localhost 应用程序的浏览器,并且所有服务都已打开。然后我将有另一个标签页,我将一边是 A1 Pro,一边是 Repo Prompt。这是我们第一次看到这两件事。所以,左边,我仍然在 ChatGPT 中,我选择了一 Pro。我实际上将选择 GPT 40 用于请求提示,因为这是一个更具迭代性的步骤,对于这项任务来说通常更好。我们将要做的是,正如我所说,我们在右边打开了 Repo Prompt。所以,请确保打开 Repo Prompt,因为我们将开始更多地讨论它。再次,如果您是 Windows 或 Linux 用户,让我们尝试在社区中找到一些解决方案。我们将使用 Repo Prompt 的原因是,我们有大量的代码库上下文需要管理。软件开发者的工作方式之一正在改变,您的任务正从编写代码转变为像上下文管理器一样。所以,Repo Prompt 就是为此而生的。您会看到我有一个最近的工作区打开。我将打开我的工作区。您需要做的是,您需要点击这个打开文件夹按钮,然后您只需要打开与您在光标中打开的文件夹相同的文件夹,相同的存储库。所以,您应该能够查看您的文件资源管理器,打开它,您会看到当我打开这个工作区时,我们这里有一个完整的关于我所有代码的部分。所以,我们有所有不同的目录,我们有所有这些不同的文件。您可以看到我们可以展开所有它们并查看所有不同的文件。所以,这就是为什么 Repo Prompt 如此酷的原因。例如,如果我想做一些使用我的组件的事情,也许我检查了除组件之外的所有内容。您会看到我的上下文实际上正在下降,以 token 数量计。所以,看看当我取消选中这个组件框时会发生什么。这个组件框,它有大约 50,000 个 token,只是因为这是整个 ShadCN 库。您显然可以取消选中整个内容,重新选中它,所有内容都会被选中。所以,您将掌握如何有效地使用它的技能。我们可以折叠所有内容。所以,我推荐使用的一个设置是,我喜欢折叠我所有的文件夹,然后我将按 token 从高到低排序。因为通常当您管理代码库的上下文时,您会遇到的一件事是,这里的目标是将 token 总数保持在 100,000 左右。这是获得良好响应的理想选择。所以,如果您开始超过这个数字,如果按从高到低的 token 排序,您可以看到应该从哪里开始删除内容。显然,您不应该仅仅为了删除 token 而删除上下文,您需要明智地这样做。您必须确保包含 AI 执行任务所需的上下文。所以,我们将进一步探讨这一点。您还需要确保您在这里添加了 CodeMap。我们实际上还需要选择文件进行文件树。所以,您的设置应该与此完全相同。对于文件树,您希望包含文件,对于 CodeMap 使用,您希望它完成。我们将在接下来的课程中更多地讨论这一点。所以,正如我所说,我们需要实际使用请求提示。所以,让我们继续,我将转到我只是在 Obsidian 中工作,所以您可以使用任何您喜欢的文本编辑器来管理您的提示。显然,我们有 Takeoff 上的提示。我将确保链接到每个提示,以便您可以获取该提示。事实上,我现在就去这样做。获取提示的方法是,您需要转到我们的提示库。我们将从这六个提示开始,用于 O1 Pro 模板系统,我们将继续添加更多。但我们需要请求提示。所以,我们将点击这个复制按钮。这将将其复制到您的剪贴板。我将创建一个主示例下的一个。我只是喜欢在文本编辑器中这样做,因为我们将从不同的步骤复制粘贴时调整一些参数,就像我们之前讨论过的。所以我将在这里粘贴我的提示。现在我们有了提示,我们可以处理了。所以,我们需要做的第一件事是,我们实际上必须写出我们的想法。所以,我做的一些事情是为了加快速度,我构思了一些示例输入。所以,我将在这里粘贴这个段落。所以,您基本上需要给请求提示,你知道,三四句话,一个典型的段落,关于您的初步概念。所以,在这种情况下,我们显然将构建这个收据 AI Web 应用程序。但如果您有其他想法,您可以遵循。关键是,在这个模板变量,这个 idea 模板变量中,您只需要放入您的想法。所以我发现一个段落通常很好。您不必过于详细。我们现在将与 AI 模型进行的迭代将对其进行完善。所以,现在我有了完整的提示,我将回到 ChatGPT,我将在这里粘贴它,我们应该能够与模型对话。

所以,我们终于要进入实际的工作流程了。所以,让我们看看 GPT 40 会说什么。所以,您可以看到我们如何请求输出看起来像这样。您可以看到它正在以那种格式给出。这很酷。我们现在得到了第一个草稿。我们应该如何看待它呢?我们实际上想要思考它提出的所有问题,我们想要在聊天中回应,然后我们应该得到另一个草稿。所以,它说了一些澄清。所以我将输入一,我将快速回答每一个问题。所以,我们将只说,现在只做图像。我们将跳过 PDF。我需要电子邮件解析,从电子邮件自动获取收据吗?否,电子邮件解析。对于 OCR 功能,我们将使用 GPT 40 和 OpenAI API 进行 OCR 功能。所以,这是我们需要澄清的第一部分。数据提取和处理。我们想要哪些关键数据点?所以,我们肯定想要商家名称。我们肯定想要日期。我们肯定想要金额。让我们说,让我们只做这三个开始。让我们保持相对简单。AI 是否需要自动分类费用?我们将手动分类它,以改变。我们将手动创建类别,是的,我们将对它们进行分类。所以,让我们看看第三个。用户如何验证提取的数据?内联编辑,批量验证?让我们有一个验证页面,我们可以通过未经验证的收据。我甚至懒得修复我的拼写错误,我只是会懒惰。用户是否需要导出选项?是的,我们想要导出 CSV。请提供 CSV。所以,您可以看到我正在逐一浏览 AI 模型提出的所有澄清。我们将这样做几次。所以,如果您觉得您想加快速度,请随时这样做。但这基本上就是实际工作流程的样子。每个用户都有收据存储吗?是的。搜索和过滤。看起来我意外地把这个放错了地方。所以,第五个。集成。我们现在只保留无集成。用户管理。让我们假设只有单用户,没有团队。让我们保持相对简单。我们将准备好身份验证,来自我们的入门模板。好的,第七个。平台和可访问性。让我们只说它是一个 Web 应用程序,但要使其响应式,这样人们就可以在移动设备上使用它。保持 UI 干净现代。然后第八个,最后但并非最不重要的。我们有月度和年度定价作为基本 SaaS 内置。好的,让我们发送它,看看我们会得到什么。所以,我们之所以要使用像 GPT 40 这样的模型,是因为如果它是 O1 Pro,它会思考 5 分钟,这对于我们需要的来说有点过头了。所以,让我们看看我们需要什么。所以,我们可以阅读第二版草稿。目标受众看起来不错。收据上传,肯定想要。我们不需要移动摄像头支持。我们将跳过它,以缩小范围。我不想在这里待上整整八个小时的视频。如果您想做这样的功能,请随时这样做。我强烈建议您尽情发挥。但我们想在这里保持相对简单。对于系统或教程。好的,组织插入。我只是在阅读这个,伙计们。所以,如果您需要加快速度,请随时这样做。到目前为止一切看起来都不错。我们只是不想要摄像头。我们只说一切都很好,除了我们不需要摄像头支持。这应该是我们得到的最后一件事情,最终的迭代。这可能足够开始。您显然可以做得更复杂。从模型那里获得这样的提示或结果的好处之一是,我们可以复制它。我将把它粘贴到示例输入下。这样我们就可以继续使用它。如果我们想编辑不同的待办事项,我们可以手动添加。您需要做的是,您只需要确保这个请求提示的输出符合您的期望。所以,请确保添加您需要添加的任何内容,然后我们将继续下一步。我认为我可能刚刚说过我们将继续进行计划提示。提醒一下,流程是请求、规范、计划、编码、审查。所以,我们现在正在进行规范提示示例。所以,让我们从 Takeoff 获取它。所以,您需要确保您转到提示库。转到规范提示。我们将复制该提示。我们将回到我们的文本编辑器,我们将粘贴它,以便我们可以处理它。我将在这里做一个草稿,并将第一个保留在这里,以防我想撤销某些事情。但您会注意到,对于我们的规范提示,第一个输入是,就像我们在六个提示部分中讨论过的,我们实际上想要获取我们刚刚从请求提示中获得的输出。所以,这就是这个提示更改机制的用武之地。我将复制我刚刚从 GPT 40 获得的响应。我们将将其粘贴到项目请求的 XML 标签内。这就是这个模板变量的用途。所以,我们将粘贴我们整个请求提示。

所以,这个规范提示现在将如何工作?您将有一个典型的开始,角色和任务。然后我们将传递请求的上下文。现在我们需要获取我们的项目规则,并且我们需要获取我们入门模板的代码。所以,项目规则很容易获取。我们可以滚动回光标。您需要做的是,您需要获取这个光标规则文件。所以我将获取整个文件。我们将直接复制粘贴到我们的规则中。关于这些规则的说明,这是我的规则如何基于我的模板设置的。如果您以不同的方式编写代码,您只需要确保更新您的规则以匹配您喜欢的工作方式。我们显然会为研讨会保持与模板一致。所以我将复制它。我们将回到这里。正如您所看到的,我在这里有四个窗口。我们将在此处项目规则的 XML 标签内插入这批规则。所以我将粘贴它。所以,这个东西真的开始增长了。所以,我们需要做的下一件事是,我们实际上想要获取入门模板并输入所有入门代码,以便我们可以让 O1 Pro 对我们的代码库结构有一个大致的了解。所以,这就是 Repo Prompt 将发挥作用的地方。所以,此时,我们想要做的是,我们想要将所有代码输入到那些 XML 标签中。所以,我们实际上要做的是,这是一个很好的技巧。本质上,AI 模型已经对我们使用的 UI 库有了很好的感觉,它叫做 ShadCN。所以,如果我们在这里展开我们的组件文件夹,然后展开其中的 UI 文件夹,您可以看到我们有所有这些组件,模型可以使用,它们已经预装在我们的代码库中了。我这样做的原因是因为它消除了您手动安装所有这些组件的需要,基本上它只是给了 AI 一个庞大的组件库开箱即用,这往往很有帮助。但它有很多 token。所以,您可以看到现在我们有大约 61,000 个 token,用于所有这些文件。您可以看到当您包含文件系统等其他内容时,它会达到 62,000 个 token。如果我们取消选中它,我们将失去大约 50,000 个 token。所以,这现在下降到 32,000 个 token。您可以看到我们的文件 token 下降了,我们的 CodeMap 文件上升了。所以,如果我点击这个复制按钮,让我向您展示它的设置。点击设置图标。您希望包含保存的提示,包含文件,包含用户说明。如果我复制它并粘贴到,你知道,我将在这里粘贴它,我们将选择 O1 Pro,因为我们将从现在开始使用它。如果我在这里粘贴它,这实际上并没有像我想象的那么大。但您可以看到,这是一个巨大的文件,或者一个巨大的输入,其中包含我们所有的代码。您可以看到我们有文件映射,我们将有代码映射,我们将有我们所有的文件。所以,这基本上就是我们的代码库作为一个巨大的字符串,这很有趣。所以,我们可以做的是,为了向您展示它有多少 token,OpenAI 有这个很好的 tokenizer 工具,它只是一个很好的近似器。所以,如果我将它粘贴到 tokenizer 中,您可以看到大约是 28,000 个 token。这很有趣。所以,我们将要做的是,我们将粘贴所有代码。所以,这基本上就是我们整个入门模板,只是没有 UI 组件。所以,如果我们在这里粘贴它,现在我们拥有了我们所需的一切。所以,只是为了回到顶部查看提示,并提醒您,我们有项目请求,所以那里有所有 token。我们有项目规则,所有这些 token。然后我们有所有入门模板代码。所以,现在将要发生的是,我们将复制整个输入提示,我们将将其粘贴到 O1 Pro。我将删除旧的。我们将将其粘贴到 O1 Pro。我将发送它。将要发生的是,O1 Pro 可能会思考三到五分钟。这只是我们必须做的事情。我们一直滚动到最底部。您可以看到它正在思考。如果我们点击详细信息,出于某种原因,它决定现在用法语思考。谁知道。但我将剪辑到响应回来的时候。所以,只是再次确保您获取了规范提示,然后您必须粘贴上一步的项目请求。您必须粘贴在中间,并且您必须确保保留这些 XML 标签。它确实有助于响应。然后您必须将光标规则粘贴进去。然后您必须使用 Repo Prompt 获取入门模板,不包含 UI 组件,以节省大量 token。我们将看看我是否粘贴了整个结果。所以,这是大约 34,000 个 token,我们刚刚给了模型。我将剪辑到完成的时候,我们将讨论它。

所以,我们刚刚收到了 O1 Pro 的响应。您可以看到,出于某种原因,有时 O1 Pro 会返回它思考的时间,有时不会。这大约是三分钟左右。所以,让我们全屏查看并分析正在发生的事情。所以,您会记得当我们第一次谈论规范提示时。我们提到我们让它做的一件事是,我们让它使用这些规范规划标签来思考,然后再进行。所以,您可以看到在这个标签和如果我们一直滚动到最底部,让我们看看它在哪里停止思考。好的,它实际上思考了相当长的时间,直到这里。这基本上是它提出它应该做的一些事情。所以,这就是采用一些思考标签技巧的优势。尽管这是一个推理模型,我们仍然试图让它双倍利用。我发现这实际上确实会产生更好的响应。所以,您可以,它正在进行。我注意到的一件事是,我将分享所有这些聊天记录,以便您可以阅读它们并了解正在发生的事情。我将公开它们。如果出于某种原因我无法做到,我相信我可以分享它们并公开它们。我会告诉您,但我应该有所有这些不同聊天的链接,以便您可以阅读。我们不会浪费太多时间阅读它。但您可以看到结果是,我们得到了这个输出。为什么我们会得到这个输出?所以,让我们回到我们的规范提示。让我们看看它,在 Takeoff 中,没有所有额外的变量。这是因为我们基本上要求项目名称技术规范采用这种格式。所以,如果我们回到我们的聊天,您会看到我们得到收据 AI 技术规范,然后它逐一进行我们想要的所有事情。您可以看到格式在 ChatGPT 中的渲染方式上有点破损,但这完全没问题。所以,我们可以做的是,如果我突出显示所有内容,我们将实际在文本编辑器中查看它。我实际上创建了一些输出示例页面。这是使用 Obsidian 的好处之一,这是我使用的另一个很好的免费软件。这是我用来做个人笔记的应用程序。它内置了 Markdown 渲染。所以,如果我在这里粘贴它,您会看到我们得到了一个非常漂亮的渲染输出,我们从模型那里请求的,我们可以查看。所以,您会看到我们有系统概述,我们有项目结构,我们有功能规范。您甚至可以看到它正在进行子项目,例如用户故事之类的。我们得到了数据库模式。您可以看到它甚至在构建 Markdown 表来突出显示该模式。它正在进行服务器操作。它正在学习做所有事情,它正在描述所有事情,基于项目规则和我们现有的代码库。这就是那样做的优势。所以,您可以看到 O1 Pro 能够生成这个极其复杂的规范。并且它完全按照我们要求的输出来输出。这就是为什么这个模型如此强大。因为将要发生的是,你知道,如果您尝试使用另一个模型,您可能会遇到输入上下文窗口限制。您将无法提交我们尝试发送给这个模型的整个请求。您将无法获得连贯的响应。让我们实际上快速地将其通过 tokenizer,看看有多少 token。所以,如果我们回到 OpenAI 的 tokenizer,粘贴它,只是为了一个不错的估计。这是 5,100 个 token 的极其连贯的工作。所以,让我们实际运行文本规范。我想要平衡查看它,同时也不要让它变得无聊。所以,您可能想要加快速度。但我们将要做的是,我们将浏览整个文本规范,看看是否需要编辑任何内容。所以,如果您是自己做应用程序创意的人,这就是您需要手动编辑文本规范的地方。您可能需要删除内容并根据您想要实现的确切方式进行调整。但通常 AI 会提供很好的起点。您可以看到系统概述。这是我们应用程序的描述以及我们要求的通用内容。您可以看到关键工作流程。这是从请求提示中提取所有关键工作流程。所以,当我们从第一个提示获得输出时,这就是它如何决定文本规范中需要做的每一件事。它正在从那个提示结果中提取所有上下文。所以,您可以看到我们有上传、验证、组织和搜索、导出和用户管理。不错的系统架构。所有这些看起来都不错。这是通用的文件结构。您可以看到格式有点破损,这完全没问题。我们假设它没问题。所以,转到第三个,功能规范。所以,您可以看到,这通常很好。您可以看到它正在提出一些实现步骤,处理边缘情况。验证系统。所以,这基本上是逐一处理所有这些关键工作流程,并使其更好。我只是粗略地看一下。再次,我们将为您提供完整的聊天记录,如果您想放慢速度并仔细阅读。但这通常看起来不错。没有什么让我觉得不好的。您可以看到它正在提取我们模板代码库中变量的名称,这很酷。所以,您可以看到为什么这很重要。RBAC 是可管理的。我猜这是某种合规性问题。我真的不知道这是什么意思。所以我可能会删除它,以便我能更好地理解它。我们实际上不需要。我们将只说假设仅浅色模式。我现在不想要深色模式。货币化是正确的。您可以看到它实际上正确地假设我们的会员是 Pro,基于我们的代码。您可以看到这是通用模式。所以,这看起来不错。对于收据,我们想要存储商家、金额,就像我们要求的。然后我们可以对其进行分类和验证。您可以看到服务器操作。这是我们的数据库查询以及我们如何与数据库交互。所有这些看起来都不错。其他操作。这很重要,因为我们将在这里讨论 GPT 40。所有这些看起来都不错。设计系统。我可以手动检查那些颜色,看看。这基本上是从我们的全局 CSS 中提取的。所以,您会看到这里有深色模式。所以我实际上将删除深色模式,这样它就不会混淆我上面说的无深色模式和下面说的有深色模式。我们将保持一致。这就是我们审查它的原因。您可以看到它实际上正在从 ShadCN 库中提取组件。这就是我们包含它的原因。所以,有很多很好的技巧可以获得这个东西的输出。这很好,因为我们在这里调整的每一件事都很小。所以,这很好。然后我将做的最后一件事是,这个存储库我保持简单。我们实际上不会进行测试分析。所以我将删除 11 和 12,以稍微缩小范围。现在我们基本上有了来自规范提示的完整输出提示,或者说来自规范提示的输出结果。所以,我们基本上,让我们再回顾一遍。所以,我们得到了规范提示。它要求我们输入三件事。它要求我们输入项目请求,这就是我们在上一步中做的。然后我们必须获取项目规则,那是光标规则文件。然后我们必须获取入门模板。我们使用 Repo Prompt 完成了这一点。如果我再次将其设为侧视图,现在我们已经完成了审查。然后我们将其发送到 O1 Pro。所以,我们确实从 GPT 40 切换到了 O1 Pro,这就是我们将继续使用的。它输出了这个详细的规范。然后我们只是审查了它,确保一切都符合我们的喜好。进行了一些小的调整,现在一切都准备就绪。所以,让我们继续进行下一个提示,这将是计划提示。

所以,现在我们有了规范提示的输出,我们可以继续进行计划提示。所以,让我们获取我们的计划提示。我们将回到 Takeoff,回到提示。我们想要计划提示。我们将复制它。我们将回到 Obsidian,我将粘贴它,我们将开始插入所有需要的模板变量。所以,请记住,当我们谈论计划提示时。我们正在构建在请求提示之上。我们正在构建在规范提示之上。所以,让我们获取两者的输出。因为我们需要四种输出。我们将需要项目请求。我们将再次需要项目规则。我们将需要我们刚刚获得的文本规范。然后我们将需要再次获取我们的入门模板。所以,让我们获取请求输出。所以,这是我们最初的请求。我们将复制它。回到我们的计划提示输入。在这两个项目请求的 XML 标签之间,我们将粘贴项目请求。然后我们将再次获取我们的光标规则。所以,让我们回到光标。再次,我们将复制它们。我们将回到这里。我们将在此处粘贴它们。接下来我们需要的是,我们将需要文本规范。所以,我们将获取我们审查过的文本规范,并进行了一些小的调整。所以,让我们复制整个文件。所以,这将是所有 10 个项目符号点或 10 个编号点。我们将粘贴它。现在,砰,它也是我们计划提示的一部分。最后,我们将回到 Repo Prompt。我们将再次点击复制按钮。我们想要整个代码库,只是没有 ShadCN 组件,因为有很多 token。我们将复制它。转到 XML 标签之间,我们的模板变量所在的位置。并粘贴它。现在我们拥有了我们所需的一切。所以,让我们复制整个东西。让我快速将其粘贴到 tokenizer 中,以便我们可以了解我们正在处理多少 token。这几乎是 38,000 个 token。可能更多,因为这个 tokenizer 与 O1 Pro 使用的并不完全相同。所以,这再次说明了为什么 O1 Pro 如此强大。因为这里的每一个 token 都将被充分利用。O1 Pro 的上下文窗口利用率非常高。所以,我们将能够真正地输入它并获得很好的结果。所以,让我们创建一个新的聊天。我将粘贴整个内容,我将发送它。

所以,如果我们让它开始思考,我们将能够做的就是,我们将在这里等待。如果有人来自 OpenAI,顺便说一句。

如果我们能让它不回到顶部,那将是非常棒的。如果你想看一个简化的思维链式的东西,你甚至可以点击详情。所以,让我让它运行,然后我们会回来看看。好的,这个花了大约 4 分钟,如果你向下滚动,你会看到我们有一个非常详细的实施计划。所以,我们要做的是,我们将做一些与上一段视频非常相似的事情,那就是我们将在这里看看分析。所以,再一次,我们有那些头脑风暴标签,你可以看到它在思考它正在做什么。我确实知道有些人会说,嗯,这是一个推理模型,你不需要告诉它这样做。我发现它实际上很有帮助,所以我将继续这样做。我们将要做的是复制输出。所以,再一次,这个输出的格式是我们实际提示中要求的格式。好的,这就是为什么 01 Pro 如此棒,因为它确实能精确地遵循你给它的指示。所以,我们在这里要做的是,我们将转到我的 Obsidian 应用中的规划器提示输出示例。我将把它粘贴进去,以便我们可以分析一下。所以,再一次,看起来我们得到了大约 15 个步骤,我相信我在这里看到的。好的,15 个步骤。所以,我们在这里可以做的是,我们可以非常类似于我们用规范提示所做的那样来浏览它,并确保所有这些步骤看起来都不错。我们可以根据这里输出的内容来调整事物。所以,这只是一个提醒。当我们最初处理规划器提示时,我们当然已经讨论过这个问题了。但是,这些步骤中的每一个返回的方式都是一个命名的步骤,带有任务。我们得到它通常会编辑的文件列表。我们得到步骤依赖关系,所以你可以看到,如果我们向下滚动,就像第 10 步依赖于第 3 步和第 7 步一样。这就是为什么我们有步骤依赖关系,它只是帮助模型知道这里发生了什么。你可以看到所有内容都格式化为待办事项。所以,我们将逐一检查这些步骤,遍历 Cen 提示中的每个步骤。当然,我们还有用户说明。你可以看到,例如,在这个步骤中,用户说明是你必须确保你的 .loal 文件命名正确,诸如此类的事情。所以,看起来它将从设置数据库开始。再一次,如果你想加快速度,完全可以。但我只是会阅读一下。可能会有一些短暂的沉默,那只是我在阅读的时候。好的,所以 Superbase 存储操作。这看起来相当不错。看起来我们甚至添加了像 10MB 文件限制这样的东西,这是一个很好的做法。我喜欢看到这一点。你可以看到用户说明,它甚至指示我们构建正确的行级别服务,行级别安全规则。所以,这是一个策略,以确保用户只能看到他们自己的存储的收据,对吧?这显然非常重要。然后,你可以看到它正在转向收据数据库操作。这很有意义,从后端开始,然后转向前端。你可以看到它甚至指示我们运行我们的迁移。所以,再一次,这非常重要,尤其是对于初学者来说,因为我们构建提示的方式是允许 AI 或 01 Pro 告诉我们我们需要做什么。因为对于一个从未构建过这个的人来说,他们可能不知道他们必须手动运行迁移。所以,这是一个很酷的事情,这也是包含每个步骤的用户说明的原因。好的,看起来是 AI 提取。所以,让我们来看看。看起来,使用 GPT 40 和 OpenAI,返回提取的字段。这看起来不错。创建一个单一的操作来上传并按下提取。这看起来不错。仪表板和收据布局。你现在正在转向前端的东西。你可以看到它甚至在设置受保护的路由组,这很棒,以确保用户必须经过身份验证才能访问仪表板。所以,它确实在思考我们需要的一切。这老实说是一个相当令人印象深刻的计划。提醒一下,我们之所以这样构建提示,是因为这些步骤中的每一个都需要足够易于管理,以便 01 Pro 可以在一步中完成所有事情,因为你不想合并。就像你不想合并这其中的五个,让整个事情变成三个步骤,因为否则你会得到更糟糕的结果。这可能有点过度了。这些步骤可能可以合并成两步。基本上,这些步骤中的每一个可能都是一步。我不知道,这有意义吗,我说的 guys?你可能可以要求它同时运行第一步和第二步,然后第三步和第四步。但我们将保持简单。我认为这可能是基于模型当前能力正确范围内的。好的,所以让我们看看。收据页面列表搜索和过滤。所有这些看起来都不错。收据上传 UI。我们肯定需要那个。验证页面。所以,你可以看到它甚至为这些页面中的每一个正确地构建了路由。这看起来很棒。删除收据。我们也肯定想要能够删除东西。导出 CSV。我们确实要求了 CSV 导出,所以这很棒。然后,你可以看到确保受保护的路由。好的,所以它只是在确保我们的身份验证做得正确。UI 增强。我实际上要在这里编辑的一件事是,我们不想要主题切换器。我们只想要浅色模式。所以我实际上要快速删除那个。我们将删除那个暗模式切换按钮,我们不想要暗模式。所以,只是一个快速的小调整。再次删除那个暗模式。然后测试和验证。我们实际上将跳过测试,所以我们可以删除这一步。有一步我们不必做。最后但并非最不重要的是,这实际上根本不是代码生成步骤。它基本上只是要求我们确保事物已部署。所以我实际上要删除它,因为它实际上不需要在那里做任何事情。这看起来像一个计划。所以,看起来我们最终的计划将是一个 13 步的计划。你可以看到这些计划中的每一个都非常详细。我们有 AI 需要处理的文件。我们有大致的任务。步骤依赖关系。我们甚至还有用户说明。所以,我们现在将要做的是,我们将采用这个计划,我们将采用我们的技术规范,我们将采用我们的请求输出。我们将把它输入到 Cen 提示中,我们将遍历这些步骤中的每一个。所以,让我们开始构建这个东西。所以,现在我们需要在我们的 Coden 提示中逐步构建,当我们进行时。所以,让我们开始获取我们的 Coden 提示。提醒一下,我们不会做这个的 XML 版本。如果你有兴趣用 XML 做 Coen 提示,请查看我们之前做的课程,大概是 90 分钟前。所以,你可以看看。我们将做标准的版本,因为它更容易理解。所以,让我们来看看这个提示。我们将把它复制到我们的 Obsidian 中,让我们看看我们需要哪些输入变量。所以,这个需要五个。所以,我们需要项目请求,项目规则,文本回溯,实施计划。然后提醒一下,这次不是起始模板代码,你实际上需要每次运行新步骤时,你都需要用最新的代码更新现有代码。对吧?在第六步时,给你第一步的代码是没有多大意义的。所以,我们需要确保在我们遍历这些步骤时,我们都在更新现有代码。所以,让我们来填写所有这些。这显然是无聊的部分。首先,我们将获取我们的请求提示输出。我们将回到 Coden。我们将把它输入到这些 XML 标签之间。我将把它粘贴进去。接下来我们需要的是项目规则。所以,我们将最后一次在光标中获取它们。好的,我将复制这些光标规则。我们将回到这里并粘贴它们。所以,现在我们需要获取我们从规范提示获得的技​​术规范输出。所以我将复制整个东西。跳回我们的 Cen 提示并将其粘贴到技术规范 XML 标签之间。然后,我们将获取我们刚刚获得的实施计划。好的,这将是这其中的所有 13 个步骤。我们将复制它,然后将其粘贴到这里的实施计划模板变量中。现在,我们将使用现有代码标签。这里有几个要点,因为这会一步一步地变化。首先,你需要确保 AI 完成每个步骤后,你必须进去并添加一个 x。所以,在我们完成第一步之后,我们将在这里添加一个 x。这将表明它已完成。这样,下次我们向 A1 Pro 模型提供提示时,它就会意识到,好的,我们完成了这一步。现在我们将运行第二步。我们希望继续包含每个步骤作为上下文,以便它有一个很好的运行历史,它实际处理了什么。当然,这是第一步,所以我们还不需要这样做。但这只是一个指针,当我们实际处理这些步骤时。然后对于现有代码,你当然需要用 repo 提示更新你的代码并粘贴更新后的代码,这将在下一课,第二课中向你展示。但对于第一个,它实际上将与我们一直在做的一样。所以,我们将进入 repo 提示,我们将复制它,因为基本上,我们从头开始,我们从那个模板开始,我们将粘贴它。所以,现在我将复制整个文件。所以,这是我们的整个提示,再次,让我们看看分词器是什么样的。所以,这大约是 40,000 个令牌。我们将创建一个新的聊天,使用 01 Pro。我们将粘贴它,然后让它开始为我们工作。所以,01 Pro 现在正在做的事情,这就是为什么我在这个研讨会开始时就提到了,你想要像 01 Pro 一样思考,就像你雇佣了一个真正的开发者一样,因为现在它正在做的事情,如果我们进入我们的规划器提示,它现在正在尝试实现我们第一步所需的整个代码。所以,将会发生什么,一旦它完成工作,我们就会谈论它,它将为我们提供我们需要的每一个完整文件,我们将把它粘贴到我们的代码中。我们将做的是,我们将基本上遍历这些文件中的每一个,以及它给我们的任何用户说明,我们将在我们的代码库中进行更改。我们将直接在光标中进行,我现在可以关闭这个光标规则文件,因为我们暂时不需要它了。我们将一步一步地继续下去。所以,让我们让 01 Pro 工作。这可能需要大约 4 到 6 分钟。所以我将让它运行,然后我们将讨论如何做这一切。好的,所以你可以看到 01 Pro 在第一步上工作了 3 分 1 秒。所以,接下来我们要做的就是逐个文件地进行,并做我们需要做的所有事情。所以,你会看到,对于这些文件中的每一个,我们得到了被编辑或添加的文件。我们得到了我做了什么以及为什么。所以,这解释了 01 Pro 实际做了什么。它给你文件路径,所以你知道在哪里放文件。然后,你可以看到它提供了整个文件,以及所有的文档。所以,只是一个说明,如果你是一个不喜欢文档的人,我们之前提到过,你完全可以修改提示来删除它。我认为,至少在你与 01 Pro 一起遍历这些步骤时,它非常有帮助。然后,我认为之后,如果你已经把应用程序弄到了你想要的状态,然后你想要删除所有额外的文档,我认为那就是时候了。但我确实认为,当你遍历这些步骤时,如果你保留每个文件的注释,所有这些文档等等,我认为你会得到更好的结果。我已经广泛测试过这一点,并且发现情况确实如此。所以,只是一个需要注意的点。好的,所以这是我们需要做的。所以,我们将在这里做的就是,我们真的只是逐个文件地复制,然后粘贴代码。第一个文件路径我们需要处理的是 db schema receipts schema。所以,我们将把它添加到我们的代码库中。所以我将打开 db。我将打开 schema。看起来我们需要命名文件 receipts schema.ts。所以我将这样做。所以,让我们 receipts d schema TTS,然后我们将粘贴它,保存它,然后瞧,你现在可以看到我们有一个收据表 schema,它有大量的文档,并且符合我们在光标规则文件中指示的代码标准。所以,相当酷。所以,这是第一个路径。让我们向下滚动到下一个文件。所以,现在我们实际上需要编辑我们 schema 中的索引文件。这将导出东西。所以,这实际上是一个已经存在的文件。所以,我们可以再次覆盖。这就是为什么我们要求 01 Pro 每次都返回完整的文件内容。因为而不是我们必须弄清楚,好吧,这两个文件之间有什么变化。我们可以做一个非常简单的复制粘贴工作流程,这非常棒。好的,让我们去第三个。所以,现在我们将更新 dbdb.ts 文件。它可能就在这里。就像我们上次一样,我们将粘贴新文件。你将看到我们现在在 schema 中有了那个收据表。我们有一些新注释,一些好的文档,这很棒。好的,让我们向下滚动。看起来我们现在需要调整 env.example 文件。所以,我们将这样做。所以,值得注意的是,它会要求我更新示例文件,但我们当然也需要更新我们的 .env.loal 文件,因为那是我们的实际环境变量。还值得注意的是,因为我们调整了一个环境变量,我们需要做什么?我们需要进入 verell。我们需要进入我们的设置。我们需要进入我们的环境变量。所以,看起来我们还没有添加那个变量。所以,我们可以做的是,我们可以直接粘贴它,点击保存。记住,我们必须重新部署才能确保它被添加。所以,我们将点击重新部署,再次点击重新部署。这将注入新的环境变量。所以,这非常重要。然后,你可以看到我们完成了第一步。我们得到了一些概述,关于 AI 做了什么。然后,你可以看到我们得到了用户说明。所以,你可以看到,检查你的 .lo。你可以看到,确保添加它。然后它说,可选地,我们将需要生成我们的 drizzle 迁移,以便将其上传到我们的数据库。因为我们更新了 schema 的代码,你会看到,如果我们刷新 superbase,你会看到我们没有那个表。所以,这实际上将如何在我们的代码中工作是,我们必须去我们的终端,运行 npm run DB generate。这将生成新的迁移文件。所以,如果我们点击 migrations,你会看到我们现在有一个 SQL 迁移文件,用于我们的收据表。然后,当然,我们需要迁移它。我们将运行 npm run DB migrate。它将运行迁移。然后,如果我们回到 super base,我们应该能够刷新它,看到我们的收据表,以及所有那些漂亮的列,AI 为我们编写的 schema。好的,所以这是第一步的结束。你在这里需要做的一件事是,你实际上需要删除你所有的现有代码。所以,通常我会向你展示,在下一步中,当我们继续这个的时候,因为这可能相当糟糕,每次都要找到打开的标签。所以我将继续向上滚动,向上滚动,向上滚动。看起来我们还在代码映射中。让我们再往前一点。这是文件系统。我们必须删除所有这些现有代码。所以,我们删除了代码。现在我们需要去实施计划中的第一步,我们只需要标记它已完成。所以,我们只需要在这里添加一个 x。现在,这个东西已经准备好了,可以进行第二步了。我们要做的其中一件事是,在我们继续第二步之前,我们将快速回到光标。我们将实际提交我们的代码。所以,我推荐你做的一件事是,在你完全完成每一步之后,你实际上想要创建一个新的提交到你的 GitHub 存储库。我将直接称之为第一步。我将提交它,我只是使用我的 git 标签,就在光标内。你当然可以使用终端,如果你喜欢使用 git CLI。然后,我们将同步它。非常容易初学者使用。git UI 相当不错。我将在 Mac 上使用 Shift Command W,这将关闭我现有的文件。你会注意到,如果我们回到我们的 git 存储库,你会看到在 tutorial 上,你会看到我有一个第一步。我刚刚提交了它。所以,这个黄色的是待定。所以,真正很棒的一件事是将你的 GitHub 存储库连接到你的 cell 项目。每次你提交到你的目标分支时,基本上会发生什么就是,它会构建你的应用程序,这很酷。所以,这实际上将完成并构建第一步。它将实际将你更新后的代码部署到你现有的域。所以,发生的事情是,在每一步结束时,你确保一切都已完成,你提交你的代码,然后它将实际构建并部署到你托管在 verell 上的现有 URL。这很酷。所以,让我们开始处理下一步。好的,所以只是一个提醒,你将需要确保你勾选了第一步。然后,我们将滚动回到现有代码部分。现在,我们需要使用 repo 提示来包含现有代码。所以,让我们看一下 repo 提示一会儿,因为有几件事你需要做。所以,你注意到的其中一件事是,如果我们实际上展开,我们将点击展开。你会注意到,我们创建的一些新文件。让我们实际关闭那个 UI 文件夹,这样它就不会太长。但你会看到 receipts schema,特别是,这是我们添加的新文件,实际上并没有添加到我们的上下文中。所以,你必须确保你做的是,每当你创建一个新文件时,这非常重要,因为如果你不这样做,你就会包含过时的代码。01 Pro 所做的工作实际上会很糟糕或过时。所以,非常重要的是,你要充当项目经理和上下文管理器,以确保你始终包含正确、最新的代码给 01 Pro。因为将会发生的一件事是,我敢肯定,在完成大约十几个步骤的过程中,你会忘记做一次这件事,你会得到一个糟糕的结果,你会对模型生气,而实际上是你的错,因为你没有更新上下文。所以,我们将确保我们添加这个文件到上下文。你会看到它会增加我的令牌计数。太好了。我相信这是我们添加的唯一文件,因为其他文件只是编辑。所以,一切都将是最新的。你甚至可以点击这个小刷新按钮,以确保一切都是最新的。这通常是我喜欢做的。你可以看到,一切都准备就绪了。如果我们打开我们的 DB 文件夹,打开我们的 schema 文件夹,它就准备好了。所以,我们将复制我们的新代码,我们的现有代码。你可以看到我的 versel 构建现在已准备就绪。所以,它已成功部署,这很棒。现在我们可以进入我们的现有代码标签,我们已经从上一步清除了。粘贴进去。我们将复制整个东西。我们将回到 chat gbt,开始一个新的聊天,使用 01 Pro。我们将传递第二步,然后让它开始工作。我通常在这个时候做的一件事是,为了让自己更容易,我回到我的文本编辑器,我实际上只是按撤销按钮,这样我们就可以轻松地清除现有代码。这样,它就准备好进行第三步了。我甚至会做的是,我将直接去上面,勾选第二步。假设它会完成。当然,如果你进去做了一些编辑,或者你重新做了第二步,因为你可能不喜欢 01 Pro 给你的结果,那么请确保,如果你不喜欢结果,就不要勾选它。但我们将假设它会做得很好。所以,现在它为我们准备好了第三步。所以,我们只需要回到 chat bt。我们需要等待 01 Pro 完成工作,然后我们可以继续。好的,所以我们从第二步获得了代码。所以,让我们看看 01 Pro 为我们做了什么。所以,看起来,我们有这个第一个文件。所以,我们将要做的是,我们将只做我们一直在做的事情。我们将复制这个第一个文件。所以,这将是 actions storage/receipt storage actions。所以,如果我们进入我们的代码,我们将进入 actions。看起来我们需要一个新的文件夹,叫做 storage。然后,看起来我们需要称之为 receipts storage actions。所以,我们将 receipts storage actions.ts。我们将粘贴这个文件。看起来我们遇到了第一个有趣的导入错误。这可能是一个我们需要安装的包,它将在用户说明中介绍给我们。所以,让我们看看,是否有我们需要做的。好的,所以看起来这可能是在光标中需要调试的东西。所以,这完全没问题。我们稍后会处理。我们可以做的是,我们可以看看 env.example 文件。所以,看起来我们在这里将 receipts 值添加到 superbase bucket receipts。但我相信我们已经有了。所以我实际上不认为我们需要编辑它。所以,这很棒。所以,让我们谈谈如果你从 01 Pro 收到错误会发生什么。这就是为什么我们要使用光标。因为我们可以直接在光标中悬停并点击在 composer 中修复。这将激活光标 composer,它会告诉我们我们需要做什么。在这种情况下,看起来确实如此,我们只需要安装这个包。所以,让我们点击这个运行按钮。这将运行我们的终端命令。将会发生的是,它可能只需要 --force。所以,我们可以做的就是,我们可以粘贴这个错误,然后输入 fix。然后光标将为我们生成一个新的命令。好的,让我们运行这个,应该已经纠正了。果然,你可以看到我们现在已经安装了我们的依赖项,并且错误消失了。所以,这理想情况下是我们可以在提示中调整的东西,但发生的是,01 Pro 使用了一个我们没有安装的库的代码。所以,我们只需要悬停在错误消息上,点击光标 composer,粘贴错误消息,我们就得到了修复它所需的一切。所以,修复起来非常容易。这就是为什么 AI 编码工具如此棒。因为即使 01 Pro 做对了,那么我们也可以在光标级别修复它,我们仍然不需要写任何代码。我们只是复制粘贴东西,点击东西,AI 已经为我们做了所有工作。所以,让我们提交那个代码。让我实际上确保一下。那只是唯一的文件,对吧?好的,太好了。所以,我们只是提交第二步。提交同步更改。再一次,这将更新我们的 GitHub。如果我刷新它,我们应该看到第二步。太好了,已经提交了。然后,如果我们去我们的 cell,我们应该看到另一个构建开始运行。当它运行时,我们可以做的是,我们可以直接进入下一步。好的,所以,这是我们将真正真正保持事情运转的地方。所以,现在对于第三步,我们实际上必须回到 repo 提示。我们添加了一个新文件。所以,让我们添加我们的存储文件。好的,瞧。我们将刷新上下文。我们将复制我们更新后的代码。我们将回到我们的现有代码。记住,我们已经勾选了实施计划中的第二步。所以,它知道这将是第三步。把它粘贴在这里。我们将把它发送给 01 Pro 的新实例,然后让它工作。提醒一下,回到你的文本编辑器,按撤销按钮来做那个小技巧。删除它。然后,我们将去第三步。我们将勾选它。现在,我们将让 01 Pro 为我们工作。所以,你可以看到,01 Pro 的思考时间相当长,这里是 5 分 17 秒。所以,让我们来做这些更改。好的,所以在 receipts actions 中,看起来我们需要回到我们的 DB。我们将要做的是,我们将创建一个,让我们看看 actions/db receipts actions。所以,我们需要做 receipts actions.ts。我们将粘贴在这里。看起来我们可以点击我们的问题,看看发生了什么。所以,让我们悬停在这里,让 composer 修复它。值得注意的是,你不想保持一个运行时间很长的 composer 会话。你实际上会在每一步之间重置它。所以,让我们让光标 composer 为我们修复它。好的,看起来我们解决了那个问题。然后,看起来我们还有另一个问题。所以,让我们再次悬停在这里。这是一个新任务。我将创建一个新的 composer 实例。好的,看起来问题是,drizzle delete 操作不会删除行。所以,它正在调整我们的查询。我们接受它,现在我们的文件中没有任何问题。太棒了。所以,01 Pro 加上光标等于好的文件。很简单。所以,让我们向下滚动到下一个。看起来我们在这里唯一需要做的就是创建那个文件。所以,看起来是用户说明。好的,这里没有什么我们真正需要做的。所以,我们可以直接继续。所以,我们将要做的是,我们将提交它。所以,这是第三步。所以,我们将提交第三步。接下来我们要做的就是确保我们刚刚添加的 actions 文件被添加到我们的 repo 提示上下文中。我们将刷新它。我们将复制上下文。好的,看起来我们的构建正在部署,基于那个提交。这很棒。我们想验证一下。好的,我们完成了第三步吗?看起来我们确实完成了第三步。好的,所以,我们将进入现有代码,粘贴我们更新后的代码。我们将复制整个文件。我们将开始一个新的聊天。所以,我们将在这里开始一个新的聊天。我们将粘贴它,然后让它工作。在这一点上,我们将非常快速地通过这些步骤。我当然会暂停一下,确保代码是正确的,以及所有这些东西。但现在我们真的进入了我们的工作流程,你们也对发生了什么有了很好的了解。我们将尽量保持前进。我们现在有了第四步的代码。所以,让我们看看实际发生了什么。好的,所以我们有 extract receipt action。所以,让我们添加这个文件。它将进入 actions,而不是子文件夹,我相信。好的,我们将做 extract receipt actions.ts。你可以看到这里发生的是,它试图教我们如何错误地使用 OpenAI API。所以,我们实际上要在这里做的是,我们将向你们展示一个非常重要的技能,当你们使用 01 Pro 时,尤其是当它涉及到使用 API 和类似的东西时,因为你总是想确保你给它提供最新的文档。所以,我实际上要做的是,我将在这里引入 OpenAI 文档。我将向你们展示如何修复从 01 Pro 收到的响应。所以,我们想做的一件事是,我们想使用 GPT 40 的图像功能和结构化输出。所以,我们实际上想去 OpenAI。所以,如果我们去,这看起来是图像功能。所以,我们可以做的就是,我们可以复制这个页面。我们将回到我们的 01 Pro 聊天。我们将粘贴所有这些文档。然后,我们还想获取结构化输出的文档。我们将复制这个页面。我们将回到我们的聊天并粘贴它。所以,我们现在正在做的是,我们正在给 01 Pro 提供 GPT 40 的图像和结构化输出的文档。我们将要做的是,我们只是说,嘿,实际上,这是使用 GPT 40 图像输入和结构化输出的文档。请用这些知识重做任务。然后,我们可以发送它,它将开始工作。如果我够细心,我可能已经读完了第四步,并在发送初始消息时就知道该这样做。但我当时,你知道,我在这里很投入,试图记录正在发生的事情。所以,你可以看到,当我实际审查 actions 的代码时,我发现了那个问题。因为这已经过时了。所以,这是我之前提到的事情之一。你的工作正在从开发者变成上下文管理器。在这种情况下,01 Pro 不一定写了明显错误的东西。但当我们将它与前端连接时,我们会遇到各种错误,因为它基本上是以一种相当过时的方式调用 OpenAI API。所以,我们所做的是,我们基本上只是给了它,你知道,那个新的上下文,通过在实际的实时互联网上查找文档。把它作为回复给 01 Pro。所以,你可以用两种方式来做。你可以尝试作为回复来做,或者你可以复制原始请求的原始上下文,然后创建一个新的聊天,并添加这个附加的上下文。所以,让我们来看看。所以,看起来 01 Pro 能够调整我们想要的东西。所以,我们可以复制它。你会看到它改变了文件名。我实际上将保留文件名,就像它目前一样。你可以看到这次它实际上是从 OpenAI 文档中提取的,并且它更准确地完成了这个过程。你可以看到它实际上正在使用 GPT 40 mini。所以,我们将需要确保我们切换它。所以,让我们实际上进入我的文件,并用文档中的更新版本覆盖它。让我们将其更改为 GPT 40。看起来我们遇到了两个错误。看起来我们可能只需要安装另一个库。我实际上应该确保做的一件事是创建一个新的 composer 实例。所以,让我们在这里 composer 中修复它。好的,所以我们只需要安装这两个包。再一次,我们将获得这个的正确版本。我们可以运行它,这应该可以消除我们的两个错误。基本上只需要安装两个新库。事实上,这就是为什么你需要阅读用户说明。因为事实上,它明确告诉我们要做同样的事情。所以,如果我们听从 01 Pro,它就会为我们解决。看起来我们还有一件事。所以,让我们点击在 composer 中修复。我们将进行一个新的 composer 会话。看起来 Pro 可能只是一个小的输入错误。所以,我们可以用 en cursor 来解决它。正如我所怀疑的,果然是一个输入错误。好的,所以我们可以接受这些更改,我们现在完成了第四步。所以,我们将提交第四步。我们将同步它。确认它已经到达我们的 GitHub。触发一个新的构建。太棒了。现在我们可以做什么呢?我们可以进入 repo 提示。确保我们添加了那个新 actions。刷新我们的上下文。复制它。然后,我们现在想要做的当然是,我们想要进入我们的现有代码区域。所以,我们需要撤销那个。粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第四步。好的,所以我们已经完成了 GPT 40 的提取 actions。基于我们如何更新文档。粘贴进去。现在,我们的第五步请求已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第五步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将不得不在这里切换回 40。因为我没有在给它第五步时做那个更改。但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。当然,你总是可以阅读它,看看它实际添加了什么。我们可以当然回到最底部。你可以看到第五步已经完成。你可以看到用户说明。它们都为我们写好了。没有什么真正需要我们做的。得到一点总结。所以,我们将要做的是,我们将点击刷新。我们将获取文件刷新。我们没有在这里添加任何文件,所以我们不必实际添加任何文件。所以,我们将创建一个新的聊天。准备好它。复制我们的新代码库上下文。回到 Coden 提示。我们将粘贴新代码。实际上,在我粘贴新代码之前,我将确保勾选了第五步。好的,所以我们已经完成了提取 GPT 40 的 actions。基于我们如何更新文档。粘贴进去。现在,我们的请求为第六步已经准备好了。所以,我们将创建一个新的 A1 Pro 聊天。我们将发送它,并带有新的更新上下文,让第六步开始工作。我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。我将确保我实际上进去并阅读了之前的代码。所以,我实际上注意到的一件事是,它切换了这个模型。所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。然后其他一切都会很好。所以,让我们看看我们在这里需要做什么,第五步。好的,所以我们需要做,DB receipts actions。看起来我们正在做一个更新。然后,我们将更新 extract receip action.ts 文件。所以,让我们复制收据 actions 的更新。你可以看到它基本上只是重命名一些东西。它创建了一个新的函数来创建收据 actions。所以,我们可以做的是,这将是对现有 actions 文件的编辑。所以,我们将复制粘贴整个文件。你可以看到它实际上正在尝试导入一个尚不存在的东西。没关系,因为这必须与我们的第二个文件相关。所以,让我们获取我们的第二个文件。如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。但是的,所以让我们进入 extract receed actions。在这里,我们将粘贴它。我们要做的其中一件事是,我们将^{-(1)

- 如果我们能让它不回到顶部,那将是非常棒的。

- 如果你想看一个简化的思维链式的东西,你甚至可以点击详情。

- 所以,让我让它运行,然后我们会回来看看。

好的,这个花了大约 4 分钟,如果你向下滚动,你会看到我们有一个非常详细的实施计划。

所以,我们要做的是,我们将做一些与上一段视频非常相似的事情,那就是我们将在这里看看分析。

所以,再一次,我们有那些头脑风暴标签,你可以看到它在思考它正在做什么。

我确实知道有些人会说,嗯,这是一个推理模型,你不需要告诉它这样做。

我发现它实际上很有帮助,所以我将继续这样做。

我们将要做的是复制输出。

所以,再一次,这个输出的格式是我们实际提示中要求的格式。

好的,这就是为什么 01 Pro 如此棒,因为它确实能精确地遵循你给它的指示。

所以,我们在这里要做的是,我们将转到我的 Obsidian 应用中的规划器提示输出示例。

我将把它粘贴进去,以便我们可以分析一下。

所以,再一次,看起来我们得到了大约 15 个步骤,我相信我在这里看到的。

好的,15 个步骤。

所以,我们在这里可以做的是,我们可以非常类似于我们用规范提示所做的那样来浏览它,并确保所有这些步骤看起来都不错。

我们可以根据这里输出的内容来调整事物。

所以,这只是一个提醒。

当我们最初处理规划器提示时,我们当然已经讨论过这个问题了。

但是,这些步骤中的每一个返回的方式都是一个命名的步骤,带有任务。

我们得到它通常会编辑的文件列表。

我们得到步骤依赖关系,所以你可以看到,如果我们向下滚动,就像第 10 步依赖于第 3 步和第 7 步一样。

这就是为什么我们有步骤依赖关系,它只是帮助模型知道这里发生了什么。

你可以看到所有内容都格式化为待办事项。

所以,我们将逐一检查这些步骤,遍历 Cen 提示中的每个步骤。

当然,我们还有用户说明。

你可以看到,例如,在这个步骤中,用户说明是你必须确保你的 .loal 文件命名正确,诸如此类的事情。

所以,看起来它将从设置数据库开始。

再一次,如果你想加快速度,完全可以。

但我只是会阅读一下。

可能会有一些短暂的沉默,那只是我在阅读的时候。

好的,所以 Superbase 存储操作。

这看起来相当不错。

看起来我们甚至添加了像 10MB 文件限制这样的东西,这是一个很好的做法。

我喜欢看到这一点。

你可以看到用户说明,它甚至指示我们构建正确的行级别服务,行级别安全规则。

所以,这是一个策略,以确保用户只能看到他们自己的存储的收据,对吧?

这显然非常重要。

然后,你可以看到它正在转向收据数据库操作。

这很有意义,从后端开始,然后转向前端。

你可以看到它甚至指示我们运行我们的迁移。

所以,再一次,这非常重要,尤其是对于初学者来说,因为我们构建提示的方式是允许 AI 或 01 Pro 告诉我们我们需要做什么。

因为对于一个从未构建过这个的人来说,他们可能不知道他们必须手动运行迁移。

所以,这是一个很酷的事情,这也是包含每个步骤的用户说明的原因。

好的,看起来是 AI 提取。

所以,让我们来看看。

看起来,使用 GPT 40 和 OpenAI,返回提取的字段。

这看起来不错。

创建一个单一的操作来上传并按下提取。

这看起来不错。

仪表板和收据布局。

你现在正在转向前端的东西。

你可以看到它甚至在设置受保护的路由组,这很棒,以确保用户必须经过身份验证才能访问仪表板。

所以,它确实在思考我们需要的一切。

这老实说是一个相当令人印象深刻的计划。

提醒一下,我们之所以这样构建提示,是因为这些步骤中的每一个都需要足够易于管理,以便 01 Pro 可以在一步中完成所有事情,因为你不想合并。

就像你不想合并这其中的五个,让整个事情变成三个步骤,因为否则你会得到更糟糕的结果。

这可能有点过度了。

这些步骤可能可以合并成两步。

基本上,这些步骤中的每一个可能都是一步。

我不知道,这有意义吗,我说的 guys?

你可能可以要求它同时运行第一步和第二步,然后第三步和第四步。

但我们将保持简单。

我认为这可能是基于模型当前能力正确范围内的。

好的,所以让我们看看。

收据页面列表搜索和过滤。

所有这些看起来都不错。

收据上传 UI。

我们肯定需要那个。

验证页面。

所以,你可以看到它甚至为这些页面中的每一个正确地构建了路由。

这看起来很棒。

删除收据。

我们也肯定想要能够删除东西。

导出 CSV。

我们确实要求了 CSV 导出,所以这很棒。

然后,你可以看到确保受保护的路由。

好的,所以它只是在确保我们的身份验证做得正确。

UI 增强。

我实际上要在这里编辑的一件事是,我们不想要主题切换器。

我们只想要浅色模式。

所以我实际上要快速删除那个。

我们将删除那个暗模式切换按钮,我们不想要暗模式。

所以,只是一个快速的小调整。

再次删除那个暗模式。

然后测试和验证。

我们实际上将跳过测试,所以我们可以删除这一步。

有一步我们不必做。

最后但并非最不重要的是,这实际上根本不是代码生成步骤。

它基本上只是要求我们确保事物已部署。

所以我实际上要删除它,因为它实际上不需要在那里做任何事情。

这看起来像一个计划。

所以,看起来我们最终的计划将是一个 13 步的计划。

你可以看到这些计划中的每一个都非常详细。

我们有 AI 需要处理的文件。

我们有大致的任务。

步骤依赖关系。

我们甚至还有用户说明。

所以,我们现在将要做的是,我们将采用这个计划,我们将采用我们的技术规范,我们将采用我们的请求输出。

我们将把它输入到 Cen 提示中,我们将遍历这些步骤中的每一个。

所以,让我们开始构建这个东西。

所以,现在我们需要在我们的 Coden 提示中逐步构建,当我们进行时。

所以,让我们开始获取我们的 Coden 提示。

提醒一下,我们不会做这个的 XML 版本。

如果你有兴趣用 XML 做 Coen 提示,请查看我们之前做的课程,大概是 90 分钟前。

所以,你可以看看。

我们将做标准的版本,因为它更容易理解。

所以,让我们来看看这个提示。

我们将把它复制到我们的 Obsidian 中,让我们看看我们需要哪些输入变量。

所以,这个需要五个。

所以,我们需要项目请求,项目规则,文本回溯,实施计划。

然后提醒一下,这次不是起始模板代码,你实际上需要每次运行新步骤时,你都需要用最新的代码更新现有代码。

对吧?

在第六步时,给你第一步的代码是没有多大意义的。

所以,我们需要确保在我们遍历这些步骤时,我们都在更新现有代码。

所以,让我们来填写所有这些。

这显然是无聊的部分。

首先,我们将获取我们的请求提示输出。

我们将回到 Coden。

我们将把它输入到这些 XML 标签之间。

我将把它粘贴进去。

接下来我们需要的是项目规则。

所以,我们将最后一次在光标中获取它们。

好的,我将复制这些光标规则。

我们将回到这里并粘贴它们。

所以,现在我们需要获取我们从规范提示获得的技​​术规范输出。

所以我将复制整个东西。

跳回我们的 Cen 提示并将其粘贴到技术规范 XML 标签之间。

然后,我们将获取我们刚刚获得的实施计划。

好的,这将是这其中的所有 13 个步骤。

我们将复制它,然后将其粘贴到这里的实施计划模板变量中。

现在,我们将使用现有代码标签。

这里有几个要点,因为这会一步一步地变化。

首先,你需要确保 AI 完成每个步骤后,你必须进去并添加一个 x。

所以,在我们完成第一步之后,我们将在这里添加一个 x。

这将表明它已完成。

这样,下次我们向 A1 Pro 模型提供提示时,它就会意识到,好的,我们完成了这一步。

现在我们将运行第二步。

我们希望继续包含每个步骤作为上下文,以便它有一个很好的运行历史,它实际处理了什么。

当然,这是第一步,所以我们还不需要这样做。

但这只是一个指针,当我们实际处理这些步骤时。

然后对于现有代码,你当然需要用 repo 提示更新你的代码并粘贴更新后的代码,这将在下一课,第二课中向你展示。

但对于第一个,它实际上将与我们一直在做的一样。

所以,我们将进入 repo 提示,我们将复制它,因为基本上,我们从头开始,我们从那个模板开始,我们将粘贴它。

所以,现在我将复制整个文件。

所以,这是我们的整个提示,再次,让我们看看分词器是什么样的。

所以,这大约是 40,000 个令牌。

我们将创建一个新的聊天,使用 01 Pro。

我们将粘贴它,然后让它开始为我们工作。

所以,01 Pro 现在正在做的事情,这就是为什么我在这个研讨会开始时就提到了,你想要像 01 Pro 一样思考,就像你雇佣了一个真正的开发者一样,因为现在它正在做的事情,如果我们进入我们的规划器提示,它现在正在尝试实现我们第一步所需的整个代码。

所以,将会发生什么,一旦它完成工作,我们就会谈论它,它将为我们提供我们需要的每一个完整文件,我们将把它粘贴到我们的代码中。

我们将做的是,我们将基本上遍历这些文件中的每一个,以及它给我们的任何用户说明,我们将在我们的代码库中进行更改。

我们将直接在光标中进行,我现在可以关闭这个光标规则文件,因为我们暂时不需要它了。

我们将一步一步地继续下去。

所以,让我们让 01 Pro 工作。

这可能需要大约 4 到 6 分钟。

所以我将让它运行,然后我们将讨论如何做这一切。

好的,所以你可以看到 01 Pro 在第一步上工作了 3 分 1 秒。

所以,接下来我们要做的就是逐个文件地进行,并做我们需要做的所有事情。

所以,你会看到,对于这些文件中的每一个,我们得到了被编辑或添加的文件。

我们得到了我做了什么以及为什么。

所以,这解释了 01 Pro 实际做了什么。

它给你文件路径,所以你知道在哪里放文件。

然后,你可以看到它提供了整个文件,以及所有的文档。

所以,只是一个说明,如果你是一个不喜欢文档的人,我们之前提到过,你完全可以修改提示来删除它。

我认为,至少在你与 01 Pro 一起遍历这些步骤时,它非常有帮助。

然后,我认为之后,如果你已经把应用程序弄到了你想要的状态,然后你想要删除所有额外的文档,我认为那就是时候了。

但我确实认为,当你遍历这些步骤时,如果你保留每个文件的注释,所有这些文档等等,我认为你会得到更好的结果。

我已经广泛测试过这一点,并且发现情况确实如此。

所以,只是一个需要注意的点。

好的,所以这是我们需要做的。

所以,我们将在这里做的就是,我们真的只是逐个文件地复制,然后粘贴代码。

第一个文件路径我们需要处理的是 db schema receipts schema。

所以,我们将把它添加到我们的代码库中。

所以我将打开 db。

我将打开 schema。

看起来我们需要命名文件 receipts schema.ts。

所以我将这样做。

所以,让我们 receipts d schema TTS,然后我们将粘贴它,保存它,然后瞧,你现在可以看到我们有一个收据表 schema,它有大量的文档,并且符合我们在光标规则文件中指示的代码标准。

所以,相当酷。

所以,这是第一个路径。

让我们向下滚动到下一个文件。

所以,现在我们实际上需要编辑我们 schema 中的索引文件。

这将导出东西。

所以,这实际上是一个已经存在的文件。

所以,我们可以再次覆盖。

这就是为什么我们要求 01 Pro 每次都返回完整的文件内容。

因为而不是我们必须弄清楚,好吧,这两个文件之间有什么变化。

我们可以做一个非常简单的复制粘贴工作流程,这非常棒。

好的,让我们去第三个。

所以,现在我们将更新 dbdb.ts 文件。

它可能就在这里。

就像我们上次一样,我们将粘贴新文件。

你将看到我们现在在 schema 中有了那个收据表。

我们有一些新注释,一些好的文档,这很棒。

好的,让我们向下滚动。

看起来我们现在需要调整 env.example 文件。

所以,我们将这样做。

所以,值得注意的是,它会要求我更新示例文件,但我们当然也需要更新我们的 .env.loal 文件,因为那是我们的实际环境变量。

还值得注意的是,因为我们调整了一个环境变量,我们需要做什么?

我们需要进入 verell。

我们需要进入我们的设置。

我们需要进入我们的环境变量。

所以,看起来我们还没有添加那个变量。

所以,我们可以做的是,我们可以直接粘贴它,点击保存。

记住,我们必须重新部署才能确保它被添加。

所以,我们将点击重新部署,再次点击重新部署。

这将注入新的环境变量。

所以,这非常重要。

然后,你可以看到我们完成了第一步。

我们得到了一些概述,关于 AI 做了什么。

然后,你可以看到我们得到了用户说明。

所以,你可以看到,检查你的 .lo。

你可以看到,确保添加它。

然后它说,可选地,我们将需要生成我们的 drizzle 迁移,以便将其上传到我们的数据库。

因为我们更新了 schema 的代码,你会看到,如果我们刷新 superbase,你会看到我们没有那个表。

所以,这实际上将如何在我们的代码中工作是,我们必须去我们的终端,运行 npm run DB generate。

这将生成新的迁移文件。

所以,如果我们点击 migrations,你会看到我们现在有一个 SQL 迁移文件,用于我们的收据表。

然后,当然,我们需要迁移它。

我们将运行 npm run DB migrate。

它将运行迁移。

然后,如果我们回到 super base,我们应该能够刷新它,看到我们的收据表,以及所有那些漂亮的列,AI 为我们编写的 schema。

好的,所以这是第一步的结束。

你在这里需要做的一件事是,你实际上需要删除你所有的现有代码。

所以,通常我会向你展示,在下一步中,当我们继续这个的时候,因为这可能相当糟糕,每次都要找到打开的标签。

所以我将继续向上滚动,向上滚动,向上滚动。

看起来我们还在代码映射中。

让我们再往前一点。

这是文件系统。

我们必须删除所有这些现有代码。

所以,我们删除了代码。

现在我们需要去实施计划中的第一步,我们只需要标记它已完成。

所以,我们只需要在这里添加一个 x。

现在,这个东西已经准备好了,可以进行第二步了。

我们要做的其中一件事是,在我们继续第二步之前,我们将快速回到光标。

我们将实际提交我们的代码。

所以,我推荐你做的一件事是,在你完全完成每一步之后,你实际上想要创建一个新的提交到你的 GitHub 存储库。

我将直接称之为第一步。

我将提交它,我只是使用我的 git 标签,就在光标内。

你当然可以使用终端,如果你喜欢使用 git CLI。

然后,我们将同步它。

非常容易初学者使用。

git UI 相当不错。

我将在 Mac 上使用 Shift Command W,这将关闭我现有的文件。

你会注意到,如果我们回到我们的 git 存储库,你会看到在 tutorial 上,你会看到我有一个第一步。

我刚刚提交了它。

所以,这个黄色的是待定。

所以,真正很棒的一件事是将你的 GitHub 存储库连接到你的 cell 项目。

每次你提交到你的目标分支时,基本上会发生什么就是,它会构建你的应用程序,这很酷。

所以,这实际上将完成并构建第一步。

它将实际将你更新后的代码部署到你现有的域。

所以,发生的事情是,在每一步结束时,你确保一切都已完成,你提交你的代码,然后它将实际构建并部署到你托管在 verell 上的现有 URL。

这很酷。

所以,让我们开始处理下一步。

好的,所以只是一个提醒,你将需要确保你勾选了第一步。

然后,我们将滚动回到现有代码部分。

现在,我们需要使用 repo 提示来包含现有代码。

所以,让我们看一下 repo 提示一会儿,因为有几件事你需要做。

所以,你注意到的其中一件事是,如果我们实际上展开,我们将点击展开。

你会注意到,我们创建的一些新文件。

让我们实际关闭那个 UI 文件夹,这样它就不会太长。

但你会看到 receipts schema,特别是,这是我们添加的新文件,实际上并没有添加到我们的上下文中。

所以,你必须确保你做的是,每当你创建一个新文件时,这非常重要,因为如果你不这样做,你就会包含过时的代码。

01 Pro 所做的工作实际上会很糟糕或过时。

所以,非常重要的是,你要充当项目经理和上下文管理器,以确保你始终包含正确、最新的代码给 01 Pro。

因为将会发生的一件事是,我敢肯定,在完成大约十几个步骤的过程中,你会忘记做一次这件事,你会得到一个糟糕的结果,你会对模型生气,而实际上是你的错,因为你没有更新上下文。

所以,我们将确保我们添加这个文件到上下文。

你会看到它会增加我的令牌计数。

太好了。

我相信这是我们添加的唯一文件,因为其他文件只是编辑。

所以,一切都将是最新的。

你甚至可以点击这个小刷新按钮,以确保一切都是最新的。

这通常是我喜欢做的。

你可以看到,一切都准备就绪了。

如果我们打开我们的 DB 文件夹,打开我们的 schema 文件夹,它就准备好了。

所以,我们将复制我们的新代码,我们的现有代码。

你可以看到我的 versel 构建现在已准备就绪。

所以,它已成功部署,这很棒。

现在我们可以进入我们的现有代码标签,我们已经从上一步清除了。

粘贴进去。

我们将复制整个东西。

我们将回到 chat gbt,开始一个新的聊天,使用 01 Pro。

我们将传递第二步,然后让它开始工作。

我通常在这个时候做的一件事是,为了让自己更容易,我回到我的文本编辑器,我实际上只是按撤销按钮,这样我们就可以轻松地清除现有代码。

这样,它就准备好进行第三步了。

我甚至会做的是,我将直接去上面,勾选第二步。

假设它会完成。

当然,如果你进去做了一些编辑,或者你重新做了第二步,因为你可能不喜欢 01 Pro 给你的结果,那么请确保,如果你不喜欢结果,就不要勾选它。

但我们将假设它会做得很好。

所以,现在它为我们准备好了第三步。

所以,我们只需要回到 chat bt。

我们需要等待 01 Pro 完成工作,然后我们可以继续。

好的,所以我们从第二步获得了代码。

所以,让我们看看 01 Pro 为我们做了什么。

所以,看起来,我们有这个第一个文件。

所以,我们将要做的是,我们将只做我们一直在做的事情。

我们将复制这个第一个文件。

所以,这将是 actions storage/receipt storage actions。

所以,如果我们进入我们的代码,我们将进入 actions。

看起来我们需要一个新的文件夹,叫做 storage。

然后,看起来我们需要称之为 receipts storage actions。

所以,我们将 receipts storage actions.ts。

我们将粘贴这个文件。

看起来我们遇到了第一个有趣的导入错误。

这可能是一个我们需要安装的包,它将在用户说明中介绍给我们。

所以,让我们看看,是否有我们需要做的。

好的,所以看起来这可能是在光标中需要调试的东西。

所以,这完全没问题。

我们稍后会处理。

我们可以做的是,我们可以看看 env.example 文件。

所以,看起来我们在这里将 receipts 值添加到 superbase bucket receipts。

但我相信我们已经有了。

所以我实际上不认为我们需要编辑它。

所以,这很棒。

所以,让我们谈谈如果你从 01 Pro 收到错误会发生什么。

这就是为什么我们要使用光标。

因为我们可以直接在光标中悬停并点击在 composer 中修复。

这将激活光标 composer,它会告诉我们我们需要做什么。

在这种情况下,看起来确实如此,我们只需要安装这个包。

所以,让我们点击这个运行按钮。

这将运行我们的终端命令。

将会发生的是,它可能只需要 --force。

所以,我们可以做的就是,我们可以粘贴这个错误,然后输入 fix。

然后光标将为我们生成一个新的命令。

好的,让我们运行这个,应该已经纠正了。

果然,你可以看到我们现在已经安装了我们的依赖项,并且错误消失了。

所以,这理想情况下是我们可以在提示中调整的东西,但发生的是,01 Pro 使用了一个我们没有安装的库的代码。

所以,我们只需要悬停在错误消息上,点击光标 composer,粘贴错误消息,我们就得到了修复它所需的一切。

所以,修复起来非常容易。

这就是为什么 AI 编码工具如此棒。

因为即使 01 Pro 做对了,那么我们也可以在光标级别修复它,我们仍然不需要写任何代码。

我们只是复制粘贴东西,点击东西,AI 已经为我们做了所有工作。

所以,让我们提交那个代码。

让我实际上确保一下。

那只是唯一的文件,对吧?

好的,太好了。

所以,我们只是提交第二步。

提交同步更改。

再一次,这将更新我们的 GitHub。

如果我刷新它,我们应该看到第二步。

太好了,已经提交了。

然后,如果我们去我们的 cell,我们应该看到另一个构建开始运行。

当它运行时,我们可以做的是,我们可以直接进入下一步。

好的,所以,这是我们将真正真正保持事情运转的地方。

所以,现在对于第三步,我们实际上必须回到 repo 提示。

我们添加了一个新文件。

所以,让我们添加我们的存储文件。

好的,瞧。

我们将刷新上下文。

我们将复制我们更新后的代码。

我们将回到我们的现有代码。

记住,我们已经勾选了实施计划中的第二步。

所以,它知道这将是第三步。

把它粘贴在这里。

我们将把它发送给 01 Pro 的新实例,然后让它工作。

提醒一下,回到你的文本编辑器,按撤销按钮来做那个小技巧。

删除它。

然后,我们将去第三步。

我们将勾选它。

现在,我们将让 01 Pro 为我们工作。

所以,你可以看到,01 Pro 的思考时间相当长,这里是 5 分 17 秒。

所以,让我们来做这些更改。

好的,所以在 receipts actions 中,看起来我们需要回到我们的 DB。

我们将要做的是,我们将创建一个,让我们看看 actions/db receipts actions。

所以,我们需要做 receipts actions.ts。

我们将粘贴在这里。

看起来我们可以点击我们的问题,看看发生了什么。

所以,让我们悬停在这里,让 composer 修复它。

值得注意的是,你不想保持一个运行时间很长的 composer 会话。

你实际上会在每一步之间重置它。

所以,让我们让光标 composer 为我们修复它。

好的,看起来我们解决了那个问题。

然后,看起来我们还有另一个问题。

所以,让我们再次悬停在这里。

这是一个新任务。

我将创建一个新的 composer 实例。

好的,看起来问题是,drizzle delete 操作不会删除行。

所以,它正在调整我们的查询。

我们接受它,现在我们的文件中没有任何问题。

太棒了。

所以,01 Pro 加上光标等于好的文件。

很简单。

所以,让我们向下滚动到下一个。

看起来我们在这里唯一需要做的就是创建那个文件。

所以,看起来是用户说明。

好的,这里没有什么我们真正需要做的。

所以,我们可以直接继续。

所以,我们将要做的是,我们将提交它。

所以,这是第三步。

所以,我们将提交第三步。

接下来我们要做的就是确保我们刚刚添加的 actions 文件被添加到我们的 repo 提示上下文中。

我们将刷新它。

我们将复制上下文。

好的,看起来我们的构建正在部署,基于那个提交。

这很棒。

我们想验证一下。

好的,我们完成了第三步吗?

看起来我们确实完成了第三步。

好的,所以,我们将进入现有代码,粘贴我们更新后的代码。

我们将复制整个文件。

我们将开始一个新的聊天。

所以,我们将在这里开始一个新的聊天。

我们将粘贴它,然后让它工作。

在这一点上,我们将非常快速地通过这些步骤。

我当然会暂停一下,确保代码是正确的,以及所有这些东西。

但现在我们真的进入了我们的工作流程,你们也对发生了什么有了很好的了解。

我们将尽量保持前进。

我们现在有了第四步的代码。

所以,让我们看看实际发生了什么。

好的,所以我们有 extract receipt action。

所以,让我们添加这个文件。

它将进入 actions,而不是子文件夹,我相信。

好的,我们将做 extract receipt actions.ts。

你可以看到这里发生的是,它试图教我们如何错误地使用 OpenAI API。

所以,我们实际上要在这里做的是,我们将向你们展示一个非常重要的技能,当你们使用 01 Pro 时,尤其是当它涉及到使用 API 和类似的东西时,因为你总是想确保你给它提供最新的文档。

所以,我实际上要做的是,我将在这里引入 OpenAI 文档。

我将向你们展示如何修复从 01 Pro 收到的响应。

所以,我们想做的一件事是,我们想使用 GPT 40 的图像功能和结构化输出。

所以,我们实际上想去 OpenAI。

所以,如果我们去,这看起来是图像功能。

所以,我们可以做的就是,我们可以复制这个页面。

我们将回到我们的 01 Pro 聊天。

我们将粘贴所有这些文档。

然后,我们还想获取结构化输出的文档。

我们将复制这个页面。

我们将回到我们的聊天并粘贴它。

所以,我们现在正在做的是,我们正在给 01 Pro 提供 GPT 40 的图像和结构化输出的文档。

我们将要做的是,我们只是说,嘿,实际上,这是使用 GPT 40 图像输入和结构化输出的文档。

请用这些知识重做任务。

然后,我们可以发送它,它将开始工作。

如果我够细心,我可能已经读完了第四步,并在发送初始消息时就知道该这样做。

但我当时,你知道,我在这里很投入,试图记录正在发生的事情。

所以,你可以看到,当我实际审查 actions 的代码时,我发现了那个问题。

因为这已经过时了。

所以,这是我之前提到的事情之一。

你的工作正在从开发者变成上下文管理器。

在这种情况下,01 Pro 不一定写了明显错误的东西。

但当我们将它与前端连接时,我们会遇到各种错误,因为它基本上是以一种相当过时的方式调用 OpenAI API。

所以,我们所做的是,我们基本上只是给了它,你知道,那个新的上下文,通过在实际的实时互联网上查找文档。

把它作为回复给 01 Pro。

所以,你可以用两种方式来做。

你可以尝试作为回复来做,或者你可以复制原始请求的原始上下文,然后创建一个新的聊天,并添加这个附加的上下文。

所以,让我们来看看。

所以,看起来 01 Pro 能够调整我们想要的东西。

所以,我们可以复制它。

你会看到它改变了文件名。

我实际上将保留文件名,就像它目前一样。

你可以看到这次它实际上是从 OpenAI 文档中提取的,并且它更准确地完成了这个过程。

你可以看到它实际上正在使用 GPT 40 mini。

所以,我们将需要确保我们切换它。

所以,让我们实际上进入我的文件,并用文档中的更新版本覆盖它。

让我们将其更改为 GPT 40。

看起来我们遇到了两个错误。

看起来我们可能只需要安装另一个库。

我实际上应该确保做的一件事是创建一个新的 composer 实例。

所以,让我们在这里 composer 中修复它。

好的,所以我们只需要安装这两个包。

再一次,我们将获得这个的正确版本。

我们可以运行它,这应该可以消除我们的两个错误。

基本上只需要安装两个新库。

事实上,这就是为什么你需要阅读用户说明。

因为事实上,它明确告诉我们要做同样的事情。

所以,如果我们听从 01 Pro,它就会为我们解决。

看起来我们还有一件事。

所以,让我们点击在 composer 中修复。

我们将进行一个新的 composer 会话。

看起来 Pro 可能只是一个小的输入错误。

所以,我们可以用 en cursor 来解决它。

正如我所怀疑的,果然是一个输入错误。

好的,所以我们可以接受这些更改,我们现在完成了第四步。

所以,我们将提交第四步。

我们将同步它。

确认它已经到达我们的 GitHub。

触发一个新的构建。

太棒了。

现在我们可以做什么呢?

我们可以进入 repo 提示。

确保我们添加了那个新 actions。

刷新我们的上下文。

复制它。

然后,我们现在想要做的当然是,我们想要进入我们的现有代码区域。

所以,我们需要撤销那个。

粘贴新代码。

实际上,在我粘贴新代码之前,我将确保勾选了第四步。

好的,所以我们已经完成了提取 GPT 40 的 actions。

基于我们如何更新文档。

粘贴进去。

现在,我们的请求为第五步已经准备好了。

所以,我们将创建一个新的 A1 Pro 聊天。

我们将发送它,并带有新的更新上下文,让第五步开始工作。

我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。

我将确保我实际上进去并阅读了之前的代码。

所以,我实际上注意到的一件事是,它切换了这个模型。

所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。

然后其他一切都会很好。

所以,让我们看看我们在这里需要做什么,第五步。

好的,所以我们需要做,DB receipts actions。

看起来我们正在做一个更新。

然后,我们将更新 extract receip action.ts 文件。

所以,让我们复制收据 actions 的更新。

你可以看到它基本上只是重命名一些东西。

它创建了一个新的函数来创建收据 actions。

所以,我们可以做的是,这将是对现有 actions 文件的编辑。

所以,我们将复制粘贴整个文件。

你可以看到它实际上正在尝试导入一个尚不存在的东西。

没关系,因为这必须与我们的第二个文件相关。

所以,让我们获取我们的第二个文件。

如果我们向下滚动,你可以看到这些文件输出非常长,这就是为什么 01 Pro 如此好的原因。

它真的是目前唯一能够做到这一点的模型,至少你知道,二月中旬,它能够做到这一点。

有趣的是,几个月后我们会重新审视这一点,看看其他模型能做什么。

但是的,所以让我们进入 extract receed actions。

在这里,我们将粘贴它。

我们要做的其中一件事是,我们将不得不在这里切换回 40。

因为我没有在给它第五步时做那个更改。

但你可以看到,现在,那个导入错误已经修复了,因为我们有了更新的 extract receipt action。

当然,你总是可以阅读它,看看它实际添加了什么。

我们可以当然回到最底部。

你可以看到第五步已经完成。

你可以看到用户说明。

它们都为我们写好了。

没有什么真正需要我们做的。

得到一点总结。

所以,我们将要做的是,我们将点击刷新。

我们将获取文件刷新。

我们没有在这里添加任何文件,所以我们不必实际添加任何文件。

所以,我们将创建一个新的聊天。

准备好它。

复制我们的新代码库上下文。

回到 Coden 提示。

我们将粘贴新代码。

实际上,在我粘贴新代码之前,我将确保勾选了第五步。

好的,所以我们已经完成了提取 GPT 40 的 actions。

基于我们如何更新文档。

粘贴进去。

现在,我们的请求为第六步已经准备好了。

所以,我们将创建一个新的 A1 Pro 聊天。

我们将发送它,并带有新的更新上下文,让第六步开始工作。

我有时会做的一件事是,当 01 Pro 工作时,你可以看到我花了 5 分 25 秒来做其他任务。

我将确保我实际上进去并阅读了之前的代码。

所以,我实际上注意到的一件事是,它切换了这个模型。

所以,我将要做的一件事是,作为这一步的一部分,我将确保我们将模型切换回 GPT 40。

然后其他一切都会很好。

所以,让我们看看我们在这里需要做什么,第六步。

好的,所以我们需要做,app/dashboard/layout.tsx。

所以,我们需要去 app。

我们将创建一个新的文件夹,叫做 dashboard。

再一次,我弄清楚我需要添加什么的方法就是看文件路径。

所以,我们还没有一个叫做 dashboard 的东西,所以我们需要创建它。

然后,我们可以为 dashboard 添加 layout.tsx 并粘贴我们的 dashboard。

你会看到,再一次,我们遇到了一个错误。

这是因为这将会依赖于我们假设将要添加到 _components 文件夹作为子目录的文件。

所以,让我们看看那些文件是什么。

所以,让我们向下滚动到下一个。

看起来我们确实得到了那个 dashboard wrapper 组件。

所以,让我们创建那个 dashboard DW wrapper.tsx。

粘贴我们的代码。

我们应该能够看到下一步是什么。

看起来这就是我们所需要的。

现在,一件非常重要的事情是,我们确实想要积极地测试我们的 UI。

所以,我们应该能够去我们的 dashboard 路由。

所以,让我们点击 dashboard。

我们应该得到一些渲染的东西。

有可能我们只需要重新构建我们的应用程序。

让我快速去开发服务器。

我将回到我们的应用程序。

你知道吗,我意识到,这实际上是 dashboard w 的一部分。

我们实际上也需要命名它 dashboard。

这是 nextjs 工作方式的一种怪癖。

我们在这里要做的是,嗯,实际上意识到我们只做布局页面,这个仪表板本身实际上在我们拥有其他页面之前还不是我们可以看到的东西,所以实际上我有点超前了自己一点点,你会看到这仍然显示一个错误,这实际上只是一个过时的错误,所以我们实际上刚刚刷新了我们的代码编辑器,你会看到这个实际上消失了,所以这确实是第六步的结尾,基本上我们将在稍后进行页面,布局实际上只是一个围绕我们还没有的所有页面的包装器,所以我们将继续提交第六步,这看起来是我们所需要的一切,值得注意的是,伙计们,我显然试图在这里快速进行,只是因为教程的性质,但当你自己构建你的应用程序时,你想确保你实际上会浏览所有这些文件并弄清楚发生了什么,对吧,所以,让我们就以这里的例子来说明一下,我们在这里所做的,或者更确恰当地说,O Pro 所做的,是它创建了一个受保护的路由,所以你会看到这是一个受保护的路由,这是一个仪表板布局,而且从技术上讲,我猜这还不是一个路由,因为我们还没有页面,但它只是在构建我们的仪表板将是什么样子,你可以在这里看到,它实际上正在创建一个小侧边栏,这可能会在第七步出现,一旦我们有了实际的页面,但它基本上只是创建了一个带有侧边栏的仪表板,然后是一个内容区域,所以当我们到达第七步时,这实际上应该看起来相当不错,所以我要做的是,我提交了这个,对吧,是的,我提交了这个,所以我要在这里做的是,我将创建一个新的聊天,我们当然需要现在去添加那些仪表板路由,以防我们想确保我们添加了这些文件,点击刷新,现在我们可以回到我们的正常流程,回到我们的提示,好的,我们将标记第六步为已完成,好的,所以我们差不多了,我想我们有 13 步,下一步将是中间点,嗯,我的 codex ml 标签在哪里,好的,现在让我们粘贴我们刚刚从 repo prompt 复制的代码,好的,嗯,我复制了一切吗,是的,我复制了,现在我们想回到一个新的聊天,让我们开始第七步,好的,所以我们真的在飞速前进,再次,只是作为这里的中间点,我会发送这个,并且最好让这个东西工作起来,对吧,确保你正在审查你的代码,再次,我正在快速浏览这个,因为我只是,这里的想法不是我们正在构建的应用程序,想法是工作流程,想法是你在这里学习的技能,想法是给你一些关于如何调整工作流程以满足你自己的需求的想法,这里有很多不同的技巧和窍门,所以想法是启发你构建自己的工作流程,并以此为起点,所以请确保你理解你的应用程序中发生了什么,如果你需要调整你的实现计划,当你正在进行时,也许你想让 AI 做一些不同的事情,对吧,你总是可以做到,我们将在最后讨论如何继续迭代应用程序,所以你不必认为这是最终的 13 步,你永远无法再次处理它,这只是一个起点,你可以随时使用这个工作流程,用于额外的功能,用于像错误修复这样的事情,用于像 UI 更新这样的事情,你对这个工作流程能做什么有无限的可能性,所以让我们让第七步运行并回来,所以第七步是我们实际上将开始为我们的仪表板获取页面的地方,所以你可以在这里看到,O Pro 为我们生成的第一个页面是这个 page.tsx 文件,用于收据页面,好的,所以我们需要进入 dashboard,现在这将是我们的第一个实际页面,所以我们将有 receipts,然后这将是 page.tsx,我们可以现在粘贴它,当然,我们需要在其中创建一个 _components 组件文件夹,以便我们可以添加 O Pro 为我们创建的这些组件,所以让我们向下滚动到那些,好的,所以这将是 receipt-list.tsx,所以这将是基于其名称应该渲染收据列表的组件,好的,所以那个文件看起来不错,然后我们只需要获取最后一个,这将是我们的搜索表单,所以我们将进入同一个组件文件夹,这将被称为 search-form.tsx,我们可以粘贴我们的搜索表单组件,现在我们应该有,嗯,我们需要的一切,所以我们只是快速重新加载我们的窗口以消除那两个类型错误,看起来在 receipt-list 中我们只有一个问题需要喂给 composer,好的,所以看起来属性实际上不存在,好的,所以这将使用 cursor agent 来为我们修复这个问题,好的,所以它将进行调整,它将正确格式化,我们可以接受 cursor agent 的生成,一切应该都很好,所以我们此时应该能够做的是,我们现在确实有一个页面,所以让我们来看看我们的页面,所以看起来,嗯,这里发生了什么,我刚刚犯了和上一个一样的错误,那就是 dashboard 不是一个路由,dashboard 只是一个路由组,所以如果我们去 /receipts,我们应该能够看到一个页面,看起来我们有一个小错误,所以我们只需要将那个错误直接复制粘贴到 cursor 中,我们将启动一个新的 composer 实例,使用 cursor agent,我们将提交它,它应该能够弄清楚发生了什么,所以当你开始遇到这样的错误时,特别是当你注意到同样的错误反复发生时,这是一个很好的机会去改进你的提示,所以这可能是一个我们想在提示中更改某些内容的情况,甚至可能是一个用例,我们想在我们的 cursor 规则中更新某些内容,所以你知道,你会记得作为 Cen prompt 的一部分,对吧,我们正在输入那些 cursor 规则,所以我们可能只需要提醒,你知道,在这种情况下,看起来我们只需要为这个 action 添加 use server,嗯,这可能只是一个我们需要去更新那个规则的情况,所以我们在这里要做的是,我们将尝试弄清楚这一点,嗯,看起来我们现在有一个导入错误,所以我们将通过调试过程,好的,新的 composer 实例,粘贴那个,看起来我们只需要一个缺失的依赖项,所以我们将运行我的命令,我需要记住,看,这是我们反复遇到的另一个错误,所以我们应该只更新我们的 cursor 规则,嗯,然后你会想去更新你仓库中的 cursor 规则,嗯,然后确保你也更新你的代码生成提示,所以那就是,嗯,在这种情况下你会做的事情,好的,你可以看到我们看到了一点闪烁,看起来我们还有最后一个错误,所以这实际上只是调试过程,这是非常正常的,你会遇到这个,重要的是你能看到它,嗯,这样你就知道在实际遇到错误时该怎么做,所以我要做的其中一件事是,我要快速停止这个,我要给你展示一个快速的小 cursor 技巧,所以如果我们实际上创建一个新的 composer 实例,所以我在 Mac 上按 command n,你实际上可以做的是 / 然后引用打开的编辑器,这实际上会将你所有打开的文件注入到上下文中,然后如果你粘贴它,它实际上会帮助 cursor agent 更快地找到错误,所以假设我们在那个 search-form 中有那些 select 标签,看起来它抛出的错误是 value 不能为空,所以它已经将 value 调整为 all,对于任何东西,然后它还,嗯,做了一些其他的调整,看起来,好的,所以你现在可以看到初始状态在这里,它正在被调整以适应这一点,我们可以接受,然后砰,我们有了我们的仪表板,好的,太棒了,所以我们现在有了这个小侧边栏,所以如果我们点击 verify,这将显示未找到,对吧,因为这实际上在我们的应用程序中是无效的,看起来这个路由甚至都是错误的,所以我们可以做的是,我们可以告诉 cursor,比如,嗯,所以你实际上可能会做的是,你会想也标记那个 dashboard 文件夹,嗯,所以 dashboard 在哪里,dashboard,我们可以说,嘿,因为 dashboard 是一个路由组而不是一个路由,我们需要调整侧边栏链接,而这将会,嗯,现在将这个文件夹中的所有内容注入到上下文中,它会找到那个带有侧边栏的 dashboard wrapper,你会看到它实际上编辑了那些链接,所以将这个 o01 Pro 工作流程与 cursor 的使用结合起来,非常强大,我们可以接受,验证这看起来是正确的,果然,我们有了我们的 UI,当然,因为我们还没有添加任何收据,所以不会找到任何收据,这完全没关系,这将在接下来的步骤中发生,所以让我们提交我们的代码,第七步,这太棒了,所以现在我们需要做相当多的更新,对吧,因为,嗯,让我们实际展开它,看看我们需要添加什么,我们需要添加 receipts page.tsx 中的所有内容,我想就是这样,我们当然需要点击刷新按钮,现在我们可以看到我们的 token 正在开始累积,所以只是提醒一下,你通常想将这个保持在最多 100,000 个 token 左右,如果你开始超过这个,你将需要开始删除对 AI 正在处理的特定步骤可能不必要的项目,所以让我们在这里创建一个新的聊天,让我们复制这个代码库上下文,让我们回到我们老朋友的代码生成提示,标记第七步为已完成,在现有的代码 XML 标签之间粘贴新代码,复制粘贴这个坏家伙,回到 01 Pro,然后喊 gbt,让我们让第八步工作,第八步将开始,嗯,实现我们的 uploader,好的,所以看起来是我们的第一个新文件,嗯,而且你可以看到其中一件事是,我们每次得到的文件格式略有不同,但你可以看到我们仍然得到所有一般的东西,对吧,我们得到,这是我做的,看,我们得到文件路径,我们得到所有代码,这意味着如果我们在这不同的聊天之间使用这个提示,并且仍然得到一致的结果,这意味着我们的提示是好的,好的,所以我们现在需要的是,我们需要这个 receipt-uploader,所以让我们进入那个,嗯,receipts components, receipt-uploader.tsx,粘贴它,好的,看起来它已经准备好了,将向下滚动到我们需要的文件,然后我们需要一个,看起来我们实际上正在做一个 API 路由,好的,所以这将是一个节奏的变化,所以我们将复制这个,我们将进入 app,然后这次我们需要进入 API,它的路由是什么,那是 receipts/upload,好的,所以这将是 receipts/upload,然后我们需要在这个里面有一个 route.ts,然后我们应该能够粘贴那个路由,看起来我们得到一个问题,所以让我们创建一个新的 composer 实例,我们将让 composer 做它的事情,并修复这个,看起来它是一个导入问题,好的,你可以看到这现在弹出了一个次要错误,这可能是因为它需要添加 await,果然,这就是问题所在,你会注意到,当你了解错误时,你可以预测它会做什么,顺便说一句,我非常故意地试图自己写尽可能少的代码,我试图向你展示,即使是初学者,你也不必自己写很多代码,所以这应该会让你不那么害怕,因为那个,好的,这就是整个目标,目标是向你展示如何用自然语言来做,这样我们就可以教你如何实际写代码,这有点像一个特洛伊木马,让你实际上学会写代码,嗯,好的,这是第二件事,然后看起来我们需要将新的 receipt uploader 添加到我们的,嗯,dashboard,所以这是我们可以用 cursor 做的一件相当容易的事情,所以没关系,所以我们可以做的是,我们实际上只是复制粘贴这个步骤,我们将创建一个新的 composer 实例,我们将使用那个相同的引用打开编辑器技巧,我们将粘贴那个消息,我们将把它交给 composer,我们将让 composer 完成这个步骤,所以我们正在尝试让 AI 为我们做尽可能多的工作,所以如果我们一会儿点击这个页面,你会看到我们将得到 diff,一旦它开始编写代码,然后我们可以审查它,我们将在这里做的是,你会看到 Owen Pro 的回应实际上指示我们测试上传,嗯,果然,我们想确保我们这样做,因为当你开始将你的 UI 连接到你的后端时,你会想确保所有这些东西都起作用,因为你不想跳过这一点,然后到达项目的结尾,然后才发现它坏了,你有点想在步骤中间发现步骤在哪里中断,这样你就可以,你可以看到我们现在有了 receipt uploader,我们应该能够接受它,然后回到我们的应用程序并实际测试这个东西,所以我要做的是,我实际上会展示,给你一秒钟,我将去拿一些收据,我们可以尝试一下,好的,所以让我们看看这个东西是否有效,我将把收据拖到这个框里,放下它,看起来什么都没发生,所以让我们回到我们的代码编辑器,在 cursor 中,让我们让 agent 知道它遇到了那个问题,我们将打开所有编辑器,我们将说,我们将说,嘿,我把一个文件拖到了 uploader 里,它不起作用,所以看起来 agent 可能已经识别出了问题所在,所以让我们点击 receipt uploader,看起来它找到了一个文件,其中一个文件引用有问题,所以让我们看看它是否真的能弄清楚这一点,所以你可以看到它正在应用更改,看起来我们正在添加很多不同的代码,然后它将检查 API 路由,以确保它在 API 路由中所做的任何事情都正确地完成,所以这基本上是我们上传这个文件作为 blob 的方式,所以你可以阅读代码,看看它在做什么,看起来它需要,嗯,调整一些东西,所以你可以在这里看到它所做的改进,然后我们将在这里手动继续测试,看看它现在是否有效,所以让我们刷新这个路由,我将再次尝试,所以让我们把这个文件拖进来,好的,太棒了,所以这次我们确实有一个选定的文件,让我们看看我们的上传是否有效,好的,所以我们可以看看我们的控制台,看起来我们确实得到了一个错误,所以我们可以做的就是复制我们得到的错误,我们将再次创建一个新的 composer agent 实例,引用我们的打开的编辑器,粘贴它,然后说请修复它,然后我们再次继续让 AI 为我们做所有工作,我们只是充当上下文管理器, sort of,迭代它给我们的错误,所以你可以看到它正在编辑我的 .env.example 文件,看起来,嗯,看起来它实际使用一切的方式是,我们需要从 superbase 获取另外两个密钥,所以我们将在这里进入并快速获取那些密钥,所以如果我们进入 superbase dashboard 并进入 Project settings,我认为我们可以进入 data API,我们应该能够获取我们的 URL,让我们接受这个,嗯,而且你可以看到,如果我们回到我们的 .local 文件,嗯,这里应该发生的是,看起来它实际上已经开始为我们工作了,但是我们想注意的一件事是,我们不想重复使用这个 service roll key,这个应该仍然是秘密的,我们实际上想要的是第二个密钥,我们想要这个 anon public key,它是公开的,这是完全没问题的,所以如果我们在这里粘贴它,嗯,然后再次尝试,我们应该能够让它工作,所以我们要做的就是,我们将点击我们的 superbase table editor,我们将尝试再次上传,我将拖入那个家伙,点击上传,让我们看看我们是否得到上传,看起来存储桶未找到,所以这实际上很有道理,因为这意味着我们需要去创建存储桶,所以让我们进去,我们将添加这个 composer,我们可以说我需要做什么,会发生什么,而且你也可以,顺便说一下,你也可以用 01 Pro 做所有这些事情,只是,嗯,它会告诉你,它只是需要更长的时间,好的,所以你可以在这里看到,composer 正在告诉我们该怎么做,所以我们必须进入 super base 中的 storage/buckets,嗯,storage,然后我们想进入 buckets,看起来我们需要创建一个新的 bucket,这就是我说的,好的,所以我们需要创建一个名为 receipts 的新 bucket,然后我们需要实际运行 sql,所以首先,让我们创建这个名为 receipts 的新 bucket,我们将保存它,然后我们必须进入 SQL 编辑器,因为它告诉我们我们需要运行一些 SQL,所以让我们复制它,我们将粘贴它,我们将运行它,看起来那个脚本成功运行了,然后它说我们还需要添加 NEXT_PUBLIC_SUPERBASE_RECEIPTS_BUCKET,所以让我们把它添加到我们的 .env 文件中,所以我们将把它添加到示例中,然后我们也将把它添加到 .env 文件中,嗯,然后我们应该能够做的一件事是,我们应该能够测试它,现在我们已经创建了存储桶,这应该可以工作,好的,这就是实际迭代它的样子,我们将上传,我们将看看我们得到什么,所以看起来我们实际上违反了行级安全,这与我们创建的策略有关,所以我们可能需要迭代它,所以我们将留在同一个 composer 实例中,因为它与我们一直在做的事情有关,所以它将进入 receipt storage actions,它将弄清楚我们实际上是如何上传这个的,它可能会要求我们调整一些东西,好的,所以你看到它创建了错误的策略,这完全没关系,它将给我们一个命令,在 subbay SQL 编辑器中运行,所以我们将这样做,只是删除我们之前的策略并创建一个新的,它将更新那些存储操作,而我们应该能够做的就是,我们应该能够再次接受这个,我们将刷新,我们将粘贴这个,我们将上传,看起来这次它没有出错,看起来它实际上正在工作,所以让我们看看我们的日志,以验证我们没有遇到任何问题,看起来我们在 action 中遇到了一个问题,看起来我们的,嗯,数据已成功提取,但看起来我们在其中一个列类型上遇到了数据格式问题,好的,所以现在这是一个新任务,我们将为此创建一个新的 composer 实例,嗯,当然,我们想引用我们的打开的编辑器,请修复,这应该只是更新 action 以修复列类型,所以我们将让它运行一会儿,进行我们需要的编辑,再次,我们只是用自然语言完成所有这一切,我们实际上不需要自己做任何工作,我们只是试图将错误喂给 AI,看看它是否真的能,嗯,修复东西,你可以看到它尝试了一次迭代,不起作用,所以它现在正在尝试另一次迭代,好的,所以让我们接受它,让我们给我们的新版本一个尝试,我拖放我的收据,我们将上传它,我们将让它运行,所以后端,对吧,正在发生的是,它正在运行那个提取函数,而且你可以看到我们确实收到了上传成功,这意味着如果我们去 superbase,如果我们去我们的表,我们现在应该在 receipts 中有一个值,所以现在它起作用了,它现在也正确地从收据中提取了我的数据,然后如果我们实际上去我们的存储桶,我们也应该看到我们有,嗯,收据正在存储,所以你可以看到这是我的收据的图像,所以这很酷,所以关于存储安全需要注意的一件事是,我们可能实际上想增加我们的安全性,并确保它生成的行级安全策略是正确的,好的,这是 AI 为你编写代码时非常重要的一点,所以这是开发者 McKay 将介入一会儿,我一直在尝试做整个 vibe code 的事情,让 AI 做尽可能多的事情,但是当涉及到像安全,像环境变量,我们已经提了很多次了,然后像表和存储安全,你真的想确保你要求 Owen Pro 实施最佳安全实践,我将在这里稍微忽略一下,只是为了继续前进,但这是你需要注意的事情,好的,所以此时我实际上只是,嗯,完全手动重置我的上下文,嗯,我们实际上需要删除那个组件,我们可以删除很多那些 token,嗯,我们将在这里开始一个新的聊天,我们也应该现在提交我们的代码,因为我们已经测试了上传工作,所以这将是第八步,我们将继续提交它,另一件值得一提的事情是,你想确保你总是要求 A1 Pro 或 cursor 保持你的环境变量安全,并确保你遵循最佳安全实践,所以我们要做的其中一件事是,因为我们在这一步添加了三个环境变量,我们必须回到 versell,我们必须添加那些新密钥,所以我们将点击环境变量,我们将粘贴它们,你可以看到我们甚至得到一点警告,所以我们的 super base 的 anon key 完全没问题,它是公开的,所以我们实际上不需要担心这个,所以我们可以,嗯,点击保存并重新部署,并确保那些环境变量被添加进来,好的,所以现在我们有了更新的上下文,所以让我们复制过去,让我们回到我们老朋友的代码生成提示,我们将标记第八步为已完成,这绝对是我们迄今为止最复杂的一步,有很多错误需要迭代,嗯,显然这是你手动测试,复制粘贴错误消息,与 01 Pro 和 cursor 合作以获得正确的结果,然后我们将粘贴新的代码,复制过去,现在我们可以开始第九步,好消息是,接下来的一切都将比第八步容易得多,第八步只是最难的,由于存储设置的性质,所以如果你能够设置 super b super base 存储,大大的赞美你,这对于初学者来说不是一件容易的事情,但当然,这是每个初学者都想学习的事情,我如何做文件存储,嗯,希望你对如何做到这一点有一点了解,所以第九步,6 分钟 53 秒,这是一个巨大的步骤,基于生成时间,我们将看看它实际写了多少代码,但看起来我们现在需要更新我们的 dashboard wrapper,这将是一个文件更新,所以让我们复制它,然后我们,嗯,我们将,嗯,清理一下,我们需要打开 dashboard wrapper,当然,我们需要粘贴完全更新的文件,好的,然后下一个我们将要处理的文件看起来我们需要创建 verification 页面,好的,所以现在我们将进入 verify 步骤,让我们复制它,我们需要在 verify 路由组中创建一个新页面,我们将进入 page.tsx 并粘贴它,看起来我们都很好,除了我们需要添加一个组件,看起来我们将得到 verification-list 组件,所以我们现在就创建它,verification-list.tsx,并且假设这应该是我们列表中的下一项,果然,所以我们将复制粘贴这个家伙在这里,看起来我们得到一个表格式,这相当不错,看起来我们遇到了一些问题,让我看看是否有任何其他文件需要处理,看起来我们确实需要一个 API 路由,所以我们将暂时搁置问题,看起来在 app/api/receipts 中,我们实际上需要一个更新,所以看起来这可能不是我们想要的,因为我们实际上可以,嗯,我们可以从客户端组件调用服务器操作,我们只是不能在里面创建它们,所以我要做的是,我将告诉 01 Pro,看看它是否能快速调整,所以让我说,嗯,是的,我将在 01 Pro 中这样做,我只是会说,实际上我们可以使用客户端组件中的服务器操作,我们只是不能在客户端组件内部创建它们,而我们要做的就是,我们将要求它再做一次,知道这一点,好的,所以这是我们之前使用的一个技术,理论上我们可以坐在这里让它根据那个新知识更新它所做的,它现在拥有所有这些新知识,好的,所以我们得到了更新的版本,这是非常正常的,有时一 Pro 会走错路,无论是你提示它不好,看起来在这种情况下我可能提示它不好,或者它只是做了错误的事情,所以有时你只需要,嗯,你只需要适应,要么开始一个新的聊天,要么让它更新东西,果然,看起来这应该有望解决问题,所以让我们将代码复制到 dashboard,接下来,我们需要在,嗯,verify 创建一个新的服务器页面,当然,我们已经在这里创建了,我们只是用新版本更新它,然后我们去第三步,看起来我们需要添加一个新的新函数,所以你看到我们有 receipt-actions 的完整文件,所以让我们回到我们的,嗯,receipt-actions,它在 db 中,我们可以希望粘贴它,然后我们应该能够向下滚动,让我们看看,这显然是一个很大的文件,嗯,我们现在需要复制更新版本的 verification-list 的代码,我相信这可能就是我们所需要的一切,好的,所以我们此时可以做的就是,当然,我们可以,嗯,修复我们的错误,这将是这个 slice,所以我们将在这里做的是,我们将使用 composer 按钮,我们将点击 fixing composer,然后 cursor agent 将为我们修复它,所以你看到它能够搜索代码库,弄清楚错误是什么,它不仅在那里修复了它,而且还在这个地方也修复了它,这很好,对吧,所以我们可以接受它,这只是,嗯,我们导入的一个过时的链接问题,所以我们只需要重新加载我们的编辑器,我们应该能够,嗯,我不确定为什么它在抱怨,实际上,让我们,嗯,让我们双重检查我们的导入是否正确,好的,那很好,现在让我们去我们的应用程序,如果我们点击这个 verify 页面,我们应该能够看到,嗯,看起来我们的链接坏了,让我们快速回到我们的 dashboard,其中一件事,对吧,这就是为什么你需要确保你正在审查你的代码,因为我猜这个被覆盖了,所以我们实际上只需要修复那个链接,很容易修复,点击 verify,我们应该能够去 verify 页面,太棒了,所以果然,我们可以添加一个类别,所以让我们说这是软件,软件,2月13日,21.49美元,我们应该能够点击 verify,看起来它不起作用,所以让我们看看,嗯,实际上我应该看看我的规划师,因为,再次,伙计们,这,这简直就是为什么你需要确保你正在审查事情,所以看起来,嗯,它应该工作,所以让我们刷新一下,并确保它,嗯,工作,所以看起来,是的,它不起作用,所以我们可以做的就是,我们可以去我们的,嗯,控制台,看看我们是否有任何错误,看起来只是按钮完全不起作用,所以我们可以做的就是说,嘿,点击 verify 按钮不起作用,我们将引用所有那些打开的编辑器,看看我们是否能解决那个问题,所以让我们看看 composer 会得出什么结论,正如你所看到的,它正在编辑 receipts-actions,所以可能其中的一个操作被错误地完成了,所以我们将看看那里发生了什么,看起来可能是问题出在 verification-list,所以它将尝试对那个按钮进行一些调整,所以理论上这个 handle-verify 函数需要,嗯,以不同的方式完成,所以让我们接受那些更改,然后再次尝试,好的,所以理论上 composer 应该已经修复了这个问题,所以让我们点击 verify,好的,看起来我们确实收到了那个收据验证,然后如果我们回到我们的 receipts 页面,我们现在应该看到它从 no verified 切换到了 yes verified,当然,我们可以去检查我们的 super base 表并验证这是正确的,果然,它是,所以太棒了,所以现在,嗯,这个步骤是什么,n,如果你不小心,肯定会丢失这些步骤,所以让我们提交这个的代码,嗯,我们将清理一下,让我们去,嗯,这是第九步,提交这个代码,现在让我们开始第十步,所以我们将再次,嗯,创建一个新的聊天,我们将刷新这个,我们实际上需要做的是,我们在这里添加了什么,伙计们,让我们展开,所以我们添加了 verify stuff,然后我们刷新了一些操作,那应该就可以了,是的,看起来不错,好的,所以我们将复制它,我们将回到我们的提示,我们将,嗯,标记第九步为完成,粘贴我们的代码,这是完全更新的,我们将启动第十步,我们现在有了我们需要添加删除按钮的代码,所以我们可以实际删除 receipts,出于某种原因,对吧,我们在 verification 过程中犯了一个错误,我们上传了东西,然后正确,也许我们上传了重复项,谁知道呢,对吧,所以让我们处理一下,看起来我们有一个更新的 receipts-actions,所以这个文件应该对我们来说很熟悉了,好的,所以我们将复制粘贴它,这将用新代码覆盖它,然后我们应该会有一些 UI 更新,看起来 receipts-list 正在得到更新,对吧,这有道理,这可能是删除按钮将出现的地方,我们将保存它,看起来第十步已经完成,现在我们只需要手动测试删除按钮,所以理论上我们可以按,我一直在说理论上,顺便说一句,我们应该停止,我们确实得到一个很好的确认对话框,所以这是 AI 的一个好工作,然后如果我们,嗯,刷新这些页面,我们可以甚至看到,如果我们刷新 super base,果然,那个记录已经消失了,所以 0 Pro 完全掌握了这一步,那是一个简单的步骤,就像我说的,一旦你完成了那些困难的步骤,所有的小功能和东西就变得非常非常非常容易了,所以这个工作流程的一个要点是,你真的只需要努力完成那些主要的核心任务,然后一旦你开始调整 UI 并添加一些功能,会发生什么呢,你知道,因为在 repo prompt 中,我们获得了越来越多的代码库上下文,这就像,嗯,AI 能够更好地推断我们的工作方式,我们希望我们的代码如何编写,如何添加东西,所以你的代码库中写得越多,生成新东西就越容易,这是一个,嗯,非常酷的事情,好的,所以让我们提交第十步,然后继续第 11 步,我们显然需要创建一个新的聊天,我们需要刷新代码,我们没有添加任何新文件,我们只是编辑了现有文件,所以刷新就可以了,我们将复制,回到我们的提示,然后,嗯,我实际上要做的是,伙计们,因为第 11 步是我们最后一个功能,我实际上只是想去掉第 13 步和第 12 步,因为这些东西涵盖了一些你想要使用我们 review prompt 的东西,所以这将是我们的最后一步,我们将让这个导出 CSV 工作,当然,我需要粘贴我刚刚复制的代码,所以让我们让这个最终的功能运行起来,然后我们将实现它,然后讨论 review prompt,所以这看起来是我们最长的生成时间,7 分钟 17 秒,O Pro 为我们工作了,所以让我们看看我们需要做什么,这显然是我们的导出 CSV 功能,所以看起来我们有一个 receipt-action 更新,所以让我们更新我们老朋友的 receipt-actions,我们应该能够粘贴整个代码,你可以看到这现在是 577 行代码,所以 01 Pro 能够非常一致地输出非常长的代码文件,我们继续滚动,好的,所以看起来我们有一个新的 API 路由,这是我们想要的一个 API 路由,所以这是正确的,不像以前它错误地生成了一个,所以我们想要 app/api,好的,app/api/receipts,这次而不是 upload,我们实际上想要一个新的文件夹叫做 export,这将给我们一个新的路由,当然,我们需要创建我们的 route.ts 文件,我也意识到这应该只是 ts,所以让我们确保我们,嗯,调整一下,然后我们要做的就是,我们要复制我们的代码,粘贴到我们的 export 路由中,我们应该能够得到导出功能所需的代码,所以现在让我们看看它实际上在哪里添加了导出按钮,所以看起来在 receipts page components 文件夹中,我们需要,嗯,它叫什么,它叫 export-button.tsx,好的,我们可以粘贴它,最后但并非最不重要的是,我假设我们将把它添加到我们的 receipts 页面,是的,所以让我们复制它,然后让我们把它添加到 receipts 页面,然后如果我们向下滚动,这应该是我们需要的一切,我相信,是的,第 11 步完成,所以当然,让我们测试一下这个实际上是否有效,我们现在应该看到一个导出到 CSV 的按钮,我们确实看到了,这很棒,所以让我们点击它,看看它是否有效,我们可以打开它,然后砰,我们有了我们的,嗯,CSV 导出功能,这很酷,显然我们只有两行在这里,所以它不是一个令人印象深刻的导出,但知道我们可以做到这一点很好,对吧,我们可以去 verify,我可以去验证我刚刚添加的这两个收据,以测试这个特定的实例,你可以看到这些是已验证的,这很好,理论上我们应该能够搜索 rebrickable,搜索,所以看起来我们的搜索坏了,所以这是我们想在 cursor 或 o1 Pro 中迭代的东西,我们稍后会讨论 review prompt 和接下来的步骤,嗯,但是的,这很酷,这是我们从原始请求提示中要求的完整功能集,所以我们将在这里停止,我显然可以坐在这里,字面意思是,你可以不断地迭代这个,一次又一次地,不断地构建你的产品,这个教程的目的当然是向你展示如何通过编写非常少的代码,我希望你真的花点时间来欣赏我们实际编写的代码量,当我们提交第 11 步时,对吧,我们基本上试图将尽可能多的东西交给 O Pro,而且还有一点值得注意的是,当你们在你们自己的想法和你们自己的项目的工作流程中工作时,也会更快,因为我没有试图在整个过程中说话,所以工作流程更有效率,感觉非常,嗯,流畅,感觉非常未来感,感觉就像与 AI 在未来工作应该是什么样子,在我看来,所以我们将,嗯,继续讨论 review prompt,只是为了谈论它,然后我确实想谈谈接下来的步骤,因为我们在这里所做的真的只是一个开始,所以,所以让我,让我在这里停下来,我会在那里解决,此时你已经拥有了所有初始功能,对吧,这已部署到真实的 URL,并且可以正常工作,一切都已更新,如果我们去这个 URL 上的 /receipts,它将带我们到仪表板,太棒了,所以一切都已部署,一切都已准备就绪,但是如果你想继续迭代它并继续构建怎么办,所以这就是我们将要谈论几分钟的内容,所以我想在这里强调的一件事是,如果你去 repo prompt,你会看到我们真的只有大约 54,000 个 token,所以我们真的只是在触及 A1 Pro 能做什么的表面,这很有意义,因为我们真的只添加了几种相当基本的功能,所以如果你想继续这样做,我提过几次,但你总是想确保你的上下文在 100,000 或以下,所以显然我们还有很长的路要走,我们有很多不同的功能可以用这个工作流程来实现,所以,假设你想处理额外的功能,假设你想改善用户体验,假设你想改进设计,你将如何用现有的工作流程来完成所有这些事情,所以你基本上需要做的一件事是,你可以几乎只是循环一遍工作流程,好的,所以让我们实际上谈谈这在实践中意味着什么,所以你可以跳过的一件事是,你可以跳过 quest prompt,你基本上会想输入类似的输入到 spec prompt,所以那就是我们开始的地方,所以你知道,让我们想想我们可以做的一些事情,对吧,我们可以为收据添加批量上传,我们可以添加团队功能,我们可以添加查看单个收据,我们可以添加图表和报告之类的内容,所以你要做的就是,你要复制 spec prompt,所以让我们实际模拟一下,我们将覆盖我在这里添加的示例输入,所以我们要做的就是,我们将在这里粘贴它,你要做的就是,在你的项目请求中,在这些 XML 标签内,你会想描述你想要的那些附加功能

构建非常类似于提示符的输出,该输出提示符看起来像是请求的输出,或者说是请求提示符的输出。所以你想做的是,你会说,嘿,这些是我接下来要处理的功能。我在这里显然是在过度简化,对吧?你会说,好的,我想做批量上传,我想做,我想做团队功能,我想添加带有图表分析的仪表板,你知道,图表加上分析。我想添加,嗯,实际上我撤销了那个,显然我不能重做那个,你们明白我的意思。我想查看单个收据,所以你在这里可以做的是,你可以说,清理用户界面,使其看起来像,或者,生产级。你几乎可以把你接下来想处理的每一件事都放在这里,然后你会做的就是,当然,你会在这里粘贴你的光标规则,你会替换掉入门模板。所以现在你想粘贴当前的代码,所以你会去仓库提示符,你会得到完全更新的代码,然后你会把它交给规范,然后规范会做的是,它会引导你完成技术规范。然后你会为规划器提示符做同样的事情,然后你会得到你想要处理的新功能的新计划,然后你会再次运行代码生成。对,所以你可以对任何你想处理的任务重复这个过程。所以如果你想逐个功能地处理,然后用规范提示符处理它,然后把它传递给规划器,处理那个功能,也许你做审查提示符来清理所有东西,然后你就可以为所有你想处理的不同主要功能循环完成这个过程,这就是这个工作流程的样子,超出了我们在这里所做的。所以再说一遍,我可以坐在这里一整天,真的像三个月,并继续使用这个工作流程来迭代这个产品。我只需要管理我的上下文窗口,在,在仓库提示符这里,我们可以继续迭代和添加更多功能,各种各样的事情,对,所以重要的是你理解这个工作流程是如何工作的,因为在实践中,当你处理自己的项目时,你会想做我在这里说的,对,你会想从你开始的基本最小可行产品开始,然后你会想继续把它变成一个越来越专业、生产级的应用程序。所以这就是如果你要继续沿着这条路走下去的工作流程的样子,对,你基本上会再次循环所有提示符,但不是从那个请求提示符开始,你会想出你的新功能请求,然后你会不断地将更新的代码库馈送到所有这些不同的步骤中,你一步一步地运行代码生成提示符,然后砰,突然你就在写应用程序,你正在用 01 Pro 构建应用程序,它几乎做了所有的繁重工作,然后你只需要用光标做一些小事情,而且你可以用自然语言做很多这些事情,就像我再说一遍,我想强调我们实际上写了多少代码来达到我们所拥有的。所以显然这是一个相当基本的功能集,但它仍然很酷,对,我们有一个真正的用户界面,它连接到一个实时数据库,有身份验证,有支付,好的,它已经部署了,对,我们可以从已部署的 URL 查看它。我现在当然必须删除所有这些项目并清除我的环境变量,在我为你们发布这个视频之前,所以我必须去做,但是让我们也谈谈一些额外的学习资源,对于那些第一次接触这个的人来说,也许你喜欢这个工作流程,也许你想学习如何在其他方面采用这个工作流程,也许你认为光标非常酷,你想了解更多关于光标的信息,让我们稍微谈谈这个。希望你觉得从这个研讨会中学到了很多东西。所以为了回顾一下你希望学到的东西,你学会了如何编写非常健壮的提示符,并且不仅能编写它们和分析它们,而且还能在实践中为实际任务使用它们。所以希望通过简单地阅读这些提示符,你们已经看到了大量高质量提示符的例子。我们认为提示符是你能够学习到的最高杠杆技能之一。我不同意的一点是,有些人说随着模型变得更好,提示符变得不那么强大。我实际上完全同意,或者说我不同意。我认为模型变得越强大,提示符实际上就越重要,因为你实际上可以利用模型做更多的事情。所以如果你是一个能够写出很棒的提示符的人,这真的就是有效地沟通指令,就像一个非常非常高效的经理一样,我认为你将远远领先于你的同行。所以希望你觉得你掌握了一些提示符技能,你当然学会了如何使用 Superbase 处理实时数据库,你学会了如何使用 Clerk 构建身份验证,我们当然部署到了 Vercel,所以你应该希望你掌握了如何将你的应用程序部署到互联网,以便其他用户实际上可以访问它。我们学习了如何使用像仓库提示符这样的工具,以便你实际上可以管理你的上下文。我们回顾了如何使用 01 Pro。学习如何使用 01 Pro 的伟大之处之一就是学习如何使用 AI 模型。所以无论你是喜欢谷歌模型、云模型、Anthropic 模型还是 OpenAI 的 GPT 模型,你都将能够更好地使用所有这些不同的模型,这是你在整个世界上能够学到的最高杠杆技能之一。所以如果你是一个对学习更多东西感兴趣的人,我们在 Takeoff 上有很多非常棒的内容。所以如果你觉得这个有帮助,这就是我全职做的事情。我们有关于使用 AI 构建全栈应用程序的课程。所以如果你想了解更多关于全栈架构的内容,并深入研究一下,我们有适合你的东西。我们做像 RAG 和检索式提示工程这样的事情。我们的光标课程刚刚更新。所以如果你是一个真正喜欢光标中的教学,并且想在这方面做得更好,我们有一些非常棒的课程。当然,我们一直都在举办研讨会,教授最新的技能。所以如果你是一个想学更多东西的人,我认为即使你不想加入,你至少也可以在我们的登陆页面上查看所有这些内容的教学大纲。当然,YouTube 上也有很多非常棒的免费内容,你可以去看看。我当然也做了大量的免费指南和教程。所以如果你觉得这个有帮助,我非常感谢你能点赞并分享给你的朋友们,订阅真的能帮助我继续为你们提供所有这些免费教程。所以希望你觉得这个有帮助,更重要的是,你觉得你更有能力去实现你脑海中的想法并真正去构建它们。很高兴我们能为你们做到这一点,很高兴能和你们一起构建这个。