Dify知识库下载小程序

一、Dify配置

1.查看或创建知识库的API

二、下载程序配置

1. 安装依赖resquirements.txt

复制代码
######requirements.txt#####
flask==2.3.3
psycopg2-binary==2.9.9
requests==2.31.0
python-dotenv==1.0.0

#####安装依赖
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

2. 主程序代码app.py

复制代码
##app.py

from flask import Flask, render_template, jsonify, Response
import requests
import os
from dotenv import load_dotenv
import io
import zipfile
import urllib.parse
from config import API_KEY, BASE_URL

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/api/datasets')
def get_datasets():
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    response = requests.get(
        f'{BASE_URL}/v1/datasets?page=1&limit=20',
        headers=headers
    )
    
    if response.status_code == 200:
        data = response.json()
        datasets = [{'id': item['id'], 'name': item['name']} for item in data.get('data', [])]
        return jsonify(datasets)
    return jsonify({'error': '获取知识库列表失败'}), response.status_code

@app.route('/api/files/<dataset_id>')
def get_files(dataset_id):
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    response = requests.get(
        f'{BASE_URL}/v1/datasets/{dataset_id}/documents',
        headers=headers
    )
    
    if response.status_code == 200:
        data = response.json()
        files = []
        for item in data.get('data', []):
            file_id = item['id']
            file_name = item.get('data_source_detail_dict', {}).get('upload_file', {}).get('name', file_id)
            files.append({'id': file_id, 'name': file_name})
        return jsonify(files)
    return jsonify({'error': '获取文件列表失败'}), response.status_code

def download_single_file(dataset_id, document_id):
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    
    # 获取文件下载地址
    response = requests.get(
        f'{BASE_URL}/v1/datasets/{dataset_id}/documents/{document_id}/upload-file',
        headers=headers
    )
    
    if response.status_code == 200:
        download_url = response.json().get('download_url')
        if download_url:
            # 拼接完整的下载URL
            full_url = f'{BASE_URL}{download_url}'
            file_response = requests.get(full_url, headers=headers)
            if file_response.status_code == 200:
                return file_response.content
    return None

@app.route('/api/download/<dataset_id>/<document_id>')
def download_file(dataset_id, document_id):
    content = download_single_file(dataset_id, document_id)
    if content:
        return Response(
            content,
            mimetype='application/octet-stream',
            headers={'Content-Disposition': 'attachment'}
        )
    return jsonify({'error': '文件下载失败'}), 400

@app.route('/api/download-dataset/<dataset_id>')
def download_dataset(dataset_id):
    # 获取文件列表
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    response = requests.get(
        f'{BASE_URL}/v1/datasets/{dataset_id}/documents',
        headers=headers
    )
    
    if response.status_code != 200:
        return jsonify({'error': '获取文件列表失败'}), response.status_code
    
    files = []
    for item in response.json().get('data', []):
        file_id = item['id']
        file_name = item.get('data_source_detail_dict', {}).get('upload_file', {}).get('name', file_id)
        files.append({'id': file_id, 'name': file_name})
    
    # 创建ZIP文件
    memory_file = io.BytesIO()
    with zipfile.ZipFile(memory_file, 'w') as zf:
        for file in files:
            content = download_single_file(dataset_id, file['id'])
            if content:
                zf.writestr(file['name'], content)
    
    memory_file.seek(0)
    return Response(
        memory_file.getvalue(),
        mimetype='application/zip',
        headers={'Content-Disposition': f'attachment;filename=dataset_{dataset_id}.zip'}
    )

if __name__ == '__main__':
    app.run(debug=True)

3. 配置知识库的Base_URL和API_key

配置dify知识库和数据库鉴权信息,如下:

复制代码
# 知识库API配置
API_KEY = 'dataset-YNXAxOyNucHoyzVUN6MlPJXT'
BASE_URL = 'http://10.1.140.33'

三、启动服务

#python3 app.py

访问 http://127.0.0.1:5000/ 进行下载文件或整个知识库

相关推荐
vx_dmxq2119 小时前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php
蹦极的考拉9 小时前
夜间无法登录:ThinkPHP api接口 23:00 准时罢工的排查全纪录
小程序·thinkphp·api接口·无法登陆
vx_vxbs6610 小时前
【SSM电影网站】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·小程序·php·idea
G佳伟17 小时前
‌微信小程序Webview转发页面空白问题解决方案‌
微信小程序·小程序
vx_vxbs6619 小时前
【SSM电动车智能充电服务平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·spring cloud·小程序·php·idea
低代码布道师1 天前
医疗小程序12出诊列表
低代码·小程序
Coder-coco1 天前
游戏助手|游戏攻略|基于SprinBoot+vue的游戏攻略系统小程序(源码+数据库+文档)
java·vue.js·spring boot·游戏·小程序·论文·游戏助手
小小王app小程序开发2 天前
盲盒小程序一番赏衍生玩法:魔王赏、非酋赏、狂欢赏差异化分析
小程序
2501_915106322 天前
iOS App 测试工具全景分析,构建从开发调试到线上监控的多阶段工具链体系
android·测试工具·ios·小程序·uni-app·iphone·webview
头发还在的女程序员2 天前
基于JAVA语言的短剧小程序-抖音短剧小程序
java·开发语言·小程序