@@ -126,6 +126,32 @@ describe("memory embedding policy", () => {
126126 expect ( isRetryableMemoryEmbeddingTransportError ( "embedding validation failed" ) ) . toBe ( false ) ;
127127 } ) ;
128128
129+ it ( "splits OpenAI 431 oversized embedding batches without retrying the same request" , async ( ) => {
130+ const run = vi . fn ( async ( items : string [ ] ) => {
131+ if ( items . length > 1 ) {
132+ throw new Error (
133+ "openai embeddings failed: 431 request_headers_too_large: Request Header Fields Too Large" ,
134+ ) ;
135+ }
136+ return items . map ( ( item ) => [ item . charCodeAt ( 0 ) ] ) ;
137+ } ) ;
138+
139+ const result = await runMemoryEmbeddingBatchRetryWithSplit ( {
140+ items : [ "a" , "b" , "c" , "d" ] ,
141+ run,
142+ isRetryable : isRetryableMemoryEmbeddingError ,
143+ isSplittable : isSplittableMemoryEmbeddingTransportError ,
144+ waitForRetry : async ( ) => { } ,
145+ maxAttempts : 3 ,
146+ baseDelayMs : 500 ,
147+ } ) ;
148+
149+ expect ( result ) . toEqual ( [ [ 97 ] , [ 98 ] , [ 99 ] , [ 100 ] ] ) ;
150+ expect ( run . mock . calls . map ( ( [ items ] ) => items . length ) ) . toEqual ( [ 4 , 2 , 1 , 1 , 2 , 1 , 1 ] ) ;
151+ expect ( isRetryableMemoryEmbeddingError ( "431 request_headers_too_large" ) ) . toBe ( false ) ;
152+ expect ( isSplittableMemoryEmbeddingTransportError ( "431 request_headers_too_large" ) ) . toBe ( true ) ;
153+ } ) ;
154+
129155 it ( "retries too-many-tokens-per-day errors" , async ( ) => {
130156 let calls = 0 ;
131157 const waits : number [ ] = [ ] ;
0 commit comments