Qwen Code Java SDK
Das Qwen Code Java SDK ist ein experimentelles Mindest-SDK für den programmatischen Zugriff auf die Funktionen von Qwen Code. Es stellt eine Java-Schnittstelle zum Austausch mit der Qwen Code-Befehlszeilenschnittstelle (CLI) bereit und ermöglicht Entwicklern, Qwen Code-Funktionen in ihre Java-Anwendungen zu integrieren.
Voraussetzungen
- Java >= 1.8
- Maven >= 3.6.0 (zum Kompilieren aus dem Quellcode)
- qwen-code >= 0.5.0
Abhängigkeiten
- Protokollierung: ch.qos.logback:logback-classic
- Hilfsfunktionen: org.apache.commons:commons-lang3
- JSON-Verarbeitung: com.alibaba.fastjson2:fastjson2
- Tests: JUnit 5 (org.junit.jupiter:junit-jupiter)
Installation
Fügen Sie die folgende Abhängigkeit zu Ihrer Maven-Datei pom.xml hinzu:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>qwencode-sdk</artifactId>
<version>{$version}</version>
</dependency>Oder bei Verwendung von Gradle fügen Sie die Abhängigkeit zu Ihrer Datei build.gradle hinzu:
implementation 'com.alibaba:qwencode-sdk:{$version}'Kompilieren und Ausführen
Build-Befehle
# Projekt kompilieren
mvn compile
# Tests ausführen
mvn test
# JAR-Paket erstellen
mvn package
# In das lokale Repository installieren
mvn install
## Schnellstart
Die einfachste Möglichkeit, das SDK zu verwenden, ist die Methode `QwenCodeCli.simpleQuery()`:
```java
public static void runSimpleExample() {
List<String> result = QwenCodeCli.simpleQuery("hello world");
result.forEach(logger::info);
}Für erweiterte Anwendungsfälle mit benutzerdefinierten Transportoptionen:
public static void runTransportOptionsExample() {
TransportOptions options = new TransportOptions()
.setModel("qwen3-coder-flash")
.setPermissionMode(PermissionMode.AUTO_EDIT)
.setCwd("./")
.setEnv(new HashMap<String, String>() {{put("CUSTOM_VAR", "value");}})
.setIncludePartialMessages(true)
.setTurnTimeout(new Timeout(120L, TimeUnit.SECONDS))
.setMessageTimeout(new Timeout(90L, TimeUnit.SECONDS))
.setAllowedTools(Arrays.asList("read_file", "write_file", "list_directory"));
List<String> result = QwenCodeCli.simpleQuery("Wer bist du und welche Fähigkeiten besitzt du?", options);
result.forEach(logger::info);
}Für die Verarbeitung von Streaming-Inhalten mit benutzerdefinierten Content-Consumern:
public static void runStreamingExample() {
QwenCodeCli.simpleQuery("Wer bist du und welche Fähigkeiten besitzt du?",
new TransportOptions().setMessageTimeout(new Timeout(10L, TimeUnit.SECONDS)), new AssistantContentSimpleConsumers() {
@Override
public void onText(Session session, TextAssistantContent textAssistantContent) {
logger.info("Textinhalt empfangen: {}", textAssistantContent.getText());
}
@Override
public void onThinking(Session session, ThingkingAssistantContent thingkingAssistantContent) {
logger.info("Denkinhalt empfangen: {}", thingkingAssistantContent.getThinking());
}
@Override
public void onToolUse(Session session, ToolUseAssistantContent toolUseContent) {
logger.info("Tool-Aufruf empfangen: {} mit Argumenten: {}",
toolUseContent, toolUseContent.getInput());
}
@Override
public void onToolResult(Session session, ToolResultAssistantContent toolResultContent) {
logger.info("Tool-Ergebnis empfangen: {}", toolResultContent.getContent());
}
@Override
public void onOtherContent(Session session, AssistantContent<?> other) {
logger.info("Weiterer Inhalt empfangen: {}", other);
}
@Override
public void onUsage(Session session, AssistantUsage assistantUsage) {
logger.info("Nutzungsinformationen empfangen: Eingabetokens: {}, Ausgabetokens: {}",
assistantUsage.getUsage().getInputTokens(), assistantUsage.getUsage().getOutputTokens());
}
}.setDefaultPermissionOperation(Operation.allow));
logger.info("Streaming-Beispiel abgeschlossen.");
}Weitere Beispiele finden Sie unter src/test/java/com/alibaba/qwen/code/cli/example.
Architektur
Das SDK folgt einer geschichteten Architektur:
- API-Schicht: Stellt die zentralen Einstiegspunkte über die Klasse
QwenCodeClibereit, mit einfachen statischen Methoden für die grundlegende Nutzung - Sitzungsschicht: Verwaltet Kommunikationssitzungen mit der Qwen Code CLI über die Klasse
Session - Transport-Schicht: Verantwortlich für den Kommunikationsmechanismus zwischen SDK und CLI-Prozess (derzeit wird ein Prozess-basierter Transport über
ProcessTransportverwendet) - Protokoll-Schicht: Definiert Datenstrukturen für die Kommunikation basierend auf dem CLI-Protokoll
- Hilfsfunktionen (Utils): Allgemeine Hilfsfunktionen für nebenläufige Ausführung, Timeout-Handling und Fehlerbehandlung
Wichtige Funktionen
Berechtigungsmodi
Das SDK unterstützt verschiedene Berechtigungsmodi zur Steuerung der Tool-Ausführung:
default: Schreib-Tools sind standardmäßig verboten, es sei denn, sie werden über dencanUseTool-Callback oder inallowedToolsfreigegeben. Lese-Only-Tools werden ohne Bestätigung ausgeführt.plan: Alle Schreib-Tools werden blockiert; die KI wird angewiesen, zunächst einen Plan vorzulegen.auto-edit: Bearbeitungs-Tools (z. B.edit,write_file) werden automatisch freigegeben, während alle anderen Tools eine Bestätigung erfordern.yolo: Alle Tools werden automatisch und ohne Bestätigung ausgeführt.
Sitzungsereignis-Consumer und Assistenten-Inhalts-Consumer
Das SDK stellt zwei zentrale Schnittstellen zur Verarbeitung von Ereignissen und Inhalten aus der CLI bereit:
Schnittstelle SessionEventConsumers
Die Schnittstelle SessionEventConsumers stellt Callbacks für verschiedene Nachrichtentypen während einer Sitzung bereit:
onSystemMessage: Verarbeitet Systemnachrichten von der CLI (empfängtSessionundSDKSystemMessage)onResultMessage: Verarbeitet Ergebnisnachrichten von der CLI (empfängtSessionundSDKResultMessage)onAssistantMessage: Verarbeitet Assistentennachrichten (KI-Antworten) (empfängtSessionundSDKAssistantMessage)onPartialAssistantMessage: Verarbeitet teilweise Assistentennachrichten während des Streamings (empfängtSessionundSDKPartialAssistantMessage)onUserMessage: Verarbeitet Benachrichtigungen vom Benutzer (empfängtSessionundSDKUserMessage)onOtherMessage: Verarbeitet andere Nachrichtentypen (empfängtSessionund eine Zeichenfolge als Nachricht)onControlResponse: Verarbeitet Steuerungsantworten (empfängtSessionundCLIControlResponse)onControlRequest: Verarbeitet Steuerungsanfragen (empfängtSessionundCLIControlRequest, gibtCLIControlResponsezurück)onPermissionRequest: Verarbeitet Berechtigungsanfragen (empfängtSessionundCLIControlRequest<CLIControlPermissionRequest>, gibtBehaviorzurück)
AssistantContentConsumers-Schnittstelle
Die Schnittstelle AssistantContentConsumers verarbeitet verschiedene Inhaltsarten innerhalb von Assistenten-Nachrichten:
onText: Verarbeitet Textinhalte (empfängtSessionundTextAssistantContent)onThinking: Verarbeitet Denkinhalte (empfängtSessionundThingkingAssistantContent)onToolUse: Verarbeitet Tool-Aufrufe (empfängtSessionundToolUseAssistantContent)onToolResult: Verarbeitet Tool-Ergebnisse (empfängtSessionundToolResultAssistantContent)onOtherContent: Verarbeitet andere Inhaltsarten (empfängtSessionundAssistantContent)onUsage: Verarbeitet Nutzungsdaten (empfängtSessionundAssistantUsage)onPermissionRequest: Verarbeitet Berechtigungsanfragen (empfängtSessionundCLIControlPermissionRequest, gibtBehaviorzurück)onOtherControlRequest: Verarbeitet andere Steuerungsanfragen (empfängtSessionundControlRequestPayload, gibtControlResponsePayloadzurück)
Beziehung zwischen den Schnittstellen
Wichtiger Hinweis zur Ereignishierarchie:
SessionEventConsumersist der hochgradige Ereignisprozessor, der verschiedene Nachrichtentypen verarbeitet (System-, Assistenten-, Benutzer-Nachrichten usw.).AssistantContentConsumersist der niedriggradige Inhaltsprozessor, der verschiedene Inhaltstypen innerhalb von Assistenten-Nachrichten verarbeitet (Text, Tools, Denkprozesse usw.).
Beziehung zwischen den Prozessoren:
SessionEventConsumers→AssistantContentConsumers(SessionEventConsumersverwendetAssistantContentConsumers, um Inhalte innerhalb von Assistenten-Nachrichten zu verarbeiten.)
Beziehungen bei der Ableitung von Ereignissen:
onAssistantMessage→onText,onThinking,onToolUse,onToolResult,onOtherContent,onUsageonPartialAssistantMessage→onText,onThinking,onToolUse,onToolResult,onOtherContentonControlRequest→onPermissionRequest,onOtherControlRequest
Beziehungen bei Ereignis-Timeouts:
Jede Ereignishandler-Methode besitzt eine entsprechende Timeout-Methode, mit der das Timeout-Verhalten für dieses spezifische Ereignis angepasst werden kann:
onSystemMessage↔onSystemMessageTimeoutonResultMessage↔onResultMessageTimeoutonAssistantMessage↔onAssistantMessageTimeoutonPartialAssistantMessage↔onPartialAssistantMessageTimeoutonUserMessage↔onUserMessageTimeoutonOtherMessage↔onOtherMessageTimeoutonControlResponse↔onControlResponseTimeoutonControlRequest↔onControlRequestTimeout
Für AssistantContentConsumers-Timeout-Methoden:
onText↔onTextTimeoutonThinking↔onThinkingTimeoutonToolUse↔onToolUseTimeoutonToolResult↔onToolResultTimeoutonOtherContent↔onOtherContentTimeoutonPermissionRequest↔onPermissionRequestTimeoutonOtherControlRequest↔onOtherControlRequestTimeout
Standard-Timeout-Werte:
- Standard-Timeout für
SessionEventSimpleConsumers: 180 Sekunden (Timeout.TIMEOUT_180_SECONDS) - Standard-Timeout für
AssistantContentSimpleConsumers: 60 Sekunden (Timeout.TIMEOUT_60_SECONDS)
Anforderungen an die Timeout-Hierarchie:
Für einen korrekten Betrieb müssen folgende Timeout-Beziehungen eingehalten werden:
- Der Rückgabewert von
onAssistantMessageTimeoutmuss größer sein als die Rückgabewerte vononTextTimeout,onThinkingTimeout,onToolUseTimeout,onToolResultTimeoutundonOtherContentTimeout. - Der Rückgabewert von
onControlRequestTimeoutmuss größer sein als die Rückgabewerte vononPermissionRequestTimeoutundonOtherControlRequestTimeout.
Transportoptionen
Die Klasse TransportOptions ermöglicht die Konfiguration der Kommunikation des SDK mit der Qwen Code-CLI:
pathToQwenExecutable: Pfad zur ausführbaren Datei der Qwen Code-CLIcwd: Arbeitsverzeichnis für den CLI-Prozessmodel: KI-Modell, das für die Sitzung verwendet werden sollpermissionMode: Berechtigungsmodus, der die Ausführung von Tools steuertenv: Umgebungsvariablen, die an den CLI-Prozess übergeben werdenmaxSessionTurns: Begrenzt die Anzahl der Gesprächsrunden innerhalb einer SitzungcoreTools: Liste der Kern-Tools, die der KI zur Verfügung stehen sollenexcludeTools: Liste der Tools, die der KI nicht zur Verfügung gestellt werden sollenallowedTools: Liste der Tools, die vorab ohne zusätzliche Bestätigung genutzt werden dürfenauthType: Authentifizierungstyp für die SitzungincludePartialMessages: Aktiviert den Empfang partieller Nachrichten während des Streamings von AntwortenturnTimeout: Timeout für eine vollständige GesprächsrundemessageTimeout: Timeout für einzelne Nachrichten innerhalb einer GesprächsrunderesumeSessionId: ID einer vorherigen Sitzung, die fortgesetzt werden sollotherOptions: Zusätzliche Befehlszeilenoptionen, die an die CLI übergeben werden
Sitzungssteuerungsfunktionen
- Sitzungserstellung: Verwenden Sie
QwenCodeCli.newSession(), um eine neue Sitzung mit benutzerdefinierten Optionen zu erstellen. - Sitzungsverwaltung: Die Klasse
Sessionstellt Methoden zum Senden von Eingabeaufforderungen, zum Verarbeiten von Antworten und zum Verwalten des Sitzungszustands bereit. - Sitzungsaufräumung: Schließen Sie Sitzungen stets mit
session.close(), um den CLI-Prozess ordnungsgemäß zu beenden. - Sitzungswiederaufnahme: Verwenden Sie
setResumeSessionId()inTransportOptions, um eine vorherige Sitzung fortzusetzen. - Sitzungsunterbrechung: Verwenden Sie
session.interrupt(), um eine aktuell ausgeführte Eingabeaufforderung zu unterbrechen. - Dynamisches Modellwechseln: Verwenden Sie
session.setModel(), um das Modell während einer Sitzung zu wechseln. - Dynamisches Wechseln des Berechtigungsmodus: Verwenden Sie
session.setPermissionMode(), um den Berechtigungsmodus während einer Sitzung zu ändern.
Konfiguration des Threadpools
Das SDK verwendet einen Threadpool zur Verwaltung gleichzeitiger Operationen mit der folgenden Standardkonfiguration:
- Kern-Threadanzahl: 30 Threads
- Maximale Threadanzahl: 100 Threads
- Keep-Alive-Zeit: 60 Sekunden
- Warteschlangenkapazität: 300 Aufgaben (mit
LinkedBlockingQueue) - Threadbenennung:
qwen_code_cli-pool-{number} - Daemon-Threads:
false - Handler für abgelehnte Ausführungen:
CallerRunsPolicy
Fehlerbehandlung
Das SDK stellt spezifische Ausnahmetypen für verschiedene Fehlerfälle bereit:
SessionControlException: Wird ausgelöst, wenn ein Problem mit der Sitzungssteuerung auftritt (Erstellung, Initialisierung usw.).SessionSendPromptException: Wird ausgelöst, wenn beim Senden einer Eingabeaufforderung oder beim Empfangen einer Antwort ein Problem auftritt.SessionClosedException: Wird ausgelöst, wenn versucht wird, eine bereits geschlossene Sitzung zu verwenden.
FAQ / Fehlerbehebung
F: Muss die Qwen CLI separat installiert werden?
A: Ja, es ist mindestens Qwen CLI 0.5.5 erforderlich.
F: Welche Java-Versionen werden unterstützt?
A: Das SDK erfordert Java 1.8 oder höher.
F: Wie behandle ich lang andauernde Anfragen?
A: Das SDK enthält Timeout-Hilfsfunktionen. Sie können Timeouts mithilfe der Klasse Timeout in TransportOptions konfigurieren.
F: Warum werden einige Tools nicht ausgeführt?
A: Dies liegt wahrscheinlich an den Berechtigungseinstellungen. Überprüfen Sie Ihre Berechtigungsmoduseinstellungen und erwägen Sie die Verwendung von allowedTools, um bestimmte Tools vorab freizugeben.
F: Wie kann ich eine vorherige Sitzung fortsetzen?
A: Verwenden Sie die Methode setResumeSessionId() in TransportOptions, um eine vorherige Sitzung fortzusetzen.
F: Kann ich die Umgebung für den CLI-Prozess anpassen?
A: Ja, verwenden Sie die Methode setEnv() in TransportOptions, um Umgebungsvariablen an den CLI-Prozess zu übergeben.
Lizenz
Apache-2.0 – Einzelheiten finden Sie in der LIZENZ.