Cal.ai 是一个可以通过电子邮件与您的日历进行交流的应用程序:
- 将非正式的电子邮件转换为预订,例如转发“明天下午2点见面怎么样?”
- 列出并重新安排您的预订,例如“清空我的下午”
- 回答关于您最繁忙时间的基本问题,例如“我的星期二看起来如何?”
核心逻辑包含在agent/route.ts中。在这里,一个LangChain Agent Executor被指派跟随您的指令。根据您最后已知的时区、工作时间和繁忙时间,它尝试对您的预订进行CRUD操作。
AI代理人只能从一组工具中进行选择,而无需查看您的API密钥。
通过receive/route.ts中的电子邮件清理和路由进行电子邮件的处理,使用MailParser。
传入的电子邮件根据电子邮件地址进行路由。地址通过DKIM记录进行验证,使其难以伪造。
入门指南
开发
如果尚未,请运行root设置步骤。
在运行应用程序之前,请参阅env.mjs以获取所有必需的环境变量。在此文件夹中运行cp .env.example .env
以开始。您将需要:
- 一个OpenAI API密钥,具有访问GPT-4的权限
- 一个SendGrid API密钥
- 一个默认的发件人电子邮件(例如,
me@dev.example.com
) - Cal.ai应用程序的ID和URL
- 一个唯一值用于
PARSE_KEY
,使用openssl rand -hex 32
要同时启动API和AI应用程序,只需运行yarn dev:ai
。
代理体系结构
agent/route.ts中的调度代理调用了一个LLM(在本例中为GPT-4)循环完成多步任务。我们使用了一个OpenAI Functions代理,该代理经过了微调,以输出适合传递给工具的文本。
工具(例如createBooking
)只是JavaScript方法,由Zod模式包装,告诉代理输出的格式。
这是完整的架构:
电子邮件路由器
要公开AI应用程序,您可以使用Tunnelmole,一个开源的隧道工具;或者nGrok,一个流行的封闭式隧道工具。
对于Tunnelmole,在新的终端中运行tmole 3005
(或AI应用程序的端口号)。如果端口号不同,请将3005
替换为端口号。在输出中,您将看到两个URL,一个http和一个https(我们建议使用https URL以获得更好的隐私和安全性)。要安装Tunnelmole,请使用curl -O https://install.tunnelmole.com/8dPBw/install && sudo bash install
。
对于nGrok,在新的终端中运行ngrok http 3005
(或AI应用程序的端口号)。您可能需要先安装nGrok。
要将传入的电子邮件转发到路径/agent
的无服务器函数,我们使用SendGrid的入站解析。
- 确保您拥有SendGrid账户
- 确保您有经过身份验证的域。转到设置 > 发件人验证 > 验证。对于DNS主机,请选择“I’m not sure”。单击下一步,添加您的域,例如
example.com
。选择手动设置。您将获得三个CNAME记录,添加到您的DNS设置中,例如在Vercel Domains中。添加这些记录后,单击验证。 - 为您的域授权电子邮件使用MX记录:一个名称为
[your domain].com
,值为mx.sendgrid.net.
,另一个名称为bounces.[your domain].com
,值为feedback-smtp.us-east-1.amazonses.com
。如果提示,将优先级设置为10
。 - 转到设置 > 入站解析 > 添加主机和URL。选择您的经过身份验证的域。
- 在目标URL字段中,使用上面的Tunnelmole或ngrok URL,以及路径
/api/receive
和一个参数parseKey
,它位于此应用程序的 .env中,下面是PARSE_KEY
。完整的URL应该类似于https://abc.tunnelmole.net/api/receive?parseKey=ABC-123
或https://abc.ngrok.io/api/receive?parseKey=ABC-123
。 - 激活“POST原始的完整MIME消息”。
- 发送电子邮件至
[anyUsername]@example.com
。您应该在Tunnelmole或ngrok侦听器和服务器上看到一个ping。 - 调整receive/route.ts中的逻辑,保存以进行热重载,并发送另一封电子邮件以测试行为。