ChatGPT API を WinUI アプリから呼ぶようにしてみた
EBt は WinUI 3 で記述しています
というわけで、WinUI 3 で ChatGPT の API を呼び出すことが出来ます。
まぁ、WinUI 3 で特別な処理をしているわけでもなく、.net で書くのと同じになります。
一応、さほど難し処理でもないんですが、一応、これからやりたい人向けにちょっとしたメモを書きたいと思います。
基本的には ChatGPT に聞けばわかるんですよね
だから、ChatGPT に ChatGPT API を呼び出す方法について確認すれば良いのです。でもまぁ、やっぱりやってみないとよくわかんない問題があるので、それについて書いておきます。
その1:データは Json でとんでくる
色々と調べていると、Json の逆シリアライズに使うライブラリとして .net で提供されていないライブラリを使っていたりします。
でも、一応、System.Text.Json というモジュールがあるので、そいつを使った方が良いかと思います。ただ、そうすると Json 形式で送られているデータを受け取るためのクラスを作らないといけない。というわけで、そのへんのクラスを実装しないといけません。
あと、正常終了したときとエラー終了したときでとんでくる Json は微妙に変わるので、それらに対応した Json にしないといけません。
例えばこんな感じ。
public class ChatGPTResult
{
public string? id { get; set; } = null;
// あかん、object フィールドが名前衝突する…とりあえず保留
//public string? object { get; set; } = null;
public long? created { get; set; } = null;
public string? model { get; set; } = null;
public List<ChatGPTChoices>? choices { get; set; } = new();
public ChatGPTUsage? usage { get; set; } = null;
public string? system_fingerprint { get; set; } = null;
public ChatGPTError? error { get; set; } = null;
}
あと、object というフィールド名で帰ってくるデータがあるんですが、思いっきり予約語とぶつかる…
中身を見ていると、まぁ、当面は無視していいかな?って気がするんで、無視するようにしている。
こんな感じでクラスを定義したら、System.Text.Json.JsonSerializer.Deserialize に喰わせてあげましょう。
JsonSerializer のクセとかはしっかり理解して使って下さいね。JsonIgnore とかプロパティ云々とか。
もうちょっと親切な解説が欲しい場合は、リクエストしてください。
ま、今のところ自分が使う API にしか対応していないので、あんまりおもしろくないですけどね…
その2:エラーかどうかを識別するには
正常に終了すると、choices にデータが入る。そこにデータがは言っていない場合もエラーなんだけど、その場合は error にメッセージが入ります。
さしあたり、error 項目にデータが入ってきたかどうかで判断すれば良さそう。
その3:1回で回答が揃わない場合
長すぎる返答がくるようなリクエストを投げると分割して回答が来ます。
で、これについては調べてもいまいちわからんなーって状況なので、ちょっと実験したいと思っています。
finish_reason の値を見てねと書いてあるんだけど、どーもいまいち信用ならなくてね…
その4:API呼び出しは遅い
というわけで、同期処理で組んじゃダメよ。
その5:課金がえげつない
デバッグだーとか思いながらガンガンリクエスト飛ばすとものすごい勢いでトークンが消費されていきます。一応、OpenAI からチャージしたよ!って mail がとんでくるので、それを見て加減していってください。
$5 を切ったら $10 までチャージという設定にしているんですが、デバッグでリクエスト投げまくったらあっさり1日で $5 使いましたよ…
というわけで
まぁ、色々なライブラリも出てきているし、そのうちに C# にもしっかりとしたライブラリが出てくると思います。が、自分でどんな物か理解しておくのは悪くない。効率が悪いけど、その分しっかり理解できますからね。
EBt では、こんな感じで ChatGPT の API 呼び出していますんで、C# で何か作りたいのであれば、こんな感じで行けるんだ~って思いつつ参考にしていただけたらと思います。
では、今日はここまで。
この記事が気に入ったらサポートをしてみませんか?