{"_id":"@lasercat/homogenaize","_rev":"28-d2d7c344d3519d518c994b2e4491bd3f","name":"@lasercat/homogenaize","dist-tags":{"latest":"1.2.41"},"versions":{"1.1.2":{"name":"@lasercat/homogenaize","version":"1.1.2","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.1.2","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/rylandgoldstein/homogenaize#readme","bugs":{"url":"https://github.com/rylandgoldstein/homogenaize/issues"},"dist":{"shasum":"4811683258f53e6d1720a652643e073cd2d3fbd2","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.1.2.tgz","fileCount":39,"integrity":"sha512-i/gs5ylXUgvofo22yXyOwbVGzS4WJ61uuh1/VD5JlvPmpCaEBJxq+UZxZ/cA3tfDO+0/2McuFBMl+R0uKkl/xQ==","signatures":[{"sig":"MEYCIQDjAFuJySNVP7Zk4AkMsTAnOG96ST6HmT55ktA/6cV/mAIhAKjyd56+Nax0Oula2D0ZRLn0A9RNoQRRFl05REsX1hj+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121355},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"932629c0b5e1b67993a6acd9d118b5503716a192","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/rylandgoldstein/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.0","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.1.2_1753393374324_0.145898906090832","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@lasercat/homogenaize","version":"1.1.3","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.1.3","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"9c7e5d09e539ce10041e3b86155895e11664b6dd","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.1.3.tgz","fileCount":39,"integrity":"sha512-TttQY/D2w5Xs54LA1E4vXulVNnWEKLurD9AuBDf8DOQaURaN1uWBzgG2qdrZ6i+ua2kj68pNmLyW0CqQClNGvg==","signatures":[{"sig":"MEQCIHD6KEdNDkpx75Uv5OrGWjbqSJQYquSzOEJed5UTJlzSAiB0eMsi++l82UOPzputnqz77IfW+7fjMQtDYzJhGJ9oxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121367},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"425b2f7ada9551a0191453649c5b67f004f00a9c","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.0","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.1.3_1753393868423_0.5396334224483197","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@lasercat/homogenaize","version":"1.1.4","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.1.4","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"476e9a9dccf1ad032dd4d3f4f827324ea8c56fe9","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.1.4.tgz","fileCount":39,"integrity":"sha512-2k8QlXMbuz2ViclHPULRpPRS0n1XznDIuKWpYkQtqMB31aiH9QazieS5J0isglpIbde6yFR+W2gEGLdDi6V3OA==","signatures":[{"sig":"MEYCIQDz4F7aZDE6gZVfjM0knHAP4W7HJ+rxmXP7tAH6wQYebQIhAIR222yj1GWSSks+Ygb1nyo3RuS20Z3caSBs158+9QLu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125029},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"359ab83643673da2d7891fa0eef4950cda96ab15","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.0","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.1.4_1754424807967_0.691104616484032","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@lasercat/homogenaize","version":"1.1.5","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.1.5","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"b1fbce3e6d5b3455d7468f8b7a09daa1aa5ff933","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.1.5.tgz","fileCount":45,"integrity":"sha512-TCrJPik83/xuxhkSA8lDRr5p8KYlU3sgvOClpXw7Vg/WxTz6QxNwWVU3KVrSWnfOmaaAcyi8YifiTvMaoiLOeQ==","signatures":[{"sig":"MEUCIDMryt6kpEgQEpBr2cSgND61tX6G1GJwm7kp58/7lPFEAiEAzV3XiOak0vXuARAPaVZ8DH4k+wCvoYtnb59FAcEjVTw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361123},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"ade36ff0ab8960cc63167f353ea54e71c2886342","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.0","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.1.5_1754510394005_0.7150438479702133","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@lasercat/homogenaize","version":"1.1.6","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.1.6","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"af403e1a1592bc6088e69c0713690159f52b2eb4","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.1.6.tgz","fileCount":45,"integrity":"sha512-oFslpRotwdheKd9+m9Re5cknbvOvN6eNQfxOGl/QxHFiNzsmnT4MgtfO0t7GUz12qJhOKSeNUxwcmQjqk+6GKA==","signatures":[{"sig":"MEQCIFV18cVAKGJf7GG9yC8H7QZgpBsU9NP1xXzm9fUq15uFAiBkBLLg1tMtlZ6fia9DvYOCJ5/63k32mrPfasAI5HOmMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361470},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"1ec552d0903ded900403875a3ba5c7c9491011fd","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.0","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.1.6_1754589469412_0.022719400100479792","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@lasercat/homogenaize","version":"1.1.7","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.1.7","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"adf297898d4f1ff7c336c7e2b7c71e46bc02a114","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.1.7.tgz","fileCount":45,"integrity":"sha512-GQfQ55kgxoBLM41gLqOE7Kk9HDPhI2IOT6pDeTV6qPmbkan4xwCsmBtDWkI1W4KVpSlSnFz41dBIC2YisKfV9Q==","signatures":[{"sig":"MEQCICqg+zsFFLTKmIw0R+2ElAI/bmnMpB5MLjsdKsi6DfS1AiBC82S749GPepQWQ85hW0vMjBjSVYa8N1CCtE+Erwp0aQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":367279},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"50a1caaeec63c6f204582ab1b0dc653c343d8435","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.0","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.1.7_1754590462589_0.2987841992727467","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"@lasercat/homogenaize","version":"1.1.9","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.1.9","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"c35f3f9d0573c0f7b5d695cd2e0e2502bdb86f00","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.1.9.tgz","fileCount":49,"integrity":"sha512-GTEKfEZOEOW/yhsKTjK3shVGRU1pVyIeaEWEP+LZ05dUyT5X4t5HFJXEV0dsph77M8pBMHq3UaBzI6p4j4eP1Q==","signatures":[{"sig":"MEUCIH8k9oozWclQMVGW7BpUfEGZHpTNLNRd1Xxhpl+qZauZAiEArkYwKSEVM4xShC9I9fMY9apQuOsG0yu9MEirVux1s1E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1550100},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"24f68eeacd8a2026ee9338d36b75851421cdf257","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.1.9_1754934861923_0.24483554787770045","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@lasercat/homogenaize","version":"1.2.1","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.1","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"fadaabdb15efb7fd48611952cae775c4c4fce48d","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.1.tgz","fileCount":49,"integrity":"sha512-yGxYR8mRJ6TThY5jhdyuk6eAyhS4H7Dwey6FRFbe/EmKduPITLs9xCjbu06OpTVAKQXAeEtXsFz5XdNRPi1fzg==","signatures":[{"sig":"MEUCIQDv3qQ9jEKAZ3T7i97ynYH8TmgO/29IDAwKx1/cKXEJZQIga9NgeHLrqhsAQ8ee7q8ZQUGQhtkUz7OW+HBxXx3EMY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1575757},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"5ee3714eccbc251caf5b29eb6f39b5d1f7e49f63","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.1_1755116481178_0.2604104175589981","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@lasercat/homogenaize","version":"1.2.3","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.3","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"9b1bdb778e2adfb8e740982428c43421ede0e981","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.3.tgz","fileCount":49,"integrity":"sha512-MVfWT7/UiOOcpC6OanB0VzHHTgrWBVr6J5FKrGJJ6acSOM/5zw/mjXy6srqtkSZ2y+8Ow2K7GUtqHcXTo6GKzA==","signatures":[{"sig":"MEQCIAatHmzKST4KkhkPq8P0Xn5eR5vIlvE4pcT5wbVl64GWAiAOC7CNnjaQQEEAJ2yYLmBSc6Qkv+NpagpcDX/z4WjXwg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1573344},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"c8e533eda10c8b45dfdb555f88463da422afcffd","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.3_1755124789763_0.42304695693649075","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@lasercat/homogenaize","version":"1.2.4","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.4","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"a228741352105fe2de9c0524d7aec1f4ea85d04f","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.4.tgz","fileCount":49,"integrity":"sha512-kejkDUXs2L5QgBm9e7x+FWPkter1boutLGQ7zxAssb9TcESarv8K9yhYwQUOvtInKKenS6dAlDqLvjzj+FcGVw==","signatures":[{"sig":"MEYCIQCh/7+wAdgc9AtMT0A6R26XKMEQYuQS6/Wmu3TCNtA5yQIhAJCjVOfgnaF/ZlLN2pBfrVKTPMkkS3gktx7OzKhMfPA1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1573882},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"91d12b987c00e2e352a49527edd17c428f22ca09","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.4_1755127540968_0.07988629169851835","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@lasercat/homogenaize","version":"1.2.5","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.5","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"8dd350e0f3600c48b37935415f50802bf987f11a","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.5.tgz","fileCount":49,"integrity":"sha512-r3spguf4o1bTaWz8nlMMH/9pRjvRBg978dfaKelmiru/AS+sc/klsGZnoQ1bxWAEA/aZq5D2oShUnJ560FCV/A==","signatures":[{"sig":"MEUCIFT2m0r2362cSK8Eobz7GCVI3SOxvRNTEYzpZuZG1x2hAiEAo2JifhNbtTxOF+94ilbPf5/L1TzGSP4y0s45Gl2mcyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1572887},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"98e4eb2aabdf34ca1de0a0703e89e637bc805e28","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.4","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.5_1755201643456_0.4349932870897557","host":"s3://npm-registry-packages-npm-production"}},"1.2.10":{"name":"@lasercat/homogenaize","version":"1.2.10","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.10","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"d042f3fdaff9e188a57d9c79f6abf65dface5652","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.10.tgz","fileCount":49,"integrity":"sha512-gwAt7TX4nsZv2uRHtWddUmGzVZPqPdcPXAoC2U7hNeM5w9LqSyPpwtyjohXzKl+EOoYY1OqstlezkR0LVNGkIA==","signatures":[{"sig":"MEYCIQCoX5DLp503XipG8TQyZMRY1mnTM53ZCaRi2GMP67UtwwIhAKtDbJQaaE1FRgde5YG55htAXDja8B4B3vWvDpKMtkG+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1578278},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"cfecefa8372578b688e7efa2355435ef3820b852","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.10_1758153979608_0.8487661263155304","host":"s3://npm-registry-packages-npm-production"}},"1.2.11":{"name":"@lasercat/homogenaize","version":"1.2.11","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.11","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"5acd506a5dd54dd02ddfbdb308b44fb246cb4ada","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.11.tgz","fileCount":49,"integrity":"sha512-jQUm7yx7jR8twJRFcrd70DkWWnzkJiGhBdJGdknYxxLCObl/FIMS9ebzSW0JzXoXvHpEt+eLuJ0THRdVn/YPeg==","signatures":[{"sig":"MEYCIQD5LGXi7RPubeZL5EEuJxkS5vxp4SUtsZRR+HZ2SWe/GAIhAL5XyZmCu4deuGw3JsrMW4nSuWPy1ozQMk91p/rlOc5r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1578369},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"8e16100a7fa282fbdecea0644a6cb311525f38eb","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.11_1758161858839_0.8852493205990077","host":"s3://npm-registry-packages-npm-production"}},"1.2.13":{"name":"@lasercat/homogenaize","version":"1.2.13","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.13","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"4cb4c93fe597d3a6c6e236df06b74474d25a6a8b","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.13.tgz","fileCount":49,"integrity":"sha512-64mN8KtiOr1qgHiVTTf9QJIn8w/iG0aSwMuUdLNkGP5/Uc9n9+6c79UKX1wyfwQ/zrR/7VRKzS2cQkieAmRR2Q==","signatures":[{"sig":"MEUCIAHVP3FibmN4MQufodAjB9Dn9voiCjgW7LUvvOIaB0wzAiEAtjbqRjrIpQPA86MemBgfUSnWhBrj9TgAj3phb4Az4eY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1579628},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"90b7a3843271aaf00e64b5f36f96fd1361f36f23","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.13_1758225495549_0.8724307224925705","host":"s3://npm-registry-packages-npm-production"}},"1.2.14":{"name":"@lasercat/homogenaize","version":"1.2.14","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.14","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"48be895c6a8184fcf2f9ee42778c0563cb695e6b","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.14.tgz","fileCount":49,"integrity":"sha512-OdkGSuugbkpifhiEXQ2iaYnKhfb37Y29O9qNhrnYkAfLPRAnPtC4tJU23y0EwTGVTN2YAXbxyozwFMQFY6ntKA==","signatures":[{"sig":"MEQCIDi8P6IT+gbXJUPuSdxRuUCFF3mD/kulIIVEIzytV3DZAiAFuo7Nk2Z3ECsC72eYsxG+X/2P7XbpSgkbNVbAETZ7Sw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1579628},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"eb09179ff40095b3b098856d08c392973f6e79c9","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.14_1758226963245_0.7171774403716735","host":"s3://npm-registry-packages-npm-production"}},"1.2.15":{"name":"@lasercat/homogenaize","version":"1.2.15","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.15","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"a0f9523535394cee68630d3f5f926da251d48d96","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.15.tgz","fileCount":49,"integrity":"sha512-qBz5axaYDmQlg3Jtf3g7ELDA+CeP4sgrZ7f/jLgdWCQ+GR0V3yDJY78fo/Ce64zeN7yXaMzz4XJSIe2RctbOQg==","signatures":[{"sig":"MEUCIQDsrwedzHGVP56EGuJG/OA5Jw7SmwYOzUBGfSbKcIICngIgX0eAEfFn5fifSevHBz+1sM0cBsqv4K8joiiKqs7LbhE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1580373},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"5689eb57707036445b680e8f52780b720cd537da","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.15_1758232268620_0.2595988191699612","host":"s3://npm-registry-packages-npm-production"}},"1.2.17":{"name":"@lasercat/homogenaize","version":"1.2.17","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.17","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"f6f83fa4cdcab8a4cb40e4c6e3e8ff6ff0004dcc","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.17.tgz","fileCount":49,"integrity":"sha512-HhIYj5t404rT2j3MgdDKLKb9B3vPMQogBvomzYp8gWXiJ696sEeCEzzLcbTxdE8PN1KeCxhN1tT2aXrhKVgVxw==","signatures":[{"sig":"MEQCIBbkCpGjnSbdJLsdI2wRQMi7kFxD+ur7AETp46+721qnAiA2BOXOp5+kLDHQiK5E9LiiHnsRPzrsyjMwe1oVqJY2Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1582144},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"54a4347a3ba6f67b9d6ec34e211cd0c067dcad3c","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.17_1758756932019_0.10102604969172635","host":"s3://npm-registry-packages-npm-production"}},"1.2.19":{"name":"@lasercat/homogenaize","version":"1.2.19","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.19","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"7d2749456625c10bd0a84eeac9cea106f1d8a6d4","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.19.tgz","fileCount":49,"integrity":"sha512-GdA72/+L6dIEQThy780odVtaYDRKXMh90U9oXbkFSTVQEv8Szr4U71WvlC4m9w77Xie/tOrpTbADf25EzJkSyg==","signatures":[{"sig":"MEUCIGqYQTLGCzEqvIHTKa96EQ8xLg/uH9sU83IsUszyvDEcAiEA6VByI6OPxlF3QULMTg1l8xAK5Fkk+7GB9iB0On66suw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1582472},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"0c743fafd4a4c6c675aa05ee5fd1381375da17c6","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.19_1758826252478_0.46038486644947585","host":"s3://npm-registry-packages-npm-production"}},"1.2.20":{"name":"@lasercat/homogenaize","version":"1.2.20","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.20","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"fc70ffccd3d1d41ec3893af5ae334be9da4bc950","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.20.tgz","fileCount":49,"integrity":"sha512-F3WooAK/hnbP4JzZNQPnfsjE3sZWTwcSGF0940Zlp9HRcZCtLLs2KvniPk4EF7mu5JIC5Z/zulYo4Yk5/9gsCA==","signatures":[{"sig":"MEQCIDIlqHfXs42a2sZrHn276/rsr20TrbODqv45hVtfCqmGAiBhLMJw5P3699rMaeTA6mlpGzc5XVQ13lXTDIYwQkZJrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1585281},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"e304685278d05b80b299aa6e45d63d5763a0c500","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0","winston":"^3.17.0","winston-transport-browserconsole":"^1.0.5"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@types/winston":"^2.4.4","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.20_1758827496455_0.47685612704582936","host":"s3://npm-registry-packages-npm-production"}},"1.2.21":{"name":"@lasercat/homogenaize","version":"1.2.21","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.21","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"fa5d4e646c30e6c6ebb9e60655ac54b37664bcfb","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.21.tgz","fileCount":49,"integrity":"sha512-/rgyRYivmv9u5UbtM+emmWaFJsExX1nXbhBR55OSfipJHNvZUSmzYssGa7jT53cshxy4jmc4hiqv1GFnB8k7xg==","signatures":[{"sig":"MEUCIBFXiMYPeu32WVHd7BGWmUKV2U0iYNpl7VfcaBjWwGdRAiEAqKmtKSvrq77Ae6oDp+Wk45pRePiMG3bN6ZWJ0vDNeEs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434107},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"4150e43601dc32c1c41b8f145cc2ea24bc5eaa44","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.21_1758828698766_0.8762366788992497","host":"s3://npm-registry-packages-npm-production"}},"1.2.25":{"name":"@lasercat/homogenaize","version":"1.2.25","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.25","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"45e1dcfe8117f2300c72e7f83ef8a6f6687df828","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.25.tgz","fileCount":49,"integrity":"sha512-pW2tlp698LlzOYeRvJxoKKedP5z4lxsF5pCnfxk2DjMshcSn5AGAfl47WtEdgGmoqUOPyW3m+AaOoPaKQLF7kA==","signatures":[{"sig":"MEYCIQDG+jCSKZgZN7+Kfvv56kJ+FawvBD6ezvLJLSMvNaGAwAIhAK+dSRsmiOxcYhOGLw3Q8YWImJR0PWVB3Rxe+IAKfA9G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434281},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"0130de3a7fb3f575f5088c035092580d29ff9b91","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.25_1759603980386_0.9907667314051241","host":"s3://npm-registry-packages-npm-production"}},"1.2.30":{"name":"@lasercat/homogenaize","version":"1.2.30","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.30","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"2f5b686219509bf5d7c15a5cded598116895a36e","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.30.tgz","fileCount":49,"integrity":"sha512-HSbQ3wCrnx8hfrRSc3VldaY3d295EShL4ykyaekFJI2a+koSv5ENOPDP6okOe/6vkFxiA5nr4MsA/LuLv0BjIQ==","signatures":[{"sig":"MEUCIQDWGMEA2aQ9lBDZ+EsAvnYBBcJ/Vx0FhPCh0v8zZRKgGQIgW1JK+k6CrFHADpdZoxnSWtEFW5RXQr2sfp/CjbjgFLw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":438137},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"2621202f5c2657df3e2d22c14fbc099235877b85","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.30_1760120094810_0.8467797096379142","host":"s3://npm-registry-packages-npm-production"}},"1.2.31":{"name":"@lasercat/homogenaize","version":"1.2.31","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.31","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"56d22ce3b5c0adfeb88282b5e742e9069c662b71","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.31.tgz","fileCount":49,"integrity":"sha512-5aPpvA2ggh91gvVxY6yBRaFoiWsbxfR4ixv0GwYM0xwcKgmJRr93kjZDpGop6+91Z9f5mPYOWlN7U09f5fQoqA==","signatures":[{"sig":"MEUCIQDeaL2/7dw0/ZioRGWwKnDYvV/Vub6hbHXE2kmd5XTDBAIgBXH2SbnP+4mNmaE3Cv5rZ6ZlQeAJVQHil9SmgJS1GjY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":439619},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"055c224c68476ff2911e26160dbdf18ef2445e90","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.31_1760381964750_0.3304576724154189","host":"s3://npm-registry-packages-npm-production"}},"1.2.35":{"name":"@lasercat/homogenaize","version":"1.2.35","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.35","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"09185f95e818ad5cfc46da1e2e278b589bd4ee49","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.35.tgz","fileCount":49,"integrity":"sha512-3EV26oVK/yqrhdt4xgQzKaYXuiJqq+tsyT1baTqFlhZKHzmNwNjLTI3SlWzHk3zh/gz6tvxoNL5zvXkeso3hSg==","signatures":[{"sig":"MEUCIQCtBmiMj7PcnDkz/uqqCi9dV5twnC9qy+5nO8xLuFzzUQIgaS0W53JOyAFHQAIxDnS62Gyln4S6siHSfWxHxi52GSw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444209},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"bd7909fe12e16157ec14c53380dfd67c743404f8","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.35_1760725995760_0.20478519161027142","host":"s3://npm-registry-packages-npm-production"}},"1.2.37":{"name":"@lasercat/homogenaize","version":"1.2.37","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.37","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"6b5e2003b0511fba1dff49a9ca506cdc65ccf6a3","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.37.tgz","fileCount":49,"integrity":"sha512-sOLY+0gCMIwdHGxsUztn5ErTOEvvhFkUoDYufSDqi52meWVX8uKiooyDTFpaARsrbN+WtpDo7SjZmSIT/s7vnw==","signatures":[{"sig":"MEUCIANsmJYFiJilRUB9YU7dsg440Xh1FoClpIvpeDdIxibIAiEAzR4kS/BR5CLEcveOqsM383t85j5RVE7+Jv6GbqQi+Hc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444677},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"c9a1649d83c30a01aa270e36fe747fa723d31b70","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.37_1760980791381_0.6210357817267962","host":"s3://npm-registry-packages-npm-production"}},"1.2.39":{"name":"@lasercat/homogenaize","version":"1.2.39","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.39","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"d992b4ced86e4642f6ca0c81ecc5fd60275111e5","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.39.tgz","fileCount":51,"integrity":"sha512-8H3B19mXU65tx3xHDSDuWiP5jEqKAkoQiR/gJXV8uLzdcS29QWnFdpiDWAW1otxDSlDKW47caMrwtXCxBDBf0Q==","signatures":[{"sig":"MEUCIQDMEdwYDkxTCPbeCl9gbGqdGiSVuRWX1Nsvv1q1HiRj8gIgVvujQr2F12qvTsTEQPMTGg+TGJxdu4OFaIaG+oUEQXU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":445839},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"aed5d349a8d41e31ef4f00ed67945ac42f75bebe","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.39_1761075793149_0.10210739611584674","host":"s3://npm-registry-packages-npm-production"}},"1.2.40":{"name":"@lasercat/homogenaize","version":"1.2.40","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"author":{"name":"Ryland Goldstein"},"license":"MIT","_id":"@lasercat/homogenaize@1.2.40","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"homepage":"https://github.com/lasercat-industries/homogenaize#readme","bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"dist":{"shasum":"b3e441b7adff4677f9b4599e4045ea4944ffddec","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.40.tgz","fileCount":51,"integrity":"sha512-FNgOgLnvAe2cFrbHw867/TTlhh5kf8TzaiP8pachXMrx61rfWGepRvgTqGpeRrUdEpWoPmlkOfb8JR6C6wDlmQ==","signatures":[{"sig":"MEYCIQD/BrVb+jPh9tUgXeaMkQk/B71Tvtra1AT4jrYVanAuqwIhAOdH9SbWZubJ52bg7jQnBWOiIDS8RbylMqs5KQCbyJQB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":450050},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"gitHead":"135f00aec2a86746b81fb08294c11680d58cf055","scripts":{"lint":"eslint .","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","postbuild":"bun run build:validate","typecheck":"tsc --noEmit","build:size":"bun run build && bunx size-limit","build:check":"bun run build && bunx publint && bunx attw --pack","list-models":"bun run scripts/list-models.ts","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"prettier":"@lasercat/config/.prettierrc.json","repository":{"url":"git+https://github.com/lasercat-industries/homogenaize.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.17","dotenv":"^17.2.0","eslint":"^9.30.1","prettier":"^3.6.2","uuid-mcp":"^1.0.0","@eslint/js":"^9.30.1","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","@lasercat/config":"^1.2.3","typescript-eslint":"^8.36.0","zod-to-json-schema":"^3.24.6","eslint-plugin-import":"^2.32.0","eslint-plugin-regexp":"^2.9.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-security":"^3.0.1","eslint-plugin-unused-imports":"^4.1.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-import-resolver-typescript":"^4.4.4"},"peerDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/homogenaize_1.2.40_1761078216326_0.5761157157835375","host":"s3://npm-registry-packages-npm-production"}},"1.2.41":{"name":"@lasercat/homogenaize","version":"1.2.41","description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","author":{"name":"Ryland Goldstein"},"license":"MIT","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./types":{"types":"./dist/types/index.d.ts"},"./package.json":"./package.json"},"keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"repository":{"type":"git","url":"git+https://github.com/lasercat-industries/homogenaize.git"},"bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"homepage":"https://github.com/lasercat-industries/homogenaize#readme","scripts":{"prebuild":"bun run clean && ([ \"$DONT_GEN_MODEL_TYPES\" = \"true\" ] || bun run generate-model-types)","build":"bunx tsc -p tsconfig.build.json && bun run scripts/build.ts","postbuild":"bun run build:validate","build:analyze":"bun run build && bunx source-map-explorer dist/*.js","build:check":"bun run build && bunx publint && bunx attw --pack","build:size":"bun run build && bunx size-limit","build:validate":"bun -e 'import(\"./dist/index.js\").then(() => console.log(\"✅ ESM import works\"))'","clean":"bun run scripts/clean.ts","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","format:check":"prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\" --ignore-path ./node_modules/@lasercat/config/.prettierignore","typecheck":"tsc --noEmit","lint":"eslint .","list-models":"bun run scripts/list-models.ts","list-chat-models":"bun run scripts/list-chat-models.ts","generate-model-types":"bun run scripts/generate-model-types.ts"},"devDependencies":{"@eslint/js":"^9.30.1","@lasercat/config":"^1.2.3","@types/ajv":"^1.0.4","@types/bun":"latest","@types/node":"^24.0.13","dotenv":"^17.2.0","eslint":"^9.30.1","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-regexp":"^2.9.0","eslint-plugin-security":"^3.0.1","eslint-plugin-unicorn":"^59.0.1","eslint-plugin-unused-imports":"^4.1.4","prettier":"^3.6.2","typescript-eslint":"^8.36.0","uuid-mcp":"^1.0.0","zod":"^4.0.17","zod-to-json-schema":"^3.24.6"},"prettier":"@lasercat/config/.prettierrc.json","peerDependencies":{"typescript":"^5.8.3"},"dependencies":{"ajv":"^8.17.1","openai":"^5.12.0"},"_id":"@lasercat/homogenaize@1.2.41","gitHead":"9df06fa6f980b721605dc5678685537166440136","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-IN3/rhIHpcfcuxcI8jaNlkOuI5p03TZF01tI3VUGSgfG1sMce6RGfcb+GE1Eq5ZAZAXfh60IpySixE5KQvdK5Q==","shasum":"b505d93856c5d637c3f268c254f6bda8cdd0b194","tarball":"https://registry.npmjs.org/@lasercat/homogenaize/-/homogenaize-1.2.41.tgz","fileCount":51,"unpackedSize":455156,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAgjaqdDCWbuONtpiy+Ik9qgG49c3rAQXCJyP/xxH1qNAiBUOj0dVFck4uCnDC43HHErbTHAqyL/AMUIoBdVslmUsw=="}]},"_npmUser":{"name":"rylasercat","email":"ryland@lasercat.ai"},"directories":{},"maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/homogenaize_1.2.41_1765681862612_0.17002190575419718"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-24T21:42:54.259Z","modified":"2025-12-14T03:11:03.011Z","1.1.2":"2025-07-24T21:42:54.540Z","1.1.3":"2025-07-24T21:51:08.688Z","1.1.4":"2025-08-05T20:13:28.151Z","1.1.5":"2025-08-06T19:59:54.190Z","1.1.6":"2025-08-07T17:57:49.599Z","1.1.7":"2025-08-07T18:14:22.810Z","1.1.9":"2025-08-11T17:54:22.188Z","1.2.1":"2025-08-13T20:21:21.423Z","1.2.3":"2025-08-13T22:39:49.983Z","1.2.4":"2025-08-13T23:25:41.270Z","1.2.5":"2025-08-14T20:00:43.662Z","1.2.10":"2025-09-18T00:06:19.859Z","1.2.11":"2025-09-18T02:17:39.068Z","1.2.13":"2025-09-18T19:58:15.749Z","1.2.14":"2025-09-18T20:22:43.565Z","1.2.15":"2025-09-18T21:51:08.886Z","1.2.17":"2025-09-24T23:35:32.278Z","1.2.19":"2025-09-25T18:50:52.721Z","1.2.20":"2025-09-25T19:11:36.693Z","1.2.21":"2025-09-25T19:31:39.002Z","1.2.25":"2025-10-04T18:53:00.598Z","1.2.30":"2025-10-10T18:14:55.059Z","1.2.31":"2025-10-13T18:59:24.931Z","1.2.35":"2025-10-17T18:33:16.003Z","1.2.37":"2025-10-20T17:19:51.627Z","1.2.39":"2025-10-21T19:43:13.334Z","1.2.40":"2025-10-21T20:23:36.593Z","1.2.41":"2025-12-14T03:11:02.768Z"},"bugs":{"url":"https://github.com/lasercat-industries/homogenaize/issues"},"author":{"name":"Ryland Goldstein"},"license":"MIT","homepage":"https://github.com/lasercat-industries/homogenaize#readme","keywords":["llm","ai","openai","anthropic","gemini","typescript","unified-api","gpt","claude","structured-output","zod"],"repository":{"type":"git","url":"git+https://github.com/lasercat-industries/homogenaize.git"},"description":"A TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini)","maintainers":[{"name":"stevekinney","email":"hello@stevekinney.net"},{"name":"rylasercat","email":"ryland@lasercat.ai"}],"readme":"# Homogenaize\n\nA TypeScript-native library that provides a unified interface for multiple LLM providers (OpenAI, Anthropic, Gemini), with full type safety and runtime validation using Zod and JSON Schema.\n\n## Features\n\n- 🔥 **Unified API** - Single interface for OpenAI, Anthropic, and Gemini\n- 🛡️ **Type Safety** - Full TypeScript support with provider-specific features\n- 🎨 **Typed Model Names** - Autocomplete and compile-time validation for model names\n- ✅ **Runtime Validation** - Zod schemas and JSON Schema for structured outputs\n- 📐 **JSON Schema Support** - Use typed `JSONSchemaType<T>` or generic JSON Schema alongside Zod\n- 🔄 **Streaming Support** - Async iterators for real-time responses\n- 🛠️ **Tool Calling** - Define and execute tools with automatic validation\n- 🎯 **Provider Features** - Access provider-specific capabilities while maintaining type safety\n- 🔁 **Retry Logic** - Built-in exponential backoff with configurable retry strategies\n- 🚫 **Request Cancellation** - Cancel in-flight requests and retry loops with AbortSignal\n- 📋 **Model Discovery** - List available models for each provider\n- 🧠 **Thinking Tokens** - Support for Anthropic's thinking tokens feature\n- 📊 **Structured Logging** - Configurable Winston logging with automatic sensitive data redaction\n\n## Installation\n\n```bash\nbun add homogenaize\n# or\nnpm install homogenaize\n# or\nyarn add homogenaize\n```\n\n## Quick Start\n\n```typescript\nimport { createLLM, createOpenAILLM, createAnthropicLLM, createGeminiLLM } from 'homogenaize';\n\n// Option 1: Generic client (recommended for flexibility)\nconst client = createLLM({\n  provider: 'openai', // or 'anthropic' or 'gemini'\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o-mini', // ✨ Typed! Autocompletes valid models\n});\n\n// Option 2: Provider-specific clients (for better type hints)\nconst openai = createOpenAILLM({\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o-mini', // ✨ Only OpenAI models allowed\n});\n\nconst anthropic = createAnthropicLLM({\n  apiKey: process.env.ANTHROPIC_API_KEY!,\n  model: 'claude-3-sonnet-20240229', // ✨ Only Anthropic models allowed\n});\n\nconst gemini = createGeminiLLM({\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: 'gemini-2.5-flash', // ✨ Only Gemini models allowed\n});\n\n// Use the same interface for all providers\nconst response = await client.chat({\n  messages: [\n    { role: 'system', content: 'You are a helpful assistant' },\n    { role: 'user', content: 'Hello!' },\n  ],\n  temperature: 0.7,\n});\n\nconsole.log(response.content);\n```\n\n## Generic API (Provider Type Pollution Avoidance)\n\nIf you want to avoid provider types spreading throughout your codebase (at the cost of compile-time model validation), use the Generic API:\n\n```typescript\nimport {\n  createGenericLLM,\n  createGenericOpenAI,\n  createGenericAnthropic,\n  createGenericGemini,\n} from 'homogenaize';\n\n// Generic API - no provider type parameters needed\nconst client = createGenericLLM({\n  provider: 'openai', // Runtime provider selection\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4', // Any string accepted (no compile-time validation)\n});\n\n// Provider-specific generic factories\nconst openai = createGenericOpenAI({\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4', // Any string model name\n});\n\n// Switch providers at runtime without type changes\nfunction createClient(provider: string) {\n  return createGenericLLM({\n    provider: provider as any,\n    apiKey: getApiKey(provider),\n    model: getModel(provider),\n  });\n}\n\n// Same interface, no type pollution\nconst response = await client.chat({\n  messages: [{ role: 'user', content: 'Hello!' }],\n});\n\n// Still supports all features (schemas, tools, streaming)\nconst structuredResponse = await client.chat({\n  messages: [{ role: 'user', content: 'Generate data' }],\n  schema: MyZodSchema, // Still works with Zod/JSON Schema\n});\n```\n\n### When to Use Generic vs Type-Safe API\n\n**Use the Type-Safe API when:**\n\n- You want compile-time validation of model names\n- You need IDE autocomplete for provider-specific features\n- You're working with a single provider\n- Type safety is more important than flexibility\n\n**Use the Generic API when:**\n\n- You need to switch providers dynamically at runtime\n- You want to avoid provider types in your function signatures\n- You're building provider-agnostic abstractions\n- You're willing to trade compile-time safety for flexibility\n\n## Structured Outputs\n\nDefine schemas using Zod or JSON Schema and get validated, typed responses from any provider:\n\n### Using Zod Schemas\n\n```typescript\nimport { z } from 'zod';\nimport { createLLM } from 'homogenaize';\n\nconst PersonSchema = z.object({\n  name: z.string(),\n  age: z.number(),\n  occupation: z.string(),\n  hobbies: z.array(z.string()),\n});\n\nconst client = createLLM({\n  provider: 'openai', // or 'anthropic' or 'gemini'\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o-mini',\n});\n\n// Get validated, typed responses\nconst response = await client.chat({\n  messages: [{ role: 'user', content: 'Generate a random person profile' }],\n  schema: PersonSchema,\n});\n\n// response.content is fully typed as { name: string, age: number, occupation: string, hobbies: string[] }\nconsole.log(response.content.name); // TypeScript knows this is a string\nconsole.log(response.content.hobbies[0]); // TypeScript knows this is a string[]\n```\n\n### Using JSON Schema\n\nYou can use JSON Schema with full TypeScript type safety using AJV's `JSONSchemaType`:\n\n```typescript\nimport type { JSONSchemaType } from 'ajv';\nimport { createLLM } from 'homogenaize';\n\ninterface PersonData {\n  name: string;\n  age: number;\n  occupation: string;\n  hobbies: string[];\n}\n\n// Typed JSON Schema - provides compile-time type checking\nconst PersonSchema: JSONSchemaType<PersonData> = {\n  type: 'object',\n  properties: {\n    name: { type: 'string' },\n    age: { type: 'number' },\n    occupation: { type: 'string' },\n    hobbies: {\n      type: 'array',\n      items: { type: 'string' },\n    },\n  },\n  required: ['name', 'age', 'occupation', 'hobbies'],\n  additionalProperties: false,\n};\n\nconst client = createLLM({\n  provider: 'anthropic',\n  apiKey: process.env.ANTHROPIC_API_KEY!,\n  model: 'claude-3-sonnet-20240229',\n});\n\n// Get validated, typed responses with JSON Schema\nconst response = await client.chat({\n  messages: [{ role: 'user', content: 'Generate a random person profile' }],\n  schema: PersonSchema,\n});\n\n// response.content is fully typed as PersonData\nconsole.log(response.content.name); // TypeScript knows this is a string\nconsole.log(response.content.age); // TypeScript knows this is a number\n```\n\n### Using Generic JSON Schema\n\nFor dynamic schemas or when type safety isn't required:\n\n```typescript\nimport { createLLM } from 'homogenaize';\n\n// Generic JSON Schema without compile-time type checking\nconst DynamicSchema = {\n  type: 'object',\n  properties: {\n    result: { type: 'string' },\n    confidence: { type: 'number', minimum: 0, maximum: 1 },\n    tags: {\n      type: 'array',\n      items: { type: 'string' },\n    },\n  },\n  required: ['result', 'confidence'],\n};\n\nconst client = createLLM({\n  provider: 'gemini',\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: 'gemini-2.5-flash',\n});\n\nconst response = await client.chat({\n  messages: [{ role: 'user', content: 'Analyze this text and provide results' }],\n  schema: DynamicSchema,\n});\n\n// response.content is typed as unknown when using generic schemas\n// You'll need to cast or validate the type yourself\nconst data = response.content as {\n  result: string;\n  confidence: number;\n  tags?: string[];\n};\nconsole.log(data.result);\n```\n\n## Streaming Responses\n\n```typescript\nconst stream = await client.stream({\n  messages: [{ role: 'user', content: 'Write a short story' }],\n  maxTokens: 1000,\n});\n\n// Stream chunks as they arrive\nfor await (const chunk of stream) {\n  process.stdout.write(chunk);\n}\n\n// Get the complete response with usage stats\nconst complete = await stream.complete();\nconsole.log(`Total tokens used: ${complete.usage.totalTokens}`);\n```\n\n## Tool Calling\n\n```typescript\n// Define a tool with schema validation\nconst weatherTool = client.defineTool({\n  name: 'get_weather',\n  description: 'Get the current weather for a location',\n  schema: z.object({\n    location: z.string().describe('City and country'),\n    units: z.enum(['celsius', 'fahrenheit']).optional(),\n  }),\n  execute: async (params) => {\n    // Your implementation here\n    return { temperature: 22, condition: 'sunny', location: params.location };\n  },\n});\n\n// Let the model decide when to use tools\nconst response = await client.chat({\n  messages: [{ role: 'user', content: \"What's the weather in Paris?\" }],\n  tools: [weatherTool],\n  toolChoice: 'auto', // or 'required' to force tool use\n});\n\n// Execute any tool calls\nif (response.toolCalls) {\n  const results = await client.executeTools(response.toolCalls);\n  console.log('Tool results:', results);\n  // Example result:\n  // [\n  //   {\n  //     toolCallId: 'call-123',\n  //     toolName: 'get_weather',\n  //     result: { temperature: 22, condition: 'sunny', location: 'Paris' }\n  //   }\n  // ]\n}\n```\n\n### Tool Calls with Streaming\n\nTool calls work seamlessly with streaming. When the model decides to call a tool during a streaming request, the tool calls are available after calling `complete()`:\n\n```typescript\nconst weatherTool = client.defineTool({\n  name: 'get_weather',\n  description: 'Get the current weather for a location',\n  schema: z.object({\n    location: z.string().describe('City and country'),\n  }),\n  execute: async (params) => {\n    return { temperature: 22, condition: 'sunny', location: params.location };\n  },\n});\n\n// Start a streaming request with tools\nconst stream = await client.stream({\n  messages: [{ role: 'user', content: \"What's the weather in Paris and London?\" }],\n  tools: [weatherTool],\n  toolChoice: 'auto',\n});\n\n// Stream any text content (may be empty if model only calls tools)\nfor await (const chunk of stream) {\n  process.stdout.write(chunk);\n}\n\n// Get the complete response including tool calls\nconst complete = await stream.complete();\n\n// Check for tool calls\nif (complete.toolCalls) {\n  console.log(`Model called ${complete.toolCalls.length} tool(s)`);\n\n  // Execute the tools\n  const results = await client.executeTools(complete.toolCalls);\n\n  // Each result contains:\n  // - toolCallId: unique identifier for this call\n  // - toolName: which tool was called\n  // - result: the return value from execute()\n  // - error?: any error message if execution failed\n  for (const result of results) {\n    console.log(`${result.toolName}: ${JSON.stringify(result.result)}`);\n  }\n}\n\n// Token usage is also available\nconsole.log(`Total tokens: ${complete.usage.totalTokens}`);\n```\n\n**Note:** During streaming, text content is yielded as chunks, but tool calls are only available after calling `complete()`. This is because tool call arguments are streamed incrementally and must be fully assembled before they can be parsed and executed.\n\n## List Available Models\n\nDiscover available models for each provider:\n\n```typescript\n// List models for a specific provider\nconst models = await client.listModels();\n\n// Example response\n[\n  { id: 'gpt-4', name: 'gpt-4', created: 1687882411 },\n  { id: 'gpt-3.5-turbo', name: 'gpt-3.5-turbo', created: 1677610602 },\n  // ... more models\n];\n\n// Use the scripts to list all models across providers\n// Run: bun run list-models\n// Output: JSON with all models from all configured providers\n\n// Or list only chat models\n// Run: bun run list-chat-models\n// Output: Filtered list of chat-capable models\n```\n\n## Retry Configuration\n\nConfigure automatic retries with exponential backoff:\n\n```typescript\nimport { createLLM } from 'homogenaize';\n\nconst client = createLLM({\n  provider: 'openai',\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o-mini',\n  retry: {\n    maxRetries: 3, // Maximum number of retry attempts (default: 3)\n    initialDelay: 1000, // Initial delay in ms (default: 1000)\n    maxDelay: 60000, // Maximum delay in ms (default: 60000)\n    backoffMultiplier: 2, // Exponential backoff multiplier (default: 2)\n    jitter: true, // Add randomness to delays (default: true)\n    onRetry: (attempt, error, delay) => {\n      console.log(`Retry attempt ${attempt} after ${delay}ms due to:`, error.message);\n    },\n  },\n});\n\n// The client will automatically retry on:\n// - Rate limit errors (429)\n// - Server errors (5xx)\n// - Network errors (ECONNRESET, ETIMEDOUT, etc.)\n// - Provider-specific transient errors\n\n// You can also customize which errors trigger retries\nconst customClient = createLLM({\n  provider: 'anthropic',\n  apiKey: process.env.ANTHROPIC_API_KEY!,\n  model: 'claude-3-sonnet-20240229',\n  retry: {\n    maxRetries: 5,\n    retryableErrors: (error) => {\n      // Custom logic to determine if an error should be retried\n      return error.message.includes('temporary') || error.status === 503;\n    },\n  },\n});\n```\n\n## Request Cancellation\n\nCancel in-flight requests and retry loops using AbortSignal:\n\n```typescript\nimport { createLLM } from 'homogenaize';\n\nconst client = createLLM({\n  provider: 'openai',\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o-mini',\n  retry: {\n    maxRetries: 3,\n    initialDelay: 1000,\n  },\n});\n\n// Create an AbortController\nconst controller = new AbortController();\n\n// Pass the signal to your request\nconst responsePromise = client.chat({\n  messages: [{ role: 'user', content: 'Write a long essay about AI' }],\n  signal: controller.signal, // Pass the abort signal\n});\n\n// Cancel from anywhere (e.g., user clicks cancel button)\nsetTimeout(() => {\n  controller.abort(); // Cancels the request immediately\n}, 5000);\n\ntry {\n  const response = await responsePromise;\n  console.log(response.content);\n} catch (error) {\n  if (error.name === 'AbortError') {\n    console.log('Request was cancelled by user');\n  } else {\n    console.error('Request failed:', error);\n  }\n}\n```\n\n### Abort During Retries\n\nThe abort signal works seamlessly with retry logic, cancelling even during backoff delays:\n\n```typescript\nconst controller = new AbortController();\n\n// This request will retry on errors\nconst promise = client.chat({\n  messages: [{ role: 'user', content: 'Hello' }],\n  signal: controller.signal,\n});\n\n// Even if the request is retrying, it will abort immediately\ncontroller.abort();\n\n// The promise will reject with an AbortError\nawait promise; // Throws AbortError\n```\n\n### Abort Streaming Requests\n\nAbort signals work with streaming as well:\n\n```typescript\nconst controller = new AbortController();\n\nconst stream = await client.stream({\n  messages: [{ role: 'user', content: 'Write a long story' }],\n  signal: controller.signal,\n});\n\n// Start consuming the stream\n(async () => {\n  try {\n    for await (const chunk of stream) {\n      process.stdout.write(chunk);\n    }\n  } catch (error) {\n    if (error.name === 'AbortError') {\n      console.log('\\nStream cancelled');\n    }\n  }\n})();\n\n// Cancel the stream after 2 seconds\nsetTimeout(() => controller.abort(), 2000);\n```\n\n### Features\n\n- ✅ Cancels fetch requests immediately\n- ✅ Breaks out of retry loops instantly\n- ✅ Cancels backoff delays between retries\n- ✅ Works with both streaming and non-streaming requests\n- ✅ Compatible with all providers (OpenAI, Anthropic, Gemini)\n- ✅ Fully backward compatible (signal parameter is optional)\n\n## Provider-Specific Features\n\nAccess provider-specific features while maintaining type safety:\n\n```typescript\n// OpenAI-specific features\nconst openaiResponse = await openai.chat({\n  messages: [{ role: 'user', content: 'Hello' }],\n  features: {\n    logprobs: true,\n    topLogprobs: 2,\n    seed: 12345,\n  },\n});\n\n// Access logprobs if available\nif (openaiResponse.logprobs) {\n  console.log('Token probabilities:', openaiResponse.logprobs);\n}\n\n// Anthropic-specific features\nconst anthropicResponse = await anthropic.chat({\n  messages: [{ role: 'user', content: 'Hello' }],\n  features: {\n    thinking: true,\n    cacheControl: true,\n  },\n});\n\n// Gemini-specific features\nconst geminiResponse = await gemini.chat({\n  messages: [{ role: 'user', content: 'Hello' }],\n  features: {\n    safetySettings: [\n      {\n        category: 'HARM_CATEGORY_DANGEROUS_CONTENT',\n        threshold: 'BLOCK_ONLY_HIGH',\n      },\n    ],\n  },\n});\n```\n\n## Thinking Tokens (Anthropic)\n\nAnthropic's thinking tokens feature allows Claude to show its reasoning process before generating a response. This is particularly useful for complex problem-solving tasks.\n\n```typescript\nimport { createAnthropicLLM } from 'homogenaize';\n\nconst anthropic = createAnthropicLLM({\n  apiKey: process.env.ANTHROPIC_API_KEY!,\n  model: 'claude-3-opus-20240229',\n});\n\n// Enable thinking tokens\nconst response = await anthropic.chat({\n  messages: [\n    {\n      role: 'user',\n      content:\n        'Solve this step by step: If a train travels at 60 mph for 2.5 hours, how far does it go?',\n    },\n  ],\n  features: {\n    thinking: true,\n    maxThinkingTokens: 1000, // Optional: limit thinking tokens\n  },\n});\n\n// Access the thinking process\nif (response.thinking) {\n  console.log(\"Claude's thought process:\", response.thinking);\n}\nconsole.log('Final answer:', response.content);\n\n// Example output:\n// Claude's thought process: \"I need to calculate distance using the formula distance = speed × time. Speed is 60 mph, time is 2.5 hours...\"\n// Final answer: \"The train travels 150 miles.\"\n```\n\n### Thinking Tokens in Streaming\n\nWhen streaming, thinking tokens are handled separately and won't be yielded as part of the regular content stream:\n\n```typescript\nconst stream = await anthropic.stream({\n  messages: [{ role: 'user', content: 'Explain quantum entanglement' }],\n  features: {\n    thinking: true,\n  },\n});\n\n// Regular content stream (no thinking tokens here)\nfor await (const chunk of stream) {\n  process.stdout.write(chunk);\n}\n\n// Get thinking tokens from the complete response\nconst complete = await stream.complete();\nif (complete.thinking) {\n  console.log('\\nThought process:', complete.thinking);\n}\n```\n\nNote: Thinking tokens are only available with Anthropic's Claude models and require specific model versions that support this feature.\n\n## Logging\n\nHomogenaize includes a powerful logging system built on Winston that provides detailed insights into library operations while maintaining zero noise by default.\n\n### Basic Configuration\n\n```typescript\n// Enable logging with default settings (info level)\nconst client = createLLM({\n  provider: 'openai',\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o-mini',\n  logging: true,\n});\n\n// Or disable logging explicitly\nconst client = createLLM({\n  provider: 'anthropic',\n  apiKey: process.env.ANTHROPIC_API_KEY!,\n  model: 'claude-3-sonnet-20240229',\n  logging: false, // Default behavior - no logs\n});\n```\n\n### Advanced Configuration\n\n```typescript\nimport { createLLM } from 'homogenaize';\n\nconst client = createLLM({\n  provider: 'gemini',\n  apiKey: process.env.GEMINI_API_KEY!,\n  model: 'gemini-2.5-flash',\n  logging: {\n    level: 'debug', // error, warn, info, debug, verbose, silent\n    format: 'json', // json or pretty (default: pretty)\n    prefix: '[MyApp]', // Optional prefix for all log messages\n  },\n});\n\n// Example log output (pretty format):\n// 2024-01-15T10:30:45.123Z [info]: [MyApp] Creating LLM client {\"provider\":\"gemini\",\"model\":\"gemini-1.5-pro\"}\n// 2024-01-15T10:30:45.456Z [debug]: [MyApp] Transformed request for Gemini API {\"contentCount\":1,\"hasTools\":false}\n```\n\n### Environment Variables\n\nConfigure logging globally using environment variables:\n\n```bash\n# Set log level\nexport HOMOGENAIZE_LOG_LEVEL=debug\n\n# Set output format\nexport HOMOGENAIZE_LOG_FORMAT=json\n\n# Run your application\nnode app.js\n```\n\n### Log Levels\n\n- **error**: API failures, network errors, validation failures\n- **warn**: Rate limit warnings, deprecated features, recoverable errors\n- **info**: Request/response summaries, token usage, model selection\n- **debug**: Request transformation, schema validation, retry attempts\n- **verbose**: Full request/response bodies, detailed transformations\n- **silent**: No logging (default)\n\n### Custom Transports\n\nFor production environments, you can configure custom Winston transports:\n\n```typescript\nimport winston from 'winston';\nimport { createLLM } from 'homogenaize';\n\nconst client = createLLM({\n  provider: 'openai',\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o-mini',\n  logging: {\n    level: 'info',\n    format: 'json',\n    transports: [\n      new winston.transports.File({\n        filename: 'llm-errors.log',\n        level: 'error',\n      }),\n      new winston.transports.File({\n        filename: 'llm-combined.log',\n      }),\n      new winston.transports.Console({\n        format: winston.format.simple(),\n      }),\n    ],\n  },\n});\n```\n\n### Security Features\n\nThe logging system automatically redacts sensitive information:\n\n- API keys (OpenAI, Anthropic, Gemini formats)\n- Tokens and secrets\n- Password fields\n- Any field with 'key', 'token', 'secret', or 'password' in the name\n\nExample:\n\n```typescript\n// This will be logged as:\n// API Key: ***REDACTED***\n// Instead of showing the actual key\n```\n\n### What Gets Logged\n\n**Provider Operations:**\n\n- Request initiation with model and provider info\n- Response completion with token usage\n- API errors with status codes and retry information\n- Streaming events and completion\n\n**Client Operations:**\n\n- Client creation with configuration\n- Tool definitions and executions\n- Request routing and transformations\n\n**Retry Logic:**\n\n- Retry attempts with backoff calculations\n- Rate limit handling\n- Final success or failure\n\n## Building Abstractions\n\nThe library exports option types for all client methods, making it easy to build abstractions:\n\n```typescript\nimport { ChatOptions, StreamOptions, LLMClient } from 'homogenaize';\n\n// Create reusable chat functions with proper typing\nasync function chatWithRetry<T>(\n  client: LLMClient<'openai'>,\n  options: ChatOptions<'openai', T>,\n  maxRetries = 3,\n): Promise<T> {\n  for (let i = 0; i < maxRetries; i++) {\n    try {\n      const response = await client.chat(options);\n      return response.content;\n    } catch (error) {\n      if (i === maxRetries - 1) throw error;\n      await new Promise((resolve) => setTimeout(resolve, 1000 * (i + 1)));\n    }\n  }\n  throw new Error('Max retries reached');\n}\n\n// Build middleware functions\nfunction withLogging<P extends ProviderName>(options: ChatOptions<P>): ChatOptions<P> {\n  console.log('Chat request:', options);\n  return options;\n}\n\n// Type-safe wrappers for specific use cases\nclass ConversationManager<P extends ProviderName> {\n  constructor(private client: LLMClient<P>) {}\n\n  async ask(options: Omit<ChatOptions<P>, 'messages'> & { message: string }) {\n    const chatOptions: ChatOptions<P> = {\n      ...options,\n      messages: [{ role: 'user', content: options.message }],\n    };\n    return this.client.chat(chatOptions);\n  }\n}\n```\n\n### Available Option Types\n\n- `ChatOptions<P, T>` - Options for the chat method\n- `StreamOptions<P, T>` - Options for the stream method (same as ChatOptions)\n- `DefineToolOptions<T>` - Options for defining tools\n- `ExecuteToolsOptions` - Array of tool calls to execute\n\n## Type Utilities\n\nHomogenaize provides helpful type utilities for working with provider-specific models:\n\n### Model Type Guards\n\nRuntime type guards to check if a string is a valid model for a specific provider:\n\n```typescript\nimport { isOpenAIModel, isAnthropicModel, isGeminiModel } from 'homogenaize';\n\nconst userInput = 'gpt-4o';\n\nif (isOpenAIModel(userInput)) {\n  // TypeScript knows userInput is OpenaiModel here\n  const client = createOpenAILLM({\n    apiKey: process.env.OPENAI_API_KEY!,\n    model: userInput, // ✅ Type-safe\n  });\n}\n\n// Check Anthropic models\nif (isAnthropicModel('claude-sonnet-4-5')) {\n  // Valid Anthropic model\n}\n\n// Check Gemini models\nif (isGeminiModel('gemini-2.5-flash')) {\n  // Valid Gemini model\n}\n```\n\n### ModelsForProvider Type\n\nExtract the model type for a specific provider:\n\n```typescript\nimport type { ModelsForProvider } from 'homogenaize';\n\n// Get model type for a specific provider\ntype OpenAIModels = ModelsForProvider<'openai'>; // OpenaiModel\ntype AnthropicModels = ModelsForProvider<'anthropic'>; // AnthropicModel\ntype GeminiModels = ModelsForProvider<'gemini'>; // GeminiModel\n\n// Use in generic functions\nfunction validateModel<P extends 'openai' | 'anthropic' | 'gemini'>(\n  provider: P,\n  model: ModelsForProvider<P>,\n): boolean {\n  switch (provider) {\n    case 'openai':\n      return isOpenAIModel(model);\n    case 'anthropic':\n      return isAnthropicModel(model);\n    case 'gemini':\n      return isGeminiModel(model);\n  }\n}\n\n// Usage\nvalidateModel('openai', 'gpt-4o'); // ✅ Type-safe\nvalidateModel('anthropic', 'claude-sonnet-4-5'); // ✅ Type-safe\n// validateModel('openai', 'claude-sonnet-4-5'); // ❌ TypeScript error\n```\n\n### Available Model Arrays\n\nAccess the full list of models for each provider:\n\n```typescript\nimport { OPENAI_MODELS, ANTHROPIC_MODELS, GEMINI_MODELS } from 'homogenaize';\n\n// All available OpenAI models\nconsole.log(OPENAI_MODELS); // ['gpt-4o', 'gpt-4o-mini', 'gpt-5', ...]\n\n// All available Anthropic models\nconsole.log(ANTHROPIC_MODELS); // ['claude-sonnet-4-5', 'claude-opus-4', ...]\n\n// All available Gemini models\nconsole.log(GEMINI_MODELS); // ['gemini-2.5-flash', 'gemini-2.5-pro', ...]\n\n// Build a model selector UI\nfunction ModelSelector({ provider }: { provider: 'openai' | 'anthropic' | 'gemini' }) {\n  const models = provider === 'openai'\n    ? OPENAI_MODELS\n    : provider === 'anthropic'\n      ? ANTHROPIC_MODELS\n      : GEMINI_MODELS;\n\n  return (\n    <select>\n      {models.map(model => (\n        <option key={model} value={model}>{model}</option>\n      ))}\n    </select>\n  );\n}\n```\n\n## API Reference\n\n### Creating Clients\n\n```typescript\n// Generic client creation (recommended)\ncreateLLM(config: {\n  provider: 'openai' | 'anthropic' | 'gemini';\n  apiKey: string;\n  model: string;\n  defaultOptions?: {\n    temperature?: number;\n    maxTokens?: number;\n    topP?: number;\n    frequencyPenalty?: number;\n    presencePenalty?: number;\n  };\n})\n\n// Provider-specific clients (for better type inference)\ncreateOpenAILLM(config: {\n  apiKey: string;\n  model: string;\n  defaultOptions?: { /* same options */ };\n})\n\ncreateAnthropicLLM(config: { /* same as above */ })\ncreateGeminiLLM(config: { /* same as above */ })\n```\n\n### Chat Methods\n\n```typescript\n// Basic chat\nclient.chat(options: {\n  messages: Message[];\n  temperature?: number;\n  maxTokens?: number;\n  schema?: ZodSchema | JSONSchemaType<T> | JSONSchema;\n  tools?: Tool[];\n  toolChoice?: 'auto' | 'required' | 'none';\n  features?: ProviderSpecificFeatures;\n})\n\n// Streaming chat\nclient.stream(options: { /* same as chat */ })\n```\n\n### Tool Methods\n\n```typescript\n// Define a tool\nclient.defineTool(config: {\n  name: string;\n  description: string;\n  schema: ZodSchema;\n  execute: (params: any) => Promise<any>;\n})\n\n// Execute tool calls\nclient.executeTools(toolCalls: ToolCall[]): Promise<ToolResult[]>\n\n// ToolResult interface\ninterface ToolResult {\n  toolCallId: string;\n  toolName: string;\n  result: unknown;\n  error?: string;\n}\n```\n\n## Environment Variables\n\n```bash\n# Provider API Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nGEMINI_API_KEY=AI...\n```\n\n## Development\n\n```bash\n# Install dependencies\nbun install\n\n# Run tests\nbun test\n\n# Run specific test file\nbun test src/providers/openai/openai.test.ts\n\n# Run with API keys for integration tests\nOPENAI_API_KEY=... ANTHROPIC_API_KEY=... GEMINI_API_KEY=... bun test\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}