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对话聊天,基于知识库实现企业级需求!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值