@@ -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