🙌

ChatGPT に openapi.yml を食わせてコードを生成してもらう話

2023/11/15に公開

こんにちは。mobです。小ネタです。

今回は個人開発なので、特にOpenAI側のトレーニングに使われるかどうかなどは気にせずにやっております。その点ご注意ください。

openapi のコード生成について

openapi-generator を使えば、 YAML から コードを生成することができます。結構便利で自分もよく使っています。

openapi-generator は template を指定することで、 ApiClient の実装からデータモデルの実装を生成してくれます。またオプションを指定することで、どちらか片方だけみたいな指定もできます。

自分の使い方としては、ApiClient 側の生成を任せることはほとんどなくて、データモデルだけの生成にすることがほとんどです。ApiClientはフレームワークやライブラリによって環境が様々だったり小回りきかせたいことが多いため、結果として ApiClient を自動生成することは滅多にしません。

template を自作して ApiClient の自動生成部分を自分で作成することという手段もあります。ただの子場合はmustache というテンプレートエンジンを使って記述することになり、これが個人的には結構とっつきづらいし読みづらく、やったこともありますが、なかなかメンテできない、できる人が限られ、徐々に廃れていく...という経験をしてきたため、今ではtemplateを自作することもなかなかやらなくなりました。

とはいえ、ApiClient の実装を手でやるのも結構しんどい

APIの数に依存しますが、たかだか20本APIがあるだけでも、実装はしんどいです。

たとえば、今回は Kotiln/JS のコードを実装する必要がありました。
ひとつのAPIを呼び出すコードは次のようになります。

  fun getKnowledgeList(chatBotId: String, onComplete: (List<KnowledgeJson>) -> Unit) {
    coroutineScope.launch {
      val knowledgeList = restClient.call<List<KnowledgeJson>>("$BASE_URL/api/chatBots/$chatBotId/knowledge").await()
      onComplete(knowledgeList)
    }
  }

これをあと残りのAPI全てとなると書けないことはないが、ただしんどい。

そこで ChatGPT

完璧ではなくてもいいので雑に全体像作って欲しいので、ChatGPTに実装をお願いしました。

次のように openapi.yml を添付して、いくつかコードサンプルを提示しながら「他のAPIのコードも生成してください」とお願いします。そうすると

添付したファイルから定義を読み取ってくれて、

コードを生成してくれました。

あとは 「Copy code」からコピーして、IDEに貼り付けて、微修正するだけで、だいぶ時間の短縮になりました。今回はだいたい200行くらい。

openapi.yml の添付について、(ここでは関係ないのですが)Assistants APIの Support Filesに yaml がなかったので 一応 txt ファイルにしております。

まとめ

openapiに限らず、定義や仕様書を添付してサンプルコードを提示し他のコードも生成するパターンは、ChatGPTの一つの使い方としてかなり便利そうです。

他にも自動テストに関するドキュメントなどを添付してテスト対象のコードを提示して、テストコードを生成してもらうなども有効かと思いました。

Discussion