{"_id":"rosetta-ai","_rev":"18-671f17382f43fed7102cfb4fc02d7122","name":"rosetta-ai","dist-tags":{"latest":"2.3.0"},"versions":{"0.1.0":{"name":"rosetta-ai","version":"0.1.0","keywords":[],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@0.1.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"403859fd81385ed344f8d40a4d7f3b255a161bc9","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-0.1.0.tgz","fileCount":3,"integrity":"sha512-JiFs6J1LA2cJ9Z5N6NF6luViGr5P72eAvcPMPPXpOAtWneBft0HzR5lUkL5AYCPQ4HapBVb++/jZCSobWxKaTA==","signatures":[{"sig":"MEYCIQDq2Ae4dSpQ4YDGfS/HeaUsi24+EzeEfX+s9sdU+bZhegIhANep3v09G8M+oPpzikEfGN462SgyPp8iU4i5xdnlYi3C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1432},"main":"index.js","type":"module","_from":"file:rosetta-ai-0.1.0.tgz","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/1618a3c8547aed2df383c41e07df3304/rosetta-ai-0.1.0.tgz","_integrity":"sha512-JiFs6J1LA2cJ9Z5N6NF6luViGr5P72eAvcPMPPXpOAtWneBft0HzR5lUkL5AYCPQ4HapBVb++/jZCSobWxKaTA==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_0.1.0_1769187375360_0.5366902601443251","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"rosetta-ai","version":"1.0.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.0.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"ded8d057cd98245c7377b01c460446ed632d5707","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.0.0.tgz","fileCount":9,"integrity":"sha512-K9kVAZKLExU1Oo8zQJqWlb5VaCmnUFj7UpB5Piz0JZar/og36ktU8iY2bsKlvhwrrDHUYsgdNJc2b1kmAcUjhA==","signatures":[{"sig":"MEYCIQDPgRO94a+VKTEJKSsL1o7wu/kKnq9KSXRt/RNYmXL7FQIhALn4EU57HjOWpY0cJ6TCmpscr/SVV1e+SjIWIZkGEsMH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1019347},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/3830e057b4cae517ebaf21d74b16b141/rosetta-ai-1.0.0.tgz","_integrity":"sha512-K9kVAZKLExU1Oo8zQJqWlb5VaCmnUFj7UpB5Piz0JZar/og36ktU8iY2bsKlvhwrrDHUYsgdNJc2b1kmAcUjhA==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.0.0_1769618403500_0.284445098898118","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"rosetta-ai","version":"1.0.1","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.0.1","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"ffb9508bf022d49cf22cb373dede042e8df97272","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.0.1.tgz","fileCount":9,"integrity":"sha512-sVmAibIV5ckBvUq8M623Ofus7ZFucsGR+xS+s1AJPStk+733cGDcuXWBJYE6IsKU50mPAuQEA38wdvRDaMZGFA==","signatures":[{"sig":"MEQCIClQymYgqJK+K4bFgbn5KRH/X44vhMrjZ/pl2BqGw7eDAiBXTOwf0lcYNw1gi3i7Q4rvNyUWj5ENNlO8FGo3sEFTOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1020311},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/aa0216b239b4642d5d96da76e955e5f0/rosetta-ai-1.0.1.tgz","_integrity":"sha512-sVmAibIV5ckBvUq8M623Ofus7ZFucsGR+xS+s1AJPStk+733cGDcuXWBJYE6IsKU50mPAuQEA38wdvRDaMZGFA==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.0.1_1769618879174_0.5613817541521848","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"rosetta-ai","version":"1.1.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.1.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"2be079bc271af6123c6696591cda3c789cbcb6fd","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.1.0.tgz","fileCount":9,"integrity":"sha512-wFzxI9fp4dBwTKJWzF89gDdQhE6bmiyFkVfFxHyUVz9nR5909P6xaAzmaYMcCOoq11QbEwN+ItqEtXUmYGxQHw==","signatures":[{"sig":"MEUCIQCpUdThYmxpTLjswTiokwZXUZpROqhqfS15JSSWSiXoywIgOqfeOJRxl7n/3qKKiDOsSZZw1+5xcjPXW1YsEjI+DVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1027639},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/d59c60a5d5be961653e0c961d8bcbc93/rosetta-ai-1.1.0.tgz","_integrity":"sha512-wFzxI9fp4dBwTKJWzF89gDdQhE6bmiyFkVfFxHyUVz9nR5909P6xaAzmaYMcCOoq11QbEwN+ItqEtXUmYGxQHw==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.1.0_1769682631208_0.3224106258011463","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"rosetta-ai","version":"1.2.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.2.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"76f3b1c1acde6496eb1333ae60f588419eff626e","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.2.0.tgz","fileCount":9,"integrity":"sha512-+FmAF5gCfHcas1EfXElX8Hy98sgl0QeQHYLbahBSMFVJFNW7TXPZycV4tmHEjcbouZ6b0/Xu2TP55XcTRIhZtA==","signatures":[{"sig":"MEUCIQCgr4pUqMMwpoFsr2DPjGDqTqXmfZ/mlkXKHsSirNc3rwIgIjKiFY4IMRx0sSXbeY2uHyhQw4ZJy/J1MJKQoaU2iKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1148467},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/fae1d3f3b1144bc036232fc55c0a688d/rosetta-ai-1.2.0.tgz","_integrity":"sha512-+FmAF5gCfHcas1EfXElX8Hy98sgl0QeQHYLbahBSMFVJFNW7TXPZycV4tmHEjcbouZ6b0/Xu2TP55XcTRIhZtA==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.2.0_1769760491924_0.9974563753932364","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"rosetta-ai","version":"1.3.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.3.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"68fea2ead7fcf46b5aadd68a77dc626d398e4d28","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.3.0.tgz","fileCount":9,"integrity":"sha512-ZCFwNVKUrmt49W06+jwu1gl8qVyYjTMCSvmNy0onMVrU7Fmn+2g7jxBm8Jugpk3ZXG/YzO/tswlv1LVT88mUIg==","signatures":[{"sig":"MEYCIQCVkFTBOQsDAkk0RY++ErZ5pd0c6zvXGJ3JKPJikZZn7QIhAOAAOfzj1NnuE3KMEGVOseaGnF37zI+awKcPlQ8SQltz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1111442},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/3677dc4869c15e42f3c093a472888be9/rosetta-ai-1.3.0.tgz","_integrity":"sha512-ZCFwNVKUrmt49W06+jwu1gl8qVyYjTMCSvmNy0onMVrU7Fmn+2g7jxBm8Jugpk3ZXG/YzO/tswlv1LVT88mUIg==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.3.0_1770022820106_0.15467356106587316","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"rosetta-ai","version":"1.3.1","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.3.1","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"9c35e09bc1b069a22308ebbe6f0c1880a87c2021","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.3.1.tgz","fileCount":9,"integrity":"sha512-p9JeIoYc/3TyKYCZ3776GsuFz+a79AZECFEQDPtjw5xLldIRxWbn5X1JxyJT32huVCGYHBcfk04Ul494Xm+hsg==","signatures":[{"sig":"MEQCIC4dLJFabyeRMOG7cKy9ttjYAXiL2dmPwAXM3SYB1e4WAiAfCvo0Gfx+cp/6tG+buiCffyyxiJtL6yGwJ6apLimhlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1117804},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.3.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/8d11f8b8db9b2b5eb80af9019a1db3b4/rosetta-ai-1.3.1.tgz","_integrity":"sha512-p9JeIoYc/3TyKYCZ3776GsuFz+a79AZECFEQDPtjw5xLldIRxWbn5X1JxyJT32huVCGYHBcfk04Ul494Xm+hsg==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.3.1_1770035018811_0.8610797380391952","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"rosetta-ai","version":"1.3.2","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.3.2","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"1f2632ea8a012822cefd366a4cf3dbdcce1f0aeb","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.3.2.tgz","fileCount":9,"integrity":"sha512-+VSVspAUtPJJP2nsZQ4rwvOCfBbjGdRxpIcDTXPlYtpllmFCzIAMZrZkOQysgQBYu83cpBcyoRTdHVcXkGYbuw==","signatures":[{"sig":"MEYCIQCflD3MlD3j4K9y2+D65vTj5MsHlYf7Smc1UjhuOlM6TAIhAJ35iHBbZXLPjf89B2VLOP7PudSUBi10+CXrTUCuqEhQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1117390},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.3.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/021d4ddc74ea1d20dc6bc2db6badace4/rosetta-ai-1.3.2.tgz","_integrity":"sha512-+VSVspAUtPJJP2nsZQ4rwvOCfBbjGdRxpIcDTXPlYtpllmFCzIAMZrZkOQysgQBYu83cpBcyoRTdHVcXkGYbuw==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.3.2_1770202371515_0.5679371243243341","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"rosetta-ai","version":"1.4.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.4.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"722c2235995890800c2c3f9fc877e8e2dda79212","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.4.0.tgz","fileCount":9,"integrity":"sha512-ECCf993MlrKy3CXkP3KL+xPS1d2Q6OD2mS+JYQLEm2AJDwGkEAHaNaZRRHA8RYvv6ZDyww5eGOrs7IY8RcPv/w==","signatures":[{"sig":"MEQCIErknm8uBJqQ8gp/hMOohCRz0JkVJC+aeP1L9AxujyRSAiALjM0eIaWmuQQTllDYnz/CGYsQF/Rbtz2Cl8PMjQSuAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1123460},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.4.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/1a54cd61bd8315f00c65490177e06f01/rosetta-ai-1.4.0.tgz","_integrity":"sha512-ECCf993MlrKy3CXkP3KL+xPS1d2Q6OD2mS+JYQLEm2AJDwGkEAHaNaZRRHA8RYvv6ZDyww5eGOrs7IY8RcPv/w==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.4.0_1770212645689_0.11364911484605233","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"rosetta-ai","version":"1.5.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.5.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"f54fc85e93d64a9184cfba231914726c13a80b15","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.5.0.tgz","fileCount":9,"integrity":"sha512-1PcCA95u+/sAxresIC2ot441xeT8hqZ4iJzRx8CdzZZRF3qxxv/c/mtmGek4vZIVAglMabeEGumYqBbOgCtLlw==","signatures":[{"sig":"MEUCIGUxXmsPIyW+IlLvPkre7w7WimO23lV8ANghNDQYft6vAiEAn+jyFCydkqr3T3/WZXF9KzNTYRGMsgVFW1FeKb1f61A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1629185},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.5.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/d0a1690ff116700530dd3c753637a272/rosetta-ai-1.5.0.tgz","_integrity":"sha512-1PcCA95u+/sAxresIC2ot441xeT8hqZ4iJzRx8CdzZZRF3qxxv/c/mtmGek4vZIVAglMabeEGumYqBbOgCtLlw==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.5.0_1770302270558_0.43862139017662694","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"rosetta-ai","version":"1.6.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.6.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"aaa7b0613ffa32493d22c04fcca3561a8778a43b","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.6.0.tgz","fileCount":9,"integrity":"sha512-FlI+tpCMA6ls4MvUhW6N7kADeq3Ww+nf1T/aUvqW1N/zJQY6Qc44ukmqO8D0kNYLhksvSXPnmhTXirCyPcrJLQ==","signatures":[{"sig":"MEUCIQDcpVVTZBO3jmCUOcKoLUblGBS3jFO0b4If+4XX/WZVGQIgcDkTAqw9TmDQpT7eO/BnY4HLbFmtgaEnjjLKChPVicg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1747470},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.6.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/612aada4e2f51707aa756f20a6f5ca17/rosetta-ai-1.6.0.tgz","_integrity":"sha512-FlI+tpCMA6ls4MvUhW6N7kADeq3Ww+nf1T/aUvqW1N/zJQY6Qc44ukmqO8D0kNYLhksvSXPnmhTXirCyPcrJLQ==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.6.0_1770369168232_0.2603646246858251","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"rosetta-ai","version":"1.6.1","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.6.1","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"ffe6717d5915ad16785ade7101f5987bf42295a9","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.6.1.tgz","fileCount":9,"integrity":"sha512-Hl2GKlcvRHEkpdFjztKVIIevPOs7Y4eM28Xf3XbFFjMoc8Mxq/a7RHmO82Ec7N8VDeLpiSF7Fn2WDGaGQdT5iw==","signatures":[{"sig":"MEYCIQCbpcDhPbaCM08wtb4UXYW61RxU41FCkBp6icSf9xR0tQIhAK7TPfiBpM912w6iIHJs0Rtod4WCHI7dwPG60o8j1Sqm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1750900},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.6.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/dbb4706dba6c74635e8da42caf130a8d/rosetta-ai-1.6.1.tgz","_integrity":"sha512-Hl2GKlcvRHEkpdFjztKVIIevPOs7Y4eM28Xf3XbFFjMoc8Mxq/a7RHmO82Ec7N8VDeLpiSF7Fn2WDGaGQdT5iw==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.6.1_1770374252720_0.9867262117220861","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"rosetta-ai","version":"1.6.2","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.6.2","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"e8a6ea392dc9c84dd7ec878d2e94ddea89009bf4","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.6.2.tgz","fileCount":9,"integrity":"sha512-ISlqdb15FFpoRGkK/f/rti0c1eoMywbsZaLNDqhoipXH5UsWSDAwQOCozC7hUv24r3Hd+a0vhfQQaLAig/Jc4w==","signatures":[{"sig":"MEUCIQDc/Q8o5QFSvFsHsQDNSPRf2WnSJg1Az5eEokI4Oi+sdwIgLOw7kgwDihtpLLh1ID/1CMFtEOvy4sQUVG2oUJP+oEw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1756382},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.6.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/05af2089af001d644999cb40e14d26f9/rosetta-ai-1.6.2.tgz","_integrity":"sha512-ISlqdb15FFpoRGkK/f/rti0c1eoMywbsZaLNDqhoipXH5UsWSDAwQOCozC7hUv24r3Hd+a0vhfQQaLAig/Jc4w==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.6.2_1770648975777_0.6497782374463537","host":"s3://npm-registry-packages-npm-production"}},"1.6.3":{"name":"rosetta-ai","version":"1.6.3","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@1.6.3","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"6a711ee26d84033ad0a5376b437e6649df5195d6","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-1.6.3.tgz","fileCount":9,"integrity":"sha512-u/7qqD90mvAoH4gGRvSjbL9yQBu4ODabLVsXvzDRQK20gQYeF1Puxe7554ibmgqf4auT+dk6Ea1npIhsnkvbBw==","signatures":[{"sig":"MEQCIGkdDzJ6zSubSbrzGiX3cgoDjanVhaz0CoNmE8irXqKYAiBqTbPal5c9qLNRtv1HCKp15c/cNGAluOV0w2kDqEQIIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1753872},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-1.6.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/06080b8c568a5501686c51a0d18574de/rosetta-ai-1.6.3.tgz","_integrity":"sha512-u/7qqD90mvAoH4gGRvSjbL9yQBu4ODabLVsXvzDRQK20gQYeF1Puxe7554ibmgqf4auT+dk6Ea1npIhsnkvbBw==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_1.6.3_1771942802215_0.002944114913710383","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"rosetta-ai","version":"2.0.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@2.0.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"6866a7da055e45486020fa25206ee503c536c97c","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-2.0.0.tgz","fileCount":9,"integrity":"sha512-AROot4ryqyloh4m9h9HGJSmVq4qw+D+JR6nUQ+GqEKx3edJg8Cyi0YHnTos3hYzcixd6qjdAW4sLQFMvvu2ydA==","signatures":[{"sig":"MEYCIQCUb72oqmGfphOhMT0LMfUMcAqCYIVPaca3FH7WF8PdAwIhANOqV4KCY1I1rWzJpZTPXrdWH+6aeS0wZYJwZm9VJMaQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1748125},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-2.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write ."},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/8358574c7ea22f62df40b6d2d169e5c3/rosetta-ai-2.0.0.tgz","_integrity":"sha512-AROot4ryqyloh4m9h9HGJSmVq4qw+D+JR6nUQ+GqEKx3edJg8Cyi0YHnTos3hYzcixd6qjdAW4sLQFMvvu2ydA==","_npmVersion":"11.7.0","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"25.3.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_2.0.0_1772533414343_0.9117961780361121","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"rosetta-ai","version":"2.1.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@2.1.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"65d49496cd44ab20166b33039e4b5f698188ed45","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-2.1.0.tgz","fileCount":9,"integrity":"sha512-j6US39xHnnZZHqSqKUO4gBquat7Y50sCPUvHBpJUnUISg8rfQf7DoIHgThdBRXjzbi13xYfBs824uDm60vidog==","signatures":[{"sig":"MEUCIQDBrCTGAgn9/rOHw5+Hf7u5bZzyljX0zEKjS8NZDm/avQIgJWUwEqWgEGA1T7ttSLRIA01GPfb1wTKSPdTmXeM/E9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1768884},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-2.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","knip":"knip","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write .","test:examples":"cd examples && pnpm test"},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/22ed669773c498d72811a60a930f3e6b/rosetta-ai-2.1.0.tgz","_integrity":"sha512-j6US39xHnnZZHqSqKUO4gBquat7Y50sCPUvHBpJUnUISg8rfQf7DoIHgThdBRXjzbi13xYfBs824uDm60vidog==","_npmVersion":"11.12.1","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"26.0.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"knip":"^6.17.1","tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@vitest/coverage-v8":"^4.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_2.1.0_1781692503522_0.3264859824668438","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"rosetta-ai","version":"2.2.0","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"author":{"name":"Latitude Data SL"},"license":"MIT","_id":"rosetta-ai@2.2.0","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"dist":{"shasum":"cb274218fd59fa2853e7d55c51a42d7f02a72f77","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-2.2.0.tgz","fileCount":9,"integrity":"sha512-tJzXJWc5KBmTdYs6D9nAZfmqutWNUK61nrkVY+x//j+HUobL34juK88SYiYiLZhwuo2tYyQsdoQtgqJz+uBIgQ==","signatures":[{"sig":"MEUCIQCkx7+VAiixuA7+8VSMAP410nXBn0mw1ta1LU6jAgsWBQIgWmoGXPmHfamois/CZbGxePKeK8ta7pchP6aFmrqPWWg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1820063},"main":"./dist/index.cjs","type":"module","_from":"file:rosetta-ai-2.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","knip":"knip","lint":"biome lint . && biome check . && tsc --noEmit","test":"vitest run","build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","format":"biome format --write . && biome lint --write . && biome check --write .","test:examples":"cd examples && pnpm test"},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/70738596b26fbe161a45012ff3732bc5/rosetta-ai-2.2.0.tgz","_integrity":"sha512-tJzXJWc5KBmTdYs6D9nAZfmqutWNUK61nrkVY+x//j+HUobL34juK88SYiYiLZhwuo2tYyQsdoQtgqJz+uBIgQ==","_npmVersion":"11.12.1","description":"The translation layer for LLM provider messages","directories":{},"_nodeVersion":"26.0.0","browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"knip":"^6.17.1","tslib":"^2.0.0","rollup":"^4.0.0","vitest":"^4.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@biomejs/biome":"^2.0.0","rollup-plugin-dts":"^6.0.0","@vitest/coverage-v8":"^4.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-typescript":"^12.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rosetta-ai_2.2.0_1781709627787_0.7607684607161471","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"rosetta-ai","version":"2.3.0","author":{"name":"Latitude Data SL"},"license":"MIT","description":"The translation layer for LLM provider messages","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"engines":{"node":">=20.0.0"},"browserslist":["last 2 Chrome versions","last 2 Firefox versions","last 2 Safari versions","last 2 Edge versions","node >= 20"],"dependencies":{"zod":"^4.0.0"},"devDependencies":{"@biomejs/biome":"^2.0.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-node-resolve":"^16.0.0","@rollup/plugin-typescript":"^12.0.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.0","knip":"^6.17.1","rollup":"^4.0.0","rollup-plugin-dts":"^6.0.0","tslib":"^2.0.0","typescript":"^5.0.0","vitest":"^4.0.0"},"scripts":{"build":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false}","dev":"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript={\"sourceMap\":false} --watch","test":"vitest run","test:examples":"cd examples && pnpm test","lint":"biome lint . && biome check . && tsc --noEmit","knip":"knip","format":"biome format --write . && biome lint --write . && biome check --write ."},"_id":"rosetta-ai@2.3.0","_integrity":"sha512-xaR2TC0nS2f+WUKrD1EMlp2lhLJ5lVkdvAHEuZH2SSgnxlaJZ0oZtq7Q7TM97Ah3bNq1XoPHJ10bnwTTJkDFVw==","_resolved":"/private/var/folders/9p/q06t_79x75xgfhc3mk2psx3h0000gn/T/3c0ee771fadb22e6a2bb003425e328dc/rosetta-ai-2.3.0.tgz","_from":"file:rosetta-ai-2.3.0.tgz","_nodeVersion":"26.0.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-xaR2TC0nS2f+WUKrD1EMlp2lhLJ5lVkdvAHEuZH2SSgnxlaJZ0oZtq7Q7TM97Ah3bNq1XoPHJ10bnwTTJkDFVw==","shasum":"5a4ed34c54c0b48dd8bc0ab9a534944c60baf7fc","tarball":"https://registry.npmjs.org/rosetta-ai/-/rosetta-ai-2.3.0.tgz","fileCount":9,"unpackedSize":2159281,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGG5/lP/UeJc6BJQwtMxnY/ftszp7J17+D6T3FhhRz/SAiBueJ5iZrD9xGkYFbLlN4omGkn4rouRQ5uZ9OcYyb2jdw=="}]},"_npmUser":{"name":"neoxelox","email":"me@arn.sh"},"directories":{},"maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rosetta-ai_2.3.0_1787736786474_0.14230611220785128"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-23T16:56:15.204Z","modified":"2026-08-26T09:33:06.798Z","0.1.0":"2026-01-23T16:56:15.521Z","1.0.0":"2026-01-28T16:40:03.641Z","1.0.1":"2026-01-28T16:47:59.345Z","1.1.0":"2026-01-29T10:30:31.362Z","1.2.0":"2026-01-30T08:08:12.064Z","1.3.0":"2026-02-02T09:00:20.271Z","1.3.1":"2026-02-02T12:23:38.985Z","1.3.2":"2026-02-04T10:52:51.690Z","1.4.0":"2026-02-04T13:44:05.846Z","1.5.0":"2026-02-05T14:37:50.743Z","1.6.0":"2026-02-06T09:12:48.421Z","1.6.1":"2026-02-06T10:37:32.900Z","1.6.2":"2026-02-09T14:56:15.978Z","1.6.3":"2026-02-24T14:20:02.419Z","2.0.0":"2026-03-03T10:23:34.591Z","2.1.0":"2026-06-17T10:35:03.714Z","2.2.0":"2026-06-17T15:20:27.954Z","2.3.0":"2026-08-26T09:33:06.626Z"},"author":{"name":"Latitude Data SL"},"license":"MIT","keywords":["llm","ai","openai","anthropic","google","vercel-ai","translation","messages","genai"],"description":"The translation layer for LLM provider messages","maintainers":[{"name":"neoxelox","email":"me@arn.sh"}],"readme":"# Rosetta\n\nThe translation layer for LLM provider messages.\n\nRosetta converts messages between different LLM providers using [**GenAI**](https://github.com/open-telemetry/semantic-conventions-genai/tree/main/model/gen-ai), a standardized intermediate format. Just pass in messages from any provider—OpenAI, Anthropic, Google, or even custom formats—and get consistent output. No manual mapping required.\n\n> Rosetta was made by [Latitude](https://latitude.so?utm_source=github&utm_medium=oss&utm_campaign=rosetta_ai) as an effort to standardize the observability layer for any LLM application!\n\n## Features\n\n- 🔄 Convert messages from any supported provider to a unified GenAI format\n- 🔀 Convert GenAI messages to any supported provider format\n- 🪄 **Universal fallback** - Pass messages from *any* LLM provider or framework, even unsupported ones, and we'll attempt best-effort conversion\n- 🔍 Automatic provider detection when source is not specified\n- 📝 Full TypeScript support with strict types\n- ✅ Runtime validation with Zod schemas\n- 💾 Preserve provider-specific metadata for lossless round-trips\n- 📌 System message order preservation - system messages retain their original position in conversation when translating between providers\n- 🌐 Works in Node.js and browsers\n- 🌳 Tree-shakeable ESM build\n\n## Installation\n\n```bash\nnpm install rosetta-ai\n# or\npnpm add rosetta-ai\n# or\nyarn add rosetta-ai\n```\n\n## Quick Start\n\n```typescript\nimport { translate } from \"rosetta-ai\";\n\n// Translate any LLM messages - provider is auto-detected\nconst openAIMessages = [\n  { role: \"system\", content: \"You are a helpful assistant.\" },\n  { role: \"user\", content: \"Hello!\" },\n  { role: \"assistant\", content: \"Hi there! How can I help you today?\" },\n];\n\nconst { messages, system } = translate(openAIMessages);\n// messages: GenAI format messages (user + assistant)\n// system: extracted system instructions\n```\n\nWorks with messages from any provider:\n\n```typescript\n// OpenAI Chat Completions\nconst openAI = [{ role: \"user\", content: \"Hello\" }];\ntranslate(openAI); // Just works\n\n// Anthropic\nconst anthropic = [{ role: \"user\", content: [{ type: \"text\", text: \"Hello\" }] }];\ntranslate(anthropic); // Just works\n\n// Vercel AI SDK\nconst vercelAI = [{ role: \"user\", content: \"Hello\" }];\ntranslate(vercelAI); // Just works\n\n// More providers...\n\n// Unknown provider? Also works (uses Compat fallback)\nconst unknown = [{ role: \"user\", content: \"Hello\" }];\ntranslate(unknown); // Still works\n```\n\n## API\n\n### translate\n\nThe main function for translating messages between providers.\n\n```typescript\nimport { translate, Provider } from \"rosetta-ai\";\n\nconst { messages, system } = translate(inputMessages, {\n  from: Provider.OpenAICompletions, // Source provider (optional, auto-detected if omitted)\n  to: Provider.GenAI,               // Target provider (optional, defaults to GenAI)\n  system: \"You are helpful\",        // Separated system instructions (optional)\n  direction: \"input\",               // \"input\" (default) or \"output\"\n});\n```\n\n**Options:**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `from` | `Provider` | auto-detected | Source provider format |\n| `to` | `Provider` | `Provider.GenAI` | Target provider format |\n| `system` | `string \\| object \\| object[]` | - | System instructions (for providers that separate them) |\n| `direction` | `\"input\" \\| \"output\"` | `\"input\"` | Affects role interpretation when translating strings |\n| `inferPriority` | `Provider[]` | `DEFAULT_INFER_PRIORITY` | Priority order for provider auto-detection |\n| `filterEmptyMessages` | `boolean` | `false` | Remove empty messages (no parts, or only blank `text`/`reasoning`/`compaction` content) during translation |\n| `providerMetadata` | `\"preserve\" \\| \"passthrough\" \\| \"strip\"` | `\"preserve\"` | How to handle provider metadata (extra fields) in translation |\n\n**Returns:** `{ messages, system? }` - translated messages and optional system instructions\n\n### safeTranslate\n\nSame as `translate`, but returns an error object instead of throwing.\n\n```typescript\nimport { safeTranslate } from \"rosetta-ai\";\n\nconst result = safeTranslate(messages, options);\n\nif (result.error) {\n  // Handle error: result.error is Error\n} else {\n  // Use result.messages (properly typed)\n}\n```\n\n### Input Flexibility\n\nMessages and system instructions accept flexible formats:\n\n```typescript\n// Messages: string, object, or array\ntranslate(\"Hello!\");                              // String → single message\ntranslate({ role: \"user\", content: \"Hello!\" });   // Single provider message\ntranslate([{ role: \"user\", content: \"Hello!\" }]); // Array of provider messages\n\n// System: string, object, or array\ntranslate(messages, { system: \"You are helpful\" });\ntranslate(messages, { system: { type: \"text\", content: \"Be helpful\" } });\ntranslate(messages, { system: [{ type: \"text\", content: \"Part 1\" }, { type: \"text\", content: \"Part 2\" }] });\n```\n\n## Common Use Cases\n\n### Translate API responses for storage or display\n\n```typescript\nimport OpenAI from \"openai\";\nimport { translate, Provider } from \"rosetta-ai\";\n\nconst openai = new OpenAI();\nconst completion = await openai.chat.completions.create({\n  model: \"gpt-4o\",\n  messages: [{ role: \"user\", content: \"What's the weather?\" }],\n});\n\n// Translate OpenAI response to unified GenAI format\nconst { messages } = translate([completion.choices[0].message], {\n  from: Provider.OpenAICompletions,\n});\n\n// Now you have a consistent format regardless of which provider you used\nconsole.log(messages[0].parts[0]); // { type: \"text\", content: \"...\" }\n```\n\n### Cross-provider translation\n\n```typescript\nimport { translate, Provider } from \"rosetta-ai\";\n\n// Translate OpenAI messages to Vercel AI SDK format\nconst openAIMessages = [\n  { role: \"system\", content: \"You are helpful.\" },\n  { role: \"user\", content: \"Hello!\" },\n];\n\nconst { messages } = translate(openAIMessages, {\n  from: Provider.OpenAICompletions,\n  to: Provider.VercelAI,\n});\n// Result: Vercel AI SDK compatible messages\n```\n\n### Handle tool calls across providers\n\n```typescript\nimport { translate, Provider } from \"rosetta-ai\";\n\n// OpenAI tool call format\nconst openAIWithToolCall = [\n  {\n    role: \"assistant\",\n    content: null,\n    tool_calls: [{\n      id: \"call_abc123\",\n      type: \"function\",\n      function: { name: \"get_weather\", arguments: '{\"location\":\"Paris\"}' },\n    }],\n  },\n  {\n    role: \"tool\",\n    tool_call_id: \"call_abc123\",\n    content: '{\"temp\": 20}',\n  },\n];\n\n// Translates to unified GenAI format with tool_call and tool_call_response parts\nconst { messages } = translate(openAIWithToolCall, {\n  from: Provider.OpenAICompletions,\n});\n\n// Tool call part\nmessages[0].parts[0]; // { type: \"tool_call\", id: \"call_abc123\", name: \"get_weather\", arguments: { location: \"Paris\" }, ... }\n\n// Tool response part\nmessages[1].parts[0]; // { type: \"tool_call_response\", id: \"call_abc123\", response: {...}, ... }\n```\n\n### Translate multimodal content\n\n```typescript\nimport { translate, Provider } from \"rosetta-ai\";\n\nconst anthropicWithImage = [\n  {\n    role: \"user\",\n    content: [\n      { type: \"text\", text: \"What's in this image?\" },\n      {\n        type: \"image\",\n        source: {\n          type: \"base64\",\n          media_type: \"image/png\",\n          data: \"iVBORw0KGgo...\",\n        },\n      },\n    ],\n  },\n];\n\nconst { messages } = translate(anthropicWithImage, {\n  from: Provider.Anthropic,\n});\n\n// Image converted to blob part\nmessages[0].parts[1]; // { type: \"blob\", modality: \"image\", mime_type: \"image/png\", content: \"...\" }\n```\n\n### Safe translation with error handling\n\n```typescript\nimport { safeTranslate } from \"rosetta-ai\";\n\nconst result = safeTranslate(unknownMessages);\n\nif (result.error) {\n  console.error(\"Translation failed:\", result.error.message);\n} else {\n  console.log(\"Translated:\", result.messages);\n}\n```\n\n## Supported Providers\n\n| Provider | toGenAI | fromGenAI | System In | System Out | Description |\n|----------|---------|-----------|-----------|------------|-------------|\n| GenAI | ✅ | ✅ | Both | Separated | Intermediate format (default target) |\n| Promptl | ✅ | ✅ | Inline | Inline | [promptl-ai](https://github.com/latitude-dev/promptl) format |\n| Vercel AI | ✅ (v6/7) | ✅ (v6) | Both | Inline | Vercel AI SDK messages |\n| OpenAI Completions | ✅ | - | Inline | - | Chat Completions API |\n| OpenAI Responses | ✅ | - | Inline | - | Responses API |\n| Anthropic | ✅ | - | Both | - | Messages API |\n| Google Gemini | ✅ | - | Both | - | GenerateContent API |\n| Compat | ✅ | - | Both | - | Universal fallback |\n\n- **toGenAI** = Can translate *from* this provider to GenAI (source)\n- **fromGenAI** = Can translate *to* this provider from GenAI (target)\n- **System In** = How system instructions are accepted as input: *Inline* (`system` messages within the conversation), *Separated* (`system` field), or *Both*\n- **System Out** = Where system instructions are emitted as output: *Inline* (`system` messages within the conversation), *Separated* (`system` field)\n\n**System message order preservation**: When translating to a provider that separates system instructions (like GenAI), system messages are extracted from the conversation and returned in the `system` field. Rosetta preserves the original position of each system message so that when translating back to a provider with inline system messages (like Promptl or Vercel AI), the system messages are re-inserted at their original positions in the conversation.\n\n### Universal Compatibility\n\nThe **Compat** provider is a universal fallback that handles messages from *any* LLM provider—even ones not explicitly supported. When you call `translate()` without specifying a source provider, Rosetta tries to match against known provider schemas. If none match, it automatically falls back to Compat, which:\n\n- Normalizes field names across conventions (`tool_calls`, `toolCalls`, `tool-calls` all work)\n- Detects common patterns: roles, content arrays, tool calls, images, reasoning, etc.\n- Handles formats from Cohere, Mistral, Ollama, AWS Bedrock, LangChain, and more\n- Preserves unrecognized data so nothing is lost\n\n```typescript\n// Works with any provider - no need to specify the source\nconst messages = [\n  { role: \"user\", content: \"Hello\" },\n  { role: \"assistant\", toolCalls: [{ id: \"1\", function: { name: \"search\", arguments: \"{}\" } }] },\n];\n\nconst { messages: translated } = translate(messages); // Auto-detected and translated\n```\n\nMore providers will be added. See [AGENTS.md](./AGENTS.md) for contribution guidelines.\n\n## GenAI Format\n\nGenAI is the intermediate format used for translation, and it tracks the [OpenTelemetry GenAI message schemas](https://github.com/open-telemetry/semantic-conventions-genai/tree/main/model/gen-ai). A single schema covers both input and output messages, so `finish_reason` is optional (it only applies to output messages). It provides a unified representation of LLM messages across all providers:\n\n```typescript\nimport type { GenAIMessage, GenAISystem } from \"rosetta-ai\";\n\nconst message: GenAIMessage = {\n  role: \"user\",           // \"user\" | \"assistant\" | \"system\" | \"tool\" | string\n  parts: [                // Array of content parts\n    { type: \"text\", content: \"What's in this image?\" },\n    { type: \"uri\", uri: \"https://example.com/cat.jpg\", modality: \"image\" },\n  ],\n  name: \"Alice\",          // Optional: participant name\n  finish_reason: \"stop\",  // Optional (output messages only): why the model stopped\n};\n\nconst system: GenAISystem = [\n  { type: \"text\", content: \"You are a helpful assistant.\" },\n];\n```\n\nRoles, modalities and finish reasons accept the named values below, plus any other string for provider-specific values:\n\n| Field | Named values |\n|-------|--------------|\n| `role` | `system`, `user`, `assistant`, `tool` |\n| `modality` | `image`, `video`, `audio`, `document` |\n| `finish_reason` | `stop`, `length`, `content_filter`, `tool_call`, `compaction`, `error` |\n\n### Part Types\n\n| Type | Description | Key Fields |\n|------|-------------|------------|\n| `text` | Plain text content | `content` |\n| `blob` | Binary data (base64) | `content`, `mime_type`, `modality` |\n| `file` | File reference by ID | `file_id`, `modality` |\n| `uri` | URL reference | `uri`, `modality` |\n| `reasoning` | Model thinking/reasoning | `content` |\n| `tool_call` | Tool/function call request | `id`, `name`, `arguments` |\n| `tool_call_response` | Tool/function result | `id`, `response` |\n| `server_tool_call` | Provider-executed tool call (e.g. web search) | `id`, `name`, `server_tool_call` |\n| `server_tool_call_response` | Provider-executed tool result | `id`, `server_tool_call_response` |\n| `compaction` | Compacted conversation state | `id`, `content` |\n| `generic` | Custom/extensible type | `type`, any additional fields |\n\nUnknown part types are always accepted as generic parts, so messages using parts that Rosetta doesn't model yet still translate.\n\n### Unsupported Parts\n\nGenAI covers more part types than any single provider format. Rosetta never drops the extras silently: every part a target cannot represent is converted to the closest part it can, with the source type recorded in `_knownFields.originalType` so you can still tell what it was.\n\n| Part | GenAI target | Promptl target | Vercel AI target |\n|------|--------------|----------------|------------------|\n| `server_tool_call` | kept as-is | `tool-call` | `tool-call` with `providerExecuted: true` |\n| `server_tool_call_response` | kept as-is | `tool-result` | `tool-result` with `providerExecuted: true` |\n| `compaction` | kept as-is | `text` part | `text` part |\n\nCompaction becomes text because the summary is conversation content: the model is given it in place of the turns it replaced, so dropping it from a translated prompt would discard the whole history it stands for.\n\n```typescript\nconst { messages } = translate(genAIMessages, { to: Provider.Promptl });\n\nmessages[0].content[0];\n// { type: \"text\", text: \"Summary of the earlier turns.\",\n//   _providerMetadata: { _knownFields: { originalType: \"compaction\" } } }\n```\n\nWhen a provider only exposes an encrypted compaction item there is no summary to carry, so it becomes an **empty** text part — the compaction stays visible in the conversation, and [`filterEmptyMessages`](#translate) drops the message if that is all it contained.\n\nTranslating to GenAI is always lossless: every part is kept, whatever its type.\n\n### Provider Metadata\n\nAll GenAI entities support `_provider_metadata` to preserve extra fields during translation. The metadata has two types of fields:\n\n1. **`_known_fields`**: Cross-provider semantic data (`toolName`, `isError`, `isRefusal`, `originalType`) used to build accurate translations\n2. **Extra fields**: Provider-specific data preserved for round-trips\n\nReserved fields are written in the target's casing (`_known_fields` vs `_knownFields`, `_parts_metadata` vs `_partsMetadata`) and read in either, so messages stay translatable no matter which provider produced them.\n\n```typescript\nconst message: GenAIMessage = {\n  role: \"tool\",\n  parts: [{\n    type: \"tool_call_response\",\n    id: \"call_123\",\n    response: \"Error occurred\",\n    _provider_metadata: {\n      // Known fields - used by target providers to build accurate translations\n      _known_fields: {\n        toolName: \"get_weather\",  // Tool name (GenAI schema doesn't include it)\n        isError: true,            // Error indicator\n      },\n      // Parts metadata - collapsed part-level metadata (for providers with string-only content)\n      _partsMetadata: {\n        _promptlSourceMap: [...], // Part metadata moved to message level\n      },\n      // Extra fields - any other provider-specific data\n      annotations: [...],\n    },\n  }],\n};\n```\n\n**Note on `_partsMetadata`**: Some providers require string content for certain message types (e.g., VercelAI system messages). When translating to these providers, part-level metadata is collected and stored in `_partsMetadata` at the message level. When translating back to a provider that supports structured content, this metadata is automatically restored to the first content part. **Important**: In passthrough mode, if the target provider doesn't support structured content (like VercelAI system messages), part-level metadata stored in `_partsMetadata` will be lost. Use **preserve** mode if you need to retain this metadata through round-trips.\n\n#### Provider Metadata Mode\n\nThe `providerMetadata` option controls how metadata (extra fields) is handled in the output.\n\n| Mode | Description |\n|------|-------------|\n| `\"preserve\"` (default) | Keep `_provider_metadata` nested in output entities |\n| `\"passthrough\"` | Spread extra fields as direct properties on output entities |\n| `\"strip\"` | Don't include metadata (only use `_known_fields` for translation) |\n\n```typescript\nimport { translate, Provider } from \"rosetta-ai\";\n\n// Preserve metadata (default) - keeps _provider_metadata in output\ntranslate(messages, { from: Provider.Promptl, to: Provider.GenAI });\n\n// Passthrough - spread extra fields on output entities for lossless round-trips\ntranslate(messages, { from: Provider.GenAI, to: Provider.Promptl, providerMetadata: \"passthrough\" });\n\n// Strip - clean output without metadata\ntranslate(messages, { to: Provider.VercelAI, providerMetadata: \"strip\" });\n```\n\n**Note**: When translating between the same provider (e.g., GenAI → GenAI), `providerMetadata` is automatically set to `\"passthrough\"` to ensure lossless round-trips, regardless of the configured setting.\n\n## TypeScript Support\n\nAll types are exported for type-safe usage:\n\n```typescript\nimport {\n  // Core types\n  type GenAIMessage,\n  type GenAIPart,\n  type GenAISystem,\n  \n  // API types\n  type TranslateOptions,\n  type TranslateResult,\n  \n  // Provider types\n  Provider,\n  type ProviderMessage,\n  type ProviderSystem,\n} from \"rosetta-ai\";\n\n// Type-safe translation\nconst result: TranslateResult<Provider.GenAI> = translate(messages);\n\n// Access provider-specific message types\ntype OpenAIMsg = ProviderMessage<Provider.OpenAICompletions>;\n```\n\n## Examples\n\nThe [examples](./examples) folder contains E2E tests demonstrating real-world usage with actual provider SDKs:\n\n```bash\ncd examples\npnpm install\npnpm test  # Runs tests (imports directly from src, no build needed)\n```\n\nTests include:\n- **Real API calls** (when API keys are set) - validates against actual provider responses\n- **Hardcoded messages** - runs without API keys for fast iteration\n\n## Development\n\n### Prerequisites\n\n- Node.js >= 20.0.0\n- pnpm >= 10.0.0\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/latitude-dev/rosetta-ts.git\ncd rosetta-ts\n\n# Install dependencies\npnpm install\n```\n\n### Commands\n\n| Command        | Description                            |\n| -------------- | -------------------------------------- |\n| `pnpm install` | Install dependencies                   |\n| `pnpm build`   | Build the package                      |\n| `pnpm dev`     | Build in watch mode                    |\n| `pnpm test`    | Run tests                              |\n| `pnpm lint`    | Check for lint, format and type errors |\n| `pnpm format`  | Format code and fixable lint errors    |\n\n## Adding a New Provider\n\nThe [AGENTS.md](./AGENTS.md) file contains extensively curated guidelines for AI coding agents, including detailed step-by-step instructions for adding new providers. The easiest way to add a provider is to give a coding agent (like Cursor, Claude, or similar) the provider's message schema along with a prompt like this:\n\n```\nBased on the attached [Provider Name] message schema (see attached), add a\n[Provider Name] provider to the package. Follow ALL the guidelines in AGENTS.md.\n\n- This provider will be source-only / source and target.\n- This provider does / does not separate system instructions from the message list.\n- Build a unified schema if the provider has separate types for input and output.\n```\n\nThe schema can be in any format the agent can understand: TypeScript SDK types, JSON Schema, OpenAPI definitions, Python types, or even API documentation.\n\n**Example prompt for adding Google Gemini:**\n\n```\nBased on the attached Google Gemini TypeScript SDK types (specifically the\nmessages and system instructions for the GenerateContent function), add a\nGoogle provider to the package. Follow ALL the guidelines in AGENTS.md.\n\n- This provider will be source-only, not a target.\n- This provider separates system instructions from the message list.\n- Build a unified schema since the provider has different types for input and output.\n```\n\nThe agent will handle creating the schema files, implementing the specification, registering the provider, writing tests, and updating documentation—all following the project's conventions.\n\n## License\n\nMIT - see [LICENSE](./LICENSE) for details.\n\n## Contributing\n\nContributions are welcome! Please read [AGENTS.md](./AGENTS.md) for detailed contribution guidelines, including architecture decisions, coding standards, and the step-by-step process for adding new providers.\n","readmeFilename":"README.md"}