Qwen Code Java SDK
Qwen Code Java SDK は、Qwen Code 機能へのプログラムによるアクセスを可能にする最小限の実験的 SDK です。この SDK は、Qwen Code CLI と対話するための Java インターフェースを提供し、開発者が Qwen Code の機能を Java アプリケーションに統合できるようにします。
要件
- Java >= 1.8
- Maven >= 3.6.0(ソースからのビルド時)
- qwen-code >= 0.5.0
依存関係
- ロギング: ch.qos.logback:logback-classic
- ユーティリティ: org.apache.commons:commons-lang3
- JSON 処理: com.alibaba.fastjson2:fastjson2
- テスト: JUnit 5(org.junit.jupiter:junit-jupiter)
インストール
Maven の pom.xml に以下の依存関係を追加してください:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>qwencode-sdk</artifactId>
<version>{$version}</version>
</dependency>Gradle を使用している場合は、build.gradle に以下を追加してください:
implementation 'com.alibaba:qwencode-sdk:{$version}'ビルドと実行
ビルドコマンド
# プロジェクトのコンパイル
mvn compile
# テストの実行
mvn test
# JAR のパッケージ化
mvn package
# ローカルリポジトリへのインストール
mvn install
## クイックスタート
SDK を使用する最も簡単な方法は、`QwenCodeCli.simpleQuery()` メソッドを利用する方法です。
```java
public static void runSimpleExample() {
List<String> result = QwenCodeCli.simpleQuery("hello world");
result.forEach(logger::info);
}カスタムトランスポートオプションを用いた高度な利用方法は以下の通りです。
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("あなたは誰ですか?どのような機能がありますか?", options);
result.forEach(logger::info);
}カスタムコンテンツコンシューマーを用いたストリーミングコンテンツの処理方法は以下の通りです。
public static void runStreamingExample() {
QwenCodeCli.simpleQuery("あなたは誰ですか?どのような機能がありますか?",
new TransportOptions().setMessageTimeout(new Timeout(10L, TimeUnit.SECONDS)), new AssistantContentSimpleConsumers() {
@Override
public void onText(Session session, TextAssistantContent textAssistantContent) {
logger.info("テキストコンテンツを受信しました: {}", textAssistantContent.getText());
}
@Override
public void onThinking(Session session, ThingkingAssistantContent thingkingAssistantContent) {
logger.info("思考コンテンツを受信しました: {}", thingkingAssistantContent.getThinking());
}
@Override
public void onToolUse(Session session, ToolUseAssistantContent toolUseContent) {
logger.info("ツール使用コンテンツを受信しました: {}、引数: {}",
toolUseContent, toolUseContent.getInput());
}
@Override
public void onToolResult(Session session, ToolResultAssistantContent toolResultContent) {
logger.info("ツール結果コンテンツを受信しました: {}", toolResultContent.getContent());
}
@Override
public void onOtherContent(Session session, AssistantContent<?> other) {
logger.info("その他のコンテンツを受信しました: {}", other);
}
@Override
public void onUsage(Session session, AssistantUsage assistantUsage) {
logger.info("使用状況情報を受信しました: 入力トークン数: {}、出力トークン数: {}",
assistantUsage.getUsage().getInputTokens(), assistantUsage.getUsage().getOutputTokens());
}
}.setDefaultPermissionOperation(Operation.allow));
logger.info("ストリーミング例の実行が完了しました。");
}その他の例については、src/test/java/com/alibaba/qwen/code/cli/example を参照してください。
アーキテクチャ
SDK はレイヤードアーキテクチャを採用しています。
- API レイヤー:
QwenCodeCliクラスを通じて、基本的な使用に必要なシンプルな静的メソッドを提供するメインのエントリポイントを定義します - セッション レイヤー:
Sessionクラスを用いて、Qwen Code CLI との通信セッションを管理します - トランスポート レイヤー: SDK と CLI プロセス間の通信メカニズム(現在は
ProcessTransportを用いたプロセス経由のトランスポート)を処理します - プロトコル レイヤー: CLI プロトコルに基づく通信のためのデータ構造を定義します
- ユーティリティ: 並行実行、タイムアウト処理、エラー管理などのために共通で使用されるユーティリティを提供します
主な機能
権限モード
SDK では、ツールの実行を制御するための異なる権限モードがサポートされています。
default: 書き込み系ツールは、canUseToolコールバックまたはallowedToolsで明示的に承認されない限り実行が拒否されます。読み取り専用ツールは確認なしで実行されます。plan: すべての書き込み系ツールをブロックし、AI に事前に実行計画を提示させるように指示します。auto-edit: 編集系ツール(edit、write_fileなど)は自動的に承認されますが、その他のツールはユーザーによる確認が必要です。yolo: すべてのツールが確認なしで自動的に実行されます。
セッションイベントコンシューマとアシスタントコンテンツコンシューマ
SDK では、CLI から発生するイベントおよびコンテンツを処理するための 2 つの主要なインターフェースが提供されています。
SessionEventConsumers インターフェース
SessionEventConsumers インターフェースは、セッション中に発生するさまざまな種類のメッセージに対するコールバックを提供します。
onSystemMessage: CLI からのシステムメッセージを処理します(SessionおよびSDKSystemMessageを受け取ります)onResultMessage: CLI からの結果メッセージを処理します(SessionおよびSDKResultMessageを受け取ります)onAssistantMessage: アシスタントメッセージ(AI の応答)を処理します(SessionおよびSDKAssistantMessageを受け取ります)onPartialAssistantMessage: ストリーミング中の部分的なアシスタントメッセージを処理します(SessionおよびSDKPartialAssistantMessageを受け取ります)onUserMessage: ユーザーによるメッセージを処理します(SessionおよびSDKUserMessageを受け取ります)onOtherMessage: その他の種類のメッセージを処理します(Sessionおよび文字列型のメッセージをを受け取ります)onControlResponse: コントロール応答を処理します(SessionおよびCLIControlResponseを受け取ります)onControlRequest: コントロール要求を処理します(SessionおよびCLIControlRequestを受け取り、CLIControlResponseを返します)onPermissionRequest: 権限要求を処理します(SessionおよびCLIControlRequest<CLIControlPermissionRequest>を受け取り、Behaviorを返します)
AssistantContentConsumers インターフェース
AssistantContentConsumers インターフェースは、アシスタントメッセージ内のさまざまな種類のコンテンツを処理します。
onText: テキストコンテンツを処理(Session と TextAssistantContent を受け取ります)onThinking: 思考コンテンツを処理(Session と ThinkingAssistantContent を受け取ります)onToolUse: ツール使用コンテンツを処理(Session と ToolUseAssistantContent を受け取ります)onToolResult: ツール実行結果コンテンツを処理(Session と ToolResultAssistantContent を受け取ります)onOtherContent: その他のコンテンツタイプを処理(Session と AssistantContent を受け取ります)onUsage: 使用状況情報を処理(Session と AssistantUsage を受け取ります)onPermissionRequest: 権限要求を処理(Session と CLIControlPermissionRequest を受け取り、Behavior を返します)onOtherControlRequest: その他の制御要求を処理(Session と ControlRequestPayload を受け取り、ControlResponsePayload を返します)
インターフェース間の関係
イベント階層に関する重要なお知らせ:
SessionEventConsumersは、高レベルのイベントプロセッサであり、さまざまなメッセージタイプ(システム、アシスタント、ユーザーなど)を処理します。AssistantContentConsumersは、低レベルのコンテンツプロセッサであり、アシスタントメッセージ内のさまざまなコンテンツタイプ(テキスト、ツール、思考プロセスなど)を処理します。
プロセッサ間の関係:
SessionEventConsumers→AssistantContentConsumers(SessionEventConsumersは、アシスタントメッセージ内のコンテンツを処理するためにAssistantContentConsumersを使用します)
イベント派生関係:
onAssistantMessage→onText、onThinking、onToolUse、onToolResult、onOtherContent、onUsageonPartialAssistantMessage→onText、onThinking、onToolUse、onToolResult、onOtherContentonControlRequest→onPermissionRequest、onOtherControlRequest
イベントタイムアウト関係:
各イベントハンドラーメソッドには、対応するタイムアウトメソッドが存在し、その特定のイベントに対してタイムアウト動作をカスタマイズできます。
onSystemMessage↔onSystemMessageTimeoutonResultMessage↔onResultMessageTimeoutonAssistantMessage↔onAssistantMessageTimeoutonPartialAssistantMessage↔onPartialAssistantMessageTimeoutonUserMessage↔onUserMessageTimeoutonOtherMessage↔onOtherMessageTimeoutonControlResponse↔onControlResponseTimeoutonControlRequest↔onControlRequestTimeout
AssistantContentConsumers のタイムアウトメソッドについては以下のとおりです:
onText↔onTextTimeoutonThinking↔onThinkingTimeoutonToolUse↔onToolUseTimeoutonToolResult↔onToolResultTimeoutonOtherContent↔onOtherContentTimeoutonPermissionRequest↔onPermissionRequestTimeoutonOtherControlRequest↔onOtherControlRequestTimeout
デフォルトのタイムアウト値:
SessionEventSimpleConsumersのデフォルトタイムアウト:180 秒(Timeout.TIMEOUT_180_SECONDS)AssistantContentSimpleConsumersのデフォルトタイムアウト:60 秒(Timeout.TIMEOUT_60_SECONDS)
タイムアウト階層の要件:
正常に動作させるためには、以下のタイムアウト関係を維持する必要があります:
onAssistantMessageTimeoutの戻り値は、onTextTimeout、onThinkingTimeout、onToolUseTimeout、onToolResultTimeout、onOtherContentTimeoutの各戻り値より大きい必要があります。onControlRequestTimeoutの戻り値は、onPermissionRequestTimeoutおよびonOtherControlRequestTimeoutの戻り値より大きい必要があります。
トランスポート オプション
TransportOptions クラスでは、SDK が Qwen Code CLI と通信する方法を設定できます。
pathToQwenExecutable: Qwen Code CLI 実行可能ファイルへのパスcwd: CLI プロセスの作業ディレクトリmodel: セッションで使用する AI モデルpermissionMode: ツール実行を制御する権限モードenv: CLI プロセスに渡す環境変数maxSessionTurns: セッション内の会話ターン数の上限coreTools: AI が利用可能なコア ツールのリストexcludeTools: AI が利用できないように除外するツールのリストallowedTools: 追加の確認なしで使用が事前に承認されたツールのリストauthType: セッションで使用する認証タイプincludePartialMessages: ストリーミング応答中に部分的なメッセージを受信できるようにしますturnTimeout: 1 回の会話ターン全体のタイムアウトmessageTimeout: ターン内の個々のメッセージのタイムアウトresumeSessionId: 再開する前のセッションの IDotherOptions: CLI に渡すその他のコマンドライン オプション
セッション制御機能
- セッションの作成:
QwenCodeCli.newSession()を使用して、カスタムオプションで新しいセッションを作成します - セッション管理:
Sessionクラスは、プロンプトの送信、レスポンスの処理、およびセッション状態の管理を行うためのメソッドを提供します - セッションのクリーンアップ: CLI プロセスを適切に終了するために、必ず
session.close()を使用してセッションを閉じます - セッションの再開:
TransportOptions内のsetResumeSessionId()を使用して、以前のセッションを再開します - セッションの中断:
session.interrupt()を使用して、現在実行中のプロンプトを中断します - 動的なモデル切り替え:
session.setModel()を使用して、セッション中にモデルを変更します - 動的なパーミッションモード切り替え:
session.setPermissionMode()を使用して、セッション中にパーミッションモードを変更します
スレッドプールの設定
SDK は、以下のデフォルト設定で並列処理を管理するためのスレッドプールを使用します。
- コアプールサイズ: 30 スレッド
- 最大プールサイズ: 100 スレッド
- キープアライブ時間: 60 秒
- キュー容量: 300 タスク(
LinkedBlockingQueue使用) - スレッド名付け:
"qwen_code_cli-pool-{number}" - デーモンスレッド:
false - 拒否された実行ハンドラー:
CallerRunsPolicy
エラー処理
SDK は、さまざまなエラー状況に対応するための特定の例外型を提供します。
SessionControlException: セッション制御(作成、初期化など)に問題がある場合にスローされます。SessionSendPromptException: プロンプト送信またはレスポンス受信に問題がある場合にスローされます。SessionClosedException: 閉じられたセッションを使用しようとした場合にスローされます。
よくある質問(FAQ)/トラブルシューティング
Q: Qwen CLI を別途インストールする必要がありますか?
A: はい。Qwen CLI バージョン 0.5.5 以降が必要です。
Q: どの Java バージョンがサポートされていますか?
A: SDK は Java 1.8 以降を必要とします。
Q: 長時間実行されるリクエストをどう処理すればよいですか?
A: SDK にはタイムアウト機能が含まれています。TransportOptions 内の Timeout クラスを使用して、タイムアウトを設定できます。
Q: 一部のツールが実行されないのはなぜですか?
A: これは、おそらく権限モードによるものです。ご使用の権限モード設定を確認し、特定のツールを事前に承認するには allowedTools を使用することを検討してください。
Q: 以前のセッションを再開するにはどうすればよいですか?
A: 以前のセッションを再開するには、TransportOptions 内の setResumeSessionId() メソッドを使用します。
Q: CLI プロセスの実行環境をカスタマイズできますか?
A: はい。CLI プロセスに環境変数を渡すには、TransportOptions 内の setEnv() メソッドを使用します。
ライセンス
Apache-2.0 — 詳細については LICENSE を参照してください。