@@ -5,6 +5,7 @@ use crate::provider::Provider;
55use crate :: telemetry:: run_with_request_telemetry;
66use codex_client:: HttpTransport ;
77use codex_client:: RequestTelemetry ;
8+ use codex_protocol:: openai_models:: ModelInfo ;
89use codex_protocol:: openai_models:: ModelsResponse ;
910use http:: HeaderMap ;
1011use http:: Method ;
@@ -41,7 +42,7 @@ impl<T: HttpTransport, A: AuthProvider> ModelsClient<T, A> {
4142 & self ,
4243 client_version : & str ,
4344 extra_headers : HeaderMap ,
44- ) -> Result < ModelsResponse , ApiError > {
45+ ) -> Result < ( Vec < ModelInfo > , Option < String > ) , ApiError > {
4546 let builder = || {
4647 let mut req = self . provider . build_request ( Method :: GET , self . path ( ) ) ;
4748 req. headers . extend ( extra_headers. clone ( ) ) ;
@@ -66,17 +67,15 @@ impl<T: HttpTransport, A: AuthProvider> ModelsClient<T, A> {
6667 . and_then ( |value| value. to_str ( ) . ok ( ) )
6768 . map ( ToString :: to_string) ;
6869
69- let ModelsResponse { models, etag } = serde_json:: from_slice :: < ModelsResponse > ( & resp. body )
70+ let ModelsResponse { models } = serde_json:: from_slice :: < ModelsResponse > ( & resp. body )
7071 . map_err ( |e| {
7172 ApiError :: Stream ( format ! (
7273 "failed to decode models response: {e}; body: {}" ,
7374 String :: from_utf8_lossy( & resp. body)
7475 ) )
7576 } ) ?;
7677
77- let etag = header_etag. unwrap_or ( etag) ;
78-
79- Ok ( ModelsResponse { models, etag } )
78+ Ok ( ( models, header_etag) )
8079 }
8180}
8281
@@ -102,16 +101,15 @@ mod tests {
102101 struct CapturingTransport {
103102 last_request : Arc < Mutex < Option < Request > > > ,
104103 body : Arc < ModelsResponse > ,
104+ etag : Option < String > ,
105105 }
106106
107107 impl Default for CapturingTransport {
108108 fn default ( ) -> Self {
109109 Self {
110110 last_request : Arc :: new ( Mutex :: new ( None ) ) ,
111- body : Arc :: new ( ModelsResponse {
112- models : Vec :: new ( ) ,
113- etag : String :: new ( ) ,
114- } ) ,
111+ body : Arc :: new ( ModelsResponse { models : Vec :: new ( ) } ) ,
112+ etag : None ,
115113 }
116114 }
117115 }
@@ -122,8 +120,8 @@ mod tests {
122120 * self . last_request . lock ( ) . unwrap ( ) = Some ( req) ;
123121 let body = serde_json:: to_vec ( & * self . body ) . unwrap ( ) ;
124122 let mut headers = HeaderMap :: new ( ) ;
125- if ! self . body . etag . is_empty ( ) {
126- headers. insert ( ETAG , self . body . etag . parse ( ) . unwrap ( ) ) ;
123+ if let Some ( etag ) = & self . etag {
124+ headers. insert ( ETAG , etag. parse ( ) . unwrap ( ) ) ;
127125 }
128126 Ok ( Response {
129127 status : StatusCode :: OK ,
@@ -166,14 +164,12 @@ mod tests {
166164
167165 #[ tokio:: test]
168166 async fn appends_client_version_query ( ) {
169- let response = ModelsResponse {
170- models : Vec :: new ( ) ,
171- etag : String :: new ( ) ,
172- } ;
167+ let response = ModelsResponse { models : Vec :: new ( ) } ;
173168
174169 let transport = CapturingTransport {
175170 last_request : Arc :: new ( Mutex :: new ( None ) ) ,
176171 body : Arc :: new ( response) ,
172+ etag : None ,
177173 } ;
178174
179175 let client = ModelsClient :: new (
@@ -182,12 +178,12 @@ mod tests {
182178 DummyAuth ,
183179 ) ;
184180
185- let result = client
181+ let ( models , _ ) = client
186182 . list_models ( "0.99.0" , HeaderMap :: new ( ) )
187183 . await
188184 . expect ( "request should succeed" ) ;
189185
190- assert_eq ! ( result . models. len( ) , 0 ) ;
186+ assert_eq ! ( models. len( ) , 0 ) ;
191187
192188 let url = transport
193189 . last_request
@@ -231,12 +227,12 @@ mod tests {
231227 } ) )
232228 . unwrap( ) ,
233229 ] ,
234- etag : String :: new ( ) ,
235230 } ;
236231
237232 let transport = CapturingTransport {
238233 last_request : Arc :: new ( Mutex :: new ( None ) ) ,
239234 body : Arc :: new ( response) ,
235+ etag : None ,
240236 } ;
241237
242238 let client = ModelsClient :: new (
@@ -245,27 +241,25 @@ mod tests {
245241 DummyAuth ,
246242 ) ;
247243
248- let result = client
244+ let ( models , _ ) = client
249245 . list_models ( "0.99.0" , HeaderMap :: new ( ) )
250246 . await
251247 . expect ( "request should succeed" ) ;
252248
253- assert_eq ! ( result . models. len( ) , 1 ) ;
254- assert_eq ! ( result . models[ 0 ] . slug, "gpt-test" ) ;
255- assert_eq ! ( result . models[ 0 ] . supported_in_api, true ) ;
256- assert_eq ! ( result . models[ 0 ] . priority, 1 ) ;
249+ assert_eq ! ( models. len( ) , 1 ) ;
250+ assert_eq ! ( models[ 0 ] . slug, "gpt-test" ) ;
251+ assert_eq ! ( models[ 0 ] . supported_in_api, true ) ;
252+ assert_eq ! ( models[ 0 ] . priority, 1 ) ;
257253 }
258254
259255 #[ tokio:: test]
260256 async fn list_models_includes_etag ( ) {
261- let response = ModelsResponse {
262- models : Vec :: new ( ) ,
263- etag : "\" abc\" " . to_string ( ) ,
264- } ;
257+ let response = ModelsResponse { models : Vec :: new ( ) } ;
265258
266259 let transport = CapturingTransport {
267260 last_request : Arc :: new ( Mutex :: new ( None ) ) ,
268261 body : Arc :: new ( response) ,
262+ etag : Some ( "\" abc\" " . to_string ( ) ) ,
269263 } ;
270264
271265 let client = ModelsClient :: new (
@@ -274,12 +268,12 @@ mod tests {
274268 DummyAuth ,
275269 ) ;
276270
277- let result = client
271+ let ( models , etag ) = client
278272 . list_models ( "0.1.0" , HeaderMap :: new ( ) )
279273 . await
280274 . expect ( "request should succeed" ) ;
281275
282- assert_eq ! ( result . models. len( ) , 0 ) ;
283- assert_eq ! ( result . etag, "\" abc\" " ) ;
276+ assert_eq ! ( models. len( ) , 0 ) ;
277+ assert_eq ! ( etag, Some ( "\" abc\" " . to_string ( ) ) ) ;
284278 }
285279}
0 commit comments