# dify-java-client **Repository Path**: sean-zhanglei/dify-java-client ## Basic Information - **Project Name**: dify-java-client - **Description**: The Simple and Easy-to-Use Dify Java Client (一款简单易用的 Dify Java 客户端) - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2025-08-11 - **Last Updated**: 2025-08-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README dify-java-client ---

maven-central   maven-central   maven-central

简单易用的 Dify Java客户端,支持在任意Java项目中使用 [Dify](https://dify.ai/) 的工作流、对话助手、Agent、Dataset、文字转语音、语音转文字等开放能力。 中文 | [English](./README_EN.md) ## 安装依赖 - 环境需求 ```code Java : >= 17 Dify Version: <= 1.x ``` - maven ```xml io.github.yuanbaobaoo dify-java-client 1.4.5 ``` - gradle ```gradle implementation group: 'io.github.yuanbaobaoo', name: 'dify-java-client', version: '1.4.5' ``` ## 快速开始 使用 ```DifyClientBuilder``` 创建各类客户端实例 ```java /** * 创建一个对话类型客户端对象,支持 base()、chat()、flow()、completion() 其对应返回类型也是不一致的 */ IAppChatClient appClient = DifyClientBuilder.app().chat().apiKey("app-xxx").baseUrl("https://api.dify.ai/v1").build(); /** * 创建一个知识库类型客户端对象 */ IDatasetClient datasetClient = DifyClientBuilder.dataset().apiKey("app-xxx").baseUrl("https://api.dify.ai/v1").build(); /** * 创建一个WebConsole类型客户端对象,用于模拟Dify控制台操作(试验特性) */ IWebConsoleClient webClient = DifyClientBuilder.web("${server}", "${userName}", "${password}").connect(); ``` ## 创建 App 类型的 Client 在代码中,使用 ```DifyClientBuilder.app()``` 即可创建App类型的客户端对象。 App客户端是指适用于 ChatBot、Agent、ChatFlow、Completion 类型的应用,提供了会话相关的API,支持会话的流式返回。主要包含如下: - [```IAppBaseClient```](https://github.com/yuanbaobaoo/dify-java-client/blob/master/src/main/java/io/github/yuanbaobaoo/dify/app/IAppBaseClient.java) - [```IAppChatClient```](https://github.com/yuanbaobaoo/dify-java-client/blob/master/src/main/java/io/github/yuanbaobaoo/dify/app/IAppChatClient.java) - [```IAppFlowClient```](https://github.com/yuanbaobaoo/dify-java-client/blob/master/src/main/java/io/github/yuanbaobaoo/dify/app/IAppFlowClient.java) - [```IAppCompletion```](https://github.com/yuanbaobaoo/dify-java-client/blob/master/src/main/java/io/github/yuanbaobaoo/dify/app/IAppCompletion.java) ### 1、IAppBaseClient 基础Client,提供Dify公共API,具体可查阅 ```IAppBaseClient``` ```java IAppBaseClient client = DifyClientBuilder.app().base().apiKey("app-xxxx").baseUrl("https://api.dify.ai/v1").build(); // 调用接口 String metaInfo = client.getAppMetaInfo(); // 上传文件 DifyFileResult result = client.uploadFile(new File("pom.xml"), "abc-123"); ``` ### 2、IAppChatClient 适用于 ChatBot、Agent、ChatFlow 类型应用,继承自 ```IAppBaseClient```,提供了会话相关的API: ```java IAppChatClient client = DifyClientBuilder.app().chat().apiKey("app-xxxx").baseUrl("https://api.dify.ai/v1").build(); // 创建消息 ParamMessage m = ParamMessage.builder().query("你是谁").user("abc-123").inputs(Map.of( "test", "value", "file1", ParamFile.builder() .type(ParamFile.FileType.audio) .transferMethod(ParamFile.TransferMethod.remote_url) .build() )).build(); // 发送阻塞消息 DifyChatResult result = chatClient.sendMessages(m); // 发送流式消息 CompletableFuture future = client.sendMessagesAsync(m, (r) -> { System.out.println("ok: " + r.getPayload().toJSONString()); }); ``` ### 3、IAppFlowClient 适用于 WorkFlow 类型应用,继承自 ```IAppBaseClient```,提供了工作流相关的API: ```java IAppFlowClient flowClient = DifyClientBuilder.app().flow().apiKey("app-xxxx").baseUrl("https://api.dify.ai/v1").build(); // 创建消息 ParamMessage m = ParamMessage.builder().user("abc-123").inputs(Map.of( "name", "元宝宝", "text", "Java为什么叫Java?" )).build(); // 阻塞式运行工作流 DifyChatResult result = flowClient.runBlocking(m); // 流式运行工作流 CompletableFuture future = client.runStreaming(m, (r) -> { System.out.println("ok: " + r.getPayload().toJSONString()); }); ``` ### 4、IAppCompletion 适用于 Completion 类型应用,继承自 ```IAppBaseClient```,提供了文本生成相关的API: ```java IAppCompletion completion = DifyClientBuilder.completion().flow().apiKey("app-xxxx").baseUrl("https://api.dify.ai/v1").build(); // 创建消息 ParamMessage m = ParamMessage.builder().query("Java为什么叫Java").user("abc-123").build(); // 阻塞式运行 DifyChatResult result = completion.sendMessages(m); // 流式运行 CompletableFuture future = completion.sendMessagesAsync(m, (r) -> { System.out.println("ok: " + r.getPayload().toJSONString()); }); ``` ## 创建 知识库 类型的 Client 当前项目提供了内部知识库Client 与 外部知识库相关类型定义,其中外部知识库并没有做具体实现。 ### Dify内置知识库: IDifyDatasetClient 具体API定义,请查阅 [```io.github.yuanbaobaoo.dify.dataset.IDifyDatasetClient```](https://github.com/yuanbaobaoo/dify-java-client/blob/master/src/main/java/io/github/yuanbaobaoo/dify/dataset/IDatasetClient.java) #### 参考案例 ```java IDatasetClient client = DifyClientBuilder.dataset().apiKey("dataset-xxxx").baseUrl("https://api.dify.ai/v1").build(); // 声明参数 ParamDataset dataset = ParamDataset.builder() .name("你的知识库名称") .build(); // 创建空知识库 client.create(dataset); ``` #### Hero类 项目中,针对知识库的工具类,除了提供了基于 ```IDatasetClient``` 的相关方法外,还提供了Hero类对知识库进行操作支持。 具体使用哪种方式,取决于你的需求。 - 案例一:新增文档 ```java // dify 配置 DifyConfig config = DifyConfig.builder().server("https://api.dify.ai/v1").apiKey("dataset-xxxx").build(); // 声明参数 ParamDocument document = ParamDocument.builder() .name("测试文档") .text("你好啊你好吧") .indexingTechnique(DatasetConsts.IndexingTechnique.high_quality) .processRule(ProcessRule.builder().mode(ProcessRule.Mode.automatic).build()) .build(); ``` 方式1、直接使用 IDatasetClient操作API ```java IDatasetClient client = DifyClientBuilder.dataset().config(config).build(); client.insertDocByText("知识库ID", document); ``` 方式2、使用 DifyClientBuilder 创建一个 Hero对象 ```java DatasetHero dataset = DifyClientBuilder.dataset().config(config).of("知识库ID"); dataset.insertTxt(document); ``` 方式3、直接创建Hero对象 ```java DatasetHero dataset = DatasetHero.of("知识库ID", config); dataset.insertTxt(document); ``` - 案例2:更新文档 ```java // dify 配置 DifyConfig config = DifyConfig.builder().server("https://api.dify.ai/v1").apiKey("dataset-xxxx").build(); // 声明参数 ParamDocument document = ParamDocument.builder() .name("测试.txt2") .text("又疑瑶台近,飞上青云端") .build(); ``` 方式1、直接使用 IDatasetClient操作API ```java IDatasetClient client = DifyClientBuilder.dataset().config(config).build(); client.updateDocByText("知识库ID", "文档ID", dataset); ``` 方式2、使用 DifyClientBuilder 创建一个 Hero对象 ```java DocumentHero documentHero = DifyClientBuilder.dataset().config(config).ofDocument("知识库ID", "文档ID"); documentHero.updateByText(document); ``` 方式3、直接创建Hero对象 ```java DocumentHero documentHero = DocumentHero.of("知识库ID", "文档ID", config); documentHero.updateByText(document); ``` ### Dify外部知识库: IKnowledgeService 当前项目并未对知识库API做实现,只声明了相关参数对象和接口 ```java public interface IKnowledgeService { /** * 知识检索 * @param apiKey Dify传递的API KEY * @param args KnowledgeArgs */ KnowledgeResult retrieval(String apiKey, KnowledgeArgs args); } ``` 如果你有需求,可以基于声明的参数与接口进行实现即可,以下为参考代码“: - 1、声明一个endpoint ```java /** * 检索本地知识库内容 * @param args KnowledgeArgs */ @PostMapping("/retrieval") public KnowledgeResult retrieval(@RequestBody(required = false) KnowledgeArgs args, HttpServletRequest request) { return knowledgeService.retrieval(request.getHeader("Authorization"), args); } ``` - 2、实现接口```io.github.yuanbaobaoo.dify.dataset.IKnowledgeService``` ```java class KnowledgeService implements IKnowledgeService { @Override public KnowledgeResult retrieval(String apiKey, KnowledgeArgs args) { // TODO 你的本地知识库检索逻辑 } } ``` ## 创建 WebConsole Client 用于模拟登录到 Dify Web控制台,并请求控制台的接口。 - 参数 ```java WebConfig config = WebConfig.builder() .server("https://api.dify.ai/") .userName("username") .password("password") .build(); ``` - 登录 ```java IWebConsoleClient client = DifyClientBuilder.web(config).connect(); ``` - 请求 ```java /** * get app list */ DifyPage res = client.queryApps(1, 30, null); /** * request custom api */ String res = client.httpClient().requestJson(); ``` ## 请求自定义接口 任意的Client对象,都拥有一个httpClient()方法, 该方法会返回一个已经注入了 api key 和 server url 或者 login token属性的 SimpleHttpClient 对象,你可以使用该对象进行自定义接口请求。 ```java SimpleHttpClient http = client.httpClient(); ``` ## 异常处理 - **DifyException** >默认情况下,当正常的请求返回了 http status >= 400 时,都会抛出一个异常对象 ```DifyException```。 该对象接收了Dify返回的 ```status```、```code```、```message```、```params``` 这几个属性。 当然你也可以通过 ```getOriginal()``` 方法获取原始返回内容。 - **DifyClientException** >除了 ```DifyException``` 之外,其他所有类型的异常都会被包装成非受检异常 ```DifyClientException``` 抛出