Android Weekly

Android Weekly #-604 "KMP에서의 Gemini 사용"

베블렌 2024. 1. 8. 23:51

1월 2주차에는 KMP에서 Gemini의 사용법에 대한 글입니다.

https://github.com/joreilly/GeminiKMP

 

GitHub - joreilly/GeminiKMP: Kotlin Multiplatform sample that uses Gemini Generative AI APIs. Runs on Android, iOS, Desktop and

Kotlin Multiplatform sample that uses Gemini Generative AI APIs. Runs on Android, iOS, Desktop and Wasm based Compose for Web. - GitHub - joreilly/GeminiKMP: Kotlin Multiplatform sample that uses ...

github.com

 

 

소개

KMP에서 Gemini를 사용하는 방법에 대한 코드입니다. 이번주에 작성안 kotlin weekly의 글과의 차이점이 조금 있습니다.

1. 텍스트 검색과 이미지를 이용한 검색을 구분하지 않고, 텍스트 검색만 있는 모습입니다.

2. ktor를 이용하여 여러 플랫폼에서 사용될수있게 합니다.

 

import dev.johnoreilly.gemini.BuildKonfig
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.http.ContentType
import io.ktor.http.contentType
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class Part(val text: String)

@Serializable
data class Content(val parts: List<Part>)

@Serializable
data class Candidate(val content: Content)

@Serializable
data class Error(val message: String)

@Serializable
data class GenerateContentResponse(val error: Error? = null, val candidates: List<Candidate>? = null)

@Serializable
data class GenerateContentRequest(val contents: Content)

class GeminiApi {
    private val baseUrl = " https://generativelanguage.googleapis.com/v1beta/models"
    private val apiKey = BuildKonfig.GEMINI_API_KEY

    @OptIn(ExperimentalSerializationApi::class)
    private val client = HttpClient {
        install(ContentNegotiation) {
            json(Json { isLenient = true; ignoreUnknownKeys = true; explicitNulls = false})
        }
    }

    suspend fun generateContent(prompt: String): GenerateContentResponse {
        val part = Part(text = prompt)
        val contents = Content(listOf(part))
        val request = GenerateContentRequest(contents)

        return client.post("$baseUrl/gemini-pro:generateContent") {
            contentType(ContentType.Application.Json)
            url { parameters.append("key", apiKey) }
            setBody(request)
        }.body<GenerateContentResponse>()
    }
}

 

 

 

 

 

 

https://androidweekly.net/

 

Android Weekly - Free weekly Android & Kotlin development newsletter

Android Weekly - Free weekly Android & Kotlin development newsletter

androidweekly.net