Skip to content

Commit 368d318

Browse files
committed
feat: Add Edits API
1 parent 9b6440b commit 368d318

File tree

18 files changed

+340
-1
lines changed

18 files changed

+340
-1
lines changed

ychat/src/commonMain/kotlin/co/yml/ychat/YChat.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package co.yml.ychat
22

33
import co.yml.ychat.entrypoint.features.ChatCompletions
44
import co.yml.ychat.entrypoint.features.Completion
5+
import co.yml.ychat.entrypoint.features.Edits
56
import co.yml.ychat.entrypoint.features.ImageGenerations
67
import co.yml.ychat.entrypoint.impl.YChatImpl
78
import kotlin.jvm.JvmStatic
@@ -93,6 +94,21 @@ interface YChat {
9394
*/
9495
fun imageGenerations(): ImageGenerations
9596

97+
/**
98+
* The edits api is used to edit prompts and re-generate. Given a prompt and an instruction,
99+
* the model will return an edited version of the prompt.
100+
*
101+
* You can configure the parameters of the edits before executing it. Example:
102+
* ```
103+
* val result = YChat.create(apiKey).edits()
104+
* .setInput("As Descartes said, I think, therefore")
105+
* .setInstruction("Fix spelling mistakes")
106+
* .set...
107+
* .execute()
108+
* ```
109+
*/
110+
fun edits(): Edits
111+
96112
/**
97113
* Callback is an interface used for handling the results of an operation.
98114
* It provides two methods, `onSuccess` and `onError`, for handling the success

ychat/src/commonMain/kotlin/co/yml/ychat/data/api/ChatGptApi.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import co.yml.ychat.data.dto.ChatCompletionParamsDto
44
import co.yml.ychat.data.dto.ChatCompletionsDto
55
import co.yml.ychat.data.dto.CompletionDto
66
import co.yml.ychat.data.dto.CompletionParamsDto
7+
import co.yml.ychat.data.dto.EditsDto
8+
import co.yml.ychat.data.dto.EditsParamsDto
79
import co.yml.ychat.data.dto.ImageGenerationsDto
810
import co.yml.ychat.data.dto.ImageGenerationsParamsDto
911
import co.yml.ychat.data.infrastructure.ApiResult
@@ -15,4 +17,6 @@ internal interface ChatGptApi {
1517
suspend fun chatCompletions(paramsDto: ChatCompletionParamsDto): ApiResult<ChatCompletionsDto>
1618

1719
suspend fun imageGenerations(paramsDto: ImageGenerationsParamsDto): ApiResult<ImageGenerationsDto>
20+
21+
suspend fun edits(paramsDto: EditsParamsDto): ApiResult<EditsDto>
1822
}

ychat/src/commonMain/kotlin/co/yml/ychat/data/api/impl/ChatGptApiImpl.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import co.yml.ychat.data.dto.ChatCompletionParamsDto
55
import co.yml.ychat.data.dto.ChatCompletionsDto
66
import co.yml.ychat.data.dto.CompletionDto
77
import co.yml.ychat.data.dto.CompletionParamsDto
8+
import co.yml.ychat.data.dto.EditsDto
9+
import co.yml.ychat.data.dto.EditsParamsDto
810
import co.yml.ychat.data.dto.ImageGenerationsDto
911
import co.yml.ychat.data.dto.ImageGenerationsParamsDto
1012
import co.yml.ychat.data.infrastructure.ApiExecutor
@@ -36,4 +38,12 @@ internal class ChatGptApiImpl(private val apiExecutor: ApiExecutor) : ChatGptApi
3638
.setBody(paramsDto)
3739
.execute()
3840
}
41+
42+
override suspend fun edits(paramsDto: EditsParamsDto): ApiResult<EditsDto> {
43+
return apiExecutor
44+
.setEndpoint("v1/edits")
45+
.setHttpMethod(HttpMethod.Post)
46+
.setBody(paramsDto)
47+
.execute()
48+
}
3949
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package co.yml.ychat.data.dto
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
internal data class EditsChoiceDto(
8+
@SerialName("text")
9+
val text: String,
10+
@SerialName("index")
11+
val index: Int
12+
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package co.yml.ychat.data.dto
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
internal data class EditsDto(
8+
@SerialName("object")
9+
val objectType: String,
10+
@SerialName("created")
11+
val created: Long,
12+
@SerialName("choices")
13+
val choices: List<EditsChoiceDto>,
14+
@SerialName("usage")
15+
val usage: UsageDto,
16+
)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package co.yml.ychat.data.dto
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
internal data class EditsParamsDto(
8+
@SerialName("model")
9+
val model: String,
10+
@SerialName("input")
11+
val input: String,
12+
@SerialName("instruction")
13+
val instruction: String,
14+
@SerialName("n")
15+
val results: Int = 1,
16+
@SerialName("temperature")
17+
val temperature: Double,
18+
@SerialName("top_p")
19+
val topP: Double,
20+
)

ychat/src/commonMain/kotlin/co/yml/ychat/di/module/LibraryModule.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ import co.yml.ychat.data.storage.ChatLogStorage
77
import co.yml.ychat.di.provider.NetworkProvider
88
import co.yml.ychat.domain.usecases.ChatCompletionsUseCase
99
import co.yml.ychat.domain.usecases.CompletionUseCase
10+
import co.yml.ychat.domain.usecases.EditsUseCase
1011
import co.yml.ychat.domain.usecases.ImageGenerationsUseCase
1112
import co.yml.ychat.entrypoint.features.ChatCompletions
1213
import co.yml.ychat.entrypoint.features.Completion
14+
import co.yml.ychat.entrypoint.features.Edits
1315
import co.yml.ychat.entrypoint.features.ImageGenerations
1416
import co.yml.ychat.entrypoint.impl.ChatCompletionsImpl
1517
import co.yml.ychat.entrypoint.impl.CompletionImpl
18+
import co.yml.ychat.entrypoint.impl.EditsImpl
1619
import co.yml.ychat.entrypoint.impl.ImageGenerationsImpl
1720
import kotlinx.coroutines.Dispatchers
1821
import org.koin.core.module.Module
@@ -27,12 +30,14 @@ internal class LibraryModule(private val apiKey: String) {
2730
factory<Completion> { CompletionImpl(Dispatchers.Default, get()) }
2831
factory<ChatCompletions> { ChatCompletionsImpl(Dispatchers.Default, get()) }
2932
factory<ImageGenerations> { ImageGenerationsImpl(Dispatchers.Default, get()) }
33+
factory<Edits> { EditsImpl(Dispatchers.Default, get()) }
3034
}
3135

3236
private val domainModule = module {
3337
factory { CompletionUseCase(get(), get()) }
3438
factory { ChatCompletionsUseCase(get()) }
3539
factory { ImageGenerationsUseCase(get()) }
40+
factory { EditsUseCase(get()) }
3641
}
3742

3843
private val dataModule = module {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package co.yml.ychat.domain.mapper
2+
3+
import co.yml.ychat.data.dto.EditsDto
4+
import co.yml.ychat.data.dto.EditsParamsDto
5+
import co.yml.ychat.domain.model.EditsParams
6+
7+
internal fun EditsDto.toEditsModel(): List<String> {
8+
return this.choices.map { it.text }
9+
}
10+
11+
internal fun EditsParams.toEditsParamsDto(): EditsParamsDto {
12+
return EditsParamsDto(
13+
model = this.model,
14+
input = this.input,
15+
instruction = this.instruction,
16+
results = this.results,
17+
temperature = this.temperature,
18+
topP = this.topP
19+
)
20+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package co.yml.ychat.domain.model
2+
3+
internal data class EditsParams(
4+
var model: String = "text-davinci-edit-001",
5+
var input: String = "",
6+
var instruction: String = "",
7+
var results: Int = 1,
8+
var temperature: Double = 1.0,
9+
var topP: Double = 1.0,
10+
)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package co.yml.ychat.domain.usecases
2+
3+
import co.yml.ychat.data.api.ChatGptApi
4+
import co.yml.ychat.domain.mapper.toEditsModel
5+
import co.yml.ychat.domain.mapper.toEditsParamsDto
6+
import co.yml.ychat.domain.model.EditsParams
7+
8+
internal data class EditsUseCase(private val chatGptApi: ChatGptApi) {
9+
10+
suspend fun requestEdits(params: EditsParams): List<String> {
11+
val requestDto = params.toEditsParamsDto()
12+
val response = chatGptApi.edits(requestDto)
13+
return response.getBodyOrThrow().toEditsModel()
14+
}
15+
}

0 commit comments

Comments
 (0)