From 97769b49506bdc80b95bbe25ec489fe9633171bc Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Sun, 24 May 2026 12:02:51 -0700 Subject: [PATCH] test(voyage-multimodal): switch fixture from AVIF to PNG Voyage's /multimodalembeddings endpoint rejects AVIF as of 2026-05 with 'Please provide a valid base64-encoded image'. The prior comment ('AVIF is fine for an embed call') held at v0.27.x and regressed silently on the provider side. Add test/fixtures/images/tiny.png (16x16 RGB PNG, 1307 bytes generated via sips from the macOS default wallpaper). PNG is universally accepted by Voyage and other multimodal providers. Surfaced during fix-wave: warm-narwhal E2E gate. Co-Authored-By: Claude Opus 4.7 (1M context) --- test/e2e/voyage-multimodal.test.ts | 9 +++++---- test/fixtures/images/tiny.png | Bin 0 -> 1307 bytes 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/images/tiny.png diff --git a/test/e2e/voyage-multimodal.test.ts b/test/e2e/voyage-multimodal.test.ts index 1267ba81f..ae0210958 100644 --- a/test/e2e/voyage-multimodal.test.ts +++ b/test/e2e/voyage-multimodal.test.ts @@ -26,11 +26,12 @@ describe.if(HAS_KEY)('voyage-multimodal-3 (real API, gated VOYAGE_API_KEY)', () }); test('embeds the tiny PNG fixture into a 1024-dim vector', async () => { - // Reuse the Phase 1 fixture (the AVIF is fine for an embed call; Voyage - // accepts data URLs of common image types). - const buf = readFileSync('test/fixtures/images/tiny.avif'); + // Use PNG fixture. Voyage's multimodal endpoint rejects AVIF as of + // 2026-05; the prior comment ("AVIF is fine") was true at v0.27.x and + // regressed silently on the provider side. PNG is universally accepted. + const buf = readFileSync('test/fixtures/images/tiny.png'); const data = buf.toString('base64'); - const out = await embedMultimodal([{ kind: 'image_base64', data, mime: 'image/avif' }]); + const out = await embedMultimodal([{ kind: 'image_base64', data, mime: 'image/png' }]); expect(out.length).toBe(1); expect(out[0]).toBeInstanceOf(Float32Array); expect(out[0].length).toBe(1024); diff --git a/test/fixtures/images/tiny.png b/test/fixtures/images/tiny.png new file mode 100644 index 0000000000000000000000000000000000000000..00cb2d31108fa3a399db3c2e3077bbb0ccd4b279 GIT binary patch literal 1307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|N>U>{(|mmy zw18|523AHk24;{F2B3OIAt;*>$aZ320gD4A7@ZO9_DmR?!3!wQz`(qK5us}V6I@nc z0W*RPQkdS5ypMr_i8(VQq9nrC$0|8LS1&OoKPgqOBDVmffWfB13dqb&ElE_U$j!+s zwyLmI0;{kBvO&W7N(x{lCE2!05xxNm&iO^D3TAo+dIm~%TnY*bHbp6ERzWUqQ0+jT ztx`rwNr9EVetCJhUb(Seeo?xG?WUP)qwZeFo6#1NP{E~&-I zMVSR9nfZANAafIw@=Hr>m6Sjh!2!gbC7EdmoAQdG-U511A0(r1sAr%LHyfzc1|(_~ zl9`hlo|#gTVP|S+WCK=-B!;jBqT0VGGZpAgkZbG=p{kL^(A5WIlMX*)y*s zwWy#77=B>gFuQQ8KsO8IQlHekbPT6L1)=I~^g+Rd6l{<<0gD17#g5BHA0EMWTz#SE zOM%J3&C|s(L_<_H=ysm4p}^MTkN2i*KB@LF=qpo@H{(ivg?|&`otoGetg2XUbHLeA zVQFZTMy997ESH;KZyerH;l4RJ``paOlCQ<}`?mz0(eZ2gP+uAO#M39{%e_DoC70y9 z&#Vhfj59=!C`p(!KRO`9c9!i%bHx@jrYGH@E%Q_Zg_@?Rt}N1Hkyt6xbcwC^&y+WL zp&R*}TWu0`>WQXX z!xgcuJW5?2Cm0S!WH)~gR4X>N;@ivY=Y40TPsrh0t{p{A{%<;JA2+Fsx$G&5`1kFJ z-lk8Q=l0Dv*{-`;Y?ac(1@E_>sj&-v;@9qc`{pWJ^|r*DCF1kVH?zvk<8@74c-=0H zZ^gsJ8Gm-#++TU>|U$pi(E0gUj4iOTJN#9e@`_qy_^yDmt|f4tZzIkUdY_h zuc|ciS{ZwH=GA}8{f$pJHCo87e_SwQJJ*|j{|l{^ag}G*1;(l+UX@-Ex4OOVvZL1L z327|r4Ytl$xNQIP$K7o=Z0>8m3k%=k@lB5B(vtg4HAcU`zC3+1Wm>8Aj*YX+g>t0N z)nu+tkCWWQdQRPZ^3P+B^Om#bRs4H+b@#`sSJc9+dSbm>zn$E*F5LI+Wruyvt5?mR zvFFaYPcN@u{C&OM{B-EF<)0){dRDBMmOdfKIAiv-gQaJ~;`mzbI`$P;{eI>lsbQUK zvLQz2`fE0?y|enoj?1g3FBdk^X=Yzyl6z>;&yTq`EW*F;cAY3}ss8xWL-{MJ*;(`1 RfrS|mc)I$ztaD0e0s#7u+id^< literal 0 HcmV?d00001