Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenAPI.jsonを元にgeneratorを使ったとき、関数名が2回繰り返されるのを避けられるようにする? #1521

Open
Hiroshiba opened this issue Jan 28, 2025 · 3 comments
Labels
機能向上 状態:必要性議論 必要性を議論している状態 状態:設計 設計をおこなっている状態

Comments

@Hiroshiba
Copy link
Member

内容

VOICEVOX EngineのOpenAPIをエディタ側からgeneratorを使ってラッパーを生成していますが、関数名が2回繰り返されるようになってしまっています。

https://github.com/VOICEVOX/voicevox/blob/af114ee04d66b9b9e037869c74b0872abec48f11/src/openapi/apis/DefaultApi.ts#L344

これはエンジン側をいい感じに変更することで、関数名の繰り返しをなくすことができます。
このissueはこの方法適用してよいか・適用すべきかを議論して、適用するなら適用すれば完了だと思います。

Pros 良くなる点

エディターのコードが見やすくなる。
OpenAPIを使っている人にも得があるかも?

Cons 悪くなる点

OpenAPIを使っている場合に破壊的変更になる。(バージョンアップ時の扱いは破壊的変更としては使わない予定)
エディタの方も変更が必要。

実現方法

ここから転載

operationId というのを指定すると、生成される関数名を指定できます。
一括で、アノテーションされてる関数名にするための関数が公式で案内されてました。
https://fastapi.tiangolo.com/ja/advanced/path-operation-advanced-configuration/#path-operation-operationid

def use_route_names_as_operation_ids(app: FastAPI) -> None:
    """
    Simplify operation IDs so that generated API clients have simpler function
    names.

    Should be called only after all routes have been added.
    """
    for route in app.routes:
        if isinstance(route, APIRoute):
            route.operation_id = route.name  # in this case, 'read_items'

voicevox_engine/application.py 定義して、genarate_app の最後に呼び出した状態で生成された openapi.json を用いて、typescript-fetch のライブラリを生成すると、以下のような関数ができました。
https://github.com/VOICEVOX/voicevox/blob/main/src/openapi/apis/DefaultApi.ts#L1200-L1203 に相当するものです。

    /**
     * 音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。
     * 音声合成用のクエリを作成する
     */
    async audioQuery(requestParameters: AudioQueryRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<AudioQuery> {
        const response = await this.audioQueryRaw(requestParameters, initOverrides);
        return await response.value();
    }

VOICEVOXのバージョン

0.22

その他

@raa0121 さんに教えていただきました、ありがとうございます!!

@Hiroshiba Hiroshiba added 機能向上 状態:必要性議論 必要性を議論している状態 状態:設計 設計をおこなっている状態 labels Jan 28, 2025
@Hiroshiba
Copy link
Member Author

これは個人的には実装してくださる方がいらっしゃるのであれば是非お任せしたいと思ってます!
OpenAPIが変わってしまうことはリリース時に案内を入れようと思います 🙏

@raa0121
Copy link
Contributor

raa0121 commented Jan 28, 2025

一括で operation_idroute.name に設定するべきかどうか、決める必要があると思います。
必要なら、個別に operation_id を設定してもいいと思います。

@Hiroshiba
Copy link
Member Author

なるほどです! どういう時に個別に設定した方がよさそうにでしょうか 👀
(あまり利用者側の視点を持っておらず。。)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
機能向上 状態:必要性議論 必要性を議論している状態 状態:設計 設計をおこなっている状態
Projects
None yet
Development

No branches or pull requests

2 participants