{"_id":"@bernierllc/ai-provider-core","_rev":"12-53e428fecacd45d3344d96a649572234","name":"@bernierllc/ai-provider-core","dist-tags":{"latest":"1.6.1"},"versions":{"1.0.1":{"name":"@bernierllc/ai-provider-core","version":"1.0.1","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"6e5b11b51a0583064fe988159ccabba14607f05a","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.0.1.tgz","fileCount":66,"integrity":"sha512-F7M6fbu5VdOXapFXBQvMqYnS6JWM8qnPWmBY/cEorVWOvgMQf6AKygrnpguJOG4pldvF7HCPcGV2EhSwL3qR1g==","signatures":[{"sig":"MEUCIQCTDZwIXaeqFGygPyZfsmzBJa1GgPlu09+PM8BtSfKyLAIgA1C0rue2JvM0RTZBab9CSin4t+weSt0CpzYGs5nFGHc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145838},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"58d62967c6feabbe9d8d9a19c178e9ce7896f298","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.4.2","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@bernierllc/logger":"^1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.0.1_1760329030234_0.6333424464694195","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/ai-provider-core","version":"1.0.2","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"d3e370ec089820870a802a3823baf8dfa638be76","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.0.2.tgz","fileCount":67,"integrity":"sha512-a8gz/4Ja2YjcURfM5Ac8BoG/wPnRoveFaj35acCmnkcRAxlqAZijh6VqrxKK7k045rDDlNYH4IUeZ0OUBrklEQ==","signatures":[{"sig":"MEQCIE5abGJzT5ngqrO9ciZRvLjpscY4thM2oR66/GjL0TLYAiBVcKo7acUYd2V0qzRY3osAZVRzAibOV4Mieu+msQ9Oow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146260},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.0.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/tmp/ba97861bcbc4b6be97073bafb51247e2/bernierllc-ai-provider-core-1.0.2.tgz","_integrity":"sha512-a8gz/4Ja2YjcURfM5Ac8BoG/wPnRoveFaj35acCmnkcRAxlqAZijh6VqrxKK7k045rDDlNYH4IUeZ0OUBrklEQ==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.7.0","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@bernierllc/logger":"1.0.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.0.2_1766437720055_0.8407271333659252","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bernierllc/ai-provider-core","version":"1.0.3","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"af424cf0214f6f0ca2de4475f8e4583d5a3c70da","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.0.3.tgz","fileCount":67,"integrity":"sha512-ff3OwQCFVVTxnq9GaCycCD9lnBYbV3T8fxhbJw8vcJxKnFnOuzLIfiQlJBCHLiD0eYODQymOsIGqlJrWK6LnlA==","signatures":[{"sig":"MEUCIQDtUrr15G+rLanma7nEZ/6w6RpH64mOuLQlmJNbu/6u2AIgCEZ9jAKXvLL7L18Hjx4bX+JM/6bh7dHeU7lUMIxld7Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146442},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.0.3.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/tmp/b000cedf37d31338a6d55308198cb0c9/bernierllc-ai-provider-core-1.0.3.tgz","_integrity":"sha512-ff3OwQCFVVTxnq9GaCycCD9lnBYbV3T8fxhbJw8vcJxKnFnOuzLIfiQlJBCHLiD0eYODQymOsIGqlJrWK6LnlA==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.7.0","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@bernierllc/logger":"1.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.0.3_1766454377639_0.9297526061732657","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/ai-provider-core","version":"1.2.0","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"f4276520ad424829f361d1c01ebdae986025639b","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.2.0.tgz","fileCount":67,"integrity":"sha512-n0iL7U/31UBlBsdt0GL8BzfVc9cxrd+cUNYZI+93b3Y9SWtg34kzmzSpK6GyTMywXhesy5//8U74NE8HFY0Auw==","signatures":[{"sig":"MEUCIDoFMzYviWRxb4iNAYlFR10yCVdFVvY9z8ehI7qTEuqAAiEAyw0ZVv8RxzT8zH+0DKfspXrE5ZWqMBHVWDf6sLaNKxM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148534},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@bernierllc/logger":"1.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.2.0_1767642427693_0.606572888148482","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bernierllc/ai-provider-core","version":"1.2.1","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"ef5e84bd908723770c3f1f443934444de5b38fd9","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.2.1.tgz","fileCount":67,"integrity":"sha512-glEERXFGUDsknahIiGMhN1vo0tJzVvLb8quTVG0qPiSNhcCDLJz0DE3OkyswRZ7sNZpCqnkHgLhcyvabfWG3Eg==","signatures":[{"sig":"MEQCIBznjjwXv8JQ3mftlERfEYyQwDybwe/bWdo5J2GiiMiyAiBl/+3MSX0EgcEpQTK1jkKoSr7dXnaommPZAfDQtykQbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148692},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.2.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/tmp/e9b2cce182412654ee5cc5818441c028/bernierllc-ai-provider-core-1.2.1.tgz","_integrity":"sha512-glEERXFGUDsknahIiGMhN1vo0tJzVvLb8quTVG0qPiSNhcCDLJz0DE3OkyswRZ7sNZpCqnkHgLhcyvabfWG3Eg==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.11.0","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/logger":"1.3.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.2.1_1773078348531_0.20480340828432597","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/ai-provider-core","version":"1.2.2","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"fc1f44d91595f95e67b439b293584fdc1d0d0f3c","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.2.2.tgz","fileCount":67,"integrity":"sha512-GqvKsDOdDWJm/3TuHtSCLpUottF5sfNtiQIvZDOBDQHPUeIqQ5VtgvXvxDs22Jq07M6X7JpDUuEpmaf8qb//fQ==","signatures":[{"sig":"MEUCIQDALx/FHmwcS6vN86RPI51f6bdnTjrhNAgxLJDaMIBr1AIgQbSJAoPYGwlHNZUkNWCCeUvWe2iCjKG3P5T/K96tEmA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148908},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.2.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/ai-provider-core/bernierllc-ai-provider-core-1.2.2.tgz","_integrity":"sha512-GqvKsDOdDWJm/3TuHtSCLpUottF5sfNtiQIvZDOBDQHPUeIqQ5VtgvXvxDs22Jq07M6X7JpDUuEpmaf8qb//fQ==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.11.0","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/logger":"1.3.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.2.2_1773163002269_0.7074410949276582","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@bernierllc/ai-provider-core","version":"1.2.3","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.2.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"88e46f86ed64d92e315f9f0e278f22159354ac33","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.2.3.tgz","fileCount":67,"integrity":"sha512-JVpKWiTbNpZRdSuf+ncYqbFlgY71w2tzW8p91TBnmHGm3EaBKmJjDBo2GhUnC3c9Im8t95vmYxi5G5Vkahm18Q==","signatures":[{"sig":"MEUCIBie4e1GH/2WseE0TEmspMeIxUTfM8/KCk/rWrkC8ZYzAiEA4T5lilXt9TsS4x4A1jCbCMhjCK9RTZUr4UU2XcJ9YS0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149124},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.2.3.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/ai-provider-core/bernierllc-ai-provider-core-1.2.3.tgz","_integrity":"sha512-JVpKWiTbNpZRdSuf+ncYqbFlgY71w2tzW8p91TBnmHGm3EaBKmJjDBo2GhUnC3c9Im8t95vmYxi5G5Vkahm18Q==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.14.1","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/logger":"1.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.2.3_1779133321374_0.4671424953737997","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@bernierllc/ai-provider-core","version":"1.2.4","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.2.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"e889f7f1385233d6c687c9b86c441878f8f9f81f","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.2.4.tgz","fileCount":67,"integrity":"sha512-bk3privAo1j44/1IzBdtGWOmGWKDPU19NSyy78ZazlDHo+fqHjLIXPZ4hUxyi+b+ilTcUOEyZCRPqJGgN8/FYA==","signatures":[{"sig":"MEUCIH2bI5evDJH/q/z1Np1IDH6ezkyjkVtfz+Vin1WVo8rGAiEA/PGBAKq880IVoY3LzEz5Rej9Yc6dCbmpPhzrNBTKBrQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149340},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.2.4.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/ai-provider-core/bernierllc-ai-provider-core-1.2.4.tgz","_integrity":"sha512-bk3privAo1j44/1IzBdtGWOmGWKDPU19NSyy78ZazlDHo+fqHjLIXPZ4hUxyi+b+ilTcUOEyZCRPqJGgN8/FYA==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.14.1","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/logger":"1.4.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.2.4_1779157078329_0.6352118158935385","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/ai-provider-core","version":"1.4.0","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"33f0b67775cc66507a1153d3bc048da35d39e5b4","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.4.0.tgz","fileCount":44,"integrity":"sha512-WnZwgjuEj0vP8xdnw96/AtB3KhswGtnkr6uA53Dt7/kDBJdB7i27O8vcklJHu9cRaqfu3PikodShQ/CLY9wiww==","signatures":[{"sig":"MEUCIBEqG7E8niLLHZ2v3snu56WFJ59NxAwPIgcm67Uzt8Z3AiEAnNkFFymnLWNxY8mEETDEfDR7HBcLB006nXy4Rf+ReYk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53170},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/ai-provider-core/bernierllc-ai-provider-core-1.4.0.tgz","_integrity":"sha512-WnZwgjuEj0vP8xdnw96/AtB3KhswGtnkr6uA53Dt7/kDBJdB7i27O8vcklJHu9cRaqfu3PikodShQ/CLY9wiww==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.14.1","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/logger":"1.4.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.4.0_1779221175509_0.2569823273810652","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/ai-provider-core","version":"1.5.0","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"3bda2e17689e84cefc2a9a4a4c56b4697f9c85f7","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.5.0.tgz","fileCount":44,"integrity":"sha512-xE3ONI7i5C23szGmsfpLiV7aUdnR/ARhL8iNkOxjKYstKUtfsmwEmoSvN+LbBiCDDe/g04saDtsOLpD2MgK+oA==","signatures":[{"sig":"MEUCIQC3YRLq+oMcYsOeee8sjTbTyoxuGeD2qAyUWD7tvNoFLAIgDgNuICLAeK90RA4r6nEAFyUMwToJfbWqZEPfeepsZuw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53170},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.5.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/ai-provider-core/bernierllc-ai-provider-core-1.5.0.tgz","_integrity":"sha512-xE3ONI7i5C23szGmsfpLiV7aUdnR/ARhL8iNkOxjKYstKUtfsmwEmoSvN+LbBiCDDe/g04saDtsOLpD2MgK+oA==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.14.1","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/logger":"1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.5.0_1779240897499_0.7624158075007574","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@bernierllc/ai-provider-core","version":"1.6.0","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/ai-provider-core@1.6.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"2af45e606e7c128a299db290733bb6efb0ada9e5","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.6.0.tgz","fileCount":44,"integrity":"sha512-tsbbA/kLDo6rjHNZUgFvFILpV49m5QN/79Q/gsdOXhIAp9CwyaMsRUZV0/wUwGo+Ju40V38PBY1N1lxQtSsKcQ==","signatures":[{"sig":"MEQCIQC+pFTZ51iogu/LaCWeBRgPjPSCOfW/14Zkbe5r7BK2+wIfEBKliteMR5tq0g9dfMqnRkLBBnwvkxTzosaU+kUK4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53170},"main":"dist/index.js","_from":"file:bernierllc-ai-provider-core-1.6.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/ai-provider-core/bernierllc-ai-provider-core-1.6.0.tgz","_integrity":"sha512-tsbbA/kLDo6rjHNZUgFvFILpV49m5QN/79Q/gsdOXhIAp9CwyaMsRUZV0/wUwGo+Ju40V38PBY1N1lxQtSsKcQ==","bernierllc":{"tags":["ai","provider","abstraction","interface"],"category":"core","integration":{"logger":"optional","neverhub":"optional","docs-suite":"ready"}},"_npmVersion":"11.14.1","description":"Abstract AI provider interface for unified multi-provider AI integration","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/logger":"1.7.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-provider-core_1.6.0_1779249628013_0.7111427226158702","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"@bernierllc/ai-provider-core","version":"1.6.1","description":"Abstract AI provider interface for unified multi-provider AI integration","main":"dist/index.js","types":"dist/index.d.ts","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","dependencies":{"@bernierllc/logger":"1.7.1"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.50.0","jest":"^29.7.0","ts-jest":"^29.1.0","typescript":"^5.3.0"},"bernierllc":{"category":"core","tags":["ai","provider","abstraction","interface"],"integration":{"neverhub":"optional","logger":"optional","docs-suite":"ready"}},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","clean":"rm -rf dist"},"_id":"@bernierllc/ai-provider-core@1.6.1","_integrity":"sha512-bM//laGi+lBzUsH3nUoRnVolVl8iIlCiTW7uugktov4PZNdYRHkoi10FbyvVCi2vJDOOJKIHl1TEIxcTf9/jMQ==","_resolved":"/home/runner/work/tools/tools/packages/core/ai-provider-core/bernierllc-ai-provider-core-1.6.1.tgz","_from":"file:bernierllc-ai-provider-core-1.6.1.tgz","_nodeVersion":"24.18.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-bM//laGi+lBzUsH3nUoRnVolVl8iIlCiTW7uugktov4PZNdYRHkoi10FbyvVCi2vJDOOJKIHl1TEIxcTf9/jMQ==","shasum":"aef4eb9ae34f1b49c04171e550b20989b1e5c8b2","tarball":"https://registry.npmjs.org/@bernierllc/ai-provider-core/-/ai-provider-core-1.6.1.tgz","fileCount":44,"unpackedSize":53170,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCKjO7H5ncsIjeihD239t/Qw3I29/u/YiovFH3f3FBhZQIhAL3/9c86+VGs2W0l4tBHX0QLqhteLLxGX60uhkRxXv4n"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:afdbb26f-a233-45a2-a9f0-2afab623a8d2"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-provider-core_1.6.1_1784015487589_0.3939211020090092"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-13T04:17:10.075Z","modified":"2026-07-14T07:51:27.871Z","1.0.1":"2025-10-13T04:17:10.405Z","1.0.2":"2025-12-22T21:08:40.216Z","1.0.3":"2025-12-23T01:46:17.789Z","1.2.0":"2026-01-05T19:47:07.818Z","1.2.1":"2026-03-09T17:45:48.667Z","1.2.2":"2026-03-10T17:16:42.415Z","1.2.3":"2026-05-18T19:42:01.538Z","1.2.4":"2026-05-19T02:17:58.482Z","1.4.0":"2026-05-19T20:06:15.863Z","1.5.0":"2026-05-20T01:34:57.653Z","1.6.0":"2026-05-20T04:00:28.150Z","1.6.1":"2026-07-14T07:51:27.769Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","keywords":["ai","provider","abstraction","interface","openai","anthropic","multi-provider"],"description":"Abstract AI provider interface for unified multi-provider AI integration","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/ai-provider-core\n\nAbstract AI provider interface for unified multi-provider AI integration across OpenAI, Anthropic, and custom AI providers.\n\n## Installation\n\n```bash\nnpm install @bernierllc/ai-provider-core\n```\n\n## Features\n\n- **Provider Abstraction** - Unified interface for all AI providers\n- **Multi-Provider Support** - Seamlessly switch between providers\n- **Failover Strategies** - Automatic fallback when providers fail\n- **Cost Management** - Token estimation and cost calculation\n- **Type Safety** - Full TypeScript support with strict typing\n- **Provider Registry** - Manage multiple providers centrally\n- **Provider Comparison** - Compare capabilities, pricing, and performance\n\n## Quick Start\n\n### Implementing a Custom Provider\n\n```typescript\nimport {\n  AIProvider,\n  AIProviderConfig,\n  CompletionRequest,\n  CompletionResponse\n} from '@bernierllc/ai-provider-core';\n\nclass MyCustomProvider extends AIProvider {\n  async complete(request: CompletionRequest): Promise<CompletionResponse> {\n    // Implement your provider logic\n    return {\n      success: true,\n      content: 'AI response',\n      finishReason: 'stop'\n    };\n  }\n\n  // Implement other required methods...\n}\n\n// Use your provider\nconst provider = new MyCustomProvider({\n  providerName: 'my-provider',\n  apiKey: process.env.API_KEY!,\n  defaultModel: 'model-name'\n});\n\nconst response = await provider.complete({\n  messages: [{ role: 'user', content: 'Hello!' }]\n});\n```\n\n### Using Provider Registry\n\n```typescript\nimport { AIProviderRegistry } from '@bernierllc/ai-provider-core';\n\nconst registry = new AIProviderRegistry();\n\n// Register multiple providers\nregistry.register('openai', openaiProvider);\nregistry.register('anthropic', anthropicProvider);\n\n// Set default\nregistry.setDefault('openai');\n\n// Get healthy providers\nconst healthy = await registry.getHealthyProviders();\n\n// Use with failover\nconst provider = registry.getDefault() || registry.get(healthy[0]);\n```\n\n## Core Concepts\n\n### AIProvider Abstract Class\n\nAll provider implementations must extend `AIProvider` and implement:\n\n- `complete(request)` - Generate text completion\n- `streamComplete(request)` - Stream text completion\n- `generateEmbeddings(request)` - Generate embeddings\n- `moderate(content)` - Check content moderation\n- `getAvailableModels()` - List available models\n- `checkHealth()` - Health check endpoint\n\n### Provider Configuration\n\n```typescript\ninterface AIProviderConfig {\n  providerName: string;        // Provider identifier\n  apiKey: string;              // API key\n  organizationId?: string;     // Optional organization ID\n  baseURL?: string;            // Custom API base URL\n  version?: string;            // Provider version\n  defaultModel?: string;       // Default model to use\n  timeout?: number;            // Request timeout (ms)\n  maxRetries?: number;         // Max retry attempts\n  retryDelay?: number;         // Retry delay (ms)\n  enableLogging?: boolean;     // Enable logging\n  enableMetrics?: boolean;     // Enable metrics collection\n}\n```\n\n## API Reference\n\n### AIProvider\n\n#### Methods\n\n**complete(request: CompletionRequest): Promise<CompletionResponse>**\n\nGenerate a text completion.\n\n```typescript\nconst response = await provider.complete({\n  messages: [\n    { role: 'system', content: 'You are helpful' },\n    { role: 'user', content: 'Explain AI' }\n  ],\n  maxTokens: 100,\n  temperature: 0.7\n});\n```\n\n**streamComplete(request: CompletionRequest): AsyncGenerator<StreamChunk>**\n\nStream a text completion.\n\n```typescript\nfor await (const chunk of provider.streamComplete(request)) {\n  process.stdout.write(chunk.delta);\n}\n```\n\n**generateEmbeddings(request: EmbeddingRequest): Promise<EmbeddingResponse>**\n\nGenerate text embeddings.\n\n```typescript\nconst response = await provider.generateEmbeddings({\n  input: 'Text to embed'\n});\n```\n\n**moderate(content: string): Promise<ModerationResponse>**\n\nCheck content moderation.\n\n```typescript\nconst result = await provider.moderate('Content to check');\nif (result.flagged) {\n  console.log('Content flagged:', result.categories);\n}\n```\n\n**getAvailableModels(): Promise<ModelInfo[]>**\n\nGet available models.\n\n```typescript\nconst models = await provider.getAvailableModels();\nmodels.forEach(model => {\n  console.log(`${model.name}: ${model.contextWindow} tokens`);\n});\n```\n\n**checkHealth(): Promise<HealthStatus>**\n\nCheck provider health.\n\n```typescript\nconst health = await provider.checkHealth();\nconsole.log(`Status: ${health.status}, Latency: ${health.latency}ms`);\n```\n\n**Utility Methods**\n\n```typescript\n// Get provider info\nprovider.getProviderName();        // string\nprovider.getProviderVersion();     // string\nawait provider.isAvailable();      // boolean\n\n// Token and cost estimation\nprovider.estimateTokens(text);     // number\nprovider.estimateCost(request);    // CostEstimate\n```\n\n### AIProviderRegistry\n\n#### Methods\n\n**register(name: string, provider: AIProvider): void**\n\nRegister a provider.\n\n```typescript\nregistry.register('openai', openaiProvider);\n```\n\n**unregister(name: string): boolean**\n\nUnregister a provider.\n\n```typescript\nconst removed = registry.unregister('openai');\n```\n\n**get(name: string): AIProvider | undefined**\n\nGet a specific provider.\n\n```typescript\nconst provider = registry.get('openai');\n```\n\n**getDefault(): AIProvider | undefined**\n\nGet the default provider.\n\n```typescript\nconst provider = registry.getDefault();\n```\n\n**setDefault(name: string): void**\n\nSet the default provider.\n\n```typescript\nregistry.setDefault('anthropic');\n```\n\n**getProviderNames(): string[]**\n\nGet all provider names.\n\n```typescript\nconst names = registry.getProviderNames();\n```\n\n**getAllProviders(): AIProvider[]**\n\nGet all providers.\n\n```typescript\nconst providers = registry.getAllProviders();\n```\n\n**checkAvailability(name: string): Promise<boolean>**\n\nCheck if a provider is available.\n\n```typescript\nconst available = await registry.checkAvailability('openai');\n```\n\n**getHealthyProviders(): Promise<string[]>**\n\nGet names of all healthy providers.\n\n```typescript\nconst healthy = await registry.getHealthyProviders();\n```\n\n**getAllHealthStatuses(): Promise<Map<string, boolean>>**\n\nGet health status for all providers.\n\n```typescript\nconst statuses = await registry.getAllHealthStatuses();\nfor (const [name, isHealthy] of statuses) {\n  console.log(`${name}: ${isHealthy ? 'Healthy' : 'Unhealthy'}`);\n}\n```\n\n### Utility Functions\n\n**validateProviderConfig(config: AIProviderConfig): ValidationResult**\n\nValidate provider configuration.\n\n```typescript\nimport { validateProviderConfig } from '@bernierllc/ai-provider-core';\n\nconst result = validateProviderConfig(config);\nif (!result.isValid) {\n  console.error('Invalid config:', result.errors);\n}\n```\n\n**compareProviders(provider1: ModelInfo, provider2: ModelInfo): ProviderComparison**\n\nCompare two providers.\n\n```typescript\nimport { compareProviders } from '@bernierllc/ai-provider-core';\n\nconst comparison = compareProviders(gpt4Model, claudeModel);\nconsole.log('Better context window:', comparison.betterContextWindow);\nconsole.log('Common capabilities:', comparison.commonCapabilities);\n```\n\n**findBestProviderForCapability(providers: ModelInfo[], capability: string): ModelInfo | undefined**\n\nFind the best provider for a specific capability.\n\n```typescript\nimport { findBestProviderForCapability } from '@bernierllc/ai-provider-core';\n\nconst best = findBestProviderForCapability(models, 'vision');\nconsole.log('Best for vision:', best?.name);\n```\n\n**getCommonCapabilities(providers: ModelInfo[]): string[]**\n\nGet capabilities common to all providers.\n\n```typescript\nimport { getCommonCapabilities } from '@bernierllc/ai-provider-core';\n\nconst common = getCommonCapabilities(models);\nconsole.log('Common capabilities:', common);\n```\n\n## Type Definitions\n\n### CompletionRequest\n\n```typescript\ninterface CompletionRequest {\n  messages: Message[];\n  model?: string;\n  maxTokens?: number;\n  temperature?: number;        // 0-2\n  topP?: number;              // 0-1\n  frequencyPenalty?: number;  // -2 to 2\n  presencePenalty?: number;   // -2 to 2\n  stop?: string[];\n  stream?: boolean;\n  user?: string;\n  metadata?: Record<string, any>;\n}\n```\n\n### Message\n\n```typescript\ninterface Message {\n  role: 'system' | 'user' | 'assistant' | 'function';\n  content: string;\n  name?: string;\n  functionCall?: FunctionCall;\n}\n```\n\n### CompletionResponse\n\n```typescript\ninterface CompletionResponse {\n  success: boolean;\n  content?: string;\n  finishReason?: 'stop' | 'length' | 'content_filter' | 'function_call';\n  usage?: TokenUsage;\n  model?: string;\n  metadata?: Record<string, any>;\n  error?: string;\n}\n```\n\n### ModelInfo\n\n```typescript\ninterface ModelInfo {\n  id: string;\n  name: string;\n  contextWindow: number;\n  maxOutputTokens: number;\n  pricing?: ModelPricing;\n  capabilities: string[];\n  description?: string;\n}\n```\n\n### HealthStatus\n\n```typescript\ninterface HealthStatus {\n  status: 'healthy' | 'degraded' | 'unavailable';\n  latency?: number;\n  lastChecked: Date;\n  details?: Record<string, any>;\n}\n```\n\n## Advanced Usage\n\n### Implementing Failover\n\n```typescript\nasync function requestWithFailover(\n  registry: AIProviderRegistry,\n  request: CompletionRequest\n): Promise<CompletionResponse> {\n  const providers = await registry.getHealthyProviders();\n\n  for (const name of providers) {\n    const provider = registry.get(name);\n    if (!provider) continue;\n\n    try {\n      const response = await provider.complete(request);\n      if (response.success) {\n        return response;\n      }\n    } catch (error) {\n      console.error(`Provider ${name} failed:`, error);\n    }\n  }\n\n  throw new Error('All providers failed');\n}\n```\n\n### Load Balancing\n\n```typescript\nclass LoadBalancedProvider {\n  private registry: AIProviderRegistry;\n  private currentIndex = 0;\n  private healthyProviders: string[] = [];\n\n  async refreshHealthy() {\n    this.healthyProviders = await this.registry.getHealthyProviders();\n  }\n\n  async getNextProvider(): Promise<AIProvider | undefined> {\n    if (this.healthyProviders.length === 0) {\n      await this.refreshHealthy();\n    }\n\n    const name = this.healthyProviders[this.currentIndex % this.healthyProviders.length];\n    this.currentIndex++;\n\n    return this.registry.get(name);\n  }\n}\n```\n\n### Cost Optimization\n\n```typescript\nasync function getCheapestProvider(\n  registry: AIProviderRegistry\n): Promise<AIProvider | undefined> {\n  const providers = await registry.getHealthyProviders();\n\n  let cheapest: { provider: AIProvider; avgCost: number } | undefined;\n\n  for (const name of providers) {\n    const provider = registry.get(name);\n    if (!provider) continue;\n\n    const models = await provider.getAvailableModels();\n    if (models[0]?.pricing) {\n      const avgCost = (\n        models[0].pricing.inputPricePerToken +\n        models[0].pricing.outputPricePerToken\n      ) / 2;\n\n      if (!cheapest || avgCost < cheapest.avgCost) {\n        cheapest = { provider, avgCost };\n      }\n    }\n  }\n\n  return cheapest?.provider;\n}\n```\n\n## Examples\n\nSee the [examples](./examples) directory for complete working examples:\n\n- [custom-provider.ts](./examples/custom-provider.ts) - Implementing a custom AI provider\n- [provider-registry.ts](./examples/provider-registry.ts) - Multi-provider management and failover\n- [provider-comparison.ts](./examples/provider-comparison.ts) - Comparing providers by capabilities and cost\n\n## Integration Status\n\n- **Logger**: Optional - Use `@bernierllc/logger` for enhanced logging\n- **Docs-Suite**: Ready - Full TypeScript type documentation\n- **NeverHub**: Optional - Can integrate for service discovery\n\n## See Also\n\n- [@bernierllc/ai-provider-openai](../ai-provider-openai) - OpenAI provider implementation\n- [@bernierllc/ai-provider-anthropic](../ai-provider-anthropic) - Anthropic provider implementation\n- [@bernierllc/ai-content-generator](../ai-content-generator) - AI content generation service\n- [@bernierllc/ai-content-reviewer](../ai-content-reviewer) - AI content review service\n\n## License\n\nCopyright (c) 2025 Bernier LLC\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code only within the scope of the project it was delivered for.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n\n## Contributing\n\nThis package is part of the BernierLLC tools monorepo. Follow the MECE architecture principles and ensure 90%+ test coverage for all contributions.\n","readmeFilename":"README.md"}