GPUStack 实战:n8n 接入本地模型,零成本打造 AI 资讯助手
n8n 是一款强大的开源低代码自动化工具,它允许你通过可视化节点的方式,将不同的服务和 API 串联起来,构建复杂的自动化工作流。与传统的自动化平台相比,n8n 拥有极高的自由度和扩展性,支持自托管部署,能够确保数据的完全私有化。 在集成 AI 能力时,n8n 丰富的节点生态可以轻松对接 GPUStack 部署的本地大模型。这种组合不仅消除了昂贵的 API 调用费用,还确保了企业敏感数据在处理过程中始终留在本地,是构建私有化 AI 智能体的理想选择。接下来,我们将通过一个实战案例,演示如何将两者结合使用。 首先,我们需要获取模型的调用地址。在 GPUStack 的 Deployments 列表找到目标模型,通过右侧菜单点击 API Access Info。系统会弹出详细的接入信息,若尚未配置密钥,可直接点击窗口内的链接跳转至创建页。 创建 API Key 成功创建后,生成的 API Key 将作为 n8n 访问本地模型的安全凭证。由于 Key 仅在创建时显示一次,建议立即将其妥善保存。 由于 GPUStack 兼容 OpenAI 协议,我们在 n8n 中直接添加一个 OpenAI API 类型的凭证即可。 在配置窗口,填入刚才获取的 API Key 和 GPUStack 的接入地址。如果填入凭据信息无误,点击 关闭凭据配置窗口后,勾选 本节目标是搭建一个自动化链路:每天早上八点半定时触发,自动采集 RSS 源信息,并调用 AI 提取摘要发送至指定邮箱。 配置触发时间为每天早上八点半 点击测试按钮,验证 双击 在弹出的配置窗口中,配置 Source for Prompt (User Message) 为 Define below,然后拖动左侧面板 继续在下方配置 添加 Email 凭据,如下如所示,点击 此界面仅为示例,具体的 SMTP 配置信息(如服务器地址、端口、授权码)请参照你所使用邮箱服务的官方说明。 配置收件人地址及邮件正文。作为初步演示,我们直接将模型输出的原始文本作为邮件内容。 点击 Execute Workflow 手动触发一次工作流。n8n 将抓取最新的 RSS 资讯,调用 GPUStack 进行推理生成摘要,最后通过 执行完成如图所示: 邮箱截图: 上述流程中我们注意到,工作流每完整执行一次就会发送 30 封邮件,这显然不符合预期。我们期望将每条资讯压缩为一句话摘要,再将所有摘要汇总为一个列表,以单封邮件的形式发送,并对展示样式进行统一美化。 在后续弹出的菜单中,根据自己偏好选择 本文以 在弹出的配置面板中,填入如下 JavaScript Code: n8n 支持在 修改完成,重新运行,最终效果如下所示 至此,工作流部署完成。只要 n8n 服务保持运行,系统将按照预设在每天早上 8:30 触发执行,并在处理完成后自动发送资讯摘要邮件。 通过本文的实战,我们成功利用 n8n 和 GPUStack 搭建了一套全自动、零成本的 AI 资讯助手。从 RSS 抓取到 AI 摘要再到邮件推送,整个流程完全运行在本地环境中,既保护了数据隐私,又规避了高昂的 API 调用成本。 最后,别忘了打开 GPUStack Dashboard 概览页。你可以直观地查看指定模型在一段时间内的 Token 消耗详情(包括 Prompt 和 Completion)以及 API 请求总数,真正掌握 AI 服务的运行状况。🛠️ 演示环境
📖 工作流搭建
1. 获取模型 API 凭证




2. 配置 n8n 模型连接


Save 会提示 Connection tested successfully。

Limit models,指定该凭证仅使用特定的本地模型。
3. 编排自动化工作流
Workflow
First step node 为 On a schedule 类型

RSS Read 节点,这里以 https://36kr.com/feed 为例

RSS Read 节点是否正常工作

RSS Read 节点可查看执行日志和数据
Basic LLM Chain 节点,用于提取信息摘要
contentSnippet 字段到 Prompt (User Message) 输入框中

System Prompt -> 你是一个资深科技编辑。请阅读下方的文章内容,提取摘要,要求字数精炼,直击本质。


Send Email 节点

Create new credential 会弹出配置窗口。

表达式无需手写,将字段拖拽到输入框即可。

📊 效果验证
Send Email 节点发送邮件。注意:这一步不要着急实操,否则将一次性收到 30 封邮件!🤣



💡 工作流优化
Basic LLM Chain 节点上的系统提示词,指导其直接输出一个 list item你是一个资深科技编辑。请将用户输入的文章内容总结为一条简练的 HTML 列表项(<li>...</li>),包含标题和核心要点。
格式示例:
<li><b>标题</b>:核心要点摘要</li>
要求:
1. 仅输出 <li> 标签及其内容,不要包含 <ul> 或其他 markdown 格式。
2. 摘要控制在 50 字以内。
Basic LLM Chain 与 Send Email 节点之间插入一个 Code 节点,用于将分散的摘要聚合为美观的 HTML 格式。
Code in JavaScript / Code in Python (Native)。Code in JavaScript 为例。⚠️ 注意:在微信公众号中直接复制以下代码时,普通空格可能会被替换成不换行空格 (NBSP),粘贴后请务必检查并手动替换回普通空格!
// 获取所有 LLM 节点的输出项
const items = $input.all();
// 定义 CSS 样式
const style = {
container: "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f9f9f9; border-radius: 10px; border: 1px solid #e0e0e0;",
header: "color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; margin-bottom: 20px; font-size: 24px;",
list: "list-style-type: none; padding: 0;",
listItem: "background-color: #ffffff; margin-bottom: 15px; padding: 15px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.05); line-height: 1.6; color: #555;",
footer: "margin-top: 30px; font-size: 12px; color: #999; text-align: center; border-top: 1px solid #e0e0e0; padding-top: 10px;"
};
// 构建 HTML 内容
let htmlContent = `<div style="${style.container}">`;
htmlContent += `<h2 style="${style.header}">📅 每日科技资讯摘要</h2>`;
htmlContent += `<ul style="${style.list}">`;
for (const item of items) {
if (item.json.text) {
// 为 item 添加样式
let styledItem = item.json.text.replace('<li>', `<li style="${style.listItem}">`);
htmlContent += styledItem + "\n";
}
}
htmlContent += `</ul>`;
htmlContent += `<div style="${style.footer}">Generated by n8n & GPUStack • ${new Date().toLocaleDateString()}</div>`;
htmlContent += `</div>`;
// 返回合并后的单一结果供邮件节点使用
return [{
json: {
email_content: htmlContent
}
}];
Send Email 节点{{ }} 中编写 JavaScript 表达式。这里我们使用 {{ $now.format('yyyy-MM-dd') }},以便在邮件主题中自动附带当天的日期信息。


📈 总结

🙌 欢迎加入我们的社区

如果二维码失效,大家可前往 GPUStack 项目获取最新入群二维码 https://github.com/gpustack/gpustack/blob/main/docs/assets/wechat-group-qrcode.jpg