首页 >web前端 >js教程 >使用可重用代码构建人工智能驱动的电子邮件代理

使用可重用代码构建人工智能驱动的电子邮件代理

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-24 08:47:14990浏览

Build an AI-Powered Email Agent with Reusable Code

为什么要自动化您的任务?

大家好?!作为一名应用程序开发人员,我很高兴与您分享如何创建简单但功能强大的代理来自动执行日常任务。

?和你们许多人一样,我每天都会收到大量电子邮件。尽管我尽了最大努力,实现难以捉摸的收件箱清零仍然是一个挑战。整理订单确认和发货更新等电子邮件既乏味又耗时。

但好消息是:自动化可以拯救世界

?我编写了一个利用 AI 来帮助自动进行电子邮件分类的基本脚本,您也可以。

在本文中,我将分享可重用的代码片段,以帮助您构建适合您需求的自动化代理。 ?


自动化之美

有无数的工具,包括无代码平台,可以为您处理整个流程。但是,我更喜欢将任务分解为模块化代码片段。为什么?

  1. 灵活性:模块化代码可以轻松适应不断变化的需求。
  2. 可重用性:编写一次,永远使用。
  3. 可维护性:小而独立的代码块更容易调试和改进。

通过采取增量方法,您可以逐渐用自动化步骤取代手动步骤。

?‍?我用于制作脚本原型的首选工具是 Znote——一款具有实时编码和 AI 功能的笔记本,可以帮助我跟踪和增强我的工作流程。尝试一下,或者使用您最喜欢的 IDE!


让我们构建一个电子邮件自动化代理

目标

当新电子邮件到达时,我们希望:

  1. 阅读电子邮件并提取相关信息。
  2. 使用法学硕士从预定义列表中确定其类别。
  3. 创建 Gmail 标签(如果它们尚不存在)。
  4. 更新电子邮件的标签以反映指定的类别。

入门

先决条件

第 1 步:启用 Gmail API

  1. 转到 Google Cloud Console 并启用 Gmail API。
  2. 为桌面应用程序设置 OAuth 凭据。按照以下步骤下载 google-credentials.json 文件并将其放置在项目目录中。

第2步:安装Ollama

下载 Ollama 来运行本地法学硕士。安装后,下载模型:

ollama pull mistral  

第三步:安装依赖项

安装所需的 Node.js 库:

ollama pull mistral  

编写代码

1. 使用Google API进行身份验证

设置与 Gmail 的 OAuth 连接:

npm install -S @google-cloud/local-auth googleapis openai  

2. 创建 Gmail 标签

使用此函数创建标签并检索其 ID:

// google-api.js
const fs = require("fs");
const path = require("path");
const { authenticate } = require("@google-cloud/local-auth");
const { google } = require("googleapis");

class GoogleAPI {
  constructor(credentialFilename) {
    this.TOKEN_PATH = path.join(__dirname, `token-${credentialFilename}`);
    this.CREDENTIALS_PATH = path.join(__dirname, credentialFilename);
    this.SCOPES = [
      "https://mail.google.com/",
      "https://www.googleapis.com/auth/gmail.modify",
    ];
  }

  async authorize() {
    const loadSavedCredentials = () => {
      try {
        const content = fs.readFileSync(this.TOKEN_PATH);
        return google.auth.fromJSON(JSON.parse(content));
      } catch {
        return null;
      }
    };

    const saveCredentials = (client) => {
      const keys = JSON.parse(fs.readFileSync(this.CREDENTIALS_PATH));
      fs.writeFileSync(
        this.TOKEN_PATH,
        JSON.stringify({
          type: "authorized_user",
          client_id: keys.installed.client_id,
          client_secret: keys.installed.client_secret,
          refresh_token: client.credentials.refresh_token,
        })
      );
    };

    let client = await loadSavedCredentials();
    if (!client) {
      client = await authenticate({
        scopes: this.SCOPES,
        keyfilePath: this.CREDENTIALS_PATH,
      });
      if (client.credentials) saveCredentials(client);
    }
    return client;
  }
}

module.exports = GoogleAPI;

3.阅读电子邮件

从消息 API 中提取详细信息:

async function createAndGetLabels(labelsToCreate) {
  const google = await getGoogleClient();
  const gmail = google.gmail({ version: "v1" });

  const existingLabels = (await gmail.users.labels.list({ userId: "me" })).data.labels || [];

  const labelsMap = new Map();
  for (const label of labelsToCreate) {
    const existing = existingLabels.find((l) => l.name === label);
    if (existing) {
      labelsMap.set(label, existing.id);
    } else {
      const res = await gmail.users.labels.create({
        userId: "me",
        requestBody: { name: label },
      });
      labelsMap.set(label, res.data.id);
    }
  }
  return labelsMap;
}

4.解密相关信息

从电子邮件中提取有意义的详细信息:

async function readEmails(gmail, maxResults = 10) {
  const res = await gmail.users.messages.list({ userId: "me", labelIds: ["INBOX"], maxResults });
  return Promise.all(
    res.data.messages.map(async ({ id }) => {
      const email = await gmail.users.messages.get({ userId: "me", id });
      return email.data;
    })
  );
}

5. 使用法学硕士进行分类

集成 Ollama 或 OpenAI 对电子邮件进行分类:

function extractMailInfos(mail) {
  // Define the headers to extract
  const relevantHeaders = ["Date", "Subject"];

  // Extract and structure the relevant headers
  const headers = mail.payload.headers
    .filter(header => relevantHeaders.includes(header.name))
    .reduce((accumulator, header) => {
      accumulator[header.name] = header.value;
      return accumulator;
    }, {});

  // Add the unique mail ID directly to the headers object
  headers.id = mail.id;

  return headers;
}

把它们放在一起

以下是一切如何协同工作的:

async function classifyEmail(prompt) {
  const { OpenAI } = require("openai");
  const openai = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "not-needed" });

  const response = await openai.chat.completions.create({
    model: "mistral",
    temperature: 0.3,
    messages: [{ role: "user", content: prompt }],
  });

  return response.choices[0].message.content.trim();
}

?就是这样!您的收件箱现在更加智能、更有条理。

走得更远

但是为什么停在这里呢?探索更高级的示例,用于阅读电子邮件内容、发送草稿以及构建全自动响应所需的一切。
有关更多自动化想法和可重用脚本,请查看 Znote。

让我们将您的日常任务变成有趣且高效的事情! ?

以上是使用可重用代码构建人工智能驱动的电子邮件代理的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn