使用Python写一个适用于Dify和FastGPT的JsonPath插件

编写适用于 Dify 和 FastGPT 的 JsonPath 插件

在本文中,我将分享如何编写一个适用于 AI应用平台的 JsonPath 插件,该插件能够处理 JSON 数据的路径查询、正则表达式提取,以及 JavaScript 沙盒执行功能。这个插件的主要目的是让用户能够通过简单的 HTTP 请求,对 JSON 数据进行高效、灵活的查询和处理。接下来,我们将详细介绍如何实现这个插件的功能。

项目结构与依赖

首先,我们需要创建一个 Flask 应用程序来承载这个插件。项目的主要依赖项包括 Flaskjsonpath_ngrejsonjs2pythreading。这些库分别用于处理 HTTP 请求、JSONPath 查询、正则表达式匹配、JavaScript 代码执行和处理并发任务。

python 复制代码
from flask import Flask, request, jsonify
from jsonpath_ng import parse
import re
import json
import js2py
import threading
import logging

为了便于调试和跟踪,我们配置了日志记录功能:

python 复制代码
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
JSONPath 查询

首先,我们实现了一个 JSONPath 查询功能,通过 POST 请求获取用户提交的 JSONPath 表达式和 JSON 数据,并返回匹配的结果。

python 复制代码
@app.route('/jsonpath', methods=['POST'])
def get_value_by_jsonpath():
    json_path = request.json.get('json_path')
    json_string = request.json.get('json_string')
    data = json.loads(json_string)
    jsonpath_expr = parse(json_path)
    matches = [match.value for match in jsonpath_expr.find(data)]
    if '*' in json_path or ('[' in json_path and ':' in json_path):
        return jsonify({"data": matches})  # 预期返回列表
    else:
        if len(matches) == 0:
            return jsonify({"data": None})
        else:
            return jsonify({"data": matches[0]}) if matches else None  # 预期返回单个元素
正则表达式提取

接下来,我们实现了一个正则表达式提取功能,用户可以通过提交正则表达式和目标字符串来提取匹配的内容。

python 复制代码
@app.route('/regex_extract', methods=['POST'])
def regex_extract():
    regex = request.json.get('regex')
    string = request.json.get('string')
    if not regex or not string:
        return jsonify({"error": "regex或string参数不正确"}), 400
    result = extract_target(regex, string)
    logging.info('regex: %s, string: %s, result: %s', regex, string, result)
    return jsonify({"data": result, "match": True if result else False})
JavaScript 沙盒执行

最后,我们实现了一个 JavaScript 沙盒执行功能,允许用户提交 JavaScript 代码,并在一个安全的环境中执行该代码。我们使用 js2py 库来执行 JavaScript,并设置了超时机制以防止脚本长时间运行。

python 复制代码
@app.route('/js_sandbox', methods=['POST'])
def js_sandbox():
    code = request.json.get('code')
    if not code:
        return jsonify({"error": "code参数不正确"}), 400
    code = fix_string_conflicts(code)
    timer = threading.Timer(3.0, timeout)
    timer.start()
    result = None
    try:
        result = js2py.eval_js(code)
        print(result)
    except Exception as e:
        logging.error("Error while executing JavaScript: %s", e)
    finally:
        timer.cancel()
    logging.info('code: %s, result: %s', code, result)
    return jsonify({"data": result})

总结

通过上述步骤,我们实现了一个简单但功能强大的 JsonPath 插件,适用于 Dify 和 FastGPT。它可以处理 JSONPath 查询、正则表达式提取以及 JavaScript 沙盒执行等任务。希望这篇文章能帮助你更好地理解如何构建类似的插件,并将其应用到你的项目中。如果你有任何问题或建议,欢迎在评论区留言讨论。

相关推荐
兵慌码乱1 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot3 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海7 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱10 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽15 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码15 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱1 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵1 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python