Skip to content

Commit 3ae4a72

Browse files
committed
Reformat code and update Java version to 24
1 parent 5376f5b commit 3ae4a72

File tree

6 files changed

+151
-134
lines changed

6 files changed

+151
-134
lines changed

.java-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
23
1+
24

langchain4j-kotlin/src/main/kotlin/me/kpavlov/langchain4j/kotlin/adapters/TokenStreamToReplyFlowAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package me.kpavlov.langchain4j.kotlin.adapters
22

33
import dev.langchain4j.service.TokenStream
44
import dev.langchain4j.spi.services.TokenStreamAdapter
5-
import java.lang.reflect.ParameterizedType
6-
import java.lang.reflect.Type
75
import kotlinx.coroutines.flow.Flow
86
import me.kpavlov.langchain4j.kotlin.model.chat.StreamingChatLanguageModelReply
97
import me.kpavlov.langchain4j.kotlin.model.chat.asReplyFlow
8+
import java.lang.reflect.ParameterizedType
9+
import java.lang.reflect.Type
1010

1111
class TokenStreamToReplyFlowAdapter : TokenStreamAdapter {
1212
override fun canAdaptTokenStreamTo(type: Type?): Boolean {

langchain4j-kotlin/src/main/kotlin/me/kpavlov/langchain4j/kotlin/adapters/TokenStreamToStringFlowAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package me.kpavlov.langchain4j.kotlin.adapters
22

33
import dev.langchain4j.service.TokenStream
44
import dev.langchain4j.spi.services.TokenStreamAdapter
5-
import java.lang.reflect.ParameterizedType
6-
import java.lang.reflect.Type
75
import kotlinx.coroutines.flow.Flow
86
import me.kpavlov.langchain4j.kotlin.model.chat.asFlow
7+
import java.lang.reflect.ParameterizedType
8+
import java.lang.reflect.Type
99

1010
class TokenStreamToStringFlowAdapter : TokenStreamAdapter {
1111
override fun canAdaptTokenStreamTo(type: Type?): Boolean {

langchain4j-kotlin/src/main/kotlin/me/kpavlov/langchain4j/kotlin/model/chat/StreamingChatLanguageModelExtensions.kt

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import dev.langchain4j.model.chat.response.StreamingChatResponseHandler
66
import dev.langchain4j.service.TokenStream
77
import kotlinx.coroutines.channels.Channel
88
import kotlinx.coroutines.channels.awaitClose
9-
import kotlinx.coroutines.channels.trySendBlocking
109
import kotlinx.coroutines.flow.Flow
1110
import kotlinx.coroutines.flow.buffer
1211
import kotlinx.coroutines.flow.callbackFlow
13-
import kotlinx.coroutines.flow.channelFlow
1412
import kotlinx.coroutines.flow.flow
1513
import me.kpavlov.langchain4j.kotlin.model.chat.request.ChatRequestBuilder
1614
import me.kpavlov.langchain4j.kotlin.model.chat.request.chatRequest
@@ -129,27 +127,29 @@ fun StreamingChatLanguageModel.chatFlow(
129127
}
130128
}
131129

132-
fun TokenStream.asFlow(): Flow<String> = flow {
133-
callbackFlow {
134-
onPartialResponse { trySend(it) }
135-
onCompleteResponse { close() }
136-
onError { close(it) }
137-
start()
138-
awaitClose()
139-
}.buffer(Channel.UNLIMITED).collect(this)
140-
}
130+
fun TokenStream.asFlow(): Flow<String> =
131+
flow {
132+
callbackFlow {
133+
onPartialResponse { trySend(it) }
134+
onCompleteResponse { close() }
135+
onError { close(it) }
136+
start()
137+
awaitClose()
138+
}.buffer(Channel.UNLIMITED).collect(this)
139+
}
141140

142-
fun TokenStream.asReplyFlow(): Flow<StreamingChatLanguageModelReply> = flow {
143-
callbackFlow<StreamingChatLanguageModelReply> {
144-
onPartialResponse { token ->
145-
trySend(StreamingChatLanguageModelReply.PartialResponse(token))
146-
}
147-
onCompleteResponse { response ->
148-
trySend(StreamingChatLanguageModelReply.CompleteResponse(response))
149-
close()
150-
}
151-
onError { throwable -> close(throwable) }
152-
start()
153-
awaitClose()
154-
}.buffer(Channel.UNLIMITED).collect(this)
155-
}
141+
fun TokenStream.asReplyFlow(): Flow<StreamingChatLanguageModelReply> =
142+
flow {
143+
callbackFlow<StreamingChatLanguageModelReply> {
144+
onPartialResponse { token ->
145+
trySend(StreamingChatLanguageModelReply.PartialResponse(token))
146+
}
147+
onCompleteResponse { response ->
148+
trySend(StreamingChatLanguageModelReply.CompleteResponse(response))
149+
close()
150+
}
151+
onError { throwable -> close(throwable) }
152+
start()
153+
awaitClose()
154+
}.buffer(Channel.UNLIMITED).collect(this)
155+
}

langchain4j-kotlin/src/test/kotlin/me/kpavlov/langchain4j/kotlin/adapters/ServiceWithFlowTest.kt

Lines changed: 120 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -35,131 +35,147 @@ class ServiceWithFlowTest {
3535
private lateinit var model: StreamingChatLanguageModel
3636

3737
@Test
38-
fun `Should use TokenStreamToStringFlowAdapter`() = runTest {
39-
val partialToken1 = "Hello"
40-
val partialToken2 = "world"
41-
val completeResponse = ChatResponse.builder().aiMessage(AiMessage("Hello")).build()
42-
43-
doAnswer {
44-
val handler = it.arguments[1] as StreamingChatResponseHandler
45-
handler.onPartialResponse(partialToken1)
46-
handler.onPartialResponse(partialToken2)
47-
handler.onCompleteResponse(completeResponse)
48-
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
49-
50-
val assistant =
51-
AiServices
52-
.builder(Assistant::class.java)
53-
.streamingChatLanguageModel(model)
54-
.build()
55-
56-
val result = assistant.askQuestion(userName = "My friend", question = "How are you?")
57-
.toList()
58-
59-
assertThat(result).containsExactly(partialToken1, partialToken2)
60-
}
38+
fun `Should use TokenStreamToStringFlowAdapter`() =
39+
runTest {
40+
val partialToken1 = "Hello"
41+
val partialToken2 = "world"
42+
val completeResponse = ChatResponse.builder().aiMessage(AiMessage("Hello")).build()
43+
44+
doAnswer {
45+
val handler = it.arguments[1] as StreamingChatResponseHandler
46+
handler.onPartialResponse(partialToken1)
47+
handler.onPartialResponse(partialToken2)
48+
handler.onCompleteResponse(completeResponse)
49+
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
50+
51+
val assistant =
52+
AiServices
53+
.builder(Assistant::class.java)
54+
.streamingChatLanguageModel(model)
55+
.build()
56+
57+
val result =
58+
assistant
59+
.askQuestion(userName = "My friend", question = "How are you?")
60+
.toList()
61+
62+
assertThat(result).containsExactly(partialToken1, partialToken2)
63+
}
6164

6265
@Test
63-
fun `Should use TokenStreamToStringFlowAdapter error`() = runTest {
64-
val partialToken1 = "Hello"
65-
val partialToken2 = "world"
66-
val error = RuntimeException("Test error")
67-
68-
doAnswer {
69-
val handler = it.arguments[1] as StreamingChatResponseHandler
70-
handler.onPartialResponse(partialToken1)
71-
handler.onPartialResponse(partialToken2)
72-
handler.onError(error)
73-
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
74-
75-
val assistant =
76-
AiServices
77-
.builder(Assistant::class.java)
78-
.streamingChatLanguageModel(model)
79-
.build()
80-
81-
82-
val response = assistant.askQuestion(userName = "My friend", question = "How are you?")
83-
.catch {
84-
val message =
85-
requireNotNull(it.message) { "Only $error is allowed to occur here but found $it" }
86-
emit(message)
87-
}.toList()
88-
89-
assertThat(response).containsExactly(partialToken1, partialToken2, error.message)
90-
}
66+
fun `Should use TokenStreamToStringFlowAdapter error`() =
67+
runTest {
68+
val partialToken1 = "Hello"
69+
val partialToken2 = "world"
70+
val error = RuntimeException("Test error")
71+
72+
doAnswer {
73+
val handler = it.arguments[1] as StreamingChatResponseHandler
74+
handler.onPartialResponse(partialToken1)
75+
handler.onPartialResponse(partialToken2)
76+
handler.onError(error)
77+
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
78+
79+
val assistant =
80+
AiServices
81+
.builder(Assistant::class.java)
82+
.streamingChatLanguageModel(model)
83+
.build()
84+
85+
val response =
86+
assistant
87+
.askQuestion(userName = "My friend", question = "How are you?")
88+
.catch {
89+
val message =
90+
requireNotNull(
91+
it.message,
92+
) { "Only $error is allowed to occur here but found $it" }
93+
emit(message)
94+
}.toList()
95+
96+
assertThat(response).containsExactly(partialToken1, partialToken2, error.message)
97+
}
9198

9299
@Test
93-
fun `Should use TokenStreamToReplyFlowAdapter`() = runTest {
94-
val partialToken1 = "Hello"
95-
val partialToken2 = "world"
96-
val completeResponse = ChatResponse.builder().aiMessage(AiMessage("Hello")).build()
97-
98-
doAnswer {
99-
val handler = it.arguments[1] as StreamingChatResponseHandler
100-
handler.onPartialResponse(partialToken1)
101-
handler.onPartialResponse(partialToken2)
102-
handler.onCompleteResponse(completeResponse)
103-
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
104-
105-
val assistant =
106-
AiServices
107-
.builder(Assistant::class.java)
108-
.streamingChatLanguageModel(model)
109-
.build()
110-
111-
val result = assistant.askQuestion2(userName = "My friend", question = "How are you?")
112-
.toList()
113-
114-
assertThat(result).startsWith(PartialResponse(partialToken1), PartialResponse(partialToken2))
115-
assertThat(result).index(2).isInstanceOf(CompleteResponse::class)
116-
}
100+
fun `Should use TokenStreamToReplyFlowAdapter`() =
101+
runTest {
102+
val partialToken1 = "Hello"
103+
val partialToken2 = "world"
104+
val completeResponse = ChatResponse.builder().aiMessage(AiMessage("Hello")).build()
105+
106+
doAnswer {
107+
val handler = it.arguments[1] as StreamingChatResponseHandler
108+
handler.onPartialResponse(partialToken1)
109+
handler.onPartialResponse(partialToken2)
110+
handler.onCompleteResponse(completeResponse)
111+
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
112+
113+
val assistant =
114+
AiServices
115+
.builder(Assistant::class.java)
116+
.streamingChatLanguageModel(model)
117+
.build()
118+
119+
val result =
120+
assistant
121+
.askQuestion2(userName = "My friend", question = "How are you?")
122+
.toList()
123+
124+
assertThat(
125+
result,
126+
).startsWith(PartialResponse(partialToken1), PartialResponse(partialToken2))
127+
assertThat(result).index(2).isInstanceOf(CompleteResponse::class)
128+
}
117129

118130
@Test
119-
fun `Should use TokenStreamToReplyFlowAdapter error`() = runTest {
120-
val partialToken1 = "Hello"
121-
val partialToken2 = "world"
122-
val error = RuntimeException("Test error")
123-
124-
doAnswer {
125-
val handler = it.arguments[1] as StreamingChatResponseHandler
126-
handler.onPartialResponse(partialToken1)
127-
handler.onPartialResponse(partialToken2)
128-
handler.onError(error)
129-
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
130-
131-
val assistant =
132-
AiServices
133-
.builder(Assistant::class.java)
134-
.streamingChatLanguageModel(model)
135-
.build()
136-
137-
val response = assistant.askQuestion2(userName = "My friend", question = "How are you?")
138-
.catch { emit(StreamingChatLanguageModelReply.Error(it)) }
139-
.toList()
140-
141-
assertThat(response).hasSize(3)
142-
assertThat(response).startsWith(PartialResponse(partialToken1), PartialResponse(partialToken2))
143-
assertThat(response).index(2).isInstanceOf(StreamingChatLanguageModelReply.Error::class)
144-
}
131+
fun `Should use TokenStreamToReplyFlowAdapter error`() =
132+
runTest {
133+
val partialToken1 = "Hello"
134+
val partialToken2 = "world"
135+
val error = RuntimeException("Test error")
136+
137+
doAnswer {
138+
val handler = it.arguments[1] as StreamingChatResponseHandler
139+
handler.onPartialResponse(partialToken1)
140+
handler.onPartialResponse(partialToken2)
141+
handler.onError(error)
142+
}.whenever(model).chat(any<ChatRequest>(), any<StreamingChatResponseHandler>())
143+
144+
val assistant =
145+
AiServices
146+
.builder(Assistant::class.java)
147+
.streamingChatLanguageModel(model)
148+
.build()
149+
150+
val response =
151+
assistant
152+
.askQuestion2(userName = "My friend", question = "How are you?")
153+
.catch { emit(StreamingChatLanguageModelReply.Error(it)) }
154+
.toList()
155+
156+
assertThat(response).hasSize(3)
157+
assertThat(
158+
response,
159+
).startsWith(PartialResponse(partialToken1), PartialResponse(partialToken2))
160+
assertThat(response).index(2).isInstanceOf(StreamingChatLanguageModelReply.Error::class)
161+
}
145162

146163
@Suppress("unused")
147164
private interface Assistant {
148165
@dev.langchain4j.service.UserMessage(
149-
"Hello, I am {{ userName }}. {{ message }}."
166+
"Hello, I am {{ userName }}. {{ message }}.",
150167
)
151168
fun askQuestion(
152169
@UserName userName: String,
153170
@V("message") question: String,
154171
): Flow<String>
155172

156173
@dev.langchain4j.service.UserMessage(
157-
"Hello, I am {{ userName }}. {{ message }}."
174+
"Hello, I am {{ userName }}. {{ message }}.",
158175
)
159176
fun askQuestion2(
160177
@UserName userName: String,
161178
@V("message") question: String,
162179
): Flow<StreamingChatLanguageModelReply>
163180
}
164181
}
165-

reports/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
<properties>
1616
<maven.deploy.skip>true</maven.deploy.skip>
17+
<skipPublishing>true</skipPublishing>
1718
</properties>
1819

1920
<dependencies>

0 commit comments

Comments
 (0)