7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AndroidでOpenAI APIを叩きたい

Last updated at Posted at 2023-06-25

結果

叩けました
サンプルアプリとしてこんなものを作りました
 ※ 結果が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を作るのが面倒
  • 今回はお遊びということで、普通はバックエンドで叩くよね!
    • API KEYの管理問題(外部からとってきて、保存するなら暗号化しないと。。)
    • 変更にアプリリースが必要(プロンプトを簡単に変更できない。。)
7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?