Skip to content
This repository was archived by the owner on Jan 24, 2026. It is now read-only.

Commit d9752be

Browse files
committed
fix: merge message by role to generate correctly with deepseek
1 parent f4d9537 commit d9752be

2 files changed

Lines changed: 40 additions & 39 deletions

File tree

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package io.github.stream29.proxy.client
22

3+
import io.github.stream29.proxy.server.LChatCompletionRequest
4+
import io.github.stream29.proxy.server.LChatCompletionResponseChunk
5+
import io.github.stream29.proxy.server.OChatRequest
6+
import io.github.stream29.proxy.server.OChatResponseChunk
7+
import kotlinx.coroutines.flow.Flow
8+
39
fun <T> List<T>.mergeBy(
410
selector: (T) -> String,
511
merger: (T, T) -> T,
@@ -9,12 +15,38 @@ fun <T> List<T>.mergeBy(
915
for (item in this) {
1016
result.add(
1117
if (lastItem != null && selector(lastItem) == selector(item)) {
12-
merger(lastItem, item).also { lastItem = it }
18+
merger(lastItem, item).also { result.removeAt(result.lastIndex) }
1319
} else {
14-
lastItem = item
1520
item
16-
}
21+
}.also { lastItem = it }
1722
)
1823
}
1924
return result
25+
}
26+
27+
fun ApiProvider.messageMergedByRole() = MessageMergedApiProvider(this)
28+
class MessageMergedApiProvider(
29+
val delegate: ApiProvider,
30+
) : ApiProvider by delegate {
31+
override suspend fun generateLStream(request: LChatCompletionRequest): Flow<LChatCompletionResponseChunk> {
32+
return delegate.generateLStream(
33+
request.copy(
34+
messages = request.messages.mergeBy(
35+
selector = { it.role },
36+
merger = { a, b -> a.copy(content = a.content + b.content) }
37+
)
38+
)
39+
)
40+
}
41+
42+
override suspend fun generateOStream(request: OChatRequest): Flow<OChatResponseChunk> {
43+
return delegate.generateOStream(
44+
request.copy(
45+
messages = request.messages.mergeBy(
46+
selector = { it.role },
47+
merger = { a, b -> a.copy(content = a.content + b.content) }
48+
)
49+
)
50+
)
51+
}
2052
}

src/main/kotlin/io/github/stream29/proxy/client/OpenAiBased.kt

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,42 +23,11 @@ data class DashScopeConfig(
2323
data class DeepSeekConfig(
2424
val apiKey: String,
2525
val modelList: List<String> = listOf("deepseek-chat", "deepseek-reasoner"),
26-
) : ApiProvider {
27-
val delegate = OpenAiConfig(
28-
baseUrl = "https://api.deepseek.com/",
29-
apiKey = apiKey,
30-
modelList = modelList
31-
)
32-
33-
override suspend fun getModelNameList(): List<String> = modelList
34-
35-
override suspend fun generateLStream(request: LChatCompletionRequest): Flow<LChatCompletionResponseChunk> {
36-
return delegate.generateLStream(
37-
request.copy(
38-
messages = request.messages.mergeBy(
39-
selector = { it.role },
40-
merger = { a, b -> a.copy(content = a.content + b.content) }
41-
)
42-
)
43-
)
44-
}
45-
46-
override suspend fun generateOStream(request: OChatRequest): Flow<OChatResponseChunk> {
47-
return delegate.generateOStream(
48-
request.copy(
49-
messages = request.messages.mergeBy(
50-
selector = { it.role },
51-
merger = { a, b -> a.copy(content = a.content + b.content) }
52-
)
53-
)
54-
)
55-
}
56-
57-
override fun close() {
58-
delegate.close()
59-
}
60-
61-
}
26+
) : ApiProvider by OpenAiConfig(
27+
baseUrl = "https://api.deepseek.com/",
28+
apiKey = apiKey,
29+
modelList = modelList
30+
).messageMergedByRole()
6231

6332
@Suppress("unused")
6433
@Serializable

0 commit comments

Comments
 (0)