好吧，下一篇很无聊，因为你知道的。
好吧，我引入了我们之前使用过的相同的发送电子邮件工具。
这就是我们正在使用装饰器的功能工具。
如果您还记得如果您想将函数转换为可以的东西，则可以使用该装饰器
一个工具。
它会在幕后为您生成所有 JSON。
因此，这是发送电子邮件的主题和正文，它会发送一封包含给定主题的电子邮件
身体。
我们将像以前一样使用 SendGrid。
希望您仍然拥有您的帐户并且将其保存在您的 env 文件中。
请记住更改此电子邮件。
让我将其更改为您经过验证的电子邮件。
是的，请也更改这一点。
再次强调，不要向我发送大量包含人工智能生成内容的电子邮件，但请务必向我发送包含以下内容的电子邮件：
你的问题。
当然，我总是欢迎他们，但我不太欢迎人工智能生成的搜索深度研究的东西。
呃，那么呃，内容就是，呃，HTML 版本，然后我们像以前一样发送电子邮件。
那是我们的工具。
你不需要看到这个，但无论如何我都会向你展示它。
如果我把这个打印出来你就记得了。
它在这里做什么？
如果我只是打印出来，我们应该看到我们得到一个带有描述等的功能工具。
如果您不确定为什么会发生这种情况，请查找装饰器。
确保您了解装饰器的工作原理以及它们如何转换这样的函数。
好吧，考虑到这一点，这是一个电子邮件代理。
这对你来说已经是老生常谈了。
现在我们已经这样做了好几次了。
根据说明，您可以根据详细报告发送一封格式良好的 HTML 电子邮件。
您将收到一份详细报告，您应该使用您的工具发送一封电子邮件，提供
报告。
将其转换为带有主题行的干净、呈现良好的 HTML，以便您可以看到我不再尝试
打破局面。
我给予该代理完全自由裁量权来提出主题行、重写电子邮件、执行以下操作
整个过程都使用 GPT 4 mini，我们为它提供了一个实际发送电子邮件的工具。
这就是我们的电子邮件代理。
这对你来说已经是旧闻了。
你知道，这太棒了。
好吧，好吧。
我们即将成为现实。
所以我会，呃，暂停一下，然后我们将进入该项目的真正内容。
好的。
因此，我们再次有了另一个将使用结构化输出的代理。
这就是研究员。
因此，您是一名高级研究员，负责为查询编写一份有凝聚力的报告。
研究助理将为您提供原始查询和一些初步研究。
您提出报告大纲，描述报告的结构和流程，并且
然后生成报告并返回，因为您的最终输出应该是 markdown 格式，所以它应该很长，
详细的5到10页的内容至少一千字。
好的，情况就这样了。
现在我们将使用结构化输出。
同样，我们将有一个报告数据迂腐对象，它是基本模型的子类。
它有一个简短的摘要，我们以 2 到 3 句话的简短摘要开始。
完整的 Markdown 最终报告以及一些后续建议。
建议进一步研究的主题。
所以这是一个代理。
它将接受这些指示。
它将使用 GPT 4 或 mini 输出类型。
您可以在此处指定我们使用结构化输出。
输出类型是报告数据。
这就是我们的报告作者。
这是我们的作家经纪人。
这是我们进入该项目的实际流程之前的最后一个构建块。
好的。
所以现在是关键时刻。
我们有五个功能让我向您展示。
但它们相对简单。
它们非常简单。
我将向您展示其中三个，然后是两个。
前三个将使用我们之前定义的两个代理来执行搜索
规划代理和搜索代理。
而这些函数，你可以看到它们非常短。
它们非常简单。
让我告诉你他们各自的搜索计划。
好的。
这非常简单地调用 runner run 来让我们的规划器代理传入查询。
我们进行查询并将其传递给规划代理。
请记住，计划代理将进行多次搜索。
因此，我们将计算有多少搜索并打印出来。
我们将返回最终输出，该输出采用搜索列表的形式。
这就是格式化它的原因。
再说一次，这里就是这个东西，网络搜索计划，网络搜索项目的列表。
好的。
我们回去吧。
好的。
那么下一个功能就是执行搜索。
这是我们真正要对其中每一个进行搜索的时候。
现在你还记得我不久前向你展示过 asyncio 吗？
这是并行运行事物的好方法。
现在正是时候。
因此，我们将创建一堆异步任务来搜索结果中的每个项目
这些搜索。
这是 Pydantic 对象，搜索感觉为您提供搜索项列表。
对于每个项目，我们将称之为搜索搜索。
我们将讨论的下一个函数将称为搜索。
我们要去。
这为您提供了一个协程，因此我们可以将其转化为任务。
然后我们可以使用我告诉过你的关于异步收集的这种收集方法。
如果您随后等待，它将并行运行所有这些任务，并且结果将进入结果。
然后我们就完成了。
所以希望我没有在那里失去你。
基本上我想说的是我们从规划者那里得到结果，我们只是搜索所有这些
使用搜索代理并行处理事情。
这就是我们实际使用搜索代理的方式。
我们给它一个输入。
我们实际上所做的不仅仅是告诉它查询。
我们还告诉它我们正在寻找的原因。
请记住，我说过我们要求一个理由的原因不止一个。
这也是我们可以在这里提供一些背景信息的原因。
然后我们，呃，我们运行搜索代理，然后返回搜索的最终输出。
好的。
希望你遵循这三个。
如果没有，请回来查看这些简短的函数，以便它应该有意义。
最后是一些家政服务。
两个功能。
其中一名负责撰写报告，一名负责发送电子邮件。
撰写报告将使用撰写代理。
呃，它将运行那个以 HTML 形式重构输出的代理。
最后我们将使用电子邮件代理编写一封电子邮件。
然后这将完成该过程。
所以我应该运行这两个来定义这两个函数。
这两个这五个功能。
现在我们应该为演出做好准备了。
好的。
如果你是不喜欢我只执行代码并与之对话的方式的人之一，
这是一种懒惰，那么你就会快乐。
这次我将输入代码，以便我们一起完成这部分。
所以这是一个关键时刻。
我们要说，就像痕迹研究一样，痕迹诅咒已经填补了它。
我不是。
不，我没有运气。
好吧，我要忽略诅咒在这里所说的内容。
我不看那个。
所以我们要打印一条消息，比如开始研究。
有时光标太好了。
好吧，让我们摆脱光标。
没有作弊。
我没有看我没有看光标说搜索。
如果我输入不同的内容怎么办？
呃。
混淆光标。
好的。
现在搜索。
那是行不通的。
仍然是。
它仍然弄清楚了。
好的。
但我们就这样吧。
它知道。
所以我们要做的第一件事是有一个名为搜索计划的变量，它将等待
规划搜索。
因此，如果您来到这里，就会计划进行搜索。
这是第一步。
我们这样做。
好的。
下一步是搜索结果。
我们将进行搜索。
因此，我们来到这里执行搜索计划中传递的搜索。
这就是我们也在等待的下一步。
我们需要做的下一件事是实际运行该报告。
因此，我们等待编写报告，传递查询和搜索结果。
光标和你一样清楚。
您已经说过我们下一步需要做的是发送电子邮件。
确实如此。
我可以取出然后我可以打印。
好的。
我们不会，我们会做一些与光标建议不同的事情，以表明我们在这里有一些自主权。
我们不仅仅被机器统治。
好的，我们开始吧。
让我们开始吧。
让我们运行一下。
于是就开始了研究。
它正在计划搜索。
它将通过搜索来执行。
原来如此。
而且已经完成了。
所以。
因此，它使用了一个代理来确定要执行的三个搜索。
然后，对于其中的每一个，它都使用 OpenAI 的远程托管工具来实际执行搜索。
它返回了所有结果。
我们现在使用代理来综合结果并将其转换为报告使用。
它将生成一个 Markdown 格式的报告，然后将其转换为 HTML 电子邮件。
所以，嗯，我们会让它发挥作用。
我们回来吧。
最终报告是采用这种格式，其中 Markdown 作为其中的一部分。
这就是我们现在正在写电子邮件的部分。
在撰写电子邮件时，双方都会提出主题行。
它还会将其写入 HTML 电子邮件。
希望我很快就能收到那封电子邮件。