Skip to content

Commit

Permalink
Migrated Library to use Kotlin Ktor instead of Retrofit.
Browse files Browse the repository at this point in the history
  • Loading branch information
daniel-iroka committed Oct 4, 2023
1 parent 6322374 commit 5e0877a
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 121 deletions.
22 changes: 11 additions & 11 deletions ApiLibrary/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
id("maven-publish")
kotlin("plugin.serialization") version "1.9.0"
}

android {
Expand Down Expand Up @@ -34,21 +35,20 @@ android {
}

dependencies {

val retrofitVersion = "2.9.0"
val moshiVersion = "1.13.0"

// retrofit and moshi
implementation ("com.squareup.okhttp3:okhttp:4.11.0")
implementation ("com.squareup.retrofit2:retrofit:$retrofitVersion")
implementation ("com.squareup.retrofit2:converter-moshi:$retrofitVersion")
implementation ("com.squareup.moshi:moshi:$moshiVersion")
implementation ("com.squareup.moshi:moshi-kotlin:$moshiVersion")
implementation ("com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.3")
val ktor_version = "2.3.4"

// kotlin coroutines
implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")

// ktor dependencies
implementation("io.ktor:ktor-client-content-negotiation:$ktor_version")
implementation("io.ktor:ktor-client-core:$ktor_version")
implementation("io.ktor:ktor-client-cio:$ktor_version")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")
implementation("io.ktor:ktor-client-logging:$ktor_version")

// kotlin-lifecycle
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
}

afterEvaluate {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
package com.example.apilibrary.library

import com.squareup.moshi.Json
import kotlinx.serialization.Serializable

@Serializable
internal data class PromptChat(
@Json(name = "history") val history : Array<String>,
@Json(name = "user_input") val user_input : String
val history : Array<String>,
val user_input : String
)

@Serializable
internal data class Prompt(
@Json(name = "user_input") val user_input : String
)

data class PromptChatCompletion(
@Json(name = "message") val message : String
)

data class PromptCompletion(
@Json(name = "message") val message : String
)

val user_input : String
)
Original file line number Diff line number Diff line change
@@ -1,33 +1,62 @@
package com.example.apilibrary.library

import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import java.util.concurrent.TimeUnit

internal object OpenAiClient {

private val BASE_URL = "https://spitfire-interractions.onrender.com/"

private val okhttpClient = OkHttpClient.Builder()
.readTimeout(3000, TimeUnit.MILLISECONDS)
.connectTimeout(2000, TimeUnit.MILLISECONDS)
.addInterceptor(MyInterceptor())
.addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY })
.build()

private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()

private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.client(okhttpClient)
.build()

val service: OpenAiService = retrofit.create(OpenAiService::class.java)
}
import android.util.Log
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.plugins.logging.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.json.Json

private const val TAG = "OpenAiClient"

internal class OpenAiClient {

val client = HttpClient(CIO) {
install(ContentNegotiation) {
json(Json{
prettyPrint = true
isLenient = true
})
}

install(Logging) {
logger = object : Logger {
override fun log(message: String) {
Log.d(TAG, "Network Message, log: $message")
}
}
level=LogLevel.ALL
}

install(HttpTimeout) {
socketTimeoutMillis = 10_000
requestTimeoutMillis = 10_000
connectTimeoutMillis = 10_000
}
}

suspend fun getUserChatResponse(userPrompt: String, userPromptChat : Array<String>, userId : String) : String {
val response : HttpResponse = client.post("https://spitfire-interractions.onrender.com/api/chat/completions/") {
header("Accept", "application/json")
header("Content-Type", "application/json")
header("Cookie", userId)
setBody(PromptChat(history = userPromptChat, user_input = userPrompt))
}
return response.body()
}

suspend fun getChatResponse(userPrompt: String, userId : String) : String {
val response : HttpResponse = client.post("https://spitfire-interractions.onrender.com/api/chat/") {
header("Accept", "application/json")
header("Content-Type", "application/json")
header("Cookie", userId)
setBody(Prompt(user_input = userPrompt))
}
return response.body()
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
package com.example.apilibrary.wrapperclass

import com.example.apilibrary.library.PromptChat
import com.example.apilibrary.library.OpenAiClient
import com.example.apilibrary.library.Prompt
import com.example.apilibrary.library.PromptChatCompletion
import com.example.apilibrary.library.PromptCompletion
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import retrofit2.Response

class OpenAiCaller {
companion object {
suspend fun generateUserChatResponse(userInput: String, savedHistory : Array<String>): Response<PromptChatCompletion> {
val openAiClient = OpenAiClient.service
suspend fun generateUserChatResponse(userPrompt: String, userPromptChat: Array<String>, userId: String) : String {
val openAiClient = OpenAiClient()
return withContext(Dispatchers.IO) {
val response = openAiClient.callUserChatResponse(PromptChat(user_input = userInput, history = savedHistory))
return@withContext response
return@withContext openAiClient.getUserChatResponse(
userPrompt,
userPromptChat,
userId
)
}
}

suspend fun generateChatResponse(userInput: String): Response<PromptCompletion> {
val openAiClient = OpenAiClient.service
suspend fun generateChatResponse(userPrompt: String, userId: String) : String {
val openAiClient = OpenAiClient()
return withContext(Dispatchers.IO) {
val response = openAiClient.callChatResponse(Prompt(user_input = userInput))
return@withContext response
return@withContext openAiClient.getChatResponse(userPrompt, userId)
}
}
}
Expand Down
4 changes: 0 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,4 @@ dependencies {
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")

implementation(project(":ApiLibrary"))


}
15 changes: 1 addition & 14 deletions app/src/main/java/com/example/openailibrary/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,13 @@ package com.example.openailibrary

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.apilibrary.wrapperclass.OpenAiCaller
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

const val TAG = "MainActivity"

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// Note : This is for testing purposes.
// You can do simple log tests here by adding a dependency to the Module...

// CoroutineScope(Dispatchers.Main).launch {
// val response = OpenAiCaller.generateUserChatResponse("What was my last question?",
// arrayOf("User : What color is an Apple?", "Ai : An Apple is red in color."))
//
// // Do something with response
// }
}
}

0 comments on commit 5e0877a

Please sign in to comment.