Closed8

OpenAPI から Python SDK を自動生成するツールまとめ

ピン留めされたアイテム
まちゅけんまちゅけん

OpenAPI 仕様 (openapi.yaml) から Client SDK を自動生成するツールを検索したら割と乱立しているように見えたので、有名どころのものをまとめます。 Zenn の GitHub プレビューを活用して参考文献は積極的に公式リポジトリから引用します。

筆者はクライアント側 Python コードを生成する目線でこのスクラップをまとめています 🐍

  • 紹介するコンテンツ
    • Swagger Codegen
    • OpenAPI Generator
    • openapi-python-client
    • Stainless
    • etc ...

(前提) OpenAPI 仕様とは

https://www.openapis.org/

OpenAPI とは
OpenAPI 仕様は、HTTP API を記述するための正式な標準を提供します。
これにより、APIの仕組みの理解、クライアントコードの生成、テストの作成、設計標準の適用などが可能になります。

https://github.com/OAI/OpenAPI-Specification

まちゅけんまちゅけん

Swagger Codegen

https://swagger.io/tools/swagger-codegen/
https://github.com/swagger-api/swagger-codegen

組織

Swagger (会社名: SmartBear)

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/LICENSE#L189

Swagger は OpenAPI の前身です。 OpenAPI 3.0 より前は Swagger 仕様という名前でした。 SmartBear は 2015 年に Swagger 仕様を OpenAPI 仕様として Linux foundation に寄贈されそこから OpenAPI Initiative が設立されました。

https://swagger.io/about/
https://www.openapis.org/about

Swagger (SmartBear) としては寄贈後は OpenAPI 仕様を利用する為のエコシステムを開発しており、Swagger Codegen がそのうちの一つのようです。

リリース

初期リリースは 2012 年になっています。

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/README.md#L235

これを書いている現在も活発に開発されているようです。

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/README.md#L136

ツール実装

恐らく Java で実装された Mustache というテンプレートエンジンによって生成するツールになっています。

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/README.md#L489-L492

対応言語

Python クライアントだけでなくサーバーにも対応しています。 他にも様々な言語に対応しています。

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/README.md#L77-L81

生成コード仕様

生成される Python クライアントコードとしては urllib3 に依存しているようです。

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/samples/client/petstore/python/setup.py#L25-L30

非同期の asyncio 版もあって aiohttp に依存しています。

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/samples/client/petstore/python-asyncio/setup.py#L25-L32

生成方法

Docker コマンドでコードを生成できます。

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/README.md#L367-L384

生成コード利用方法

同期版

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/samples/client/petstore/python/README.md#L43-L65

非同期版 (async / await がないので生成された README.md が間違っていそう?)

https://github.com/swagger-api/swagger-codegen/blob/0f7dea029865c048cf0beef156a62f0e440a62b6/samples/client/petstore/python-asyncio/README.md#L43-L65

まちゅけんまちゅけん

OpenAPI Generator

https://openapi-generator.tech/
https://github.com/OpenAPITools/openapi-generator

組織

コミュニティ (OpenAPITools) によって管理されているようです。

https://github.com/OpenAPITools/openapi-generator/blob/e78aeb6bc7610a763e17e3d53614a1ef1990f311/LICENSE#L189-L190

そして OpenAPI Generator は前述の Swagger Codegen の Fork のようです。

OpenAPITools/openapi-generator/docs/faq.md

Swagger Codegen と OpenAPI Generator の違いは何ですか?
Swagger Codegen は SmartBear によって駆動され、OpenAPI Generator はコミュニティによって駆動されます。Swagger Codegen の 40 人以上のトップ コントリビューターとテンプレート作成者が、創設チーム メンバーとして OpenAPI Generator に参加しています。詳細については、フォークの Q&A を参照してください。

SwaggerはSmartBearが所有する商標であり、このプロジェクトでの「Swagger」という用語の使用は、デモ(参照)のみを目的としています。

OpenAPITools/openapi-generator/docs/qna.md

なぜSwagger Codegenをフォークすることにしたのですか?
それにはいくつかの理由があります。

創設メンバーは、Swagger Codegen 3.0.0 が Swagger Codegen 2.x の哲学から大きく逸脱しすぎていると感じていました。
創設メンバーは、2 つの別々のブランチ (2.x、3.x) のメンテナンスオーバーヘッドが、Python コミュニティで感じられているのと同様の問題を引き起こすことを懸念していました。
創設メンバーは、ユーザーが安定したリリースを取得するために数か月待つ必要がないように、より迅速なリリースサイクル(毎週のパッチリリース、毎月のマイナーリリース)を望んでいました。
コミュニティ主導のバージョンを持つことで、イノベーション、信頼性、およびコミュニティが所有するロードマップが可能になります。

組織名 (OpenAPITools) 的に OpenAPI Initiative 公式のツールかと混乱しそうですが公式のツールという訳ではなく、かといって (以前の公式の) Swagger Codegen から Fork されその Fork 元からの開発者も参加しているというのがこのツールの姿のようです。 (このスクラップはこの事実を調べようと思ったのが動機でした)

リリース

2018 年に最初のリリースがあります。

https://github.com/OpenAPITools/openapi-generator/releases/tag/v3.0.0

これを書いている現在も活発に開発されています。

https://github.com/OpenAPITools/openapi-generator/releases/tag/v7.4.0

ツール実装

Fork なので Swagger Codegen と同じまたは同系統だと思われます。

対応言語

これも同様に Python クライアントだけでなくサーバーにも対応していて、他にも様々な言語に対応しています。 ただし勿論生成されるコードは異なるでしょう。 サーバー側は Swagger Codegen は Flask のみなのに対して、こちらの OpenAPI Generator は FastAPI の対応があります。

https://github.com/OpenAPITools/openapi-generator/blob/e78aeb6bc7610a763e17e3d53614a1ef1990f311/README.md#L80-L90

生成コード仕様

こちらも urllib3 に依存しており、さらに Pydantic V2 もあります。 ただし非同期版はない模様? です。

https://github.com/OpenAPITools/openapi-generator/blob/e78aeb6bc7610a763e17e3d53614a1ef1990f311/samples/client/echo_api/python/pyproject.toml#L12-L18

生成方法

これも同様に Docker コマンドでコードを生成できます。

https://github.com/OpenAPITools/openapi-generator/blob/e78aeb6bc7610a763e17e3d53614a1ef1990f311/README.md#L321-L336

生成コード利用方法

https://github.com/OpenAPITools/openapi-generator/blob/e78aeb6bc7610a763e17e3d53614a1ef1990f311/samples/client/echo_api/python/README.md#L48-L89

まちゅけんまちゅけん

openapi-python-client

https://github.com/openapi-generators/openapi-python-client

組織

コミュニティ (openapi-generators) によって管理されているようです。 OpenAPI Initiative とは関係なさそうです。

ただしライセンスには Triax Technologies とあります。

https://github.com/openapi-generators/openapi-python-client/blob/30665ead63227f0a9f21247df667408ce35f7537/LICENSE#L3

そこでリポジトリを検索すると Discussion にて言及がみられました。

https://github.com/openapi-generators/openapi-python-client/discussions/435

今後数週間のうちに、openapi-python-clientをtriaxtec orgから、純粋なオープンソースコミュニティ主導のorgに移行する予定です。このディスカッションは、この変更が起こる前に皆さんにこの変更について知ってもらい、出てきた質問、コメント、懸念に対処する機会を提供するために作成しました。

何が?
このリポジトリは新しい組織に移され、すべての将来の開発、リリース、議論、問題などはその新しい組織の下で行われます。

なぜ?
このプロジェクトはこれまで以上にコミュニティ主導型になっており、それを反映させたいと考えています!Triaxの従業員は引き続きこのプロジェクトに貢献し、サポートしていきますが、Triaxの従業員以外がより大きな役割を担うことも歓迎します!もし、新しい組織で何らかの直接アクセスを持つことに興味があれば、私に知らせてください!

Triax Technologies という会社が最初に開発したものの、2021 年にコミュニティ主導に移ったようです。

リリース

2020 年に最初のリリースがあります。

https://github.com/openapi-generators/openapi-python-client/blob/30665ead63227f0a9f21247df667408ce35f7537/CHANGELOG.md#L1105-L1107

これを書いている現在も活発に開発されています。

https://github.com/openapi-generators/openapi-python-client/blob/30665ead63227f0a9f21247df667408ce35f7537/CHANGELOG.md#L16-L18

ツール実装

Python で実装されています。 Web 開発者にはなじみ深い Jinja2 テンプレートエンジンでコードを生成しています。

https://github.com/openapi-generators/openapi-python-client/blob/30665ead63227f0a9f21247df667408ce35f7537/README.md#L17-L23

対応言語

ツール実装と同様に Python です。 他の言語には対応していません。 また上記 2 つとは異なりこのツールはクライアント側のコード生成のみです。

生成コード仕様

リポジトリの Discription にて Generate modern Python clients from OpenAPI と謳っており、その証に HTTP クライアントには HTTPX、データバリデーションには Pydantic V2 が利用されています。

https://github.com/openapi-generators/openapi-python-client/blob/30665ead63227f0a9f21247df667408ce35f7537/pyproject.toml#L1-L19

生成方法

PyPI で配布しているので pipx などでインストール、実行ができます。 CLI は openapi-python-client というそのままの名前のコマンドになっています。

https://github.com/openapi-generators/openapi-python-client/blob/30665ead63227f0a9f21247df667408ce35f7537/README.md#L25-L35

生成コード利用方法

HTTPX ベースの為か 1 つの生成コードから同期・非同期版が両方利用できます。 上記 2 つと比べてもモダンなコードベースになっています。

https://github.com/openapi-generators/openapi-python-client/blob/30665ead63227f0a9f21247df667408ce35f7537/integration-tests/README.md#L4-L75

まちゅけんまちゅけん

Stainless

https://www.stainlessapi.com/

https://www.stainlessapi.com/customers/openai

https://github.com/openai/openai-python

組織

Stainless という会社です。 元 Stripe 開発者の方が設立しました。

https://www.stainlessapi.com/company-stainless

リリース

2023 年頃 ? そもそも今はアーリーアクセス ?

ツール実装

オープンソースではないので不明です。

対応言語

Python 以外にも Node / TypeScript、Go、Java、Kotlin のクライアントに対応しています。

生成コード仕様

オープンソースではないですが、SDK として生成された結果である openai-python を見てみましょう。

https://github.com/openai/openai-python

前述の openapi-python-client と同じで HTTP クライアントには HTTPX、データバリデーションには Pydantic V2 が利用されています。

https://github.com/openai/openai-python/blob/195c05a64d39c87b2dfdf1eca2d339597f1fce03/pyproject.toml#L10-L19

生成方法

非公開ですが、デモ SDK や openai-python のように Stainelss と契約しているとみられる SDK リポジトリをチェックしてみると、アプリの OpenAPI 仕様が更新されたら 組織の bot から生成されたコードの Pull request が飛んできて自動でマージされる ようにみえます。 製品のコアは非公開にしつつ、契約者には全自動で更新を適用する ... なんと素晴らしいビジネスの展開方法なのでしょう ✨

生成コード利用方法

こちらも openai-python を拝借します。 同期・非同期版があり、さらにストリーミングの API もあるようで SDK の API も洗練されており使い易そうです。

https://github.com/openai/openai-python/blob/195c05a64d39c87b2dfdf1eca2d339597f1fce03/README.md#L25-L52

https://github.com/openai/openai-python/blob/195c05a64d39c87b2dfdf1eca2d339597f1fce03/README.md#L86-L102

https://github.com/openai/openai-python/blob/195c05a64d39c87b2dfdf1eca2d339597f1fce03/README.md#L104-L134

まちゅけんまちゅけん

その他

今回情報収集している際に見つけた個人の草リポジトリです。 どちらもモダンな手法を用いて SDK を生成するアプローチのように見えます。

https://github.com/MarcoMuellner/openapi-python-generator

https://github.com/artsmolin/pythogen

datamodel-code-generator

SDK の生成ツールではないですが、OpenAPI 仕様から Pydantic モデルを生成してくれるツールです。

https://github.com/koxudaxi/datamodel-code-generator

Pydantic Docs からもリンクされている程のツールみたいです。

https://docs.pydantic.dev/latest/integrations/datamodel_code_generator/

まちゅけんまちゅけん

まとめ

乱立している (ようにみえた) ツール群をまとめました。

まとめる前は特に以下の 3 つは名称的にも どれがファーストパーティー寄りでどれがサードパーティーのツールなのか が全く分かりませんでした。

  • Swagger Codegen (swagger-api/swagger-codegen)
  • OpenAPI Generator (OpenAPITools/openapi-generator)
  • openapi-python-client (openapi-generators/openapi-python-client)

(だって OpenAPI 仕様公式リポジトリは OAI/OpenAPI-Specification なんですよ ?!)

今回調べたおかげてとてもすっきりしました。

また Stainless は主観的には紹介した中で最も素晴らしい SDK 生成ツールですが、オープンソースではなくエンタープライズ向け ? なのが残念です 🥲 一応無料で試してみる、という応募フォームは存在します。 (https://www.stainlessapi.com/try)

しかしながら Stainless によって生成された SDK のコードを学んでいだけでも心が躍ります。 今後の動向に期待しましょう。

またこのスクラップでは情報収集しただけであり、手を動かして触ってみた所の情報ではありません。

情報収集は終了したということでスクラップはクローズして、出来れば今後実際にコード生成して SDK の使用感を試してみたいと思います 🫡

このスクラップは2024/03/29にクローズされました