大家好?!作为一名应用程序开发人员,我很高兴与您分享如何创建简单但功能强大的代理来自动执行日常任务。
?和你们许多人一样,我每天都会收到大量电子邮件。尽管我尽了最大努力,实现难以捉摸的收件箱清零仍然是一个挑战。整理订单确认和发货更新等电子邮件既乏味又耗时。
但好消息是:自动化可以拯救世界!
?我编写了一个利用 AI 来帮助自动进行电子邮件分类的基本脚本,您也可以。
在本文中,我将分享可重用的代码片段,以帮助您构建适合您需求的自动化代理。 ?
有无数的工具,包括无代码平台,可以为您处理整个流程。但是,我更喜欢将任务分解为模块化代码片段。为什么?
通过采取增量方法,您可以逐渐用自动化步骤取代手动步骤。
??我用于制作脚本原型的首选工具是 Znote——一款具有实时编码和 AI 功能的笔记本,可以帮助我跟踪和增强我的工作流程。尝试一下,或者使用您最喜欢的 IDE!
当新电子邮件到达时,我们希望:
下载 Ollama 来运行本地法学硕士。安装后,下载模型:
ollama pull mistral
安装所需的 Node.js 库:
ollama pull mistral
设置与 Gmail 的 OAuth 连接:
npm install -S @google-cloud/local-auth googleapis openai
使用此函数创建标签并检索其 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;
从消息 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; }
从电子邮件中提取有意义的详细信息:
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; }) ); }
集成 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中文网其他相关文章!