55import lombok .Builder ;
66import lombok .extern .slf4j .Slf4j ;
77import okhttp3 .OkHttpClient ;
8+ import okhttp3 .Request ;
9+ import okhttp3 .RequestBody ;
10+ import okhttp3 .sse .EventSource ;
11+ import okhttp3 .sse .EventSourceListener ;
12+ import okhttp3 .sse .EventSources ;
813import org .apache .commons .lang3 .ObjectUtils ;
914import org .apache .commons .lang3 .StringUtils ;
1015import org .devlive .sdk .common .DefaultClient ;
1116import org .devlive .sdk .common .exception .ParamException ;
17+ import org .devlive .sdk .common .exception .RequestException ;
1218import org .devlive .sdk .common .utils .ValidateUtils ;
19+ import org .devlive .sdk .openai .mixin .IgnoreUnknownMixin ;
1320import org .devlive .sdk .openai .model .ProviderModel ;
1421import org .devlive .sdk .openai .model .UrlModel ;
22+ import org .devlive .sdk .openai .utils .MultipartBodyUtils ;
1523import org .devlive .sdk .openai .utils .ProviderUtils ;
1624import org .devlive .sdk .platform .google .entity .ChatEntity ;
1725import org .devlive .sdk .platform .google .interceptor .GoogleInterceptor ;
@@ -39,6 +47,7 @@ public class GoogleClient
3947 private String model ;
4048 private VersionModel version ;
4149 private GoogleApi api ;
50+ private EventSourceListener listener ;
4251
4352 private GoogleClient (GoogleClientBuilder builder )
4453 {
@@ -68,12 +77,20 @@ private GoogleClient(GoogleClientBuilder builder)
6877 }
6978 this .model = builder .model ;
7079
80+ if (ObjectUtils .isEmpty (builder .listener )) {
81+ builder .listener (null );
82+ }
83+ super .listener = builder .listener ;
84+ this .listener = builder .listener ;
85+
7186 if (ObjectUtils .isEmpty (builder .client )) {
7287 builder .client (null );
7388 }
7489
7590 super .client = builder .client ;
91+ this .client = builder .client ;
7692 super .apiHost = builder .apiHost ;
93+ this .apiHost = builder .apiHost ;
7794 super .provider = ProviderModel .GOOGLE_GEMINI ;
7895
7996 objectMapper .setSerializationInclusion (JsonInclude .Include .NON_NULL );
@@ -89,10 +106,38 @@ private GoogleClient(GoogleClientBuilder builder)
89106 public ChatResponse createChatCompletions (ChatEntity configure )
90107 {
91108 String url = ProviderUtils .getUrl (provider , UrlModel .FETCH_CHAT_COMPLETIONS );
109+ if (ObjectUtils .isNotEmpty (this .listener )) {
110+ this .createEventSource (url , configure );
111+ return null ;
112+ }
113+
92114 return this .api .fetchChatCompletions (url , configure )
93115 .blockingGet ();
94116 }
95117
118+ private ObjectMapper createObjectMapper ()
119+ {
120+ ObjectMapper objectMapper = new ObjectMapper ();
121+ objectMapper .addMixIn (Object .class , IgnoreUnknownMixin .class );
122+ return objectMapper ;
123+ }
124+
125+ private void createEventSource (String url , Object configure )
126+ {
127+ try {
128+ EventSource .Factory factory = EventSources .createFactory (this .client );
129+ ObjectMapper mapper = this .createObjectMapper ();
130+ Request request = new Request .Builder ()
131+ .url (String .join ("/" , this .apiHost , url ))
132+ .post (RequestBody .create (MultipartBodyUtils .JSON , mapper .writeValueAsString (configure )))
133+ .build ();
134+ factory .newEventSource (request , this .listener );
135+ }
136+ catch (Exception e ) {
137+ throw new RequestException (String .format ("Failed to create event source: %s" , e .getMessage ()));
138+ }
139+ }
140+
96141 public static class GoogleClientBuilder
97142 {
98143 public GoogleClientBuilder apiKey (String apiKey )
@@ -140,6 +185,9 @@ public GoogleClientBuilder client(OkHttpClient client)
140185 interceptor .setApiKey (apiKey );
141186 interceptor .setVersion (version );
142187 interceptor .setModel (model );
188+ if (listener != null ) {
189+ interceptor .setStream (true );
190+ }
143191 client = client .newBuilder ()
144192 .addInterceptor (interceptor )
145193 .build ();
0 commit comments