From 09bf09c0ace21c595cd1681634365c71ba8bd572 Mon Sep 17 00:00:00 2001 From: Lin <220340138@cauc.edu.cn> Date: Sat, 26 Oct 2024 21:42:51 +0800 Subject: [PATCH] Multi dialogue & formate the response --- .classpath | 8 ++- WebContent/default/index.jsp | 2 +- WebContent/default/js/script.js | 11 ++-- src/javabean/db_conn.java | 2 +- src/servlet/ChatServlet.java | 56 +++++++++++------- target/classes/META-INF/MANIFEST.MF | 2 +- .../air_ticket_book/pom.properties | 4 +- target/classes/javabean/db_conn.class | Bin 3129 -> 3129 bytes target/classes/servlet/ChatServlet.class | Bin 5131 -> 5899 bytes 9 files changed, 52 insertions(+), 33 deletions(-) diff --git a/.classpath b/.classpath index 9e4c6d7..9706fd2 100644 --- a/.classpath +++ b/.classpath @@ -13,11 +13,15 @@ - - + + + + + + diff --git a/WebContent/default/index.jsp b/WebContent/default/index.jsp index d6314b2..6d52543 100644 --- a/WebContent/default/index.jsp +++ b/WebContent/default/index.jsp @@ -295,4 +295,4 @@ String todaydate = sdf.format(date); - \ No newline at end of file + diff --git a/WebContent/default/js/script.js b/WebContent/default/js/script.js index 38f2e19..6447e09 100644 --- a/WebContent/default/js/script.js +++ b/WebContent/default/js/script.js @@ -21,7 +21,7 @@ function sendMessage() { function addMessageToChat(sender, message) { const messageElement = document.createElement('div'); messageElement.classList.add('message', `${sender}-message`); - messageElement.textContent = message; + messageElement.innerHTML = message; // 使用innerHTML以支持HTML格式 chatHistory.appendChild(messageElement); chatHistory.scrollTop = chatHistory.scrollHeight; } @@ -41,10 +41,13 @@ async function callAIAPI(prompt) { } const result = await response.json(); - const aiResponse = result.output.text; + console.log('API响应:', result); // 添加这行来查看完整的响应 + + // 直接使用result.text,因为服务器返回的JSON结构中text是在顶层 + const aiResponse = result.text || '抱歉,我无法理解您的问题。'; addMessageToChat('ai', aiResponse); } catch (error) { console.error('Error:', error); - addMessageToChat('ai', '抱歉,出现了一些问题。请稍后再试。'); + addMessageToChat('ai', '抱歉,出现了一些问题。请稍后再试123。'); } -} \ No newline at end of file +} diff --git a/src/javabean/db_conn.java b/src/javabean/db_conn.java index 980cd5f..c370afe 100644 --- a/src/javabean/db_conn.java +++ b/src/javabean/db_conn.java @@ -13,7 +13,7 @@ public class db_conn { //ݿʼ public db_conn() { - String URL="jdbc:mysql://localhost:3306/fly_ticket?useSSL=false&useUnicode=true&characterEncoding=UTF8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"; //ݿ3306 + String URL="jdbc:mysql://localhost:3307/fly_ticket?useSSL=false&useUnicode=true&characterEncoding=UTF8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"; //ݿ3306 String USER="root"; //ݿû String PWD="123456"; //ݿ try{ diff --git a/src/servlet/ChatServlet.java b/src/servlet/ChatServlet.java index 9ba5057..7fe662a 100644 --- a/src/servlet/ChatServlet.java +++ b/src/servlet/ChatServlet.java @@ -11,13 +11,14 @@ import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; import org.json.JSONObject; import java.util.logging.Logger; import java.util.logging.Level; public class ChatServlet extends HttpServlet { - private static final String API_KEY = "sk-0ad1eaf5194249439f82698893607bef"; // 滻Ϊʵ API Կ - private static final String APP_ID = "1d2b00751a914efd84ea4b354fffd962"; // 滻ΪʵӦ ID + private static final String API_KEY = "sk-0ad1eaf5194249439f82698893607bef"; // 请替换为您的实际 API 密钥 + private static final String APP_ID = "1d2b00751a914efd84ea4b354fffd962"; // 请替换为您的实际应用 ID private static final String API_URL = "https://dashscope.aliyuncs.com/api/v1/apps/" + APP_ID + "/completion"; private static final Logger LOGGER = Logger.getLogger(ChatServlet.class.getName()); @@ -27,12 +28,17 @@ public class ChatServlet extends HttpServlet { response.setCharacterEncoding("UTF-8"); String prompt = request.getParameter("prompt"); + HttpSession session = request.getSession(); + String sessionId = (String) session.getAttribute("chatSessionId"); try { HttpClient client = HttpClient.newHttpClient(); JSONObject requestBody = new JSONObject(); JSONObject input = new JSONObject(); input.put("prompt", prompt); + if (sessionId != null) { + input.put("session_id", sessionId); + } requestBody.put("input", input); requestBody.put("parameters", new JSONObject()); @@ -44,38 +50,44 @@ public class ChatServlet extends HttpServlet { .build(); HttpResponse apiResponse = client.send(apiRequest, HttpResponse.BodyHandlers.ofString()); - /* - if (apiResponse.statusCode() == 200) { - PrintWriter out = response.getWriter(); - out.print(apiResponse.body()); - out.flush(); - */ + if (apiResponse.statusCode() == 200) { String responseBody = apiResponse.body(); - String formattedResponse = formatResponse(responseBody); // ʽӦ + JSONObject jsonResponse = new JSONObject(responseBody); + String newSessionId = jsonResponse.getJSONObject("output").getString("session_id"); + session.setAttribute("chatSessionId", newSessionId); + + String formattedResponse = formatResponse(responseBody); PrintWriter out = response.getWriter(); out.print(formattedResponse); out.flush(); } else { - LOGGER.log(Level.SEVERE, "API request failed with status code: " + apiResponse.statusCode()); + LOGGER.log(Level.SEVERE, "API请求失败,状态码: " + apiResponse.statusCode()); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - response.getWriter().write("{\"error\":\"APIʧ\"}"); + response.getWriter().write("{\"error\":\"API请求失败\"}"); } } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Error in ChatServlet", e); + LOGGER.log(Level.SEVERE, "ChatServlet出错", e); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - response.getWriter().write("{\"error\":\": " + e.getMessage() + "\"}"); + response.getWriter().write("{\"error\":\"服务器错误: " + e.getMessage() + "\"}"); } } - // ʽ + + // 格式化响应 private String formatResponse(String responseBody) { - // responseBodyַʽJSONҪȽ - // ʾַ滻͸ʽ - return responseBody - .replaceAll("\\*\\*(.*?)\\*\\*", "$1") // Ӵı - .replaceAll("\\n", "
") // 滻з - .replaceAll("(\\d+\\. )", "
  • $1") // б - .replaceAll("\\s+", " "); // ȥհ + JSONObject jsonResponse = new JSONObject(responseBody); + String text = jsonResponse.getJSONObject("output").getString("text"); + + // 格式化文本 + text = text.replaceAll("\\*\\*(.*?)\\*\\*", "$1") // 加粗文本 + .replaceAll("\\n", "
    ") // 替换换行符 + .replaceAll("(\\d+\\. )", "
  • $1") // 列表项目 + .replaceAll("\\s+", " "); // 去除多余空白 + + JSONObject formattedResponse = new JSONObject(); + formattedResponse.put("text", text); + formattedResponse.put("session_id", jsonResponse.getJSONObject("output").getString("session_id")); + + return formattedResponse.toString(); } } - diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF index 38f1f7e..9bdf3b1 100644 --- a/target/classes/META-INF/MANIFEST.MF +++ b/target/classes/META-INF/MANIFEST.MF @@ -1,4 +1,4 @@ Manifest-Version: 1.0 -Build-Jdk-Spec: 22 +Build-Jdk-Spec: 21 Created-By: Maven Integration for Eclipse diff --git a/target/classes/META-INF/maven/air_ticket_book/air_ticket_book/pom.properties b/target/classes/META-INF/maven/air_ticket_book/air_ticket_book/pom.properties index c1dbc80..194bf34 100644 --- a/target/classes/META-INF/maven/air_ticket_book/air_ticket_book/pom.properties +++ b/target/classes/META-INF/maven/air_ticket_book/air_ticket_book/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Tue Oct 22 14:56:12 CST 2024 +#Sat Oct 26 20:26:49 CST 2024 artifactId=air_ticket_book groupId=air_ticket_book -m2e.projectLocation=C\:\\Users\\RichardWang\\Desktop\\ai_agent +m2e.projectLocation=D\:\\college\\SE2\\air_ticket_book-master\\\u8F6F\u4EF6\u5DE5\u7A0B\u8BFE\u7A0B\u8BBE\u8BA1\\air_ticket_book m2e.projectName=air_ticket_book version=0.0.1-SNAPSHOT diff --git a/target/classes/javabean/db_conn.class b/target/classes/javabean/db_conn.class index 8f493cb04b310fa9982196570ff33c6e2557d7c5..8d11bcdc2d10f9bc090269a76349a43a7d4d0b72 100644 GIT binary patch delta 12 Tcmdlfu~TBg8%FbuZ+*A{Bn<^j delta 12 Tcmdlfu~TBg8%DE@Z+*A{BnSmd diff --git a/target/classes/servlet/ChatServlet.class b/target/classes/servlet/ChatServlet.class index 9eb97a947cececa7393eeebf7e61b9463ce57965..72726cb3d2b936123b21ab6bd222b18f28f65f72 100644 GIT binary patch delta 2576 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 W%k*_BWmZ9E^r*8~(l4bs4)WhT$mk3J