このブログは「REST Better with the Support of OpenAPI in Qt 6」を翻訳したものです。
Qtベースのアプリの接続性を向上させるための私たちの取り組みを、ご注目いただいている方もいらっしゃるかと思います。例えば、こちらのブログ記事では、Qt 6.7以降においてRESTful APIをより効率的に利用できるよう、Qtのネットワークスタックに施された改良点について解説しました。そのため、RESTに関する取り組みは完了したように思われるかもしれません。では、なぜOpenAPIにこだわるのでしょうか?実は、すべてのWebサービスの約70%がRESTで動作している一方で、そのうちの約20~30%はOpenAPI仕様から生成されたコードを使用しています。ユーザーがより少ないコードでより多くの成果を生み出せるよう支援せずに、Qtがこれを無視できるでしょうか?
新しいQt 6 OpenAPIモジュールは、Qt 6.11でテクノロジープレビューとして提供される予定です。このモジュールでは、Qt NetworkのRESTful APIを使用してQt HTTPクライアントを生成する「Qt 6 OpenAPIジェネレーター」が導入されます。
ここで重要な点として、Qt 5用のOpenAPIジェネレータは、もともとOpenAPIコミュニティによって開発されたものであることに留意してください。私たちはこれをQt 6に取り込み、リファクタリングを行い、機能を拡張しました。
このブログ記事では、Qt 6に搭載された新しいOpenAPIジェネレータについて解説し、OpenAPI形式で提供されたAPI仕様を用いて、この新しいモジュールを活用し、QtベースのシンプルなChatGPTクライアントアプリケーションを実装する方法をご紹介します。
Qt 6 ジェネレータの詳細を簡単に見てみましょう
話を進める前に、改めて確認しておきましょう。通常のコードジェネレータは、どのような役割を果たすのでしょうか?
コードジェネレータとは、開発者が自ら書きたくないような反復的なコードを自動で生成し、開発のスピードアップを支援するツールです。仕様やモデル、テンプレートを入力として受け取り、それらを実際に動作する実装に変換します。
Qt 6 OpenAPI ジェネレータの場合、開発者は大量のデータクラスを手作業で作成したり、長くてエラーが発生しやすいREST API呼び出しを実装したりする手間を省くことができます。
具体的には、Qt 6 OpenAPI ジェネレーターは、アップストリームの OpenAPI ジェネレーターを基盤として構築されたプラグインです。このプラグインは、YAML仕様を入力として受け取り、仕様ファイルで定義されたAPIを実装するQt6ベースのC++ライブラリを生成します。このプラグインは、OpenAPI Generatorの柔軟なテンプレートおよびカスタマイズシステムを活用しています。つまり、固定された出力構造に縛られることなく、生成されるファイルの数から各ファイルの具体的な内容に至るまで、あらゆる点を調整することが可能です。
いつ、どのように使えばよいのでしょうか?
Qt 6 OpenAPI ジェネレータは、次のような場合に最適な選択肢です:
- APIファーストの開発を好む場合
- OpenAPI形式で記述されたREST APIを持っている場合
- 繰り返しの多いコードの記述を避けたいと考えている場合
- 一貫性のあるクライアントコードが必要な場合
- バックエンドは頻繁に更新されますが、再生成のプロセスを予測可能かつ手間のかからないものにしたいと考えている場合
つまり、QtアプリケーションがRESTサービスと通信しており、UIやビジネスロジックに注力したいとお考えなら、まさにこれが最適です!
主なメリット
他のアップストリームのOpenAPI Generatorプラグインと比較して、Qt 6プラグインにはいくつかの実用的な利点があります:
- 最新のQt 6 RESTful APIの活用 - このジェネレーターは、最新のQt 6のネットワーク機能とRESTful APIを基盤として構築されており、生成されるコードは現在のQtの設計パターンやベストプラクティスに準拠しています
- シンプルなCMake統合—Qt 6 OpenAPIモジュールは、専用のCMake関数qt_add_openapi_client()を提供しており、手作業をすべて代行します。この関数は、コード生成ステップを実行し、ターゲットを設定し、必要なQt 6ライブラリを自動的にリンクします。カスタムスクリプトは不要で、手作業も最小限で済みます
- リンクに関する悩みとはもうおさらば ― 旧式のQt5ベースのプラグイン実装を含め、OpenAPIプラグイン間に存在する潜在的なリンクの問題やODR違反を解消します
実例:シンプルなChatGPTクライアント
具体的な例として、OpenAI APIと通信する小さなQt 6アプリケーションを見てみましょう。OpenAI APIの最新のOpenAPI仕様はこちらから入手できます。そのYAMLファイルから、実際に必要な操作のみを選択し、シンプルなテキストチャットアプリケーション用の最小限のクライアントを生成することができます。
実は、たった2つの操作で十分です:
- listModels - 利用可能なモデルのリストを取得します
- createResponse - 指定されたモデルにユーザーのリクエストを送信し、応答メッセージを受け取ります
プロジェクトファイルの `CMakeLists.txt` に OpenAPI Spec を追加してください
qt_add_library(openAIResponseApi)
qt_add_openapi_client(openAIResponseApi
SPEC_FILE
${CMAKE_CURRENT_SOURCE_DIR}/response_api.yaml
)
生成されたAPIを呼び出してください
コードが生成されたら、アプリケーションのコード内でAPIを直接使用できます:
m_responseApi->createResponse(response, this,
[&](const QRestReply &reply,
const Response &summary) {
if (!reply.isSuccess()) {
qWarning() << "createResponse:" << reply.errorString() << reply.error();
} else {
// handle Response data received from the AI model resonse
}
});
QNetworkRequestの手動処理は不要です。JSON解析の定型コードも不要です。ジェネレータがネットワーク層の処理を代行します。
ちょっとした楽しい機能をプラス
あとは、ちょっとしたUIとエンターテインメント機能を追加するだけです。例えば、このアプリケーションには4つの操作モードを用意しましょう:
- ウィザードモード - アシスタントは魔法使いのように振る舞い、魔法に関する話題を好んで話します
- 科学者モード - アシスタントはアルバート・アインシュタインになりきり、熱心に物理学について語ります
- 通常モード - 標準的なChatGPTの動作です。追加機能はありません
- カスタムユーザーモード - ユーザーが、アシスタントの振る舞いを指定するカスタムシステムプロンプトを提供します
これで、OpenAI Chatアプリケーションの準備は完了です:


AIが至る所に存在する今、ジェネレーターはまだ必要なのでしょうか?
その答えを見つけるために、従来のジェネレーターが解決することを目的としている問題について、詳しく見ていきましょう。
ゼロからソリューションを作成するには、かなりの時間がかかります。時間は金なりと言いますが、ジェネレーターはAIのように時間を節約してくれます✅.
ジェネレーターは、一般的でよく理解されているユースケースに対応するように設計された、あらかじめ定義されたソリューションです。これらは、そのような機能を初めて実装する際に開発者が犯しがちな、設計上のミスを含むよくあるミスを排除します✅.
AIモデルは膨大なデータセットを用いて学習されており、一般的なパターンにも精通しています。しかし、AIモデルは「幻覚」を起こし、誤ったコードや不完全なコードを生成してしまうことがあります。コンパイルエラーはすぐに修正できますが、設計上のエラーはそう簡単には気づかれません✅🚫.
ジェネレータは、常に厳密に定義されたが拡張可能な構造(テンプレート)に基づいています✅.
一方、AIは、類似したリクエストごとに、わずかに異なる実装を生成する可能性があります🚫.
コードジェネレータを使用することで、開発者は類似したファイル間でコードの書式を統一しやすくなります✅.
AIも一貫性のあるコードを生成できますが、それは明示的にそうするように指示した場合に限られます。また、その結果が常に再現できるとは限りません✅🚫.
では……ジェネレータは依然として必要なのでしょうか?その区別に基づけば、答えは「はい」です。ジェネレータは、具体的かつ反復可能な問題に対する信頼性の高い解決策であり続け、実世界のシステムで広く利用されています。
ところで、AIツールにジェネレーターを実行するよう指示し、生成された結果を必要に応じてソースコードに組み込むこともいつでも可能です。
まとめ
Qt 6.11の新しいOpenAPIモジュールは、最新のコードジェネレータを提供します。時間の節約や品質の向上に加え、これまで提供してきたRESTful API向けの機能強化も活用しています。ソフトウェア開発においてAIが広く活用される現代においても、OpenAPIによるコード生成は依然として有効なユースケースです。Qt 6.11の「ChatGPT RESTful API Client」をお試しいただき、これを使ってChatGPTに質問してみてください。そうすれば、この主張が正しいことが確認できるかもしれません 。