超实用!Dify调用Java的3种实现方式!
在一些复杂的业务中,我们可能需要使用 Dify 调用外部程序(如 Java 程序),因为这样才能满足业务的特殊需求。
例如,当我们使用 Dify 实现“AI 简历自动筛选器”的时候,我们首先会使用 AI 筛选出符合招聘要求的简历,然后再将简历存放到公司的“人才库”系统中,完成后续流程的招聘需要(预约面试、面试评价、发送 Offer 等操作),这个时候就需要让 Dify 调用 Java 程序了。
那么问题来了,使用 Dify 调用 Java 程序的实现方式有哪些呢?今天我们就来盘点一下。
1.解决方案概述
Dify 调用 Java 程序的解决方案有以下几种:
- 通过 “HTTP 请求” 的方式调用 Java 程序。
- 通过 “自定义工具” 的方式调用 Java 程序。
- 通过 MCP 的方式调用 Java 程序。
接下来,我们分别来看。
2.HTTP请求
HTTP 请求允许通过 HTTP 协议发送服务器请求,适用于获取外部数据、webhook、生成图片、下载文件等情景。它让你能够向指定的网络地址发送定制化的 HTTP 请求,实现与各种外部服务的互联互通。
它的使用也很简单,我们只需要在 Dify 的工作流中添加“HTTP 请求”节点即可,如下图所示:
它的参数配置包含以下这些:
当然,我们也可以利用它来发送文件给 Java 程序,并且可以自定义失败重试配置和错误异常配置。
对于被调用方 Java 来说,只需要提供一个 HTTP 接口即可,当然生成环境要考虑添加 APIKey 以保证调用的安全性,这里提供一个简单的 Java 服务接口:
import com.ai.difyhttpserver.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/it")
public class InterviewController {
@RequestMapping("/add")
public boolean add(User user) {
// 执行数据库添加操作
System.out.println(user.toString());
return true;
}
}
3.自定义工具
自定义工具的调用方式,需要先把 Java 程序发不成 Dify 中的自定义工具,才能正常调用,如下图所示:
配置的 Schema 需要满足 OpenAPI 协议,配置如下:
{
"openapi": "3.1.0",
"info": {
"title": "html to image tools",
"description": "Generate image files based on HTML code",
"version": "v1.0.0"
},
"servers": [
{
"url": "http://192.168.3.94:8080"
}
],
"paths": {
"/html2img/gen": {
"get": {
"description": "Generate image files based on HTML code",
"operationId": "html2image",
"parameters": [
{
"name": "html",
"in": "query",
"description": "HTML code",
"required": true,
"schema": {
"type": "string"
}
}
],
"deprecated": false
}
}
},
"components": {
"schemas": {
}
}
}
同样,Java 服务器端只需要提供一个可以使用 HTTP 协议访问的接口即可。
4.MCP通讯
这种通讯方式实现最麻烦,有点大炮打蚊子的感觉,但也可以实现 Dify 调用 Java 程序,此时要求先试用 Java 程序,例如 Spring AI 实现一个 MCP 服务器端,然后再使用 Dify 添加支持 MCP 调用的 Agent 策略,来调用 Java 的 MCP 服务,如下图所示:
安装 Agent 策略(支持 MCP 工具)如下图所示:
MCP SSE 选装,非必须,可以为后续 Agent 提供 MCP 工具列表,方便 LLM 正确理解和调用工具。
配置MCP服务地址
Dify 只支持 HTTP 协议的 MCP 服务调用,它的配置格式如下:
{
"server_name1": {
"transport": "sse",
"url": "http://127.0.0.1:8000/sse",
"headers": {},
"timeout": 50,
"sse_read_timeout": 50
},
"server_name2": {
"transport": "sse",
"url": "http://127.0.0.1:8001/sse"
},
"server_name3": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8002/mcp",
"headers": {},
"timeout": 50
},
"server_name4": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8003/mcp"
}
}
支持配置多个 MCP 服务,或者是以下 JSON 格式也支持:
{
"mcpServers": {
"server_name1": {
"transport": "sse",
"url": "http://127.0.0.1:8000/sse",
"headers": {},
"timeout": 50,
"sse_read_timeout": 50
},
"server_name2": {
"transport": "sse",
"url": "http://127.0.0.1:8001/sse"
},
"server_name3": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8002/mcp",
"headers": {},
"timeout": 50
},
"server_name4": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8003/mcp"
}
}
}
配置Agent
Agent 需要配置的项目比较多,首先是 Agent 策略:
然后是 LLM,选择合适的大模型即可,之后配置 MCP 工具和 HTTP 地址,如下图所示:
之后配置指令和查询问题:
测试MCP调用
我们创建的是一个 ChatFlow,执行效果如下:
执行符合预期。
Spring AI 实现 MCP 服务器端参考我之前发的文章,这里就不再赘述。
小结
Dify 调用 Java 程序的实现方式有 3 种:HTTP 请求、自定义工具、MCP 通讯方式。其中最简单、最灵活的实现方式为 HTTP 请求方式;自定义工具适合偏工具性质(而非业务性质)的调用;MCP 适合一次性注入多个工具方法给 Dify 使用的场景。
本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、LangChain4j、Dify、AI Agent、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。
超实用!Dify调用Java的3种实现方式!的更多相关文章
- Java 8 的新特性和Java 的4种引用方式
一.接口的增强 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: interface Formula { double ca ...
- Java多线程--两种实现方式
进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...
- java的两种同步方式, Synchronized与ReentrantLock的区别
java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...
- Java单例模式几种实现方式
在平时的工作.学员的学习以及面试过程中,单例模式作为一种常用的设计模式,会经常被面试官问到,甚至笔试会要求学员现场默写,下面将会就单例模式的实现思路和几种常见的实现方式进行简单的分享. 单例模式,是一 ...
- java集合四种遍历方式
package conection; import java.util.Iterator;import java.util.LinkedList;import java.util.List; publ ...
- 转载:Java的四种引用方式
原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指 ...
- JAVA多线程三种实现方式
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- Java 多线程 三种实现方式
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- Java的四种引用方式
一.引用基本概念 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用.虚引用. 1.强引用(StrongRef ...
- java 线程三种实现方式
1继承thread public class MultiThread1 extends Thread{ public void run(){ for(int i=0; i<7; i++){ Sy ...
随机推荐
- 使用PySide6/PyQt6实现Python跨平台表格数据分页打印预览处理
我曾经在前面使用WxPython开发跨平台应用程序的时候,写了一篇<WxPython跨平台开发框架之列表数据的通用打印处理>,介绍在WxPython下实现表格数据分页打印处理的过程,在Wi ...
- mac 触控板 三指拖动
1. 打开系统偏好设置 点击屏幕左上角的苹果图标(),选择"系统设置". 2. 打开指针控制 在系统偏好设置窗口左侧栏中,点击"辅助功能",然后在右侧列表中, ...
- Major、Minor、Build Number及Revision 版本号注解含义
版本号 版本号由二至四个部分组成:主版本号.次版本号.内部版本号和修订号. 主版本号和次版本号两个部分为必选,内部版本号和修订号两个部分为可选.只有在未定义内部版本号部分时,修订号部分才为可选.所有定 ...
- 【Linux】3.7 定时任务调度
3.7定时任务调度 1. 任务调度原理 crond任务调度:crontab进行定时任务调度 使用方法:crontab [选项] crontab [选项] -e:编辑crontab定时任务 -i:查询c ...
- 从客户端(XXX)中检测到有潜在危险的 Request.Form 值
维护别人的某功能模块的时候,页面返回如下错误信息: [HttpRequestValidationException (0x80004005): 从客户端(TextBox1="<?xml ...
- python爬虫,beatifulsop获取标签属性值(取值)案例
前面的案例里,均采用正则匹配的方式取值 title = re.findall('">(.*?)</a>', i, re.S)[0]#标题 url = re.findall( ...
- 腾讯云短信发送【java】
先去官网申请secretId, secretKey,然后创建对应的模板 maven引入包 <dependency> <groupId>com.tencentcloudapi&l ...
- 重载(Overloading)与重写(Override)的区别?
重载(Overloading)与重写(Override)的区别? No. 区别 重载 重写 1 英文单词 Overloading Override 2 发生范围 发生在一个类里面 发生在继承关系中 3 ...
- windows查看连接过wifi的密码
如何使用批处理脚本获取已保存的WiFi密码 在日常使用电脑时,我们经常会连接多个WiFi网络.随着时间的推移,可能会忘记某些WiFi的密码.幸运的是,Windows系统提供了命令行工具netsh,可以 ...
- MYSQL的API
1.函数的使用 常用函数(比较,分组,判断等) 截取函数:substring_index(目标字符串,分隔符,序号) 获取时间函数:TIMESTAMPDIFF(格式,开始时间,结束时间) 2.遇到的问 ...