java对接Dify的聊天助手API(实战篇)

前面的博客有讲到如何部署Dify以及简单使用,为了迎合企业级需求,快速搭建AI应用。

图片

此次演示采用RuoYI-Vue-Plus框架,后续会出具体使用教程!

步骤一:启动Dify

进入Dify的docker目录,cmd回车,执行如下命令

docker compose up -d

图片

注:需要提前启动docker,目前使用的Docker Desktop

图片

浏览器访问界面:localhost:80

图片

步骤二:搭建聊天助手

图片

中间步骤省略,可参考之前的教程

图片

步骤三:发布并测试

图片

此次演示为"发送对话消息"的API

图片

获取秘钥

图片

postman接口测试

图片

需要请求体信息,具体参照接口文档

图片

测试效果

图片

返回信息

图片

扩展:清除控制台信息

图片

至此,对接流程已通,需要进行编码环节啦

步骤四:编写java代码

图片

目前idea版本2024.2,已成功破解,需要资料的可以加入技术群获取

application.yml

# 聊天助手chatAssist:  authorization: Bearer 你的秘钥  url: 你的dify服务地址

ChatAssistController

@RestController@RequestMapping("/chat")@Slf4jpublic class ChatAssistController {    @Autowired    private ChatAssistService chatAssistService;
    /**     * 聊天对话     *     * @param chatMessageDto     * @return     */    @PostMapping("/messages")    public SseEmitter sendChatMessage(@RequestBody ChatMessageDto chatMessageDto) {        return chatAssistService.sendChatMessage(chatMessageDto);    }}

ChatAssistService

public interface ChatAssistService {    /**     * 聊天对话     *     * @param chatMessageDto     * @return     */    public SseEmitter sendChatMessage(@RequestBody ChatMessageDto chatMessageDto);}

ChatAssistServiceImpl

@Service@Slf4jpublic class ChatAssistServiceImpl implements ChatAssistService {    @Autowired    private DifyConfig difyConfig;
    @Autowired    private RestTemplate restTemplate;
    /**     * 聊天对话     *     * @param chatMessageDto     * @return     */    @Override    public SseEmitter sendChatMessage(ChatMessageDto chatMessageDto) {        // 创建 SSE Emitter,设置超时时间(例如 5 分钟)        SseEmitter emitter = new SseEmitter(300_000L);
        // 使用线程池处理异步任务        ExecutorService executor = Executors.newSingleThreadExecutor();        executor.execute(() -> {            try {                String messageUrl = difyConfig.getChatAssistUrl() + "/chat-messages";
                // 创建请求头                HttpHeaders headers = new HttpHeaders();                headers.set("Authorization", difyConfig.getChatAssistAuthorization());                headers.setContentType(MediaType.APPLICATION_JSON);
                // 创建请求实体                HttpEntity<ChatMessageDto> requestEntity = new HttpEntity<>(chatMessageDto, headers);
                // 发送请求并处理流式响应                restTemplate.execute(                        messageUrl,                        HttpMethod.POST,                        request -> {                            // 设置请求头和请求体                            request.getHeaders().setContentType(MediaType.APPLICATION_JSON);                            request.getHeaders().addAll(requestEntity.getHeaders());
                            // 写入请求体                            if (requestEntity.getBody() != null) {                                new ObjectMapper().writeValue(request.getBody(), requestEntity.getBody());                            }                        },                        response -> {                            try (BufferedReader reader = new BufferedReader(new InputStreamReader(response.getBody()))) {                                String line;                                while ((line = reader.readLine()) != null) {                                    log.info("line: {}", line);                                    // 将每一行数据推送到前端                                    emitter.send(SseEmitter.event().data(line));                                }                                // 完成推送                                emitter.complete();                            }                            return null;                        }                );            } catch (Exception e) {                // 发生错误时推送错误信息                emitter.completeWithError(e);            } finally {                executor.shutdown();                log.info("对话结束...");            }        });        // 关闭线程池        executor.shutdown();        log.info("对话完成...");        return emitter;    }}

ChatMessageDto

@Datapublic class ChatMessageDto {    @JsonProperty("inputs")    private Object inputs;
    @JsonProperty("query")    private String query;
    @JsonProperty("response_mode")    private String responseMode;
    @JsonProperty("conversation_id")    private String conversationId;
    @JsonProperty("user")    private String user;
}

DifyConfig

@Data@Componentpublic class DifyConfig {    @Value("${chatAssist.authorization}")    private String chatAssistAuthorization;
    @Value("${chatAssist.url}")    private String chatAssistUrl;
    @Bean    public RestTemplate restTemplate() {        return new RestTemplate();    }}

步骤五:启动项目

与若依框架一样,需要启动redis服务

后端

图片

postman测试接口

图片

测试该接口发现,需要认证信息,知道该怎么办了把,没错,启动前端!

前端

图片

修改配置文件,由于Dify在本地部署,默认端口80与Dify冲突,否则造成服务不可用,所以修改为8080

控制台执行命令

npm install # 第一步npm run dev # 第二步

图片

自动跳转至登录页

图片

登录后,f12弹出开发人员常用框

图片

保存并执行

图片

至此,后端已成功对接聊天对话的API,其他API操作同理,可以与前端快速的搭建AI对话聊天,基于知识库实现企业级需求!

在使用 Java 对接 Dify 平台或服务时,主要涉及以下几个方面:配置 Dify API 的访问信息、使用 HTTP 客户端发送请求、处理返回结果以及集成到后端服务中。以下是一个详细的实现方案。 ### 配置 Dify API 访问信息 首先,需要在配置文件中设置 Dify API 的访问凭证和基础 URL。可以通过 Spring 的 `@Value` 注解来注入这些配置参数,如以下代码所示: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class DifyConfig { @Value("${dify.authorization}") private String authorizationToken; @Value("${dify.api.url}") private String apiUrl; @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public String getAuthorizationToken() { return authorizationToken; } public String getApiUrl() { return apiUrl; } } ``` ### 发送 HTTP 请求对接 Dify API 使用 `RestTemplate` 可以方便地发送 HTTP 请求与 Dify API 进行交互。以下是一个调用 Dify 聊天助手 API 的示例: ```java import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class DifyService { private final DifyConfig difyConfig; private final RestTemplate restTemplate; public DifyService(DifyConfig difyConfig, RestTemplate restTemplate) { this.difyConfig = difyConfig; this.restTemplate = restTemplate; } public String sendMessageToDify(String userMessage) { String url = difyConfig.getApiUrl(); HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer " + difyConfig.getAuthorizationToken()); headers.set("Content-Type", "application/json"); String requestBody = "{\"query\": \"" + userMessage + "\"}"; HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers); ResponseEntity<String> responseEntity = restTemplate.exchange( url, HttpMethod.POST, requestEntity, String.class ); if (responseEntity.getStatusCode().is2xxSuccessful()) { return responseEntity.getBody(); } else { throw new RuntimeException("Failed to communicate with Dify API"); } } } ``` ### 处理 Dify API 的响应 Dify API 返回的结果通常是 JSON 格式的数据。可以使用 `ObjectMapper` 或其他 JSON 解析库将响应内容转换为 Java 对象进行进一步处理。例如,解析聊天助手返回的响应: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class DifyResponseHandler { private static final ObjectMapper objectMapper = new ObjectMapper(); public static String extractAnswerFromResponse(String jsonResponse) throws Exception { // 假设返回的 JSON 中包含一个 "answer" 字段 return objectMapper.readTree(jsonResponse).get("answer").asText(); } } ``` ### 集成到 Spring Boot 应用中 为了将 Dify 服务集成到 Spring Boot 应用中,可以在控制器中调用 `DifyService` 并暴露一个 REST API 端点供前端或其他服务调用: ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class DifyController { private final DifyService difyService; public DifyController(DifyService difyService) { this.difyService = difyService; } @PostMapping("/chat") public String chatWithDify(@RequestBody ChatRequest chatRequest) { try { String response = difyService.sendMessageToDify(chatRequest.getMessage()); return DifyResponseHandler.extractAnswerFromResponse(response); } catch (Exception e) { return "Error: " + e.getMessage(); } } } class ChatRequest { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } ``` ### 配置文件示例 在 `application.properties` 或 `application.yml` 中配置 Dify 的相关参数: ```properties dify.authorization=your-dify-api-key dify.api.url=https://api.dify.ai/v1/chat-messages ``` ### 总结 通过以上步骤,Java 应用可以成功对接 Dify 平台或服务。首先配置 API 的访问信息,然后使用 `RestTemplate` 发送请求,处理返回的 JSON 数据,并将其集成到 Spring Boot 应用中。这种方式不仅适用于聊天助手 API,还可以扩展到其他 Dify 提供的功能,如 RAG 引擎、Agent 框架等[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值