AI-UniApp集成Dify和飞书Aili工作流提取文档内容
前言
最近公司需要使用Uniapp开发微信小程序,并且需要解析Word和Excel文档中的内容,于是专门预研这方面的技术实现,下面是我预研的结果:
1、自己实现
2、Dify实现
3、飞书Aili实现
下面详细说明如何实现:
自己实现
如果是自己实现的话,需要安装依赖包
pnpm install xlsx mammoth pdfjs-dist
注意:pdf需要设置
pdfjsLib.GlobalWorkerOptions.workerSrc = '//your-cdn-serve/js/pdf.js/pdf.worker.mjs';
下面是实现细节代码,这样就完成了读取文件功能,但是,安装这些包会导致Uniapp发布的小程序包太大,超出限制,所以不推荐,但是如果是Web项目,就当我没说!:
const readExcel = async (file) => {
const buffer = await file.arrayBuffer();
const workbook = XLSX.read(buffer, { type: 'array' });
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
return jsonData;
};
const readDocx = async (file) => {
const arrayBuffer = await file.arrayBuffer();
const result = await mammoth.extractRawText({ arrayBuffer });
return result.value;
};
const readPdf = async (file) => {
const arrayBuffer = await file.arrayBuffer();
const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;
let text = '';
for (let i = 1; i <= pdf.numPages; i++) {
const page = await pdf.getPage(i);
const content = await page.getTextContent();
const pageText = content.items.map((item) => item.str).join(' ');
text += pageText + '\n';
}
return text;
};
const readText = async (file) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsText(file);
});
};
Dify实现
公司部署了Dify服务,所以尽情的玩,下面我将详细介绍如何使用。
首先打开Dify的开发后台,如下所示:
点击工作室并创建空白应用,如下所示:
点击创建即可。
下面是我配置好的工作流,如下所示:
详细介绍下节点设置:
1、开始结点
添加自定义参数fileUrl,字段类型是文件列表,当然你设置成单文件也是可以的。
2、文档提取器节点
输入变量设置成开始节点中的fileUrl,如下所示:
3、结束节点
结束节点,默认输出是文档提取的内容,所以默认就好。
这样就完成了工作流的配置了,现在我们可以调试一下,看看有没有问题:
可以看到,解析没有问题!
好了,我们发布一下应用,编排好工作流并发布之后,我们需要在Uniapp中集成,下面介绍下如何集成!
1、查看官方集成文档调用技能
可以看到,官方文档已经有了调用技能的示例代码,我们只要改装一下加到Uniapp中即可。
2、Uniapp调用Dify工作流
runWorkflow方法中实现了调用Dify工作流方法,这样就完成了调用。
// 在 UniApp 的页面或方法中
const runWorkflow = (fileUrl) => {
// 替换为实际参数
const apiKey = 'your_api_key_here';
uni.request({
url: 'http://agents.einwin.com/v1/workflows/run',
method: 'POST',
header: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
data: {
inputs: {
"fileUrl": [ // 动态键名
{
transfer_method: "remote_url",
url: fileUrl,
type: "document"
}
]
},
response_mode: "blocking",
user: "abc-123"
},
success: (res) => {
console.log('请求成功:', res.data);
},
fail: (err) => {
console.error('请求失败:', err);
uni.showToast({ title: '请求失败', icon: 'error' });
}
});
}
飞书Aili实现
公司是购买了飞书Aili服务,所以尽情的玩,下面我将详细介绍如何使用。
首先打开飞书aili的开发后台,这是我的飞书后台网页
点击创建工作流应用->点击从空白创建,点击确认,等待创建,创建好之后跳转下面页面:
点击编辑技能,如下所示:
这是最原始的工作流页面,下面是我配置好的工作流,如下所示:
详细介绍下节点设置:
1、开始结点
添加自定义参数fileUrl,用于设置需要提取的文件url路径
2、条件分支
因为我要解析两个类型的文档,一个word一个Excel,所以需要两个分支
3、分支1
如果fileUrl文件是Word则往下执行
4、解析Word
选择文档类型,以及待解析的文件fileUrl,以及输出result,选择MarkDown格式输出
5、分支2
如果fileUrl文件是Excel则往下执行
6、解析Excel
选择文档类型,以及待解析的文件fileUrl,以及输出result,选择MarkDown格式输出
7、最终结果和结束节点
在最终结果里面获取word和excel中的内容并输出到结束结点
这样就完成了工作流的配置了,现在我们可以调试一下,看看有没有问题:
可以看到,解析没有问题!
好了,我们发布一下应用,编排好工作流并发布之后,我们需要在Uniapp中集成,下面介绍下如何集成!
1、查看官方集成文档调用技能
可以看到,官方文档已经有了调用技能的示例代码,我们只要改装一下加到Uniapp中即可。
2、Uniapp调用飞书Aili技能
我们添加rechatForAili方法,注意调用这个方法前,我们需要设置AppID和SkillID,根据官方文档说明,我们可以直接到工作流的页面的浏览器URL中直接拿到,spring_开头的是AppID,skill_开头的 是SkillID。
接下来,我们要通过API获取tenant_access_token,根据官方文档说明,我们创建getFeishuTenantToken方法,如下所示:
async getFeishuTenantToken() {
const appId = ""; // 替换为你的 App ID
const appSecret = ""; // 替换为你的 App Secret
try {
const response = await uni.request({
url: "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal",
method: "POST",
header: {
"Content-Type": "application/json",
},
data: {
app_id: appId,
app_secret: appSecret,
},
});
const resData = response[1].data
if (resData.code === 0) {
this.feishuToken = resData.tenant_access_token;
this.error = null;
} else {
this.error = resData.msg || "获取 Token 失败";
}
} catch (err) {
this.error = "请求失败,请检查网络或配置";
}
},
但是,我们还需要获取appId和appSecret,这个可以到发布应用的地方获取,点进去之后,我们就可以看到了。
好了,拿到了tenant_access_token,下面就可以调用飞书aili的工作流技能了,代码如下所示:
rechatForAili(fileUrl) {
const appId = ''
const skillId = ''
if (this.feishuToken){
uni.request({
url: `https://open.feishu.cn/open-apis/aily/v1/apps/${appId}/skills/${skillId}/start`,
method: 'POST',
header: {
'Authorization': `Bearer ${this.feishuToken}`,
'Content-Type': 'application/json'
},
data: {
"global_variable": {
"query": ""
},
"input": JSON.stringify({
fileUrl: fileUrl
})
},
success: (res) => {
if (res.data?.code === 0) {
const resData = res.data.data
if (resData.status === 'success' && resData.output) {
//成功,加自己的业务逻辑
}
}
}
});
}
},
这样就完成了在UniApp中调用飞书Aili技能来提取文件中的内容了。
注意:
1、rechatForAili方法中,我将fileUrl放到global_variable.query中,发现报错了,然后放到input中就成功了!
2、rechatForAili方法调用时,发现报错,官方文档说可以根据Code定位问题,然后发现是缺少权限,我们根据这个code,开通权限即可!
总结
1、Dify工作流和Aili工作流提取文档内容我没有用到LLM,这个要看你自己的场景需不需要了,因为我的小程序已经有了AI对话,所以只差提取文档内容的功能;
2、Dify提取文件内容不需要区分是什么类型的文件,比Aili的简单;
3、需要购买Aili服务才能使用,这个看你公司的情况了;
更多推荐
所有评论(0)