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>()
}
}
Android Weekly - Free weekly Android & Kotlin development newsletter
Android Weekly - Free weekly Android & Kotlin development newsletter
androidweekly.net
'Android Weekly' 카테고리의 다른 글
Android Weekly #-605 "Flow 와 ChannelFlow 의 비교" (0) | 2024.01.25 |
---|---|
Android Weekly #-603 "코틀린의 동기 및 비동기 실행" (0) | 2024.01.01 |
Android Weekly #-602 "필요기능? 앱의 기기별 사용 가능성 증가" (0) | 2023.12.25 |
Android Weekly #-601 "Flow collectors의 leak 문제" (0) | 2023.12.18 |
Android Weekly #-600 "Baseline Profiles를 이용한 앱 성능 향상" (0) | 2023.12.13 |