package com.dsideal.Res.Test; import cn.hutool.core.io.FileUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONArray; import com.jfinal.kit.PathKit; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; public class CallDeepSeek { private static final String API_KEY = "sk-44ae895eeb614aa1a9c6460579e322f1"; // 请替换为您的API KEY private static final String API_URL = "https://api.deepseek.com/v1/chat/completions"; public static void callDeepSeekStream(String prompt, SSEListener listener) { new Thread(() -> { StringBuilder fullResponse = new StringBuilder(); try { // 修改提示词确保只返回HTML String htmlPrompt = prompt + "请严格按照以下HTML模板格式输出SQL血缘关系图,只返回HTML代码:\n" + "\n" + "\n" + "\n" + " SQL血缘关系图\n" + " \n" + " \n" + "\n" + "\n" + "

SQL血缘关系图

\n" + "
\n" + " [请在此处插入mermaid格式的血缘关系图]\n" + "
\n" + " \n" + "\n" + ""; JSONObject json = new JSONObject(); json.set("model", "deepseek-chat"); // 修改为对象形式构建messages JSONObject message = new JSONObject(); message.set("role", "user"); message.set("content", htmlPrompt); JSONArray messages = new JSONArray(); messages.add(message); json.set("messages", messages); json.set("stream", true); System.out.println(json); // 打印最终请求体 HttpRequest request = HttpRequest.post(API_URL) .header("Content-Type", "application/json") .header("Authorization", "Bearer " + API_KEY) .header("Accept", "text/event-stream") .body(json.toString()); HttpResponse response = request.execute(); if (response.isOk()) { try (BufferedReader reader = new BufferedReader( new InputStreamReader(response.bodyStream(), "UTF-8"))) { String line; while ((line = reader.readLine()) != null) { if (line.startsWith("data:")) { String data = line.substring(5).trim(); if (!data.equals("[DONE]")) { try { JSONObject jsonData = JSONUtil.parseObj(data); if (jsonData.containsKey("choices")) { String content = jsonData.getJSONArray("choices") .getJSONObject(0) .getJSONObject("delta") .getStr("content", ""); if (content != null && !content.isEmpty()) { fullResponse.append(content); // 实时输出到控制台 System.out.print(content); System.out.flush(); listener.onData(content); } } } catch (Exception e) { System.err.println("解析SSE数据错误: " + e.getMessage()); } } } } } } // 保存HTML到文件 String htmlContent = fullResponse.toString(); if (htmlContent.contains("") && htmlContent.contains("")) { FileUtil.writeString(htmlContent, new File("C:\\1.html"), "UTF-8"); listener.onComplete("HTML已成功保存到C:\\1.html"); } else { listener.onError("返回内容不是有效的HTML"); } } catch (Exception e) { listener.onError(e.getMessage()); } }).start(); } public static void main(String[] args) { String sql = FileUtil.readUtf8String(new File(PathKit.getRootClassPath()+"/XueYuan.sql")); String prompt = "你是一个数据库SQL的血缘关系分析专家,我将提供SQL语句给你,帮我整理数据血缘关系,并且绘制HTML页面,以展示最终的可视化形式展现。"; callDeepSeekStream(prompt + "\n" + sql, new SSEListener() { @Override public void onData(String data) { System.out.print(data); } @Override public void onComplete(String fullResponse) { System.out.println("\n\n完整回复: " + fullResponse); } @Override public void onError(String error) { System.err.println("错误: " + error); } }); try { Thread.sleep(30000); } catch (InterruptedException e) { e.printStackTrace(); } } public interface SSEListener { void onData(String data); void onComplete(String fullResponse); void onError(String error); } }