3939import java .util .UUID ;
4040import java .util .stream .Stream ;
4141
42+ import static com .comet .opik .domain .llmproviders .Anthropic .ERROR_EMPTY_MESSAGES ;
43+ import static com .comet .opik .domain .llmproviders .Anthropic .ERROR_NO_COMPLETION_TOKENS ;
4244import static com .comet .opik .domain .llmproviders .LlmProviderFactory .ERROR_MODEL_NOT_SUPPORTED ;
4345import static org .assertj .core .api .Assertions .assertThat ;
4446import static org .assertj .core .api .Assumptions .assumeThat ;
47+ import static org .junit .jupiter .api .Named .named ;
48+ import static org .junit .jupiter .params .provider .Arguments .arguments ;
4549
4650@ TestInstance (TestInstance .Lifecycle .PER_CLASS )
4751public class ChatCompletionsResourceTest {
@@ -208,14 +212,12 @@ void createAndStreamResponse(String expectedModel, LlmProvider llmProvider, Stri
208212
209213 private static Stream <Arguments > testModelsProvider () {
210214 return Stream .of (
211- Arguments . of (ChatCompletionModel .GPT_4O_MINI .toString (), LlmProvider .OPEN_AI ,
215+ arguments (ChatCompletionModel .GPT_4O_MINI .toString (), LlmProvider .OPEN_AI ,
212216 UUID .randomUUID ().toString ()),
213- Arguments . of (AnthropicChatModelName .CLAUDE_3_5_SONNET_20240620 .toString (), LlmProvider .ANTHROPIC ,
217+ arguments (AnthropicChatModelName .CLAUDE_3_5_SONNET_20240620 .toString (), LlmProvider .ANTHROPIC ,
214218 System .getenv ("ANTHROPIC_API_KEY" )));
215219 }
216220
217- // TODO: add coverage for anthropic missing model, messages or maxCompletionTokens for both streaming and non-streaming
218-
219221 @ ParameterizedTest
220222 @ ValueSource (strings = {"" , "non-existing-model" })
221223 void createAndStreamResponseReturnsBadRequestWhenNoModel (String model ) {
@@ -240,6 +242,40 @@ void createAndStreamResponseReturnsBadRequestWhenNoModel(String model) {
240242
241243 }
242244
245+ @ ParameterizedTest
246+ @ MethodSource
247+ void createAnthropicValidateMandatoryFields (ChatCompletionRequest request , String expectedErrorMessage ) {
248+ String llmProviderApiKey = UUID .randomUUID ().toString ();
249+
250+ var workspaceName = RandomStringUtils .randomAlphanumeric (20 );
251+ var workspaceId = UUID .randomUUID ().toString ();
252+ mockTargetWorkspace (workspaceName , workspaceId );
253+ createLlmProviderApiKey (workspaceName , LlmProvider .ANTHROPIC , llmProviderApiKey );
254+
255+ var errorMessage = chatCompletionsClient .create (API_KEY , workspaceName , request , HttpStatus .SC_BAD_REQUEST );
256+
257+ assertThat (errorMessage .getCode ()).isEqualTo (HttpStatus .SC_BAD_REQUEST );
258+ assertThat (errorMessage .getMessage ())
259+ .containsIgnoringCase (expectedErrorMessage );
260+ }
261+
262+ private Stream <Arguments > createAnthropicValidateMandatoryFields () {
263+ ChatCompletionRequest .Builder baseRequest = podamFactory .manufacturePojo (ChatCompletionRequest .Builder .class )
264+ .stream (false )
265+ .model (AnthropicChatModelName .CLAUDE_3_5_SONNET_20240620 .toString ());
266+ return Stream .of (
267+ arguments (named ("no messages" , podamFactory .manufacturePojo (ChatCompletionRequest .Builder .class )
268+ .stream (false )
269+ .model (AnthropicChatModelName .CLAUDE_3_5_SONNET_20240620 .toString ())
270+ .maxCompletionTokens (100 ).build ()),
271+ ERROR_EMPTY_MESSAGES ),
272+ arguments (named ("no max tokens" , podamFactory .manufacturePojo (ChatCompletionRequest .Builder .class )
273+ .stream (false )
274+ .model (AnthropicChatModelName .CLAUDE_3_5_SONNET_20240620 .toString ())
275+ .addUserMessage ("Say 'Hello World'" ).build ()),
276+ ERROR_NO_COMPLETION_TOKENS ));
277+ }
278+
243279 private void createLlmProviderApiKey (String workspaceName ) {
244280 createLlmProviderApiKey (workspaceName , LlmProvider .OPEN_AI , UUID .randomUUID ().toString ());
245281 }
0 commit comments