讲师中心 微信公众号
AI工具推荐 视频效率加速

如何利用Dify的API构建一个运行在Electron中的桌面级AI助手

千墨君_9322

千墨君_9322

发布时间:2026-08-04 17:12:24

|

1078人浏览过

|

来源于php中文网

原创

Electron应用需通过主进程代理调用Dify API以绕过CORS,配置Dify启用API权限并生成带“允许调用应用API”权限的密钥;主进程启动本地HTTP代理服务(端口8081),安全注入API Key;preload.js暴露IPC接口,主进程处理流式响应并拼接JSON,渲染进程实现打字效果。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如何利用dify的api构建一个运行在electron中的桌面级ai助手

你需要让Electron应用直接调用Dify后端服务,绕过浏览器同源限制和CORS问题,同时保证本地窗口能稳定接收流式响应。这要求Electron主进程充当代理层,而非前端直连Dify API。

配置Dify启用API访问权限

登录Dify控制台,在左侧导航栏点击“设置”→“API密钥管理”→“生成新密钥”。【密钥必须勾选“允许调用应用API”权限】,否则Electron发出的请求会被403拒绝。

复制生成的API Key,它只显示一次,丢失需重新生成。

进入目标应用编辑页,切换到“发布”标签页,确认“启用API访问”开关已打开。未开启时所有API调用返回404。

在Electron中创建安全的API代理服务

Electron渲染进程不能直接跨域请求localhost:5001(Dify默认端口),必须由主进程启动一个本地HTTP代理服务。

在main.js中添加以下代码:

const { app, BrowserWindow, net } = require('electron');
const http = require('http');
const url = require('url');

let proxyServer;

function startAPIServer() {
  proxyServer = http.createServer((req, res) => {
    const parsedUrl = url.parse(req.url, true);
    const targetUrl = `http://localhost:5001${parsedUrl.pathname}${parsedUrl.search}`;
    const request = net.request({
      method: req.method,
      url: targetUrl,
      headers: {
        'Authorization': 'Bearer ' + process.env.DIFY_API_KEY,
        'Content-Type': req.headers['content-type'] || 'application/json'
      }
    });

    request.on('response', (response) => {
      res.writeHead(response.statusCode, response.headers);
      response.pipe(res);
    });

    req.pipe(request);
  });
  proxyServer.listen(8081);
}

注意:DIFY_API_KEY必须通过process.env注入,绝不可硬编码在JS文件中,否则打包后密钥会暴露在asar包里。

构建流式响应处理模块

第一步:在preload.js中暴露安全API接口

Dify
Dify

Dify AI应用开发平台指南。用于构建LLM应用、工作流、Agent和知识库。当用户需要(1)使用Dify创建AI应用 (2)设计LLM工作流 (3)配置知识库RAG (4)开发AI Agent (5)调用Dify API (6)自托管部署Dify时激活此技能。

下载

const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('difyAPI', {
  sendQuery: (appId, input) => ipcRenderer.invoke('dify:query', appId, input)
});

第二步:主进程中注册IPC handler并处理流式chunk

ipcMain.handle('dify:query', async (event, appId, input) => {
  return new Promise((resolve) => {
    const chunks = [];
    const req = http.request({
      hostname: 'localhost',
      port: 8081,
      path: `/v1/chat-messages`,
      method: 'POST',
      headers: { 'Content-Type': 'application/json' }
    }, (res) => {
      res.on('data', chunk => chunks.push(chunk));
      res.on('end', () => {
        const fullResponse = Buffer.concat(chunks).toString();
        try {
          resolve(JSON.parse(fullResponse));
        } catch (e) {
          resolve({ error: 'Invalid JSON response' });
        }
      }
    });
    });
    req.write(JSON.stringify({
      inputs: {},
      query: input,
      response_mode: 'stream',
      user: 'electron-user'
    }));
    req.end();
  });
});

在渲染进程实现带打字效果的响应渲染

const responseElement = document.getElementById('response');
async function handleSend() {
  const input = document.getElementById('input').value;
  responseElement.innerHTML = '';
  const result = await window.difyAPI.sendQuery('app-xxx', input);
  if (result.answer) {
    let i = 0;
    const interval = setInterval(() => {
      if (i         responseElement.textContent += result.answer[i++];
      } else {
        clearInterval(interval);
      }
    }, 20);
  }
}

这一步操作起来很简单,直接把handleSend绑定到发送按钮的onclick事件上就行。

打包前必须完成的三项校验

① 检查Dify服务是否监听0.0.0.0:5001而非127.0.0.1:5001——Electron主进程发起的请求来自localhost,但Dify默认绑定127.0.0.1会导致连接被拒绝。

② 在package.json的build配置中加入:
"extraResources": [{ "from": "node_modules/dify-sdk", "to": "dify-sdk", "type": "dir" }]

③ 运行electron-builder前,执行命令:export DIFY_API_KEY=sk-xxx(macOS/Linux)或set DIFY_API_KEY=sk-xxx(Windows),确保环境变量注入成功。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
Dify 本地部署与企业配置
Dify 本地部署与企业配置

本专题系统讲解 Dify 从零开始的本地部署方法与企业环境配置实践,涵盖 Docker 安装、依赖准备、数据库初始化、反向代理、参数调优、安全加固与多用户开通,帮助开发者与企业团队快速搭建稳定可用的 Dify 平台。

657

2026.06.05

Dify Agent智能体开发实战教程
Dify Agent智能体开发实战教程

本专题聚焦 Dify Agent 智能体的设计与开发,涵盖 Agent 模式选择、工具集成、提示词设计、多步推理、上下文记忆与多 Agent 协作,帮助开发者构建可执行复杂业务任务的智能体应用。

245

2026.06.05

Dify RAG知识库构建实战教程
Dify RAG知识库构建实战教程

本专题围绕 Dify RAG 知识库的全流程实践展开,从文档导入、分段切片、向量化到混合检索、重排优化与召回评估,帮助你打造高准确率、低幻觉的企业知识问答应用。

236

2026.06.05

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

80

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

40

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

20

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

20

2026.10.10

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

20

2026.10.10

C++构造函数定义与调用方法
C++构造函数定义与调用方法

C++构造函数用于初始化类对象,是面向对象编程的重要基础。本专题从构造函数的定义、声明和调用入手,介绍默认构造函数、带参数构造函数、拷贝构造函数及成员初始化列表,帮助初学者掌握对象创建与初始化的基本方法。

20

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Dify零基础教程
Dify零基础教程

共0课时 | 148人学习

学习Agent,从Dify开始
学习Agent,从Dify开始

共0课时 | 146人学习

Dify 部署与运维指南
Dify 部署与运维指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn