5656import org .springframework .context .annotation .Bean ;
5757import org .springframework .core .convert .support .DefaultConversionService ;
5858import org .springframework .core .io .Resource ;
59+ import org .springframework .http .ResponseEntity ;
60+ import org .springframework .util .StringUtils ;
5961
6062import static org .assertj .core .api .Assertions .assertThat ;
6163
@@ -82,6 +84,9 @@ class DeepSeekWithOpenAiChatModelIT {
8284 @ Value ("classpath:/prompts/system-message.st" )
8385 private Resource systemResource ;
8486
87+ @ Autowired
88+ private OpenAiApi openAiApi ;
89+
8590 @ Autowired
8691 private OpenAiChatModel chatModel ;
8792
@@ -128,9 +133,9 @@ void streamingWithTokenUsage() {
128133 var streamingTokenUsage = this .chatModel .stream (prompt ).blockLast ().getMetadata ().getUsage ();
129134 var referenceTokenUsage = this .chatModel .call (prompt ).getMetadata ().getUsage ();
130135
131- assertThat (streamingTokenUsage .getPromptTokens ()).isGreaterThan ( 0 );
132- assertThat (streamingTokenUsage .getCompletionTokens ()).isGreaterThan ( 0 );
133- assertThat (streamingTokenUsage .getTotalTokens ()).isGreaterThan ( 0 );
136+ assertThat (streamingTokenUsage .getPromptTokens ()).isPositive ( );
137+ assertThat (streamingTokenUsage .getCompletionTokens ()).isPositive ( );
138+ assertThat (streamingTokenUsage .getTotalTokens ()).isPositive ( );
134139
135140 assertThat (streamingTokenUsage .getPromptTokens ()).isEqualTo (referenceTokenUsage .getPromptTokens ());
136141 assertThat (streamingTokenUsage .getCompletionTokens ()).isEqualTo (referenceTokenUsage .getCompletionTokens ());
@@ -325,6 +330,56 @@ record ActorsFilmsRecord(String actor, List<String> movies) {
325330
326331 }
327332
333+ @ Test
334+ void chatCompletionEntityWithReasoning () {
335+ OpenAiApi .ChatCompletionMessage chatCompletionMessage = new OpenAiApi .ChatCompletionMessage (
336+ "Explain the theory of relativity" , OpenAiApi .ChatCompletionMessage .Role .USER );
337+ OpenAiApi .ChatCompletionRequest request = new OpenAiApi .ChatCompletionRequest (List .of (chatCompletionMessage ),
338+ "deepseek-reasoner" , 0.8 , false );
339+ ResponseEntity <OpenAiApi .ChatCompletion > response = this .openAiApi .chatCompletionEntity (request );
340+
341+ assertThat (response ).isNotNull ();
342+ assertThat (response .getBody ().choices ().get (0 ).message ().reasoningContent ()).isNotBlank ();
343+ }
344+
345+ @ Test
346+ void chatCompletionStreamWithReasoning () {
347+ OpenAiApi .ChatCompletionMessage chatCompletionMessage = new OpenAiApi .ChatCompletionMessage (
348+ "Explain the theory of relativity" , OpenAiApi .ChatCompletionMessage .Role .USER );
349+ OpenAiApi .ChatCompletionRequest request = new OpenAiApi .ChatCompletionRequest (List .of (chatCompletionMessage ),
350+ "deepseek-reasoner" , 0.8 , true );
351+ Flux <OpenAiApi .ChatCompletionChunk > response = this .openAiApi .chatCompletionStream (request );
352+
353+ assertThat (response ).isNotNull ();
354+ List <OpenAiApi .ChatCompletionChunk > chunks = response .collectList ().block ();
355+ assertThat (chunks ).isNotNull ();
356+ assertThat (chunks .stream ().anyMatch (chunk -> !chunk .choices ().get (0 ).delta ().reasoningContent ().isBlank ()))
357+ .isTrue ();
358+ }
359+
360+ @ Test
361+ void chatModelCallWithReasoning () {
362+ OpenAiChatModel deepReasoner = new OpenAiChatModel (this .openAiApi ,
363+ OpenAiChatOptions .builder ().model ("deepseek-reasoner" ).build ());
364+ ChatResponse chatResponse = deepReasoner .call (new Prompt ("Explain the theory of relativity" ));
365+ assertThat (chatResponse .getResults ()).isNotEmpty ();
366+ assertThat (chatResponse .getResults ().get (0 ).getOutput ().getMetadata ().get ("reasoningContent" ).toString ())
367+ .isNotBlank ();
368+ }
369+
370+ @ Test
371+ void chatModelStreamWithReasoning () {
372+ OpenAiChatModel deepReasoner = new OpenAiChatModel (this .openAiApi ,
373+ OpenAiChatOptions .builder ().model ("deepseek-reasoner" ).build ());
374+ Flux <ChatResponse > flux = deepReasoner .stream (new Prompt ("Explain the theory of relativity" ));
375+ List <ChatResponse > responses = flux .collectList ().block ();
376+ assertThat (responses ).isNotEmpty ();
377+ assertThat (responses .stream ()
378+ .flatMap (response -> response .getResults ().stream ())
379+ .map (result -> result .getOutput ().getMetadata ().get ("reasoningContent" ).toString ())
380+ .anyMatch (StringUtils ::hasText )).isTrue ();
381+ }
382+
328383 @ SpringBootConfiguration
329384 static class Config {
330385
0 commit comments