@@ -120,6 +120,83 @@ void shouldNotHaveKeyValuesWhenEmptyValues() {
120120 HighCardinalityKeyNames .REQUEST_IMAGE_STYLE .asString ());
121121 }
122122
123+ @ Test
124+ void shouldHandleNullModel () {
125+ ImageModelObservationContext observationContext = ImageModelObservationContext .builder ()
126+ .imagePrompt (new ImagePrompt ("test prompt" ))
127+ .provider ("test-provider" )
128+ .build ();
129+
130+ assertThat (this .observationConvention .getContextualName (observationContext )).isEqualTo ("image" );
131+ assertThat (this .observationConvention .getLowCardinalityKeyValues (observationContext ))
132+ .contains (KeyValue .of (AiObservationAttributes .REQUEST_MODEL .value (), KeyValue .NONE_VALUE ));
133+ }
134+
135+ @ Test
136+ void shouldHandleEmptyModel () {
137+ ImageModelObservationContext observationContext = ImageModelObservationContext .builder ()
138+ .imagePrompt (generateImagePrompt (ImageOptionsBuilder .builder ().model ("" ).build ()))
139+ .provider ("test-provider" )
140+ .build ();
141+
142+ assertThat (this .observationConvention .getContextualName (observationContext )).isEqualTo ("image" );
143+ }
144+
145+ @ Test
146+ void shouldHandleBlankModel () {
147+ ImageModelObservationContext observationContext = ImageModelObservationContext .builder ()
148+ .imagePrompt (generateImagePrompt (ImageOptionsBuilder .builder ().model (" " ).build ()))
149+ .provider ("test-provider" )
150+ .build ();
151+
152+ assertThat (this .observationConvention .getContextualName (observationContext )).isEqualTo ("image" );
153+ }
154+
155+ @ Test
156+ void shouldHandleEmptyStyle () {
157+ var imageOptions = ImageOptionsBuilder .builder ().model ("test-model" ).style ("" ).build ();
158+
159+ ImageModelObservationContext observationContext = ImageModelObservationContext .builder ()
160+ .imagePrompt (generateImagePrompt (imageOptions ))
161+ .provider ("test-provider" )
162+ .build ();
163+
164+ // Empty style should not be included
165+ assertThat (this .observationConvention .getHighCardinalityKeyValues (observationContext )
166+ .stream ()
167+ .map (KeyValue ::getKey )
168+ .toList ()).doesNotContain (HighCardinalityKeyNames .REQUEST_IMAGE_STYLE .asString ());
169+ }
170+
171+ @ Test
172+ void shouldHandleEmptyResponseFormat () {
173+ var imageOptions = ImageOptionsBuilder .builder ().model ("test-model" ).responseFormat ("" ).build ();
174+
175+ ImageModelObservationContext observationContext = ImageModelObservationContext .builder ()
176+ .imagePrompt (generateImagePrompt (imageOptions ))
177+ .provider ("test-provider" )
178+ .build ();
179+
180+ // Empty response format should not be included
181+ assertThat (this .observationConvention .getHighCardinalityKeyValues (observationContext )
182+ .stream ()
183+ .map (KeyValue ::getKey )
184+ .toList ()).doesNotContain (HighCardinalityKeyNames .REQUEST_IMAGE_RESPONSE_FORMAT .asString ());
185+ }
186+
187+ @ Test
188+ void shouldHandleImagePromptWithoutOptions () {
189+ ImageModelObservationContext observationContext = ImageModelObservationContext .builder ()
190+ .imagePrompt (new ImagePrompt ("simple prompt" ))
191+ .provider ("simple-provider" )
192+ .build ();
193+
194+ assertThat (this .observationConvention .getContextualName (observationContext )).isEqualTo ("image" );
195+ assertThat (this .observationConvention .getLowCardinalityKeyValues (observationContext ))
196+ .contains (KeyValue .of (AiObservationAttributes .REQUEST_MODEL .value (), KeyValue .NONE_VALUE ));
197+ assertThat (this .observationConvention .getHighCardinalityKeyValues (observationContext )).isEmpty ();
198+ }
199+
123200 private ImagePrompt generateImagePrompt (ImageOptions imageOptions ) {
124201 return new ImagePrompt ("here comes the sun" , imageOptions );
125202 }
0 commit comments