Skip to content

Commit af2c995

Browse files
committed
[Stream] Support chat completions
1 parent 60f9e51 commit af2c995

5 files changed

Lines changed: 49 additions & 15 deletions

File tree

src/main/java/org/devlive/sdk/openai/DefaultClient.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,16 @@ public CompleteResponse createCompletion(CompletionEntity configure)
7575

7676
public ChatResponse createChatCompletion(ChatEntity configure)
7777
{
78-
return this.api.fetchChatCompletions(ProviderUtils.getUrl(provider, UrlModel.FETCH_CHAT_COMPLETIONS), configure)
79-
.blockingGet();
78+
String url = ProviderUtils.getUrl(provider, UrlModel.FETCH_CHAT_COMPLETIONS);
79+
if (ObjectUtils.isNotEmpty(this.listener)) {
80+
configure.setStream(true);
81+
this.createEventSource(url, configure);
82+
return null;
83+
}
84+
else {
85+
return this.api.fetchChatCompletions(url, configure)
86+
.blockingGet();
87+
}
8088
}
8189

8290
public UserKeyResponse getKeys()

src/main/java/org/devlive/sdk/openai/entity/ChatEntity.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ public class ChatEntity
3838
@JsonProperty(value = "top_p")
3939
private Double topP;
4040

41+
/**
42+
* Whether to stream back partial progress. If set, tokens will be sent as data-only server-sent events as they become available, with the stream terminated by a data: [DONE] message.
43+
* 是否流回部分进度。如果设置,令牌将在可用时作为仅数据服务器发送事件发送,流由 data: [DONE] 消息终止。
44+
*/
45+
@JsonProperty(value = "stream")
46+
private boolean stream = false;
47+
4148
private ChatEntity(ChatEntityBuilder builder)
4249
{
4350
if (ObjectUtils.isEmpty(builder.model)) {
@@ -113,6 +120,11 @@ public ChatEntityBuilder maxTokens(Integer maxTokens)
113120
return this;
114121
}
115122

123+
private ChatEntityBuilder stream()
124+
{
125+
return this;
126+
}
127+
116128
public ChatEntity build()
117129
{
118130
return new ChatEntity(this);

src/main/java/org/devlive/sdk/openai/listener/ConsoleEventSourceListener.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package org.devlive.sdk.openai.listener;
22

3-
import com.fasterxml.jackson.core.JsonProcessingException;
43
import lombok.Builder;
54
import lombok.extern.slf4j.Slf4j;
65
import okhttp3.Response;
76
import okhttp3.sse.EventSource;
87
import okhttp3.sse.EventSourceListener;
98
import org.apache.commons.lang3.ObjectUtils;
10-
import org.devlive.sdk.openai.response.CompleteResponse;
11-
import org.devlive.sdk.openai.utils.JsonUtils;
129

1310
import java.time.LocalDateTime;
1411
import java.util.concurrent.CountDownLatch;
@@ -19,13 +16,11 @@ public class ConsoleEventSourceListener
1916
extends EventSourceListener
2017
{
2118
private CountDownLatch countDownLatch;
22-
private JsonUtils<CompleteResponse> jsonUtils;
2319

2420
@Override
2521
public void onOpen(EventSource eventSource, Response response)
2622
{
2723
log.info("Console listener opened on time {}", LocalDateTime.now());
28-
this.jsonUtils = JsonUtils.getInstance();
2924
}
3025

3126
@Override
@@ -45,13 +40,7 @@ public void onEvent(EventSource eventSource, String id, String type, String data
4540
this.close();
4641
}
4742
else {
48-
try {
49-
CompleteResponse completeResponse = jsonUtils.getObject(data, CompleteResponse.class);
50-
log.info("Console event received on time {} id {} type {} data {}", LocalDateTime.now(), id, type, completeResponse.getChoices().get(0).getContent());
51-
}
52-
catch (JsonProcessingException e) {
53-
log.warn("Console event error on time {} id {} type {} data {}", LocalDateTime.now(), id, type, data, e);
54-
}
43+
log.info("Console event received on time {} id {} type {} data {}", LocalDateTime.now(), id, type, data);
5544
}
5645
}
5746

src/main/java/org/devlive/sdk/openai/listener/HttpServletEventSourceListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void onEvent(EventSource eventSource, String id, String type, String data
6767
else {
6868
try {
6969
CompleteResponse completeResponse = jsonUtils.getObject(data, CompleteResponse.class);
70-
log.debug("HttpServlet event received on time {} id {} type {} data {}", LocalDateTime.now(), id, type, completeResponse.getChoices().get(0).getContent());
70+
log.info("HttpServlet event received on time {} id {} type {} data {}", LocalDateTime.now(), id, type, completeResponse.getChoices().get(0).getContent());
7171
this.response.getWriter().write(completeResponse.getChoices().get(0).getContent());
7272
this.response.flushBuffer();
7373
}

src/test/java/org/devlive/sdk/openai/StreamClientTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package org.devlive.sdk.openai;
22

3+
import com.google.common.collect.Lists;
34
import lombok.extern.slf4j.Slf4j;
5+
import org.devlive.sdk.openai.entity.ChatEntity;
46
import org.devlive.sdk.openai.entity.CompletionEntity;
7+
import org.devlive.sdk.openai.entity.MessageEntity;
58
import org.devlive.sdk.openai.listener.ConsoleEventSourceListener;
69
import org.junit.Before;
710
import org.junit.Test;
811

12+
import java.util.List;
913
import java.util.concurrent.CountDownLatch;
1014

1115
@Slf4j
@@ -42,4 +46,25 @@ public void testCreateCompletion()
4246
log.error("Interrupted while waiting", e);
4347
}
4448
}
49+
50+
@Test
51+
public void testCreateChatCompletion()
52+
{
53+
List<MessageEntity> messages = Lists.newArrayList();
54+
messages.add(MessageEntity.builder()
55+
.content("Hello, my name is openai-java-sdk")
56+
.build());
57+
58+
ChatEntity configure = ChatEntity.builder()
59+
.messages(messages)
60+
.build();
61+
62+
client.createChatCompletion(configure);
63+
try {
64+
countDownLatch.await();
65+
}
66+
catch (InterruptedException e) {
67+
log.error("Interrupted while waiting", e);
68+
}
69+
}
4570
}

0 commit comments

Comments
 (0)