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

news/2024/9/19 5:54:18/ 标签: Dify, AIGC

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

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

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

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

identity:author: Onelevenvyname: sparklabel:en_US: Sparkzh_Hans: 讯飞星火pt_BR: Sparkdescription:en_US: Spark Platform Toolkitzh_Hans: 讯飞星火平台工具pt_BR: Pacote de Ferramentas da Plataforma Sparkicon: icon.svgtags:- 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-inputrequired: truelabel:en_US: Spark APPIDzh_Hans: APPIDpt_BR: Spark APPIDhelp:en_US: Please input your APPIDzh_Hans: 请输入你的 APPIDpt_BR: Please input your APPIDplaceholder:en_US: Please input your APPIDzh_Hans: 请输入你的 APPIDpt_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-inputrequired: truelabel:en_US: Spark APISecretzh_Hans: APISecretpt_BR: Spark APISecrethelp:en_US: Please input your Spark APISecretzh_Hans: 请输入你的 APISecretpt_BR: Please input your Spark APISecretplaceholder:en_US: Please input your Spark APISecretzh_Hans: 请输入你的 APISecretpt_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-inputrequired: truelabel:en_US: Spark APIKeyzh_Hans: APIKeypt_BR: Spark APIKeyhelp:en_US: Please input your Spark APIKeyzh_Hans: 请输入你的 APIKeypt_BR: Please input your Spark APIKeyplaceholder:en_US: Please input your Spark APIKeyzh_Hans: 请输入你的 APIKeypt_BR: Please input Spark APIKeyurl: 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,passelse: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_generationauthor: Onelevenvylabel:en_US: Spark Image Generationzh_Hans: 图片生成pt_BR: Geração de imagens Sparkicon: icon.svgdescription:en_US: Spark Image Generationzh_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 APIprovided by Sparkzh_Hans: 根据用户的输入生成图片,由讯飞星火提供图片生成apipt_BR: Gerar imagens com base na entrada do usuário, com API de geraçãode imagem fornecida pela Sparkllm: 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: prompttype: stringrequired: truelabel:en_US: Promptzh_Hans: 提示词pt_BR: Prompthuman_description:en_US: Image promptzh_Hans: 图像提示词pt_BR: Image promptllm_description: Image prompt of spark_img_generation tooll, you shoulddescribe the image you want to generate as a list of words as possibleas detailedform: 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"}).textreturn 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.ppmy.cn/news/1527541.html

相关文章

机器学习实战—天猫用户重复购买预测

目录 背景 数据集 用户画像数据 用户行为日志数据 训练数据 测试数据 提交数据 其它数据 数据探索 导入依赖库 读取数据 查看数据信息 缺失值分析 数据分布 复购因素分析 特征工程 模型训练 模型验证 背景 商家有时会在特定日期,例如节礼日(Boxing-day),黑…

vue3打包配置 vite、router、nginx配置

目录 vite配置router路由配置nginx配置配置一、多服务代理每个项目配置二、同一服务多项目 vue3项目打包需要注意的几个要点 有时候遇到新项目会忘记配置某些细节&#xff0c;导致经常花费一些时间去找问题 写个文章集中记录一下方便后续查找 vite配置 vite.config.js 文件 ba…

如何判断IP地址是否异常?

在我们日常的网络生活中&#xff0c;或许每个人都会遇到异常IP的情况&#xff0c;而出现这种情况的也存在多方因素。 IP地址冲突 当两个或两个以上设备同时使用相同IP地址时&#xff0c;会产生IP地址冲突&#xff0c;进而导致网络连接问题。在公共网络中&#xff0c;如使用公…

第六部分:1---进程间通信,匿名管道

目录 进程间通信 进程间通信的目的&#xff1a; 进程间通信的本质&#xff1a; 管道&#xff1a; 管道的定义&#xff1a; 匿名管道 单向通信的管道通路&#xff1a; 进程和文件之间的解耦&#xff1a; 单向管道的读写端回收问题&#xff1a; 管道通信主要实现动态数…

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…

SIP Servlets学习

1. SIP Servlets 基础 SIP Servlets 是一种扩展 Java Servlets 的 API&#xff0c;专门用于处理 SIP&#xff08;Session Initiation Protocol&#xff09;消息&#xff0c;用于实现语音和视频通信应用。SIP Servlets 在支持 SIP 的 Java Servlet 容器中运行&#xff08;如 JB…

Mysql查看锁阻塞信息

一 查看元数据锁 1.1 前提条件 1、需要确保下面这个sql查询出来的ENABLED值为YES select ENABLED from performance_schema.setup_instruments WHERE NAME wait/lock/metadata/sql/mdl; 如果为NO&#xff0c;则需要先将其开启&#xff1a; UPDATE performance_schema.setup…

C++中的const \static \this

目录 前言 一、const关键字 1、const修饰类的成员变量 2、const修饰类的成员函数 3、const修饰类的对象 二、static关键字 1、static修饰类中的成员变量 1. 共享性 2. 初始化 3. 访问权限 4. 内存分配 5. 不依赖于对象 2、static修饰类中的成员函数 三、this关键字…

数据结构--链表

文章目录 链表1.链表的特点2.链表的基础操作2.1增2.2删 3.自定义链表3.1 自定义单向链表3.2 自定义双向链表 链表 链表是一种常见的数据结构&#xff0c;由一系列节点构成&#xff0c;每个节点包含当前节点的数据和一个指针(单向链表)或者两个指针(双向链表)&#xff0c;链表是…

mysql怎样优化count(*) from 表名 where …… or ……这种慢sql

一 问题描述 线上发现一条类似这样的慢sql&#xff08;查询时长8s&#xff09;&#xff1a; select id,name,(select count(*) from t14 where t14.idt15.id or t14.id2t15.id) as cnt from t15 ; t14的id和id2字段上都有索引&#xff0c;但是因为条件里有or&#xff0c;导致…

21. 什么是MyBatis中的N+1问题?如何解决?

N1 问题是指在进行一对多查询时&#xff0c;应用程序首先执行一条查询语句获取结果集&#xff08;即 1&#xff09;&#xff0c;然后针对每一条结果&#xff0c;再执行 N 条额外的查询语句以获取关联数据。这个问题通常出现在 ORM 框架&#xff08;如 MyBatis 或 Hibernate&…

给虚拟机linux系统安装交叉编译工具链

我们在电脑上写的代码编译生成的是X86架构的二进制文件&#xff0c;只能在X86平台上运行&#xff0c;而开发板是ARM架构因此需要安装交叉编译链工具&#xff0c;这样在电脑上写的代码交叉编译之后生成的是ARM架构的二进制文件。 绿色的字眼是与本文无关的只是这样有助于我们的…

python 实现entropy熵算法

entropy熵算法介绍 Entropy&#xff08;熵&#xff09;算法并不是一个单一的、具体的算法&#xff0c;而是一个广泛的概念&#xff0c;用于描述系统无序程度或信息不确定性的量度。在计算机科学、信息论、热力学等多个领域中&#xff0c;熵都有重要的应用。 在计算机科学中&a…

【Vue】- 生命周期和数据请求案例分析

文章目录 知识回顾前言源码分析1. 生命周期2. 请求数据案例分析 拓展知识 总结 知识回顾 前言 Vue生命周期 ● 就是一个Vue实例从创建 到 销毁 的整个过程。 生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 ● 创建阶段&#xff1a;创建响应式数据 ● 挂载阶段…

【七篇文章从零速通transformer】01 从零开始解密神经网络:深度学习基础全解析

文章简介 本系列文章旨在帮助零基础的读者系统地掌握深度学习,最终能够理解 Transformer 架构。本篇文章是第一篇,我们将从深度学习最核心的知识——神经网络——开始讲解,深入浅出地带你了解神经网络的结构、如何让神经网络工作,激活函数、损失函数、优化器和反向传播等关…

Router安装以及导入

安装 本文适合Vue3的项目使用 安装vue-router4 npm install vue-router4在src目录下创建router的文件夹&#xff0c;并新建一个index.js在index.js中导入vue-router&#xff0c;并定义其实例 import { createRouter, createWebHistory } from vue-router//在其中定义路由 c…

[网络]TCP/IP协议 之 TCP协议的核心机制(2)

文章目录 TCP核心机制1. 确认应答2. 超时重传3. 连接管理三次握手四次挥手 4. 滑动窗口5. 流量控制6. 拥塞控制7. 延时应答8. 捎带应答9. 粘包问题10. 异常情况 TCP核心机制 1. 确认应答 (上篇) 2. 超时重传 (上篇) 3. 连接管理 建立连接的流程: 三次握手 断开连接的流程…

3本SCI/SSCI期刊更名,9月WOS更新!速看!

SCI/SSCI期刊目录9月份已更新&#xff01;快来查收最新动态&#xff01;如有相关领域作者有意投稿&#xff0c;可作为重点关注&#xff01; ​ 期刊动态 2024年9月科睿唯安期刊目录更新 2024年9月18日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;此次更新&#xff0c…

OceanBase 运维管理工具 OCP 4.x 升级:聚焦高可用、易用性及可观测性

可视化的管控平台&#xff0c;对 OceanBase 这类的分布式数据库及大规模数据的运维管理来说&#xff0c;是提升运维效率与数据库管理水平的重要工具。OceanBase 运维管理工具 OCP 作为专为OceanBase数据库设计的企业级全生命周期管理平台&#xff0c;为用户提供了全面的数据库可…

RocketMQ出现The broker does not support consumer to filter message by SQL92

在使用RocketMQ使用SQL过滤消息的时候&#xff0c;出现下面错误 原因是我们的配置文件没有开启SQL过滤功能&#xff0c;我们需要在每个配置文件中添加下面命令 #开启过滤消息时支持SQL92标准 enablePropertyFiltertrue接着我们重启namesrv与broker服务就解决问题 # 1.进入bi…