結果
叩けました
サンプルアプリとしてこんなものを作りました
※ 結果が5つ表示されているのはパラメータn=5にしているからです
このアプリのリポジトリはこちら
経緯
iOSでOpenAI APIを呼び出しているのを見て、
Androidだったらどうなのかな?と思いやってみました
取り合えず、公式リファレンスを見る
イントロダクションにライブラリを使えとある
Kotlinはコミュニティライブラリでした
Ktorに依存しており、コードを見るとServer Side Kotlin向けっぽい
公式リファレンスを読み進めると、OpenAI APIはただのREST APIのようなので、
ライブラリ使わないで実装してみました
コードの説明
API KEYはこちらに書いてください
コメントにも書きましたが、キーの取り扱いは注意してね!
app/src/main/java/com/example/open_ai_sample/network/RetrofitOpenAiNetwork.kt#L25
//XXX: サンプルのため、ここにおいてますが、API_KEYは外部から取得するようにしてください
private const val OPENAI_API_KEY = "{YOUR_API_KEY}"
通信ライブラリはRetrofitを使っていて、今回はエンドポイントv1/chat/completions
のみです
app/src/main/java/com/example/open_ai_sample/network/RetrofitOpenAiNetwork.kt#L17
//api reference : https://platform.openai.com/docs/api-reference/chat/create
@Headers("Authorization: Bearer $OPENAI_API_KEY")
@POST("v1/chat/completions")
suspend fun chatCompletions(@Body request: ChatCompletions.Request): ChatCompletions.Response.Success
ここでプロンプトを設定します
引数のpromptは画面で入力したテキストです
app/src/main/java/com/example/open_ai_sample/MainViewModel.kt#L60
/**
* ここでプロンプトをカスタムしてください
* api reference : https://platform.openai.com/docs/api-reference/chat/create
*/
private fun createRequest(prompt: String) = ChatCompletions.Request(
model = "gpt-3.5-turbo",
messages = listOf(
ChatMessage(
role = ChatRole.SYSTEM.role,
content = "You are a helpful assistant.",
),
ChatMessage(
role = ChatRole.USER.role,
content = prompt,
)
),
temperature = 0.0,
n = 5,
)
後はリクエストを投げて、レスポンスからchoices.message.contentを取り出して、
app/src/main/java/com/example/open_ai_sample/MainViewModel.kt#L41
uiState = when (result) {
is ChatCompletions.Response.Success -> {
uiState.copy(
sendResultState = MainUiState.SendResultState.Success(
result.choices.map { it.message?.content ?: "" }
)
)
}
is ChatCompletions.Response.Failure -> {/** 省略 */}
}
整形して、おわりです
app/src/main/java/com/example/open_ai_sample/ui/MainScreen.kt#L99
items(sendResultState.results.size) { index ->
Text(
modifier = Modifier.padding(8.dp),
text = "${index + 1}. ${sendResultState.results[index]}",
)
Divider()
}
まとめ
- 簡単に叩けた
- ライブラリを使わなくても、ただのREST APIなので超簡単
問題としては、modelを作るのが面倒
- ライブラリを使わなくても、ただのREST APIなので超簡単
- 今回はお遊びということで、普通はバックエンドで叩くよね!
- API KEYの管理問題(外部からとってきて、保存するなら暗号化しないと。。)
- 変更にアプリリースが必要(プロンプトを簡単に変更できない。。)