@@ -80,6 +80,26 @@ export const hasVisionInput = (payload: ResponsesPayload): boolean => {
8080const DATA_URL_PREFIX = "data:"
8181const BASE64_MARKER = ";base64,"
8282const IMAGE_MEDIA_TYPE_PATTERN = / ^ i m a g e \/ [ a - z A - Z 0 - 9 . + - ] + $ /
83+ // Static 96x32 PNG reading "Image too large / Redacted".
84+ const REDACTED_IMAGE_PLACEHOLDER_DATA_URL =
85+ "data:image/png;base64,"
86+ + [
87+ "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAMAAADaHo1mAAADAFBMVEX///8fKTfR1dsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
88+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
89+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
90+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
91+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
92+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
93+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
94+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
95+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
96+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
97+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ,
98+ "AAAAAAAAAAAAAAAAAAAAAACae8QWAAAAvElEQVR42u1WixKAIAhj/f9Hdz2BXJiVed3pVSYtpgwsGSo3GaRq6wSd4F8EyIJx" ,
99+ "ydSUAMB8il51sHT2fiVQu8czguQwXWAyFvswIJhmoS9gmzYlcFiHj1aAgzcJVgCyguYhAhNZmMhYQZs1EJnnIAqKiuHjSrZT" ,
100+ "ucSQ4s8JkKDDIYr3IuR8vEWgqroKP9b1bYKk2wfgeVmqATQLXdXamsXdEKkz3QXEEeTTuWWImMhW6qci94/+hwSVf99HqVoD" ,
101+ "OAuj2SEAAAAASUVORK5CYII=" ,
102+ ] . join ( "" )
83103
84104export const sanitizeOversizedInputImages = (
85105 payload : ResponsesPayload ,
@@ -97,7 +117,7 @@ export const sanitizeOversizedInputImages = (
97117 let count = 0
98118 for ( const image of collectInputImageDataUrls ( payload . input ) ) {
99119 if ( limit !== undefined && image . decodedBytes > limit ) {
100- replaceInputImageWithText ( image , `max ${ limit } bytes` )
120+ replaceInputImageWithPlaceholder ( image )
101121 count += 1
102122 }
103123 }
@@ -112,7 +132,7 @@ export const sanitizeAllInputImages = (payload: ResponsesPayload): number => {
112132
113133 let count = 0
114134 for ( const image of collectInputImageDataUrls ( payload . input ) ) {
115- replaceInputImageWithText ( image , "upstream rejected payload as too large" )
135+ replaceInputImageWithPlaceholder ( image )
116136 count += 1
117137 }
118138 return count
@@ -204,15 +224,12 @@ const getBase64DecodedByteLength = (
204224 return Math . max ( 0 , Math . floor ( ( base64Length * 3 ) / 4 ) - padding )
205225}
206226
207- const replaceInputImageWithText = (
208- image : InputImageDataUrl ,
209- reason : string ,
210- ) : void => {
211- image . record . type = "input_text"
212- image . record . text = `[omitted input image: ${ image . mediaType } , ${ image . decodedBytes } bytes, ${ reason } ]`
213- delete image . record . image_url
227+ const replaceInputImageWithPlaceholder = ( image : InputImageDataUrl ) : void => {
228+ image . record . type = "input_image"
229+ image . record . image_url = REDACTED_IMAGE_PLACEHOLDER_DATA_URL
230+ image . record . detail = "low"
231+ delete image . record . text
214232 delete image . record . file_id
215- delete image . record . detail
216233}
217234
218235export const resolveResponsesCompactThreshold = (
0 commit comments