Dify 中的讯飞星火平台工具源码分析

news2024/11/15 3:23:52

本文主要对 Dify 中的讯飞星火平台工具 spark 进行了源码分析,该工具可根据用户的输入生成图片,由讯飞星火提供图片生成 API。通过本文学习可自行实现将第三方 API 封装为 Dify 中工具的能力。

源码位置:dify-0.6.14\api\core\tools\provider\builtin\spark

一. spark.yaml(工具供应商 yaml)

这段代码是一个配置文件,用于设置一个平台工具的认证信息。这个平台工具的名称是 “Spark”,由一个名为 Onelevenvy 的作者创建。下面逐行解释这段代码的每个部分:

identity:
  author: Onelevenvy
  name: spark
  label:
    en_US: Spark
    zh_Hans: 讯飞星火
    pt_BR: Spark
  description:
    en_US: Spark Platform Toolkit
    zh_Hans: 讯飞星火平台工具
    pt_BR: Pacote de Ferramentas da Plataforma Spark
  icon: icon.svg
  tags:
    - image

1.identity定义平台工具的基本信息

  • author: 工具的作者是 Onelevenvy。

  • name: 工具的名称是 “spark”。

  • label: 工具的标签在不同语言中的翻译。

    • en_US: 英文标签为 “Spark”。
    • zh_Hans: 简体中文标签为 “讯飞星火”。
    • pt_BR: 葡萄牙语标签为 “Spark”。
  • description: 工具的描述在不同语言中的翻译。

    • en_US: 英文描述为 “Spark Platform Toolkit”。
    • zh_Hans: 简体中文描述为 “讯飞星火平台工具”。
    • pt_BR: 葡萄牙语描述为 “Pacote de Ferramentas da Plataforma Spark”。
  • icon: 图标文件的名称是 “icon.svg”。

  • tags: 标签信息,这里仅包含一个标签 “image”,表明这个工具与图像相关。

credentials_for_provider:
  APPID:
    type: secret-input
    required: true
    label:
      en_US: Spark APPID
      zh_Hans: APPID
      pt_BR: Spark APPID
    help:
      en_US: Please input your APPID
      zh_Hans: 请输入你的 APPID
      pt_BR: Please input your APPID
    placeholder:
      en_US: Please input your APPID
      zh_Hans: 请输入你的 APPID
      pt_BR: Please input your APPID

其中,credentials_for_provider定义用于认证的必要凭证。

2.credentials_for_provider - APPID

  • type: 输入类型为 “secret-input”,这意味着它是一个需要保密的输入字段。

  • required: 这个字段是必填的。

  • label: 在不同语言中的标签。

    • en_US: 英文标签为 “Spark APPID”。
    • zh_Hans: 简体中文标签为 “APPID”。
    • pt_BR: 葡萄牙语标签为 “Spark APPID”。
  • help: 提示信息,在不同语言中的翻译。

    • en_US: 英文提示为 “Please input your APPID”。
    • zh_Hans: 简体中文提示为 “请输入你的 APPID”。
    • pt_BR: 葡萄牙语提示为 “Please input your APPID”。
  • placeholder: 占位符信息,在不同语言中的翻译。

    • en_US: 英文占位符为 “Please input your APPID”。
    • zh_Hans: 简体中文占位符为 “请输入你的 APPID”。
    • pt_BR: 葡萄牙语占位符为 “Please input your APPID”。
APISecret:
    type: secret-input
    required: true
    label:
      en_US: Spark APISecret
      zh_Hans: APISecret
      pt_BR: Spark APISecret
    help:
      en_US: Please input your Spark APISecret
      zh_Hans: 请输入你的 APISecret
      pt_BR: Please input your Spark APISecret
    placeholder:
      en_US: Please input your Spark APISecret
      zh_Hans: 请输入你的 APISecret
      pt_BR: Please input your Spark APISecret

3.credentials_for_provider - APISecret

  • type: 输入类型为 “secret-input”。

  • required: 这个字段是必填的。

  • label: 在不同语言中的标签。

    • en_US: 英文标签为 “Spark APISecret”。
    • zh_Hans: 简体中文标签为 “APISecret”。
    • pt_BR: 葡萄牙语标签为 “Spark APISecret”。
  • help: 提示信息,在不同语言中的翻译。

    • en_US: 英文提示为 “Please input your Spark APISecret”。
    • zh_Hans: 简体中文提示为 “请输入你的 APISecret”。
    • pt_BR: 葡萄牙语提示为 “Please input your Spark APISecret”。
  • placeholder: 占位符信息,在不同语言中的翻译。

    • en_US: 英文占位符为 “Please input your Spark APISecret”。
    • zh_Hans: 简体中文占位符为 “请输入你的 APISecret”。
    • pt_BR: 葡萄牙语占位符为 “Please input your Spark APISecret”。
APIKey:
    type: secret-input
    required: true
    label:
      en_US: Spark APIKey
      zh_Hans: APIKey
      pt_BR: Spark APIKey
    help:
      en_US: Please input your Spark APIKey
      zh_Hans: 请输入你的 APIKey
      pt_BR: Please input your Spark APIKey
    placeholder:
      en_US: Please input your Spark APIKey
      zh_Hans: 请输入你的 APIKey
      pt_BR: Please input Spark APIKey
    url: https://console.xfyun.cn/services

4.credentials_for_provider - APIKey

  • type: 输入类型为 “secret-input”。

  • required: 这个字段是必填的。

  • label: 在不同语言中的标签。

    • en_US: 英文标签为 “Spark APIKey”。
    • zh_Hans: 简体中文标签为 “APIKey”。
    • pt_BR: 葡萄牙语标签为 “Spark APIKey”。
  • help: 提示信息,在不同语言中的翻译。

    • en_US: 英文提示为 “Please input your Spark APIKey”。
    • zh_Hans: 简体中文提示为 “请输入你的 APIKey”。
    • pt_BR: 葡萄牙语提示为 “Please input your Spark APIKey”。
  • placeholder: 占位符信息,在不同语言中的翻译。

    • en_US: 英文占位符为 “Please input your Spark APIKey”。
    • zh_Hans: 简体中文占位符为 “请输入你的 APIKey”。
    • pt_BR: 葡萄牙语占位符为 “Please input Spark APIKey”。
  • url: 提供了一个 URL 链接,指向用于获取或管理这些凭证的控制台页面。

总结:这段配置文件定义了一个名为 Spark 的平台工具的各种信息和认证所需的凭证。

二. spark.py(工具供应商代码)

在供应商模块下创建一个供应商类,用于实现供应商的凭据验证逻辑,如果凭据验证失败,将会抛出 ToolProviderCredentialValidationError 异常。

class SparkProvider(BuiltinToolProviderController):
    def _validate_credentials(self, credentials: dict) -> None:
        try:
            if "APPID" not in credentials or not credentials.get("APPID"):
                raise ToolProviderCredentialValidationError("APPID is required.")
            if "APISecret" not in credentials or not credentials.get("APISecret"):
                raise ToolProviderCredentialValidationError("APISecret is required.")
            if "APIKey" not in credentials or not credentials.get("APIKey"):
                raise ToolProviderCredentialValidationError("APIKey is required.")

            appid = credentials.get("APPID")
            apisecret = credentials.get("APISecret")
            apikey = credentials.get("APIKey")
            prompt = "a cute black dog"

            try:
                response = spark_response(prompt, appid, apikey, apisecret)
                data = json.loads(response)
                code = data["header"]["code"]

                if code == 0:
                    #  0 success,
                    pass
                else:
                    raise ToolProviderCredentialValidationError(
                        "image generate error, code:{}".format(code)
                    )
            except Exception as e:
                raise ToolProviderCredentialValidationError(
                    "APPID APISecret APIKey is invalid. {}".format(e)
                )
        except Exception as e:
            raise ToolProviderCredentialValidationError(str(e))

三.spark_img_generation.yaml(工具 yaml)

1.Identity 部分

这个部分定义了工具或服务的基本身份信息。

identity:
  name: spark_img_generation
  author: Onelevenvy
  label:
    en_US: Spark Image Generation
    zh_Hans: 图片生成
    pt_BR: Geração de imagens Spark
  icon: icon.svg
  description:
    en_US: Spark Image Generation
    zh_Hans: 图片生成
    pt_BR: Geração de imagens Spark
  • name: 工具的唯一标识符,是 spark_img_generation

  • author: 工具的创建者或作者,是 Onelevenvy

  • label: 工具在不同语言中的显示名称。

    • en_US: 在英语中是 Spark Image Generation(“Spark 图像生成”)。
    • zh_Hans: 在简体中文中是 图片生成(意思是“图像生成”)。
    • pt_BR: 在葡萄牙语(巴西)中是 Geração de imagens Spark(意思是“Spark 图像生成”)。
  • icon: 工具关联的图标,指定为 icon.svg

  • description: 工具的简要描述,支持多种语言。

    • en_US: 在英语中描述为 Spark Image Generation(与标签相同)。
    • zh_Hans: 在简体中文中是 图片生成(与标签相同)。
    • pt_BR: 在葡萄牙语(巴西)中是 Geração de imagens Spark(与标签相同)。

2.Description 部分

提供有关工具的详细信息,包括对人类用户和语言模型的描述。

description:
  human:
    en_US: Generate images based on user input, with image generation API
      provided by Spark
    zh_Hans: 根据用户的输入生成图片,由讯飞星火提供图片生成api
    pt_BR: Gerar imagens com base na entrada do usuário, com API de geração
      de imagem fornecida pela Spark
  llm: spark_img_generation is a tool used to generate images from text
  • human: 这个子部分描述了从用户的角度如何使用这个工具。

    • en_US: 在英语中,描述为"根据用户输入生成图像,使用 Spark 提供的图像生成 API"。
    • zh_Hans: 在简体中文中是"根据用户的输入生成图片,由讯飞星火提供图片生成 api"。
    • pt_BR: 在葡萄牙语(巴西)中是"根据用户输入生成图像,使用 Spark 提供的图像生成 API"。
  • llm: 这个子部分为语言模型提供描述。

    • 说明 spark_img_generation 是一个从文本生成图像的工具。

3.Parameters 部分

parameters:
  - name: prompt
    type: string
    required: true
    label:
      en_US: Prompt
      zh_Hans: 提示词
      pt_BR: Prompt
    human_description:
      en_US: Image prompt
      zh_Hans: 图像提示词
      pt_BR: Image prompt
    llm_description: Image prompt of spark_img_generation tooll, you should
      describe the image you want to generate as a list of words as possible
      as detailed
    form: llm
  • parameters: 这个部分定义了工具接受的参数。
    • name: 参数的名称,是 prompt
    • type: 参数的类型,是 string(字符串)。
    • required: 指示该参数是否是必需的。在这里是 true,意味着 prompt 是必需的。
    • label: 参数的显示标签,支持多种语言。
      • en_US: 在英语中是 Prompt(“提示词”)。
      • zh_Hans: 在简体中文中是 提示词(意思是“提示”)。
      • pt_BR: 在葡萄牙语(巴西)中是 Prompt(与英语相同)。
    • human_description: 为人类用户提供的参数描述。
      • en_US: 在英语中描述为“Image prompt”(图像提示词)。
      • zh_Hans: 在简体中文中是 图像提示词(描述图像的提示)。
      • pt_BR: 在葡萄牙语(巴西)中是 Image prompt(与英语相同)。
    • llm_description: 为语言模型提供的参数描述。
      • 说明 prompt 是生成图像的输入。描述应尽可能详细,以便生成所需的图像。
    • form: 指定期望的输入形式,这里是 llm(可能指语言模型的输入)。form 表单类型,目前支持 llm、form 两种类型,分别对应 Agent 自行推理和前端填写。

四.spark_img_generation.py(工具代码)

工具的整体逻辑都在 _invoke 方法中,这个方法接收两个参数:user_idtool_paramters,分别表示用户 ID 和工具参数。

1.spark_response()方法

主要是发起 requests.post 请求,返回图像内容:

def spark_response(text, appid, apikey, apisecret):
    host = "http://spark-api.cn-huabei-1.xf-yun.com/v2.1/tti"
    url = assemble_ws_auth_url(
        host, method="POST", api_key=apikey, api_secret=apisecret
    )
    content = get_body(appid, text)
    response = requests.post(
        url, json=content, headers={"content-type": "application/json"}
    ).text
    return response

返回图像具体内容:

2.img_generation()方法

主要是返回图像具体的内容:

def img_generation(self, prompt):
    response = spark_response(
        text=prompt,
        appid=self.runtime.credentials.get("APPID"),
        apikey=self.runtime.credentials.get("APIKey"),
        apisecret=self.runtime.credentials.get("APISecret"),
    )
    data = json.loads(response)
    code = data["header"]["code"]
    if code != 0:
        return self.create_text_message(f"error: {code}, {data}")
    else:
        text = data["payload"]["choices"]["text"]
        image_content = text[0]
        image_base = image_content["content"]
        json_data = {"base64_image": image_base}
    return [json_data]

3._invoke()方法

对图像内容 image[“base64_image”]进行 b64decode 解码,创建 create_blob_message:

def _invoke(
    self,
    user_id: str,
    tool_parameters: dict[str, Any],
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
    <em>"""</em>
<em>    invoke tools</em>
<em>    """</em>
    ......
    prompt = tool_parameters.get("prompt", "")
    if not prompt:
        return self.create_text_message("Please input prompt")
    res = self.img_generation(prompt)
    result = []
    for image in res:
        result.append(
            self.create_blob_message(
                blob=b64decode(image["base64_image"]),
                meta={"mime_type": "image/png"},
                save_as=self.VARIABLE_KEY.IMAGE.value,
            )
        )
    return result

原始图像内容进行 b64decode 解码后的图像内容:

说明:生成的图像保存在 dify-0.6.14\api\storage\tools\095756e3-1af6-435f-bafb-82c05264f64d 目录。

参考文献

[1] 快速接入工具:https://docs.dify.ai/v/zh-hans/guides/gong-ju/quick-tool-integration

[2] 高级接入工具:https://docs.dify.ai/v/zh-hans/guides/gong-ju/advanced-tool-integration

[3] 工具配置:https://docs.dify.ai/v/zh-hans/guides/gong-ju/tool-configuration

[4] Dify 中的工具:https://z0yrmerhgi8.feishu.cn/wiki/L0WWwUllrirwNvksBMjcOCmanuh

NLP工程化(星球号)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2154883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

巨潮股票爬虫逆向

目标网站 aHR0cDovL3dlYmFwaS5jbmluZm8uY29tLmNuLyMvSVBPTGlzdD9tYXJrZXQ9c3o 一、抓包分析 请求头参数加密 二、逆向分析 下xhr断点 参数生成位置 发现是AES加密&#xff0c;不过是混淆的&#xff0c;但并不影响咱们扣代码 文章仅提供技术交流学习&#xff0c;不可对目标服…

Java 分布式锁:原理与实践

在分布式系统中&#xff0c;多个节点同时操作共享资源的情况非常普遍。为了保证数据的一致性&#xff0c;分布式锁 应运而生。分布式锁 是一种跨多个服务器的互斥锁&#xff0c;用于协调分布式环境下的资源访问。 本文将介绍 Java 实现分布式锁 的几种常见方式&#xff0c;并结…

基于VUE的医院抗生素使用审核流程信息化管理系统

开发背景 随着医疗行业的快速发展和信息技术的不断进步&#xff0c;医院内部管理系统的信息化建设变得尤为重要。抗生素作为治疗感染性疾病的重要药物&#xff0c;在临床使用过程中需要严格控制以避免滥用导致的耐药性问题。传统的抗生素使用审核流程往往依赖于人工审核&#x…

一,初始 MyBatis-Plus

一&#xff0c;初始 MyBatis-Plus 文章目录 一&#xff0c;初始 MyBatis-Plus1. MyBatis-Plus 的概述2. 入门配置第一个 MyBatis-Plus 案例3. 补充说明&#xff1a;3.1 通用 Mapper 接口介绍3.1.1 Mapper 接口的 “增删改查”3.1.1.1 查询所有记录3.1.1.2 插入一条数据3.1.1.3 …

推荐3个AI论文、AI查重、AI降重工具

什么是AI论文、AI查重、AI降重工具&#xff1f; AI论文 AI论文指的是以人工智能&#xff08;AI&#xff09;相关主题为研究对象的学术论文。这类论文通常包含以下内容&#xff1a; 研究问题&#xff1a;针对某个特定的AI问题或领域的研究。方法&#xff1a;介绍用于解决问题…

UnLua实现继承

一、在蓝图中实现继承 1、创建父类&#xff0c;并绑定Lua脚本 2、创建子类蓝图&#xff0c;如果先创建的子类&#xff0c;可以修改父类继承 注意&#xff0c;提示选择继承父类的接口&#xff01; 二、在Lua中实现继承 1、在父类Lua脚本中实现函数 BP_CharacterBase.lua func…

SysML图例-智能家居

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

spring boot(学习笔记第二十课) vue + spring boot前后端分离项目练习

spring boot(学习笔记第二十课) vue spring boot前后端分离项目练习 学习内容&#xff1a; 后端程序构建前端程序构建 1. 后端程序构建 前后端分离结构 前后端就是前端程序和后端程序独立搭建&#xff0c;通过Restful API进行交互&#xff0c;进行松耦合的设计。后端程序构建…

【吊打面试官系列-MySQL面试题】MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么&#xff1f; 以下是 MySQL_fetch_array 和 MySQL_fe…

VisionPro - 基础 - 模板匹配技术和在VP中的使用 - PMAlign - PatMax (5)- 非线性模板变形匹配

前言&#xff1a; 本机继续对VP的PatMax 算子进行说明&#xff1a;本节讲非线性变形的模板匹配。 Non-Linear Pattern Deformation By default, PatMax requires that each boundary point in the instance of a pattern found in a run-time image closely correspond to a b…

低空经济火爆,稀缺无人机教员培训详解

随着科技的飞速发展和低空经济的日益火爆&#xff0c;无人机技术已广泛应用于航拍、农业、物流、救援、环境监测等多个领域&#xff0c;成为推动社会经济发展的新引擎。然而&#xff0c;无人机行业的快速发展也催生了对专业无人机教员的迫切需求。本文将从基础理论学习、实操技…

[Redis][List]详细讲解

目录 0.前言1.常用命令1.LPUSH / RPUSH2.LPUSHX / RPUSHX3.LRANGE4.LPOP / RPOP5.LINDEX6.LINSERT7.LLEN8.LREM9.LTRIM10.LSET 2.阻塞版本命令0.是什么&#xff1f;1.BLPOP / BRPOP 3.内部编码(旧版本&#xff0c;仅供参考)1.ziplist(压缩链表)2.linkedlist(链表)3.quicklist(快…

yolov8旋转目标检测之绝缘子检测-从数据加载到模型训练、部署

YOLOv8 是 YOLO (You Only Look Once) 系列目标检测算法的最新版本&#xff0c;以其高速度和高精度而著称。在电力行业中&#xff0c;绝缘子是电力传输线路上的重要组件之一&#xff0c;它们用于支撑导线并保持电气绝缘。由于长期暴露在户外环境中&#xff0c;绝缘子容易出现损…

详细分析Spring的动态代理机制

文章目录 1. JDK动态代理和CGLIB动态代理的区别1.1 适用范围1.2 生成的代理类1.3 调用方式 2. 问题引入3. 创建工程验证 Spring 默认采用的动态代理机制3.1 引入 Maven 依赖3.2 UserController.java3.3 UserService.java3.4 UserServiceImpl.java&#xff08;save方法添加了Tra…

【Python】探索 TensorFlow:构建强大的机器学习模型

TensorFlow 是一个开源的深度学习框架&#xff0c;由 Google 开发&#xff0c;广泛应用于机器学习和人工智能领域。自从 2015 年推出以来&#xff0c;它已成为研究人员、开发者和数据科学家们不可或缺的工具。TensorFlow 提供了灵活、高效的工具集&#xff0c;可以帮助我们构建…

API接口在金融科技领域的创新应用

导语&#xff1a; 随着互联网的发展和技术的进步&#xff0c;API接口在金融科技领域的创新应用越来越受到关注。本文将介绍API接口的基本概念&#xff0c;以及它在金融科技领域的应用案例。 第一部分&#xff1a;API接口简介及原理 API是Application Programming Interface&…

2021-03-03人工智能应用的就业效应

【摘要】文章从人工智能的概念出发&#xff0c;在总结已有研究方法的基础上&#xff0c;回顾了人工智能对就业的产业分布、岗位、工资等方面影响的理论与实证研究。文章发现&#xff0c;人工智能技术在替代部分岗位、促使劳动力在不同产业间流动的同时&#xff0c;还会加快劳动…

java 获取集合a比集合b多出来的对象元素

public class OrderListEntity {/*** deprecated 对象集合的处理* param aData 集合a* param bData 集合b* return 返回集合a比集合b多出来的部分, 通过id判断*/public static List<OrderListEntity> AHasMoreThanBData(List<OrderListEntity> aData, List<Ord…

LEAN 赋型唯一性(Unique Typing)之 Church-Rosser 定理 (Church-Rosser Theorem)及 赋型唯一性的证明

有了并行K简化的概念及其属性&#xff0c;以及其在LEAN类型理论中的相关证明&#xff0c;就可以证明&#xff0c;在K简化下的Church-Rosser 定理。即&#xff1a; 其过程如下&#xff1a; 证明如下&#xff1a; 其中的 lemma 4.9 和 4.10 &#xff0c;及 4.8 是 这整个证明过程…

华为云centos7.9按装ambari 2.7.5 hostname 踩坑记录

华为云centos7.9按装ambari 2.7.5踩坑记录 前言升华总结 前言 一般都是废话&#xff0c;本人专业写bug业余运维。起初找了三台不废弃的台式机&#xff0c;开始重装centos系统&#xff0c;开始了HDP3.1.5Ambari2.7.5安装。 推荐一波好文&#xff0c;一路长绿。跑了一段时间没啥…