{"_id":"@abejarano/ai-connectors","_rev":"11-d4b3f62642787d70eba05a680d2d5675","name":"@abejarano/ai-connectors","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@abejarano/ai-connectors","version":"1.0.0","_id":"@abejarano/ai-connectors@1.0.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"c9c7a0e19e2d84f5684b5d412100e88660fff90f","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.0.0.tgz","fileCount":4,"integrity":"sha512-DNNluj5cTH7KatMXpkCyq/wJN2k2H75hQ711Nj6eY9ub85y164Hom3eebQRraMbqKGuo5PPDNwgji7tLnCwuhw==","signatures":[{"sig":"MEYCIQDhst55mpkZC/5Caq38dGM8yCrIW7opycuYUoELGJUF6gIhAJgn+t9U7K/LfZG+TmzL3JnILeb3MXKJTD/5CHD+8iG/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4270049},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"262df130c51a1510183da9b070751fda269be433","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"abejarano","email":"programador.angel@gmail.com"},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.14.1","description":"Paquete TypeScript para integrar Google Gemini con una API pequeña y enfocada. Expone clientes para generación de texto, imagen y video, junto con tipos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@google/genai":"^2.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.8.3","@types/bun":"latest","semantic-release":"^25.0.3","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"peerDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.0.0_1778379448247_0.7765352014309599","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@abejarano/ai-connectors","version":"1.0.1","_id":"@abejarano/ai-connectors@1.0.1","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"0023dbd5ea1114669ab7c964d105bc8120c1498d","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.0.1.tgz","fileCount":26,"integrity":"sha512-hCgxnBOCjifz0BR9CDlOJzILwSNJ5IcULGFcbJSfITYqWApScKGkxHjghGH6jj++s0NW8o3XSFoexkDQxfyCvA==","signatures":[{"sig":"MEUCIDylG+jyamooLGY6qPL1B0RMG2DNcqxZpa5G0sEej3mUAiEAvh6pty2mVvqyL3yxqYapMhBmnzeE1Gk4gPGKqpZxmZs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4284247},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"1512a7329d1c62d353eb7780e48c0e2b93438472","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"abejarano","email":"programador.angel@gmail.com"},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.14.1","description":"Paquete TypeScript para integrar Google Gemini con una API pequeña y enfocada. Expone clientes para generación de texto, imagen y video, junto con tipos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@google/genai":"^2.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.8.3","@types/bun":"latest","semantic-release":"^25.0.3","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"peerDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.0.1_1778380210886_0.3760505502646281","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@abejarano/ai-connectors","version":"1.1.0","_id":"@abejarano/ai-connectors@1.1.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"b6476d8325e8be6208ef877114ee64e2ec7b792a","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.1.0.tgz","fileCount":40,"integrity":"sha512-fCyZmSq51M1TAd0BX2jrMfACXzWtEVlDw7h241af0pfJUD6yhb78LwJyIbT/fOvX8+9WUUIZCYJYuJjSbUDsdg==","signatures":[{"sig":"MEUCIQDa6LDirqvdooZk5ijRGS0duIBuGYChbQ+Xd59CbH4+0gIgY4ixBFc8PVRC3c3TVtWCc3tfDyls0DcR6fXQHZSUjYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCyMwHXcotEI1vN+bjZSCDuEqyscQMKPX4E6L6TM/dmLQIhAPaovvrBl6vkLnumlk8cNUHUoLmpkwTqAUWX0iYSVbxm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5067580},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"b6922beb1041db710d49d43abbf1d74cd4ce899e","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.1.0_1790183990468_0.27575855241584835","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@abejarano/ai-connectors","version":"1.2.0","_id":"@abejarano/ai-connectors@1.2.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"fa21c381a86a4f2b0854045197b331dd5434f267","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.2.0.tgz","fileCount":52,"integrity":"sha512-LpwzTlo7RRV6zhq/nsvaythTxLxoJI1yaFfJWgFF9vhU5cDD06pWZWLD0t8Mfpeyc7/4WnbJEJ31fQ6tJkiNbg==","signatures":[{"sig":"MEYCIQD6EDLEPBnNir9cbRbJc2/mbsfkcqDL5QUGtRcdAGuG5AIhANhyZ6KKHaOo+1IpvezlqY3X+cYp1c6TxGL4WwTkfZH1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCxAjLLZJVW5ivhZgzCD87+KZr91KTCIJhbzwNDgn3q6wIgDhsMqSD0wigmj80yCb5FQxAIyvT4Ok7HNmwkhdmESnk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5091920},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"594cfa281c55d9acd4933d35bf711a899934f90e","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.2.0_1790267602683_0.4560688252427023","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@abejarano/ai-connectors","version":"1.3.0","_id":"@abejarano/ai-connectors@1.3.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"da4a3328d2abf9dc82a7e0ea0d636c492fc3dfc2","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.3.0.tgz","fileCount":52,"integrity":"sha512-WIqcbSFLjzCSSvowHTR5HXLCv/Pyr79fQDQTINEQp58Zuh3nm0bHvST+Pd0rUidVnSgCAFJGiKNaKjflFV5D7g==","signatures":[{"sig":"MEUCIBLCNYYyVl3mwfR60gU55dxpfP5mmVdEEMNIKffsZLIdAiEArIX17opEFQpA/9O5zcQ+Q22JcPEQN9ReP7jesVEK9HM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIErr506WL2LkEEVnhf87kN+PhCKswz6xJF1AE+1qzFH5AiAFCDvfeg10QmhvfIpfe24jMoeFhUE2mAQmDGg/lTXHPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5092838},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8c996827fcb652fbd6e9190017ca9712028a5c73","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.3.0_1790335649547_0.9685962303593665","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@abejarano/ai-connectors","version":"1.4.0","_id":"@abejarano/ai-connectors@1.4.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"7e795fede8d18acaec39880461899aa47a31d048","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.4.0.tgz","fileCount":52,"integrity":"sha512-IwYzx/KNaLUNM4ytR0Vm4t9ZRjLkv0XZfP7U0cgzd9o5XmfZDXyHFY6bYIIK+Xomz0oxeD8y8u+WxY1o4UFtlQ==","signatures":[{"sig":"MEQCICOrQlBrzMpuRM+jN9XRKiglRW4BwhgplqybdbMlNp0iAiBoSxHDh1IInes/aoFnH0m03VEjwSL1yKTbb2gtQWItTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEIY7/Miy9efeYpV47TWuxjm76S58Ugotef8c52yiqLGAiAxUWa3G8RfQ3cms0flyA5oFO2mPzlm25e393Gx2avUOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5094542},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"331eeb65e85062b25a66d8d4444c2e8aa3dcace6","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.4.0_1790336073439_0.7905485031027211","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@abejarano/ai-connectors","version":"1.5.0","_id":"@abejarano/ai-connectors@1.5.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"aca96e632e67bc5850f617d5fd70f15e91848e8f","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.5.0.tgz","fileCount":52,"integrity":"sha512-J2wdAk8il+p1vH6o80ZXhOGxDnxtjXNGnFUs4uHQ4vziBKzsiRhn22UiMM7/1H+sXuSjWkSnqxOZGepFddm09g==","signatures":[{"sig":"MEUCIQCrThPiKpyPnLN0TTkdkcAmkOImoh3PoLsLLVIzeZZqLgIgN8X4Mvys7v92q+T+nvl+bM+lGVbd9geEDAe7MdPzZzE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCpgSaudnRSxcE/JPorlnGg2bvEgs1MYUUVgBNrAv5YBAIhAPIJmkhNlTbRy8I71CUHFizLbu7kTWx43LjjgenLfdXg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5097892},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e0dbacba0944195cd39dc604057d680e1b6c4cfd","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.5.0_1790338275728_0.592452631446128","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@abejarano/ai-connectors","version":"1.5.1","_id":"@abejarano/ai-connectors@1.5.1","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"bce76566b3a4813bf6053c2e52273912fe7701a1","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.5.1.tgz","fileCount":52,"integrity":"sha512-f02bWCMDE9CrnV3duoJK1yVfHVhBPj+YwYnlWaUSKb+Ukxe3PS9Thm5YG+MZIoJwBdsmoTR+uxQOconA7uvv/w==","signatures":[{"sig":"MEQCIFYhKT2V1XOkmU0Q27DbMI+BkfiUBVvoxEMZGNfHxl1fAiAHnjS7mh/Bj5L5RSdhIwvxgF1X6m0J4xwVhTNi5eON7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDqaVD75TqwZguLEDN11xBUZWDGTXCblm1zHB6IiGROuAIhALEhf/eH96PXQRlaoKNdSDx1PFAnnBG0xHdieFIiNmd/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5097983},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"a2cdedf067ab1a6ec73e07c6effe5fb00bef45cd","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.5.1_1790614195542_0.3726577577899177","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@abejarano/ai-connectors","version":"1.6.0","_id":"@abejarano/ai-connectors@1.6.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"798140e92bed9413a9162b7f932a27f9be45b580","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.6.0.tgz","fileCount":52,"integrity":"sha512-yA6XJWuRdOQOnwmwIZnZCH0+iCFcSaehx4kWSN4nIG8ocFyZ2b/L8PZtydXGC5MFuElr7oTV0pQhCF34EkXjsw==","signatures":[{"sig":"MEUCIQCJSMikvf2bWlzB1lWjHCwocvT6FxLjockQHlcKGSwzSwIgCNfp9uH7uOt8mww5rJ24u6nnJv2v68bMC3J9VVwU9Wo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFSQwBbNvCbQYEXnVPk3c5g6+kJ6+wZeQt9U5kUVeh4/AiEA1O37p/QGKxE5RX0H5iG1pCdS/kIfBrbr/QPx5hL69Xs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5101119},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fb6f8f2786d5cd8052bc29ee8624352cfa6f8266","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.6.0_1790615586209_0.6426261588354378","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@abejarano/ai-connectors","version":"1.7.0","_id":"@abejarano/ai-connectors@1.7.0","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"homepage":"https://github.com/abejarano/ai-connectors#readme","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"b953abf624808b5c9479c6bb917f0232140a1bce","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-1.7.0.tgz","fileCount":62,"integrity":"sha512-ipElD1R7xm7kE+m5O06WsDks5Uh6voI8UueOuVtzW0ANsaRXN/3uFMMQ1NZu3xNodnoSmr/fq3V41WI+7licSA==","signatures":[{"sig":"MEUCIBFk5+RLPXWI+BZVwyVlhZidunMrYPJztr581dY1XO58AiEAsLWcD91OrkSzlwXMr84xQ3FNG7mDT0IOH7KQIsMRJB4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDLYeH1ro4FDvx9hi+/XGCmbhsRQYbieBmHQ1PtXikcegIhANKUfgz503HNUxpS9bTWKdnWGNmuRVdqvuf6LpXQ/WER","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5113785},"type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fb29c1b3b9f1b1e6a955a9c50d53c4894b7d4ee6","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ai-connectors_1.7.0_1790699562096_0.20313352589197864","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"_id":"@abejarano/ai-connectors@2.0.0","bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"dist":{"shasum":"23b20d038929203c524a366a82f0460d7534a653","tarball":"https://registry.npmjs.org/@abejarano/ai-connectors/-/ai-connectors-2.0.0.tgz","fileCount":64,"integrity":"sha512-dRbZ87L4X12+4ryIJUA1MC4tFP/Tc1y7QFQwLQAs/WHy1zcGTARRNjjxRTiag5uXG++LBkzuQFIfQrvMWBAAKQ==","signatures":[{"sig":"MEQCIFPT/I0CQVqMHo1TP28Q4nzgDLBnQ0RLoaAK9pc54Kp0AiAKi4mR63IzWyPdXu9A/leEJPxxqFHAvD5WCg7FVe05rA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEpVShFgfIe6o+bfyhzUlv9oDsK7cuXTcWKGKMAIoKevAiEAv51AmXkp/5zVjBgJoso3kB3skWoEGFn71bKEZA4GHe0="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abejarano%2fai-connectors@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5134927},"name":"@abejarano/ai-connectors","type":"module","module":"index.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f869fa4ee23addb09c6b0c9c83e05a936663afdb","scripts":{"test":"bun test","build":"bun run clean && bun run build.ts && bun run build:types","clean":"rimraf dist","format":"prettier --write .","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.json","publish:dry":"bun publish --dry-run","publish:npm":"bun publish --access public","format:check":"prettier --check .","prepublishOnly":"bun run build"},"version":"2.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"e67b9426-6f69-4a22-ab99-3e3d4aacb50e"}},"homepage":"https://github.com/abejarano/ai-connectors#readme","repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"_npmVersion":"11.20.0","description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","directories":{},"maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"@google/genai":"^2.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","prettier":"^3.9.9","@types/bun":"^1.4.2","semantic-release":"^25.0.9","@semantic-release/git":"^11.0.1","@semantic-release/changelog":"^7.0.0"},"peerDependencies":{"typescript":"^7.0.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-connectors_2.0.0_1790797702459_0.4368469839361955"}}},"time":{"created":"2026-05-10T02:17:28.141Z","modified":"2026-09-30T19:48:22.895Z","1.0.0":"2026-05-10T02:17:28.490Z","1.0.1":"2026-05-10T02:30:11.079Z","1.1.0":"2026-09-23T17:19:50.577Z","1.2.0":"2026-09-24T16:33:22.809Z","1.3.0":"2026-09-25T11:27:29.665Z","1.4.0":"2026-09-25T11:34:33.551Z","1.5.0":"2026-09-25T12:11:15.862Z","1.5.1":"2026-09-28T16:49:55.682Z","1.6.0":"2026-09-28T17:13:06.308Z","1.7.0":"2026-09-29T16:32:42.185Z","2.0.0":"2026-09-30T19:48:22.589Z"},"bugs":{"url":"https://github.com/abejarano/ai-connectors/issues"},"homepage":"https://github.com/abejarano/ai-connectors#readme","repository":{"url":"git+https://github.com/abejarano/ai-connectors.git","type":"git"},"description":"Paquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.","maintainers":[{"name":"abejarano","email":"programador.angel@gmail.com"}],"readme":"# @abejarano/ai-connectors\n\nPaquete TypeScript para integrar proveedores de IA mediante adapters neutrales de texto, imagen y vídeo. Expone contratos compartidos, manejo normalizado de errores y utilidades de soporte.\n\n## Características\n\n- Generación de texto con soporte de streaming\n- Salida estructurada con JSON Schema\n- Generación de texto DeepSeek mediante su API de Chat Completions\n- Generación de imágenes con persistencia en archivo\n- Edición de imágenes existentes (image-to-image) con `edit()`\n- Generación de video con polling configurable\n- Consumo normalizado de tokens y unidades facturables en texto, multimodal, imagen y vídeo\n- Errores de transporte normalizados con información de retry\n- Selección explícita de proveedor sin dependencias de clientes concretos\n\n## Instalación\n\n```bash\nbun add @abejarano/ai-connectors\n```\n\nSi prefieres `npm` o `pnpm`:\n\n```bash\nnpm install @abejarano/ai-connectors\npnpm add @abejarano/ai-connectors\n```\n\n## Requisitos\n\n- Node.js 20 o superior\n- Una API key válida del proveedor seleccionado\n- TypeScript 5 si lo consumes desde un proyecto TS\n\n## API pública\n\nEl export raíz del paquete publica actualmente:\n\n- `TextGenerationAdapter`\n- `MultimodalGenerationAdapter`\n- `ImageGenerationAdapter`\n- `VideoGenerationAdapter`\n- `TextGenerationAdapterConfig`\n- `ImageGenerationAdapterConfig`\n- `VideoGenerationAdapterConfig`\n- `TextGenerationResponse`\n- `TextGenerationRequest`\n- `TextGenerationClient`\n- `ImageGenerationResponse`\n- `ImageGenerationRequest`\n- `ImageEditRequest`\n- `ImageInput`\n- `ImageGenerationClient`\n- `ImageGenerationCapabilities`\n- `VideoGenerationResponse`\n- `VideoGenerationRequest`\n- `VideoGenerationClient`\n- `VideoGenerationCapabilities`\n- `TextGenerationCapabilities`\n- `StructuredOutputFormat`\n- `TextRetryPolicy`\n- `TokenUsage`\n- `ImageUsage`\n- `VideoUsage`\n- `VideoResolution`\n\n## Uso\n\n### Generación de texto\n\n```ts\nimport { TextGenerationAdapter } from \"@abejarano/ai-connectors\"\n\nconst client = new TextGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-2.5-flash\",\n})\n\nconst result = await client.execute({\n  systemPrompt: \"Responde de forma breve y clara.\",\n  userPrompt: \"Escribe una descripción corta de un cuaderno premium.\",\n  maxOutputTokens: 256,\n})\n\nconsole.log(result.text)\nconsole.log(result.usage)\n```\n\n### Texto con streaming\n\n```ts\nimport { TextGenerationAdapter } from \"@abejarano/ai-connectors\"\n\nconst client = new TextGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-2.5-flash\",\n})\n\nconst result = await client.execute({\n  systemPrompt: \"Eres un asistente útil.\",\n  userPrompt: \"Explica semantic-release en un párrafo.\",\n  stream: true,\n  onTextChunk: async (chunk) => {\n    process.stdout.write(chunk)\n  },\n})\n\nconsole.log(result.text)\n```\n\n### Generación de texto con DeepSeek\n\n```ts\nimport { TextGenerationAdapter } from \"@abejarano/ai-connectors\"\n\nconst client = new TextGenerationAdapter({\n  provider: \"deepseek\",\n  apiKey: process.env.DEEPSEEK_API_KEY!,\n  model: \"deepseek-flash\",\n})\n\nconst result = await client.execute({\n  systemPrompt: \"Responde de forma breve y clara.\",\n  userPrompt: \"Escribe una descripción corta de un cuaderno premium.\",\n  maxOutputTokens: 256,\n})\n\nconsole.log(result.text)\nconsole.log(result.usage)\n```\n\nDeepSeek soporta streaming y function tools normalizados en `TextGenerationRequest`. Para salida estructurada, garantiza un objeto JSON, pero no la conformidad estricta con JSON Schema: las solicitudes con `responseFormat.strict: true` fallan localmente antes de llamar al proveedor. DeepSeek puede analizar imágenes de entrada, pero no genera imágenes; usa `ImageGenerationAdapter` con `provider: \"gemini\"` para generar assets.\n\n### Salida estructurada\n\n```ts\nimport { TextGenerationAdapter } from \"@abejarano/ai-connectors\"\n\nconst client = new TextGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-2.5-flash\",\n})\n\nconst result = await client.execute({\n  systemPrompt: \"Devuelve solo JSON válido.\",\n  userPrompt: \"Genera un objeto con title y summary.\",\n  responseFormat: {\n    type: \"json_schema\",\n    name: \"summary\",\n    schema: {\n      type: \"object\",\n      properties: {\n        title: { type: \"string\" },\n        summary: { type: \"string\" },\n      },\n      required: [\"title\", \"summary\"],\n      additionalProperties: false,\n    },\n  },\n})\n\nconsole.log(result.text)\n```\n\nSi sólo necesitas garantizar un objeto JSON válido, sin imponer un esquema,\nusa la variante `json_object`:\n\n```ts\nconst result = await client.execute({\n  systemPrompt: \"Devuelve solo JSON válido.\",\n  userPrompt: \"Genera un objeto con title y summary.\",\n  responseFormat: { type: \"json_object\" },\n})\n\nconsole.log(result.text)\n```\n\n`StructuredOutputFormat` es una unión discriminada por `type`, por lo que\n`type: \"json_schema\"` conserva `name`, `schema` y el `strict` opcional, mientras\nque `type: \"json_object\"` no envía ningún esquema al proveedor.\n\n### Análisis multimodal\n\nUsa `MultimodalGenerationAdapter` cuando el modelo deba analizar bytes de imagen\ny devolver texto o JSON estructurado. El contrato es agnóstico del proveedor;\ncada implementación traduce los bytes a su formato nativo sin convertirlos en\nuna descripción textual. Gemini y DeepSeek están disponibles actualmente.\n\n```ts\nimport { MultimodalGenerationAdapter } from \"@abejarano/ai-connectors\"\n\nconst client = new MultimodalGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-2.5-flash\",\n})\n\nconst result = await client.execute({\n  systemPrompt: \"Devuelve solo JSON válido.\",\n  userPrompt: \"Propón una composición para esta imagen.\",\n  images: [{ bytes: imageBytes, mimeType: \"image/png\" }],\n  responseFormat: {\n    type: \"json_schema\",\n    name: \"composition\",\n    schema: { type: \"object\" },\n  },\n})\n\nconsole.log(result.text)\n```\n\n### Generación de imágenes\n\nLa generación de imágenes está disponible actualmente sólo con `provider: \"gemini\"`.\n\n```ts\nimport { ImageGenerationAdapter } from \"@abejarano/ai-connectors\"\n\nconst client = new ImageGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-2.0-flash-preview-image-generation\",\n})\n\nconst result = await client.execute({\n  prompt: \"Una interfaz editorial para un dashboard de IA.\",\n  outputPath: \"./output/image.png\",\n  width: 1080,\n  height: 1350,\n  negativePrompt: \"evitar texto deformado, baja resolución, manos extra\",\n})\n\nconsole.log(result.asset.path)\nconsole.log(result.mimeType)\nconsole.log(result.width, result.height)\n```\n\n### Edición de imágenes (image-to-image)\n\n`edit()` es una operación distinta de `execute()`, con su propio método: le das\nuna imagen existente **como base de la edición** y una instrucción, y el modelo\ngenera una versión transformada a partir de ella, no una imagen nueva desde\ncero. Mantenerlas separadas evita un contrato ambiguo en el que no se sabe si\n`inputImages` significa \"edita esto\" o \"inspírate en esto\".\n\n> **Qué garantiza y qué no.** El proveedor acepta la imagen de entrada y la usa\n> como base, pero **preservar el sujeto, la geometría o la escena no es una\n> garantía contractual del modelo**: depende del modelo y de la instrucción, y es\n> justo lo que conviene medir en cada caso de uso antes de confiar en él.\n\n```ts\nimport { ImageGenerationAdapter } from \"@abejarano/ai-connectors\"\nimport { readFileSync } from \"node:fs\"\n\nconst client = new ImageGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-3-pro-image\",\n})\n\nconst result = await client.edit({\n  image: {\n    bytes: readFileSync(\"./input/industrial-base.jpg\"),\n    mimeType: \"image/jpeg\",\n  },\n  prompt: [\n    \"Preserva al técnico, la bomba, el manómetro y la escena.\",\n    \"Transforma esta fotografía en un key visual de campaña industrial:\",\n    \"más dirección gráfica, palette navy + orange, framing editorial,\",\n    \"profundidad, área diseñada para headline, sin texto ni logo.\",\n  ].join(\" \"),\n  outputPath: \"./output/key-visual.png\",\n})\n\nconsole.log(result.asset.path)\nconsole.log(result.mimeType)\nconsole.log(result.usage?.imageCount)\n```\n\n`edit()` devuelve el mismo `ImageGenerationResponse` que `execute()`, así que el\nasset, el MIME, las dimensiones y el `usage` se leen igual en ambos casos.\n\nDetalles del contrato:\n\n- **Los bytes y el MIME viajan tal cual.** La librería no recodifica la imagen:\n  sólo la codifica en base64 para el transporte. El `mimeType` se declara de\n  forma explícita porque el proveedor no lo adivina a partir de los bytes.\n- **Una imagen de entrada**, obligatoria. Un `bytes` vacío o un `mimeType` en\n  blanco se rechazan con `InvalidImageInputError` **antes** de llamar al\n  proveedor, en lugar de enviar una petición corrupta.\n- **Sin `imageConfig`.** No se fuerza encuadre ni aspect ratio: se deja que el\n  modelo lo decida a partir de la imagen de entrada, en vez de imponerle uno que\n  compita con la instrucción. Por eso `edit()` no acepta `width`/`height`.\n- **`outputPath` es obligatorio**, igual que en `execute()`, porque el resultado\n  se persiste en disco y se devuelve como `asset`.\n\n> ⚠️ **Defecto conocido, pendiente de un PR de seguimiento: la extensión de\n> `outputPath` puede no coincidir con el formato real de los bytes.**\n>\n> El proveedor decide el formato de salida y la librería escribe los bytes tal\n> cual en la ruta que le pases. Si pides `.png` y el modelo devuelve JPEG,\n> obtienes bytes JPEG dentro de un fichero `.png`, sin ningún aviso.\n>\n> Está verificado con `gemini-3-pro-image`, que devuelve `image/jpeg`, y afecta\n> por igual a `execute()` y a `edit()`, porque la persistencia es compartida. Es\n> un defecto **preexistente**, no introducido por `edit()`.\n>\n> **Hoy no hay workaround en la librería, a propósito**: no se renombra\n> `outputPath`, no se recodifica la imagen y no se infiere que `.png` signifique\n> \"convertir a PNG\". `result.mimeType` es la fuente de verdad del formato, así que\n> compruébalo y nombra el fichero en consecuencia.\n>\n> El arreglo previsto compara el MIME del proveedor con la extensión solicitada y\n> falla con un error explícito **antes de escribir**, incluyendo la extensión\n> pedida, el MIME del proveedor y el modelo. Se aplicará de forma consistente a\n> `execute()` y a `edit()`.\n\n- **Sólo `signal`.** `edit()` no expone `timeoutMs` ni `retryPolicy` porque hoy\n  no los aplica: prometerlos daría una falsa sensación de acotar la llamada. Para\n  acotarla, pasa tu propio `AbortSignal`.\n\n#### Capability y modelos\n\n`capabilities.imageEdit` **no es una constante del proveedor: depende del\nmodelo**, así que se evalúa sobre la instancia:\n\n```ts\nif (client.capabilities.imageEdit) {\n  await client.edit({ image, prompt, outputPath })\n}\n```\n\nLa librería sólo marca `imageEdit: true` para modelos verificados\n(`gemini-3-pro-image`, `gemini-3.1-flash-image`, `gemini-3.1-flash-lite-image`,\n`gemini-2.5-flash-image`). Con cualquier otro modelo **`edit()` falla con\n`UnsupportedImageEditCapabilityError` y no llama al proveedor**: nunca se degrada\nen silencio a text-to-image, porque eso devolvería una imagen plausible y\nequivocada. Es un error de capacidad, así que `isTransportError()` devuelve\n`false` y no se reintenta.\n\nSi has verificado que otro modelo respeta la imagen de entrada, actívalo de forma\nexplícita:\n\n```ts\nconst client = new ImageGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-modelo-nuevo\",\n  allowUnverifiedImageEdit: true,\n})\n```\n\n### Generación de video\n\nLa generación de vídeo está disponible actualmente sólo con `provider: \"gemini\"`.\n\n```ts\nimport { VideoGenerationAdapter } from \"@abejarano/ai-connectors\"\n\nconst client = new VideoGenerationAdapter({\n  provider: \"gemini\",\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: \"gemini-2.5-flash-video\",\n})\n\nconst result = await client.execute({\n  prompt: \"Un plano cinematográfico de una ciudad al amanecer.\",\n  outputPath: \"./output/video.mp4\",\n  width: 1080,\n  height: 1920,\n  durationSeconds: 8,\n})\n\nconsole.log(result.asset.path)\nconsole.log(result.mimeType)\nconsole.log(result.durationSeconds)\n```\n\n## Consumo de tokens y coste\n\nToda respuesta, sea de texto, multimodal, imagen o vídeo, incluye un `usage`\nnormalizado y agnóstico del proveedor.\n\n### Qué expone cada adapter\n\n| Adapter            | Campos de `usage`                             | Unidades               |\n| ------------------ | --------------------------------------------- | ---------------------- |\n| Texto y multimodal | `inputTokens`, `outputTokens`, `totalTokens`  | tokens                 |\n| Texto y multimodal | `cachedInputTokens`, `reasoningTokens`        | subconjuntos de tokens |\n| Imagen             | `imageCount`, `tokens`                        | imágenes y tokens      |\n| Vídeo              | `videoCount`, `durationSeconds`, `resolution` | segundos facturables   |\n\nContrato de los campos de tokens:\n\n- `inputTokens` es todo lo facturable como entrada: incluye el contenido\n  cacheado y los resultados de herramientas.\n- `cachedInputTokens` es un subconjunto de `inputTokens`; el input a tarifa\n  completa es `inputTokens - cachedInputTokens`.\n- `outputTokens` es todo lo facturable como salida: incluye el razonamiento.\n- `reasoningTokens` es un subconjunto de `outputTokens`.\n- `totalTokens` es el total declarado por el proveedor y coincide con\n  `inputTokens + outputTokens`.\n- `raw` conserva el payload original del proveedor por si necesitas un desglose\n  que la normalización no cubra.\n\nLos subconjuntos nunca se suman dos veces: si sólo te interesa el gasto total,\n`inputTokens` y `outputTokens` ya contienen todo lo facturable.\n\nCómo se construyen esos totales según el proveedor, porque no reportan igual:\n\n- **Gemini** deja los _thoughts_ fuera de `candidatesTokenCount` y los resultados\n  de herramientas fuera de `promptTokenCount`, pero los factura y los suma en\n  `totalTokenCount`. La normalización los incorpora a `outputTokens` e\n  `inputTokens` respectivamente; `reasoningTokens` conserva el desglose.\n- **DeepSeek** ya incluye el razonamiento dentro de `completion_tokens` (su\n  `completion_tokens_details` es un desglose, no un sumando), así que\n  `outputTokens` lo contiene sin sumarlo otra vez.\n\n```ts\nconst result = await client.execute({\n  systemPrompt: \"Responde de forma breve.\",\n  userPrompt: \"Escribe un titular.\",\n})\n\nconsole.log(result.usage?.inputTokens, result.usage?.outputTokens)\n```\n\n### La librería no calcula el precio\n\nLos precios cambian, dependen del contrato de cada cuenta y algunos proveedores\nlos aplican por franja horaria. Por eso el paquete **devuelve unidades\nfacturables y nunca las traduce a dinero**: el cálculo es responsabilidad de\ncada consumidor, con sus propias tarifas. `usage.estimatedCostUsd` existe\núnicamente como hueco para que adjuntes tu resultado; la librería nunca lo\nescribe.\n\nEjemplo con las tarifas publicadas de DeepSeek, que distinguen caché y franja\nhoraria ([precios oficiales](https://api-docs.deepseek.com/quick_start/pricing)):\n\n```ts\nconst result = await client.execute({ systemPrompt, userPrompt })\nconst usage = result.usage\n\nif (usage) {\n  const cacheHit = usage.cachedInputTokens ?? 0\n  const cacheMiss = (usage.inputTokens ?? 0) - cacheHit\n  const output = usage.outputTokens ?? 0\n  const isPeak = isDeepSeekPeakHour(new Date()) // 01:00-04:00 y 06:00-10:00 UTC, L-V\n\n  const cacheHitUsd = isPeak ? 0.006 : 0.003 // por 1M tokens\n  const cacheMissUsd = isPeak ? 0.3 : 0.15\n  const outputUsd = isPeak ? 1.2 : 0.6\n\n  usage.estimatedCostUsd =\n    (cacheHit * cacheHitUsd + cacheMiss * cacheMissUsd + output * outputUsd) /\n    1_000_000\n}\n```\n\nEn vídeo el proveedor factura por segundo generado, así que las unidades ya\nvienen separadas de los tokens:\n\n```ts\nconst result = await videoClient.execute({\n  prompt: \"Un plano cinematográfico de una ciudad al amanecer.\",\n  outputPath: \"./output/video.mp4\",\n  width: 1080,\n  height: 1920,\n})\n\nif (result.usage) {\n  result.usage.estimatedCostUsd =\n    result.usage.videoCount * result.usage.durationSeconds * PRICE_PER_SECOND\n}\n```\n\n## Manejo de errores\n\nEl paquete normaliza los fallos del proveedor para que el consumidor pueda reaccionar de forma consistente.\n\n- `TextTransportError`\n- `ImageTransportError`\n- `VideoTransportError`\n- `UnsupportedGenerationProviderError`\n- `UnsupportedTextGenerationCapabilityError`\n- `UnsupportedImageEditCapabilityError`\n- `InvalidImageInputError`\n\nLos errores de transporte (`TextTransportError`, `ImageTransportError`,\n`VideoTransportError`) se reconocen con `isTransportError()`, que devuelve\n`false` para los errores de capacidad y de configuración: si no es un fallo de\ntransporte, reintentar no sirve de nada.\n\nEn texto, el error expone un `retryable` en los detalles cuando el fallo parece transitorio.\n\n## Build\n\n```bash\nbun run build\n```\n\n## Tests\n\n```bash\nbun test\n```\n\n## Release\n\nEste repositorio usa `semantic-release` en la rama `main`. Los releases se calculan a partir de commits convencionales.\n\n### Tipos que generan release\n\n- `feat`: release menor\n- `fix`: release de parche\n- `perf`: release de parche\n- cambios incompatibles con `!` o con el footer `BREAKING CHANGE:`: release mayor\n\n### Tipos que no generan release por sí solos\n\n- `docs`\n- `chore`\n- `refactor`\n- `test`\n- `style`\n- `ci`\n\n### Ejemplos\n\n```text\nfeat(text): add streaming callbacks\nfix(video): handle empty generated payload\nperf(text): reduce token usage normalization overhead\nfeat!: change response format contract\n```\n\n### Formato recomendado\n\nUsa este patrón:\n\n```text\ntype(scope): summary\n```\n\nSi el cambio rompe compatibilidad, usa:\n\n```text\ntype(scope)!: summary\n```\n\no el footer:\n\n```text\nBREAKING CHANGE: descripción del cambio incompatible\n```\n\n## Publicación\n\nEl paquete está preparado para publicarse en npm mediante `semantic-release`.\n\n## Licencia\n\nPrivado.\n","readmeFilename":"README.md"}