Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@ activityCompose = "1.8.2"
composeBom = "2024.03.00"
appcompat = "1.6.1"
material = "1.11.0"
materialIconsCoreAndroid = "1.6.5"
media3Exoplayer = "1.3.0"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-material-icons-core-android = { module = "androidx.compose.material:material-icons-core-android", version.ref = "materialIconsCoreAndroid" }
androidx-material-icons-extended-android = { module = "androidx.compose.material:material-icons-extended-android", version.ref = "materialIconsCoreAndroid" }
androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3Exoplayer" }
androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3Exoplayer" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
Expand Down
12 changes: 11 additions & 1 deletion openai-android/src/main/java/dev/sunnat629/ai_client/OpenAI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@

package dev.sunnat629.ai_client

import dev.sunnat629.ai_client.KoinModules.openAiAndroidLibModuleKoin
import dev.sunnat629.ai_client.di.KoinModules.openAiAndroidLibModuleKoin
import dev.sunnat629.ai_client.clients.Audio
import dev.sunnat629.ai_client.clients.Chat
import dev.sunnat629.ai_client.clients.Embeddings
import dev.sunnat629.ai_client.clients.File
import dev.sunnat629.ai_client.clients.Models
import dev.sunnat629.ai_client.clients.Moderations
import dev.sunnat629.ai_client.models.openaAI.OpenAIBuilderConfig
Expand All @@ -21,6 +23,8 @@ interface OpenAI {
val models: Models
val moderations: Moderations
val audio: Audio
val embeddings: Embeddings
val file: File
}

internal class OpenAIImpl(configModel: OpenAIBuilderConfig) : OpenAI, KoinComponent {
Expand All @@ -37,6 +41,12 @@ internal class OpenAIImpl(configModel: OpenAIBuilderConfig) : OpenAI, KoinCompon
private val _audio: Audio by inject()
override val audio: Audio get() = _audio

private val _embeddings: Embeddings by inject()
override val embeddings: Embeddings get() = _embeddings

private val _file: File by inject()
override val file: File get() = _file

init {
openAiAndroidLibModuleKoin(configModel)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ package dev.sunnat629.ai_client.apis.assistants

import dev.sunnat629.ai_client.models.assistants.AssistantResponse
import dev.sunnat629.ai_client.models.assistants.CreateAssistantRequest
import dev.sunnat629.ai_client.networks.ApiResult
import dev.sunnat629.ai_client.networks.deleteRequest
import dev.sunnat629.ai_client.networks.getRequest
import dev.sunnat629.ai_client.networks.patchRequest
Expand All @@ -20,20 +19,20 @@ class AssistantRepositoryImpl(private val httpClient: HttpClient) : AssistantRep

private val baseUrl = "https://api.openai.com/v1/assistants"

override suspend fun createAssistant(request: CreateAssistantRequest): ApiResult<AssistantResponse> {
override suspend fun createAssistant(request: CreateAssistantRequest): AssistantResponse {
return httpClient.postRequest(
url = baseUrl,
request = request
)
}

override suspend fun listAssistants(): ApiResult<List<AssistantResponse>> {
override suspend fun listAssistants(): List<AssistantResponse> {
return httpClient.getRequest(
url = baseUrl
)
}

override suspend fun retrieveAssistant(assistantId: String): ApiResult<AssistantResponse> {
override suspend fun retrieveAssistant(assistantId: String): AssistantResponse {
return httpClient.getRequest(
url = "$baseUrl/$assistantId"
)
Expand All @@ -42,14 +41,14 @@ class AssistantRepositoryImpl(private val httpClient: HttpClient) : AssistantRep
override suspend fun updateAssistant(
assistantId: String,
request: CreateAssistantRequest
): ApiResult<AssistantResponse> {
): AssistantResponse {
return httpClient.patchRequest(
url = "$baseUrl/$assistantId",
request = request
)
}

override suspend fun deleteAssistant(assistantId: String): ApiResult<Unit> {
override suspend fun deleteAssistant(assistantId: String): Unit {
return httpClient.deleteRequest(
url = "$baseUrl/$assistantId"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,24 @@ package dev.sunnat629.ai_client.apis.assistants

import dev.sunnat629.ai_client.models.assistants.AssistantResponse
import dev.sunnat629.ai_client.models.assistants.CreateAssistantRequest
import dev.sunnat629.ai_client.networks.ApiResult

// AssistantRepository.kt
interface AssistantRepository {
/** Creates a new assistant */
suspend fun createAssistant(request: CreateAssistantRequest): ApiResult<AssistantResponse>
suspend fun createAssistant(request: CreateAssistantRequest): AssistantResponse

/** Lists all assistants */
suspend fun listAssistants(): ApiResult<List<AssistantResponse>>
suspend fun listAssistants(): List<AssistantResponse>

/** Retrieves an assistant by ID */
suspend fun retrieveAssistant(assistantId: String): ApiResult<AssistantResponse>
suspend fun retrieveAssistant(assistantId: String): AssistantResponse

/** Updates an assistant */
suspend fun updateAssistant(
assistantId: String,
request: CreateAssistantRequest
): ApiResult<AssistantResponse>
): AssistantResponse

/** Deletes an assistant */
suspend fun deleteAssistant(assistantId: String): ApiResult<Unit>
suspend fun deleteAssistant(assistantId: String): Unit
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@

package dev.sunnat629.ai_client.apis.embeddings

import dev.sunnat629.ai_client.models.embeddings.CreateEmbeddingsRequest
import dev.sunnat629.ai_client.models.embeddings.CreateEmbeddingsResponse
import dev.sunnat629.ai_client.networks.ApiResult
import dev.sunnat629.ai_client.models.embeddings.EmbeddingsRequest
import dev.sunnat629.ai_client.models.embeddings.EmbeddingsResponse

interface EmbeddingsRepository {

// Embeddings Operations
suspend fun createEmbedding(request: CreateEmbeddingsRequest): ApiResult<CreateEmbeddingsResponse>
suspend fun createEmbedding(request: EmbeddingsRequest): EmbeddingsResponse
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,15 @@

package dev.sunnat629.ai_client.apis.embeddings

import dev.sunnat629.ai_client.models.embeddings.CreateEmbeddingsRequest
import dev.sunnat629.ai_client.models.embeddings.CreateEmbeddingsResponse
import dev.sunnat629.ai_client.networks.ApiResult
import dev.sunnat629.ai_client.models.embeddings.EmbeddingsRequest
import dev.sunnat629.ai_client.models.embeddings.EmbeddingsResponse
import dev.sunnat629.ai_client.networks.URLs.EMBEDDINGS
import dev.sunnat629.ai_client.networks.postRequest
import io.ktor.client.HttpClient

class EmbeddingsRepositoryImpl(private val client: HttpClient) : EmbeddingsRepository {
private val baseUrl = "https://api.openai.com/v1/embeddings"

override suspend fun createEmbedding(request: CreateEmbeddingsRequest): ApiResult<CreateEmbeddingsResponse> {
return client.postRequest(baseUrl, request)
override suspend fun createEmbedding(request: EmbeddingsRequest): EmbeddingsResponse {
return client.postRequest(EMBEDDINGS, request)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ package dev.sunnat629.ai_client.apis.files
import dev.sunnat629.ai_client.models.files.FileResponse
import dev.sunnat629.ai_client.models.files.ListFilesResponse
import dev.sunnat629.ai_client.models.files.UploadFileRequest
import dev.sunnat629.ai_client.networks.ApiResult

/**
* Interface defining operations for managing files with the OpenAI API.
Expand All @@ -19,31 +18,31 @@ interface FilesRepository {
/**
* Uploads a file to the OpenAI API for use with various services like fine-tuning.
*
* @param file The file to be uploaded.
* @return ApiResult<UploadFileRequest> Result of the file upload operation.
* @param request The require contents for the API
* @return FileResponse Result of the file upload operation.
*/
suspend fun uploadFile(file: FileResponse): ApiResult<UploadFileRequest>
suspend fun uploadFile(request: UploadFileRequest, byteArray: ByteArray?): FileResponse

/**
* Retrieves a list of files previously uploaded to the OpenAI API.
*
* @return ApiResult<ListFilesResponse> A list of files.
* @return ListFilesResponse A list of files.
*/
suspend fun listFiles(): ApiResult<ListFilesResponse>
suspend fun listFiles(): ListFilesResponse

/**
* Retrieves a specific file by its unique identifier.
*
* @param fileId The unique identifier of the file to retrieve.
* @return ApiResult<FileResponse> The requested file.
* @return FileResponse The requested file.
*/
suspend fun retrieveFile(fileId: String): ApiResult<FileResponse>
suspend fun retrieveFile(fileId: String): FileResponse

/**
* Deletes a specific file by its unique identifier.
*
* @param fileId The unique identifier of the file to delete.
* @return ApiResult<FileResponse> The result of the deletion operation.
* @return FileResponse The result of the deletion operation.
*/
suspend fun deleteFile(fileId: String): ApiResult<FileResponse>
suspend fun deleteFile(fileId: String): FileResponse
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,65 @@

package dev.sunnat629.ai_client.apis.files

import android.util.Log
import dev.sunnat629.ai_client.models.files.FileResponse
import dev.sunnat629.ai_client.models.files.ListFilesResponse
import dev.sunnat629.ai_client.models.files.Purpose
import dev.sunnat629.ai_client.models.files.UploadFileRequest
import dev.sunnat629.ai_client.networks.ApiResult
import dev.sunnat629.ai_client.networks.deleteRequest
import dev.sunnat629.ai_client.networks.getRequest
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.forms.formData
import io.ktor.client.request.forms.submitFormWithBinaryData
import io.ktor.http.Headers
import io.ktor.http.HttpHeaders
import io.ktor.util.InternalAPI

class FilesRepositoryImpl(private val httpClient: HttpClient) : FilesRepository {
override suspend fun uploadFile(file: FileResponse): ApiResult<UploadFileRequest> {
// Implement the upload logic, potentially handling multipart/form-data for file upload
return ApiResult.Failure(NotImplementedError())
class FilesRepositoryImpl(private val client: HttpClient) : FilesRepository {

@OptIn(InternalAPI::class)
override suspend fun uploadFile(request: UploadFileRequest, byteArray: ByteArray?): FileResponse {

val content: Any = when (request.purpose) {
Purpose.FINE_TUNE -> request.fileJsonl
Purpose.ASSISTANTS -> byteArray
}

val response = client.submitFormWithBinaryData(
url = "files",
formData = formData {
append("purpose", request.purpose.value)
append(
key = "file",
value = content,
headers = Headers.build {
append(HttpHeaders.ContentDisposition, "filename=file.jsonl")
}
)
}
)

Log.e("ASDF", response.body<FileResponse>().toString())

return response.body<FileResponse>()
}

override suspend fun listFiles(): ApiResult<ListFilesResponse> {
return httpClient.getRequest(
url = "https://api.openai.com/v1/files"
override suspend fun listFiles(): ListFilesResponse {
return client.getRequest(
url = "files"
)
}

override suspend fun retrieveFile(fileId: String): ApiResult<FileResponse> {
return httpClient.getRequest(
url = "https://api.openai.com/v1/files/$fileId"
override suspend fun retrieveFile(fileId: String): FileResponse {
return client.getRequest(
url = "files/$fileId"
)
}

override suspend fun deleteFile(fileId: String): ApiResult<FileResponse> {
return httpClient.deleteRequest(
url = "https://api.openai.com/v1/files/$fileId"
override suspend fun deleteFile(fileId: String): FileResponse {
return client.deleteRequest(
url = "/files/$fileId"
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,18 @@ package dev.sunnat629.ai_client.apis.fineTuning

import dev.sunnat629.ai_client.models.fineTuning.CreateFineTuningRequest
import dev.sunnat629.ai_client.models.fineTuning.FineTuningResponse
import dev.sunnat629.ai_client.networks.ApiResult

// FineTuningRepository.kt
interface FineTuningRepository {
/** Creates a fine-tuning job */
suspend fun createFineTuningJob(request: CreateFineTuningRequest): ApiResult<FineTuningResponse>
suspend fun createFineTuningJob(request: CreateFineTuningRequest): FineTuningResponse

/** Lists all fine-tuning jobs */
suspend fun listFineTuningJobs(): ApiResult<List<FineTuningResponse>>
suspend fun listFineTuningJobs(): List<FineTuningResponse>

/** Retrieves a fine-tuning job by ID */
suspend fun retrieveFineTuningJob(fineTuneId: String): ApiResult<FineTuningResponse>
suspend fun retrieveFineTuningJob(fineTuneId: String): FineTuningResponse

/** Cancels a fine-tuning job */
suspend fun cancelFineTuningJob(fineTuneId: String): ApiResult<Unit>
suspend fun cancelFineTuningJob(fineTuneId: String): Unit
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ package dev.sunnat629.ai_client.apis.fineTuning

import dev.sunnat629.ai_client.models.fineTuning.CreateFineTuningRequest
import dev.sunnat629.ai_client.models.fineTuning.FineTuningResponse
import dev.sunnat629.ai_client.networks.ApiResult
import dev.sunnat629.ai_client.networks.getRequest
import dev.sunnat629.ai_client.networks.postRequest
import io.ktor.client.HttpClient
Expand All @@ -17,26 +16,26 @@ class FineTuningRepositoryImpl(private val httpClient: HttpClient) : FineTuningR

private val baseUrl = "https://api.openai.com/v1/fine-tunes"

override suspend fun createFineTuningJob(request: CreateFineTuningRequest): ApiResult<FineTuningResponse> {
override suspend fun createFineTuningJob(request: CreateFineTuningRequest): FineTuningResponse {
return httpClient.postRequest(
url = baseUrl,
request = request
)
}

override suspend fun listFineTuningJobs(): ApiResult<List<FineTuningResponse>> {
override suspend fun listFineTuningJobs(): List<FineTuningResponse> {
return httpClient.getRequest(
url = baseUrl
)
}

override suspend fun retrieveFineTuningJob(fineTuneId: String): ApiResult<FineTuningResponse> {
override suspend fun retrieveFineTuningJob(fineTuneId: String): FineTuningResponse {
return httpClient.getRequest(
url = "$baseUrl/$fineTuneId"
)
}

override suspend fun cancelFineTuningJob(fineTuneId: String): ApiResult<Unit> {
override suspend fun cancelFineTuningJob(fineTuneId: String): Unit {
return httpClient.postRequest(
url = "$baseUrl/$fineTuneId/cancel",
request = ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import dev.sunnat629.ai_client.models.images.CreateImageRequest
import dev.sunnat629.ai_client.models.images.CreateImageResponse
import dev.sunnat629.ai_client.models.images.CreateImageVariationsRequest
import dev.sunnat629.ai_client.models.images.CreateImageVariationsResponse
import dev.sunnat629.ai_client.networks.ApiResult

/**
* Interface defining operations for creating and managing images with the OpenAI API.
Expand All @@ -24,21 +23,21 @@ interface ImageRepository {
* @param request The request parameters for image creation.
* @return ApiResult<CreateImageResponse> The created image or images.
*/
suspend fun createImage(request: CreateImageRequest): ApiResult<CreateImageResponse>
suspend fun createImage(request: CreateImageRequest): CreateImageResponse

/**
* Edits an existing image according to the specified modifications.
*
* @param request The request parameters for image editing.
* @return ApiResult<CreateImageResponse> The edited image.
*/
suspend fun editImage(request: CreateImageEditRequest): ApiResult<CreateImageResponse>
suspend fun editImage(request: CreateImageEditRequest): CreateImageResponse

/**
* Creates variations of a given image based on specified parameters.
*
* @param request The request parameters for creating image variations.
* @return ApiResult<Any> The created image variations.
*/
suspend fun createImageVariations(request: CreateImageVariationsRequest): ApiResult<CreateImageVariationsResponse>
suspend fun createImageVariations(request: CreateImageVariationsRequest): CreateImageVariationsResponse
}
Loading