Did some things like async API Call

This commit is contained in:
2026-01-31 23:12:56 +01:00
parent d947f74c02
commit a14ff2feb5
2 changed files with 64 additions and 11 deletions

View File

@@ -5,6 +5,7 @@ import java.net.URI;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import java.util.function.Consumer;
import de.derpandaa.aitestsuit.MessageDto.Role; import de.derpandaa.aitestsuit.MessageDto.Role;
import de.derpandaa.aitestsuit.OpenAiDto.Model; import de.derpandaa.aitestsuit.OpenAiDto.Model;
@@ -36,8 +37,6 @@ public class ChatGPTApiWrapper {
HttpClient client = HttpClient.newHttpClient(); HttpClient client = HttpClient.newHttpClient();
try { try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
JsonNode root = mapper.readTree(response.body()); JsonNode root = mapper.readTree(response.body());
return root.path("choices").path(0).path("message").path("content").asString(); return root.path("choices").path(0).path("message").path("content").asString();
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
@@ -45,5 +44,28 @@ public class ChatGPTApiWrapper {
} }
return ""; return "";
} }
}
public static void runAsync(OpenAiDto dto, Consumer<String> onResult) {
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(dto);
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.openai.com/v1/chat/completions"))
.header("Content-Type", "application/json").header("Authorization", "Bearer " + API_KEY)
.POST(HttpRequest.BodyPublishers.ofString(jsonBody)).build();
HttpClient client = HttpClient.newHttpClient();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body)
.thenAccept(body -> {
try {
JsonNode root = mapper.readTree(body);
String content = root.path("choices").path(0).path("message").path("content").asString();
onResult.accept(content);
} catch (Exception e) {
onResult.accept("");
}
}).exceptionally(ex -> {
onResult.accept("");
return null;
});
}
}

View File

@@ -7,19 +7,26 @@ import java.util.Properties;
import de.derpandaa.aitestsuit.MessageDto.Role; import de.derpandaa.aitestsuit.MessageDto.Role;
import de.derpandaa.aitestsuit.OpenAiDto.Model; import de.derpandaa.aitestsuit.OpenAiDto.Model;
import io.qt.core.QMetaObject;
import io.qt.core.QMimeData;
import io.qt.core.Qt.AlignmentFlag; import io.qt.core.Qt.AlignmentFlag;
import io.qt.core.Qt.ConnectionType;
import io.qt.gui.QColor; import io.qt.gui.QColor;
import io.qt.gui.QKeySequence;
import io.qt.gui.QPalette; import io.qt.gui.QPalette;
import io.qt.gui.QShortcut;
import io.qt.widgets.QApplication; import io.qt.widgets.QApplication;
import io.qt.widgets.QBoxLayout; import io.qt.widgets.QBoxLayout;
import io.qt.widgets.QComboBox; import io.qt.widgets.QComboBox;
import io.qt.widgets.QFrame; import io.qt.widgets.QFrame;
import io.qt.widgets.QHBoxLayout; import io.qt.widgets.QHBoxLayout;
import io.qt.widgets.QLabel; import io.qt.widgets.QLabel;
import io.qt.widgets.QLineEdit;
import io.qt.widgets.QMainWindow; import io.qt.widgets.QMainWindow;
import io.qt.widgets.QPushButton; import io.qt.widgets.QPushButton;
import io.qt.widgets.QScrollArea; import io.qt.widgets.QScrollArea;
import io.qt.widgets.QSizePolicy;
import io.qt.widgets.QSizePolicy.Policy;
import io.qt.widgets.QTextEdit;
import io.qt.widgets.QVBoxLayout; import io.qt.widgets.QVBoxLayout;
import io.qt.widgets.QWidget; import io.qt.widgets.QWidget;
@@ -28,7 +35,7 @@ public class ChatWindow extends QMainWindow {
private QBoxLayout layout; private QBoxLayout layout;
private QVBoxLayout chatLayout; private QVBoxLayout chatLayout;
private QWidget chatWidget; private QWidget chatWidget;
private QLineEdit textInput; private QTextEdit textInput;
private OpenAiDto openAiDto; private OpenAiDto openAiDto;
private QComboBox modelComboBox; private QComboBox modelComboBox;
@@ -61,15 +68,26 @@ public class ChatWindow extends QMainWindow {
layout.addWidget(scrollArea); layout.addWidget(scrollArea);
QHBoxLayout inputLayout = new QHBoxLayout(); QHBoxLayout inputLayout = new QHBoxLayout();
textInput = new QLineEdit(); textInput = new QTextEdit() {
@Override
protected void insertFromMimeData(QMimeData source) {
insertPlainText(source.text());
}
};
textInput.setMaximumHeight(100);
textInput.setPlaceholderText("Nachricht eingeben..."); textInput.setPlaceholderText("Nachricht eingeben...");
QPushButton sendButton = new QPushButton("Senden"); QPushButton sendButton = new QPushButton("Senden");
sendButton.clicked.connect(() -> sendMessage()); sendButton.clicked.connect(() -> sendMessage());
sendButton.setSizePolicy(new QSizePolicy(Policy.Minimum, Policy.Minimum));
inputLayout.addWidget(textInput); inputLayout.addWidget(textInput);
inputLayout.addWidget(sendButton); inputLayout.addWidget(sendButton);
layout.addLayout(inputLayout); layout.addLayout(inputLayout);
QShortcut shortcut = new QShortcut(new QKeySequence("Ctrl+Return"), widget);
shortcut.activated.connect(() -> sendMessage());
widget.setLayout(layout); widget.setLayout(layout);
setCentralWidget(widget); setCentralWidget(widget);
resize(600, 500); resize(600, 500);
@@ -88,7 +106,7 @@ public class ChatWindow extends QMainWindow {
frame.setFrameShadow(QFrame.Shadow.Raised); frame.setFrameShadow(QFrame.Shadow.Raised);
// frame.setMaximumWidth(Integer.MAX_VALUE); // frame.setMaximumWidth(Integer.MAX_VALUE);
// frame.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred); frame.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred);
QVBoxLayout frameLayout = new QVBoxLayout(frame); QVBoxLayout frameLayout = new QVBoxLayout(frame);
@@ -129,7 +147,7 @@ public class ChatWindow extends QMainWindow {
} }
private void sendMessage() { private void sendMessage() {
String message = textInput.text().trim(); String message = textInput.getPlainText().trim();
if (message.isEmpty()) { if (message.isEmpty()) {
return; return;
@@ -144,14 +162,27 @@ public class ChatWindow extends QMainWindow {
textInput.clear(); textInput.clear();
chatWidget.adjustSize(); chatWidget.adjustSize();
String answer = ChatGPTApiWrapper.run(openAiDto); QWidget loadingWidget = createMessage("Loading...", Role.assistant);
chatLayout.addWidget(loadingWidget);
chatWidget.adjustSize();
ChatGPTApiWrapper.runAsync(openAiDto, answer -> {
QMetaObject.invokeMethod(this, () -> {
chatLayout.removeWidget(loadingWidget);
loadingWidget.disposeLater();
openAiDto.addMessage(new MessageDto(Role.assistant, answer));
chatLayout.addWidget(createMessage(answer, Role.assistant));
chatWidget.adjustSize();
}, ConnectionType.QueuedConnection);
// update();
});
openAiDto.addMessage(new MessageDto(Role.assistant, answer));
chatLayout.addWidget(createMessage(answer, Role.assistant));
} }
public static void main(String[] args) { public static void main(String[] args) {
QApplication.initialize(args); QApplication.initialize(args);
QApplication.setStyle("Fusion");
initProperties(); initProperties();
ChatWindow window = new ChatWindow(); ChatWindow window = new ChatWindow();