{"_id":"@alma-harness/providers","_rev":"13-078d3bfbd06fd8b86f819323533585e9","name":"@alma-harness/providers","dist-tags":{"latest":"0.10.2"},"versions":{"0.1.0":{"name":"@alma-harness/providers","version":"0.1.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.1.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"86f70e13c3ceea9d7f08bb024a5a500cab34fbab","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.1.0.tgz","fileCount":6,"integrity":"sha512-XJDWdBwq+LoWIHdVdDnPW4JP8FeLHg2flEkzCFchVsbCieHJocbvPZUosr5KpngD2IbdYLLI1g4yyNead7lJmg==","signatures":[{"sig":"MEUCIAOAB7eDIVMJ6oHXzIxoGZ/TsXLJx11XxECitLbAuMAnAiEA7ogxq57btT32JHif01Zade/MFlYCYDnivOdcI/Tg5c4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94912},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/1f58991f72350c524fb5715e78d7015d/alma-harness-providers-0.1.0.tgz","_integrity":"sha512-XJDWdBwq+LoWIHdVdDnPW4JP8FeLHg2flEkzCFchVsbCieHJocbvPZUosr5KpngD2IbdYLLI1g4yyNead7lJmg==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.1.0_1788211399694_0.7682993862421665","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alma-harness/providers","version":"0.2.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.2.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"b979375c7454ba2387da7280600e25f06c5629c7","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.2.0.tgz","fileCount":6,"integrity":"sha512-/PJLG5kTOsLfGSWdWRstpoZK7o9B2OZEdVMDMONWw0dvLO+thvbB53qXnHJbX5earuRcqC2F7bGWjRVNhDW+Xw==","signatures":[{"sig":"MEUCIFeCTR3KM0JknG0ogfBnlrUa4hqb0q679O+Uoagpp/amAiEArYrIaTSxwQiUMnP/8CvDvSktwd/FAyzAa7yqn11XMeg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181532},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/9f1e3d082648ff661cb90d3500d09c21/alma-harness-providers-0.2.0.tgz","_integrity":"sha512-/PJLG5kTOsLfGSWdWRstpoZK7o9B2OZEdVMDMONWw0dvLO+thvbB53qXnHJbX5earuRcqC2F7bGWjRVNhDW+Xw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.2.0_1788446554383_0.9357900741684597","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alma-harness/providers","version":"0.3.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.3.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"b13ba018f46d7140d514d8133b8c33d5b7228c4e","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.3.0.tgz","fileCount":6,"integrity":"sha512-5/uS/rb5YjxAdkCq1fQaSSatB4dtdZZVF8cQAPn7VhjAPFHLXjQplGyBkWaQ9tnhg0xaX3j8eV5u8EFCqtzlzg==","signatures":[{"sig":"MEUCIER2wyOSX7xEwd1eMrAUuoVPZMbMixFOQcK+yp147l2qAiEApALgsJAtvVOf5t2YAIJwNDlSfsz57OD2BJTo7ISzoms=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183070},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/f710e59a0ce7ebb08d6bde9bf3b25bd8/alma-harness-providers-0.3.0.tgz","_integrity":"sha512-5/uS/rb5YjxAdkCq1fQaSSatB4dtdZZVF8cQAPn7VhjAPFHLXjQplGyBkWaQ9tnhg0xaX3j8eV5u8EFCqtzlzg==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.3.0_1788455646016_0.37399560021076694","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@alma-harness/providers","version":"0.4.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.4.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"dc44b82ca33544b245685cb1da30e84217d6878b","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.4.0.tgz","fileCount":6,"integrity":"sha512-5cwds9VB7Q7LrRFnMavmDWuxC9ax4ppEt34WL63MBCf+E8xTlhePq1Pdd24qHwX4Ryi00516S5DRW5eXRXavgA==","signatures":[{"sig":"MEQCIAwZXQzqNXHt4Fuoy+fMGmWoPpZ+Iq8VnvL7y/dWSwxqAiB70Qp70P/gPl4Uj86Y5pQuVdNjyxerr4XwGc5ULvGYpQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191338},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/8b23454ad4000f922f0666ea8f8410d5/alma-harness-providers-0.4.0.tgz","_integrity":"sha512-5cwds9VB7Q7LrRFnMavmDWuxC9ax4ppEt34WL63MBCf+E8xTlhePq1Pdd24qHwX4Ryi00516S5DRW5eXRXavgA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.4.0_1788462111698_0.5694889865603923","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@alma-harness/providers","version":"0.5.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.5.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"cb3ad2bc3527c7bddb6f5114ebc37b5b543ce3aa","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.5.0.tgz","fileCount":6,"integrity":"sha512-w2R6zAHoPlLPGqbDpYHPcixoL/egyUwwJWvQkp0YaDybu10as5g2QzuuTAgII5RSQoLFRio+n9z6Xw1I7dmS4Q==","signatures":[{"sig":"MEQCIG6FVGNks1lT1dbmcKPVBn+RUfLXyXsjbY7gWe2bEJo/AiBVKHjieNavC8lnDfCML7g8Flkb9R+O6m21dPo0geUCzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190591},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/2449b907e4efc625af2531805bae2bb3/alma-harness-providers-0.5.0.tgz","_integrity":"sha512-w2R6zAHoPlLPGqbDpYHPcixoL/egyUwwJWvQkp0YaDybu10as5g2QzuuTAgII5RSQoLFRio+n9z6Xw1I7dmS4Q==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.5.0_1788472353816_0.2177306227638749","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@alma-harness/providers","version":"0.6.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.6.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"10f08f2beb97adeded6524d38a64e0dcc8958032","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.6.0.tgz","fileCount":6,"integrity":"sha512-CYPs8SNLRiX9e/QUvp0S158xgL36jfOsbTPOhOekxQMsC6LNC25oadDEi/bcwOwnw4HAZyFAIq1KmEam+IzmlA==","signatures":[{"sig":"MEUCIQCUPPl54+2kl7zs1VfuVhG21Pp5jrPcFau3vwlzLdEVgAIgWsq1CQqAQBaGHusvYJ4pWlgR+WrBKrh/adX8oaLzfGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291457},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/31123c4a52aa76d1ab26c32f07084c13/alma-harness-providers-0.6.0.tgz","_integrity":"sha512-CYPs8SNLRiX9e/QUvp0S158xgL36jfOsbTPOhOekxQMsC6LNC25oadDEi/bcwOwnw4HAZyFAIq1KmEam+IzmlA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.6.0","@alma-harness/execution":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.6.0_1788902326935_0.14643799243181532","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@alma-harness/providers","version":"0.6.1","license":"Apache-2.0","_id":"@alma-harness/providers@0.6.1","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"a2e39d8bc98ef2068ca48e5e1057b3ff65ad3c21","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.6.1.tgz","fileCount":6,"integrity":"sha512-w0UJ6k9gT74ysIcupCuPgPQZKTkch8Iw5PB5IDRKSXCYVO5r8FC+IWGX495rmYvtbYJtvNnFKlg0IvIbl5WSDQ==","signatures":[{"sig":"MEQCIHvFL4Wkpbt8yMsxl3sn57Zg2yoniRhR84nWd1DGRnRwAiB8nBAi8wxhjqFP+n9aU/X71udogM1OqIVIDRo5t01YuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292028},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.6.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/e91f350a2d131281f4a6645991c2bf3f/alma-harness-providers-0.6.1.tgz","_integrity":"sha512-w0UJ6k9gT74ysIcupCuPgPQZKTkch8Iw5PB5IDRKSXCYVO5r8FC+IWGX495rmYvtbYJtvNnFKlg0IvIbl5WSDQ==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.6.1","@alma-harness/execution":"^0.6.1"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.6.1_1788905831768_0.5102383815025764","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@alma-harness/providers","version":"0.7.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.7.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"67f445763d88a8a141e8fca6d0363145d94237f1","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.7.0.tgz","fileCount":6,"integrity":"sha512-XSvDx9dbSWwJl4uEieWIapRX0Y5puzi4MD0QepBeuVljzhTWj1ZS2niKT9qiKDW9YRtJPP9KJy22cdbJcMk+Ig==","signatures":[{"sig":"MEUCIQDl/S0OsrkBjEzjPQFcC8fjGmgASOavvwU1mHBFGpesJAIgMv7osuSwFmcM9JYpwT2PHLJtgqMY43jCVpFM4imLI9Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315415},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/c96ebe39e6f41958a002039afa18c88f/alma-harness-providers-0.7.0.tgz","_integrity":"sha512-XSvDx9dbSWwJl4uEieWIapRX0Y5puzi4MD0QepBeuVljzhTWj1ZS2niKT9qiKDW9YRtJPP9KJy22cdbJcMk+Ig==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.7.0","@alma-harness/execution":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.7.0_1789137033448_0.41626931788686705","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@alma-harness/providers","version":"0.8.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.8.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"c0c2caeb8ce9a9bf6b662681a853f252edffe118","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.8.0.tgz","fileCount":6,"integrity":"sha512-9Hx7gWpHg3i0BzVaTgSJWCdJX+n5INlMqwbq9Iigo2/r6qo55AUDOwWTFNC1TYj0nrRJvd5iK5/cjA7nZoGy/w==","signatures":[{"sig":"MEUCIQC5Hf5O5ycUgwrlJbot+ge/Ac7E/IUxm6B+dk9lOqi99gIgZqGXKHRZ+9+pgP6mdZwJXHD0gJ5vFhr2cX1ZHn0onfg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315415},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.8.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/343fea373a19615b56ee328270edd6e8/alma-harness-providers-0.8.0.tgz","_integrity":"sha512-9Hx7gWpHg3i0BzVaTgSJWCdJX+n5INlMqwbq9Iigo2/r6qo55AUDOwWTFNC1TYj0nrRJvd5iK5/cjA7nZoGy/w==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.8.0","@alma-harness/execution":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.8.0_1789155222758_0.6176594937892372","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@alma-harness/providers","version":"0.9.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.9.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"a4c249d25527801917501fe2d31510e954b71a07","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.9.0.tgz","fileCount":6,"integrity":"sha512-cgtWrey+HOQXcMHnQpV77xb+gX1zMSnYmygN2Ai5nsYRiipDibkCFNUex2UbpUHkhrZS30PaloW8dnbbqsStKw==","signatures":[{"sig":"MEQCIAMN3Z6Oem8snswoyDGhERMalagxM5APqXqbDIFCh8BGAiAUdSOj4GQfo+G8jqPV6CZVvrGIpnM0iH0ZNhIk3hoyjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBDiTqu/6Jt2L+zUVZ5VdzFC+UHY3fOks8qZbM0KZ/bPAiEA0O8Q8Sq5atznhAt6shWI1kjQXY3aXKU/fxmFLewZlU8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315415},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.9.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/2ef248705dc3e0a043ca0e2072d1c3c4/alma-harness-providers-0.9.0.tgz","_integrity":"sha512-cgtWrey+HOQXcMHnQpV77xb+gX1zMSnYmygN2Ai5nsYRiipDibkCFNUex2UbpUHkhrZS30PaloW8dnbbqsStKw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.9.0","@alma-harness/execution":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.9.0_1789655851655_0.4411985626491661","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@alma-harness/providers","version":"0.10.0","license":"Apache-2.0","_id":"@alma-harness/providers@0.10.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"e5d2cbc907c87785bc3b3a09cbef0f8ceccc8dff","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.10.0.tgz","fileCount":6,"integrity":"sha512-1blKssOivOH75P6zQtCyozwHq7LVJX6sKbIoxGD4dUqlrPvbem9vNyXKeSzBKp/jRw0SMes9dC1kvCvxHx3mgA==","signatures":[{"sig":"MEQCIGfGTNkFPABcjHU+aZHMOdQbwA1HaH2DMHElJMd2BAt1AiA690VxmApbC4MlgfRSOZyu3r9JPzWM4E187jqplHuDEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCgejiVhye5tEVL3fPBekg+0hdOP4y1W2FqcxbNAG/a6QIgJzLTe7kvd6HdbvMhRNX4l4MM/O3GgXtaGcidY2+Q7o8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323435},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.10.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/81caea0873e69e20442199122c56bc00/alma-harness-providers-0.10.0.tgz","_integrity":"sha512-1blKssOivOH75P6zQtCyozwHq7LVJX6sKbIoxGD4dUqlrPvbem9vNyXKeSzBKp/jRw0SMes9dC1kvCvxHx3mgA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.10.0","@alma-harness/execution":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.10.0_1789675254810_0.14487908581540987","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@alma-harness/providers","version":"0.10.1","license":"Apache-2.0","_id":"@alma-harness/providers@0.10.1","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"6e3dac6e33663a9c110fe7ef1f023d39864bd0e7","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.10.1.tgz","fileCount":6,"integrity":"sha512-yNojbHk7JDnVsCf5ZzZJ7MS38GvuyUtaodA1qrxydCmSEuZkg7DuUlysZWTQWbH2Cn6OWkV7lhacDJv4G2x47Q==","signatures":[{"sig":"MEUCICByqOqNxK8rqF3gyHZ0nQzojaxFbAsPgOjg6IaneLx4AiEA2dcwn9zd4JEuqnOuj8Ggux6FQgSVBDWjxlf5bTojRP4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAOO/RxGOu4EbwkEDII2vrgv8w1ttqv6rqgQq35MBAF6AiB8Jkm6rBLmJzxpEpE63upEJbIvbWnL3c6z79NstGxJ6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":324594},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-providers-0.10.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/79c01298e44ec305162fc9bfcc94420d/alma-harness-providers-0.10.1.tgz","_integrity":"sha512-yNojbHk7JDnVsCf5ZzZJ7MS38GvuyUtaodA1qrxydCmSEuZkg7DuUlysZWTQWbH2Cn6OWkV7lhacDJv4G2x47Q==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.10.1","@alma-harness/execution":"^0.10.1"},"_npmOperationalInternal":{"tmp":"tmp/providers_0.10.1_1789680642916_0.4076326899400229","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"_id":"@alma-harness/providers@0.10.2","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"ff53a9917a739d33280493a40e09d9fd1eaf428b","tarball":"https://registry.npmjs.org/@alma-harness/providers/-/providers-0.10.2.tgz","fileCount":6,"integrity":"sha512-b4y+MCJBb+lDK827UDIM0OuMQ42OQoIx6QcZfsC7h3f10vIK2SYxt/k2LSzn7cYIC/kcruJZYIAIAsivD0Y27w==","signatures":[{"sig":"MEQCIFxP/jjxtmUWGP8vLk+ZMTTgKZgDmyQ+R/VHRjcLaqKWAiBUnlqIyC2aFDdTcJ9cmoOVCvDn26ozgySJ9ye0rSo3eQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFO1q3vX+HHHv/sL/+6DCtGDTZAlciYO3K9mmGLUmuEPAiEAwWh4DGbDDoGNU6hYlGncQIQT9wbE+0v2WZgr0nBcAKQ="}],"unpackedSize":325256},"main":"./dist/index.js","name":"@alma-harness/providers","type":"module","_from":"file:alma-harness-providers-0.10.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"license":"Apache-2.0","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"version":"0.10.2","_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/2d254392a5f85766980c77bef8bf98ce/alma-harness-providers-0.10.2.tgz","_integrity":"sha512-b4y+MCJBb+lDK827UDIM0OuMQ42OQoIx6QcZfsC7h3f10vIK2SYxt/k2LSzn7cYIC/kcruJZYIAIAsivD0Y27w==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"_npmVersion":"11.18.0","description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","directories":{},"maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"_nodeVersion":"26.4.0","dependencies":{"openai":"^7.5.0","@anthropic-ai/sdk":"^0.117.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.10.2","@alma-harness/execution":"^0.10.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/providers_0.10.2_1789687652410_0.4184208538316112"}}},"time":{"created":"2026-08-31T21:23:19.541Z","modified":"2026-09-17T23:27:32.761Z","0.1.0":"2026-08-31T21:23:19.837Z","0.2.0":"2026-09-03T14:42:34.571Z","0.3.0":"2026-09-03T17:14:06.146Z","0.4.0":"2026-09-03T19:01:51.842Z","0.5.0":"2026-09-03T21:52:33.954Z","0.6.0":"2026-09-08T21:18:47.133Z","0.6.1":"2026-09-08T22:17:11.905Z","0.7.0":"2026-09-11T14:30:33.638Z","0.8.0":"2026-09-11T19:33:42.901Z","0.9.0":"2026-09-17T14:37:31.747Z","0.10.0":"2026-09-17T20:00:54.921Z","0.10.1":"2026-09-17T21:30:43.033Z","0.10.2":"2026-09-17T23:27:32.517Z"},"bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"license":"Apache-2.0","homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/providers"},"description":"ModelClient adapters for Anthropic and OpenAI over Alma's neutral message format.","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"readme":"# @alma-harness/providers\n\n`ModelClient` adapters for [Alma](https://github.com/FabioFernandesCarneiro/alma):\nAnthropic and OpenAI first-party, plus the OpenRouter gateway bridge, over one\nneutral message format.\n\n> **Status: pre-1.0.** The API is still moving; see the\n> [roadmap](../../docs/architecture.md#12-adoption-roadmap) for where it stands.\n\n## What it owns\n\n- `AnthropicModelClient` — Messages API, streaming, with explicit\n  `cache_control` breakpoints (at the wire's default duration, or the hour a\n  policy asks for — spec: cache-ttl; the other two wires refuse the ask) at the stable-system boundary and the\n  conversation tail.\n- `OpenAIModelClient` — Responses API, streaming, automatic prefix caching.\n- `OpenRouterModelClient` — the gateway bridge (chat completions). A gateway\n  does not answer \"who processed this data?\" by itself, so construction\n  REQUIRES a declared upstream allowlist, fallbacks are off by default, data\n  collection is denied by default, and `require_parameters` rides along\n  whenever the request carries tools. Opening the catalogue changes nothing\n  about what the routing policy permits — that stays a product/DPO decision.\n- The translation between Alma's neutral `Msg`/`Block` format and each\n  provider's wire format, in both directions.\n\nRouting decides *which* client runs; the adapter only speaks the protocol.\n\n```ts\nimport { OpenRouterModelClient } from \"@alma-harness/providers\";\n\nconst client = new OpenRouterModelClient({\n  upstreams: [\"deepinfra\", \"together\"], // the declared data-processing chain\n});\n```\n\n## Credentials\n\nThe harness never owns credentials. Each client accepts an explicitly injected\nkey or falls back to the SDK's own environment resolution — configuration comes\nfrom the hosting environment, never from a file this repo reads.\n\n```ts\nimport { AnthropicModelClient } from \"@alma-harness/providers\";\n\nconst client = new AnthropicModelClient();          // reads ANTHROPIC_API_KEY\nconst explicit = new AnthropicModelClient({ apiKey }); // or inject it\n```\n\n## Jobs\n\n`AnthropicJobClient` (Message Batches) and `OpenAIJobClient` (the Batch API,\nover a JSONL file of `/v1/responses` requests) implement the `ModelJobClient`\nseam (spec: model-jobs): the same request translations, minus streaming, and\na non-streaming translation of the complete answer. OpenRouter has no batch\nAPI.\n\n## Reasoning\n\nWhen the policy sets `ModelChoice.reasoning` (spec: reasoning-blocks), each\nadapter asks for it and hands it back as one complete block per step:\n\n| effort | Anthropic | OpenAI | OpenRouter |\n|---|---|---|---|\n| absent | nothing sent; default output dropped | nothing sent; default items dropped | nothing sent |\n| `none` | `thinking: disabled` | `reasoning.effort: none` | `reasoning.enabled: false` |\n| others | `thinking: adaptive` + `output_config.effort` | `reasoning.effort` + encrypted content | `reasoning.effort` |\n\nAn adapter replays only its own blocks, and only when reasoning is on for the\nrequest; every other reasoning block in the history is skipped.\n\n## Provider-executed web search\n\n`ModelRequest.providerTools` (spec: provider-tools) declares the provider's\nown search beside the registered tools; what comes back is two neutral\nblocks, `provider_tool_call` and `provider_tool_result`, the provider's\npayload kept `opaque` for replay.\n\n| | Anthropic | OpenAI | OpenRouter |\n|---|---|---|---|\n| declaration | `web_search_20250305` (the direct search; the agentic 2026-03-18 version drives `code_execution` and is another kind) with `max_uses`, `allowed_domains`, `blocked_domains` | `{ type: \"web_search\", filters: { allowed_domains } }` + `include: [\"web_search_call.action.sources\"]`; `blockedDomains` is REFUSED before the network; `maxUses` is the loop's to enforce | refused before the network |\n| on the stream | `server_tool_use` → call; `web_search_tool_result` → result (url, title, page age; an error code as `error`); `usage.server_tool_use.web_search_requests` | a completed `web_search_call` item → call (`input: action`) and result (the sources; `failed` as an error), counted | — |\n| replay | its own two blocks as `server_tool_use` + `web_search_tool_result` with the encrypted content, only while the request declares the kind (a capped step replays the text and skips the search); another provider's skipped | its own result's `opaque` as the item, only while the request declares the kind; the call block skipped | skipped |\n| `pause_turn` | → the neutral `pause`: the loop re-sends | — | — |\n\n## Media\n\n| | Anthropic | OpenAI | OpenRouter |\n|---|---|---|---|\n| image by URL | `source: { type: \"url\" }` | `input_image` with the URL | `image_url` with the URL |\n| image by bytes (spec: media-by-bytes) | base64 source; JPEG, PNG, GIF, WebP, else refused | `input_image` with a data URL | `image_url` with a data URL |\n| document | by URL: `document` source · by bytes: base64 PDF, else refused | by bytes only: `input_file` with a data URL and the ref's filename, PDF · by URL refused | refused |\n| audio | refused — products transcribe upstream | refused | refused |\n\nA block carries bytes when the loop attached `content` from the product's `MediaSource`; the adapters never fetch anything and never see the ref's path on the bytes path.\n\n## Structured output and cache controls\n\n`ModelRequest.output` selects native JSON schema output (spec:\nprovider-request-controls). It introduces no tool or business handler. Responses\nstill arrive as text and usage/stop events: validate the result and inspect\nrefusal/truncation before treating it as application data. The governed\nsingle-call runner is not part of this slice.\n\n| Control | Anthropic | OpenAI | OpenRouter |\n|---|---|---|---|\n| `output: {type: \"json_schema\", name, schema}` | `output_config.format` with type/schema, preserving reasoning effort | `text.format` with `strict: true` | refused |\n| format `name` | validated portable label; no wire slot, intentionally omitted | required wire name | refused |\n| `cache: false` | removes both explicit breakpoints | refused | refused |\n| `cache: {ttl, conversationTail: false}` | only the last stable system block gets a breakpoint | refused | refused |\n| absent controls | existing defaults | existing defaults | existing defaults |\n\nNames use 1–64 ASCII letters, digits, underscores or dashes. Schemas must be\nobjects and comply with the selected provider's strict schema subset; arbitrary\ntool input schemas are not automatically converted. Model-specific schema\nsupport is validated by the provider. Cache controls preserve message roles and\norder; disabling the tail prevents a system suffix from being included in that\nbreakpoint. Disabling prompt cache is not a data-retention or erasure setting.\n\nStreaming and batch reuse these mappings (`toAnthropicBatchRequests` and\n`toBatchLines` expose the pure batch translations). Unsupported options reject\nbefore network activity, including batch file upload. These fixtures prove\nserialization against installed SDK types, not live model acceptance.\n\n## Arguments the wire cut\n\nA tool call whose arguments do not parse — a response cut by `max_tokens`\nmid-arguments, or a model that emitted broken JSON — is still a `tool_call`\n(spec: what-the-wire-cuts): `input: {}` and the raw text as `malformed`,\nfollowed by the wire's own stop reason. The loop answers a malformed call\nwith an invalid-input result on `tool_use`, and closes it on `max_tokens`.\nThe translators never throw on it.\n\n## Errors\n\nWhat an SDK throws leaves every client as a `ProviderError` from\n`@alma-harness/core` (spec: error-taxonomy), classified through one\nduck-typed table over the fields the SDKs share: 429 → `rate_limited`\n(OpenAI's `insufficient_quota` → `rejected`); 529, 503 or an overloaded body\n→ `overloaded`; no status or 5xx → `unavailable`; a 400 that says the prompt\ndoes not fit → `context_window`; the other 4xx → `rejected`. A user abort\npasses through untouched. The translation error classes are\n`ProviderError`s too — `rejected` before the network, `provider_drift`\nmid-stream — and `toProviderError` / `classifyFailure` are exported for a\nproduct wrapping its own client.\n\n## What it must never do\n\n- Decide routing, spend, or capability. Those are core, not adapter.\n- Leak a provider type into the neutral format — the format is the boundary\n  that makes a second provider cheap.\n- Swallow provider drift: a stream that ends without a stop event fails loudly\n  rather than looking like a successful empty turn.\n\n## Documentation\n\n[Docs index](../../docs/README.md) · [Architecture §6.2](../../docs/architecture.md#6-contracts)\n· [Anthropic adapter spec](../../docs/specs/002-anthropic-provider.md)\n· [OpenAI adapter spec](../../docs/specs/003-openai-provider.md)\n\nApache-2.0\n\n## Opt-in single-dispatch clients\n\n`createAnthropicSingleDispatchClient({ apiKey?, baseURL? })` and\n`createOpenAISingleDispatchClient({ apiKey?, baseURL? })` return a frozen\n`SingleDispatchModelClient`. They disable SDK retries and HTTP redirects and\nwithhold authentication-provider, middleware and transport injection options.\nThe existing constructors keep their current retry/usage behavior; batches and\nOpenRouter do not implement this new capability.\n\nThe capability accepts the same neutral tools, tool results, supported media and\nreasoning history as the first-party translators, plus supported system, JSON\nschema, reasoning, tier and cache controls (spec: rich-single-dispatch-requests).\nIt executes no local tool handler; the host owns authorization and sensitivity. `validate` is pure and\n`streamEvidence` validates/clones before its first network await. These checks\nprove local adapter support, not model-specific schema acceptance. Clone errors\nare content-free rejected ProviderErrors. Consume each returned stream once.\n\nKnown final counts are emitted before stop or a terminal translation error.\nMissing/invalid/partial usage never becomes zero. `unpriced` preserves counts\nfor unknown served tiers or missing/mixed/inconsistent cache TTL attribution, and must\nnot be sent to pricing with a fallback. Anthropic final cumulative updates win;\nOpenAI input excludes cache reads AND writes to avoid counting writes twice.\nOpenAI search counts use unique completed item identities and terminal output when\npresent; missing/conflicting attribution remains unknown. Anthropic search activity\nrequires a valid positive cumulative search count. Known and unpriced evidence\nretain search counts without copying queries or URLs into billing metadata.\nOnly bounded provider request IDs enter reference events, including HTTP errors.\nContent events remain content: never store the whole evidence stream as a\nfinancial row. OpenAI still sends `store: false`.\n\nThe legacy `stream` method on these new clients converts known evidence to a\nusage event and fails on unknown/unpriced evidence. Drain `streamEvidence` to\nretain known usage even if a later error occurs. Pre-abort is not-dispatched;\nall ambiguous network outcomes require reconciliation. An early return aborts\ntransport even immediately after headers, but cannot promise final usage.\nThis is transport evidence, not durable deduplication or invoice reconciliation.\n\nReasoning history replays through the existing translator when reasoning is\nenabled and the block belongs to that provider. Preserve opaque replay content\nunchanged. This support does not itself adopt durable multi-turn execution.\nReusing a stream fails with a rejected ProviderError.\nCaller cancellation preserves the AbortSignal reason, including custom errors.\n\n## Explicit temperature\n\n`temperature` is optional and sent unchanged in streaming and batch bodies. The\nmatrix admits Anthropic `1`, plus `0..1` for `claude-haiku-4-5` and\n`claude-haiku-4-5-20251001` with reasoning absent or `none`\n(spec: haiku-temperature-compatibility),\nand OpenAI GPT-5.1/GPT-5.2 base IDs or dated snapshots with explicit reasoning\n`none`, in `0..2`. Pro/chat/codex variants and OpenRouter reject it. This is a\nconservative adapter matrix; other Anthropic IDs remain explicit-1-only. Omit it for\nprovider defaults. Invalid/unsupported values fail before network or batch upload;\nzero is preserved. There is no automatic downgrade or determinism guarantee.\n\n## Single-dispatch batch evidence\n\n`createAnthropicSingleDispatchBatchClient` and\n`createOpenAISingleDispatchBatchClient` implement execution's additive\n`SingleDispatchBatchClient`. Frozen capabilities admit apiKey/baseURL only,\nwith SDK retries disabled and redirects rejected. Legacy job clients are unchanged.\nValidate 1..512 unique batch-tier items (IDs: ASCII alphanumeric, underscore or\nhyphen, max64), one model, and a 16 MiB wire bound before network. Requests and\nhandles are snapshotted before asynchronous work. Use a trusted immutable\nconfiguration for baseURL/account selection.\n\nConsume submitEvidence exactly once after a durable dispatch:true decision.\nOpenAI yields input_file before its separate create POST, then accepted. Save\nneeded file evidence before resuming. Lost responses never authorize another\nattempt; creating a new iterable *is* a new attempt. File cleanup is not provided.\nResolve handles and expected item IDs from the scoped durable manifest before\npolling or collecting: the adapter itself provides no tenant authorization.\n\nresultsEvidence requires terminal status and yields independently validated usage\nand content, including when translation fails. Cancellation in progress remains\nrunning. Both OpenAI result files are read, even for terminal cancellation.\nAnthropic result URLs must match the configured origin and batch results path\nbefore authenticated retrieval. JSONL is incremental, with a 2 MiB line/32 MiB\ncollection limit, max512 expected IDs, and readers cancelled on abandonment.\nUnknown, duplicate or missing IDs fail the collection. Prior observations survive\nsuch failure and must not be interpreted as complete collection or free remainder.\n\nBatch transport supplies batch billing for compatible default tier fields;\ncontradictory tiers and mixed cache TTLs remain unpriced. Missing counts stay\nunknown. Content has no duplicate usage field; provider errors have closed reasons.\nServer-tool content may be unusable while its validated search charges survive.\nThese are adapter prerequisites, not durable collection or settlement. No runner,\nroutine, production delivery or live billing validation is implied.\n\n## Governed OpenRouter requests\n\n`createOpenRouterSingleDispatchClient({ upstreams: ['anthropic'], apiKey })`\nimplements the same `SingleDispatchModelClient` capability as the first-party\nfactories. It snapshots the declared upstream list, denies data collection by\ndefault, and disables gateway fallbacks, SDK retries and HTTP redirects. Optional\n`zeroDataRetention` and explicit `dataCollection` retain the gateway translator's\ncontrols. `allowFallbacks: true` is rejected; the legacy constructor remains\nunchanged until cutover. The key defaults only from `OPENROUTER_API_KEY`.\n\nThe adapter preserves the current text/tool/image/reasoning translator and its\nunsupported-control refusals. Financial evidence uses native token counts from\nthe final usage chunk: ordinary input excludes cache reads and writes, and\nreasoning is a subset of output. Positive cache writes without a TTL are unpriced;\nmissing or malformed counts are unknown. A context-window HTTP error never proves\nzero usage. Candidate counts stay private until the stream closes or fails;\ncontradictory observed chunks fail without an early known charge. The provider's\ncost field does not replace the runner's persisted price table. The promise is one\nAlma inference attempt, with gateway fallback disabled, not an attestation of the\ngateway's internal infrastructure. See spec openrouter-single-dispatch.\n\nThe Anthropic single-dispatch adapter attests `anthropic_context_window_v1` only\nfor the exact structured HTTP 400 input-window rejection before SSE, with a\nbounded request ID and known zero usage. Generic errors and post-stream failures\nremain uncertain. OpenAI/OpenRouter do not attest this proof. No automatic SDK\nretry is added; the governed conversation owns any continuation after settlement\n(spec: safe-context-rejection-rotation).\n\nBoth official single-dispatch batch clients support `cancel(handle, {signal?})`\n(spec: governed-batch-cancellation-adoption). Each explicit invocation sends at\nmost one cancellation POST, with SDK retries and redirects disabled. Handles are\nsnapshotted before awaiting; returned identity, status and counts are validated.\nAnthropic `canceling` and OpenAI `cancelling` remain running. Lost acknowledgements\nand malformed responses reject without another request or invented terminal state.\n\n## Explicit client-tool selection\n\n`ModelRequest.toolChoice` is optional host policy (spec: governed-tool-choice).\nAbsence sends no `tool_choice` and retains previous provider behavior; explicit\n`auto` remains distinct from absence in execution identity. No choice grants\npermission to a tool or runs its handler.\n\n| Neutral control | Anthropic streaming / batch | OpenAI Responses / batch | OpenRouter |\n|---|---|---|---|\n| `{ type: \"auto\" }` | `{ type: \"auto\" }` | `\"auto\"` | refused |\n| `{ type: \"none\" }` | `{ type: \"none\" }` | `\"none\"` | refused |\n| `{ type: \"required\" }` | `{ type: \"any\" }` | `\"required\"` | refused |\n| `{ type: \"tool\", name }` | `{ type: \"tool\", name }` | `{ type: \"function\", name }` | refused |\n\nForced modes (`required` / `tool`) admit these exact IDs only:\n\n- Anthropic: `claude-haiku-4-5`, `claude-haiku-4-5-20251001`,\n  `claude-sonnet-4-5`, `claude-sonnet-4-5-20250929`, `claude-sonnet-4-6`,\n  `claude-opus-4-5`, `claude-opus-4-5-20251101`, `claude-opus-4-6`,\n  `claude-opus-4-7`.\n- OpenAI: `gpt-4.1`, `gpt-4.1-mini`, `gpt-5.1`, `gpt-5.2`, `gpt-5.6-luna`.\n\nOther IDs, including unlisted dated snapshots, reject forcing before network.\nAuto/none use the documented first-party wire without a forced-model allowlist;\nmodel availability and general model capabilities remain provider concerns.\nAll explicit choices reject simultaneous `output` or nonempty `providerTools`.\nForced modes on other models reject an explicit reasoning effort other than none.\nFor exact OpenAI `gpt-5.6-luna`, use explicit reasoning none/low/medium/high/xhigh/max\nin both execution controls and the loaded request (spec: luna-forced-reasoning).\nOmitted, minimal, unknown and malformed efforts reject; no provider default is\nsilently selected. Active efforts retain the existing summary and encrypted\nreasoning transport for stateless replay in Responses and batch. Reasoning tokens\nare already part of output tokens and are not charged again.\nAuto/none and omitted selection retain existing behavior. Omit temperature;\nLuna temperature support is unchanged. The remaining conservative model/provider\nguards are retained rather than extrapolated from Luna compatibility.\nNo control is silently downgraded, and absence bypasses this new matrix.\n\nA named tool must match exactly one advertised `ToolSpec`; forced modes need\nclient tools. Invalid shapes, names and ambiguous registries reject before\nstream dispatch or batch file upload. The single-dispatch clients snapshot\nrequests before asynchronous work; all first-party batch mappings share the\nstream translator. OpenRouter explicit selection is refused until a reviewed\nmodel/upstream matrix can guarantee local validation.\n\nFor a governed structured one-call result, use `createGovernedStepRunner` from\n`@alma-harness/single-call` with the same choice in planned execution controls and its\nloaded request. Inspect the tool calls, original stop and receipts; a forced\nchoice does not guarantee valid arguments, a successful stop or exactly one\nblock. The text/JSON `createSingleCallRunner` does not accept this control.\nSee the [single-call composition](../single-call/README.md). There is no automatic tool\nexecution or personal-memory write on the structured step path.\n\nSources checked 2026-09-17: [Anthropic tool selection](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools),\n[Anthropic thinking compatibility](https://platform.claude.com/docs/en/build-with-claude/thinking),\n[OpenAI function calling](https://developers.openai.com/api/docs/guides/function-calling),\n[Luna capabilities and default effort](https://developers.openai.com/api/docs/models/gpt-5.6-luna),\n[OpenAI batch body parity](https://developers.openai.com/api/docs/guides/batch),\n[OpenRouter tool calling](https://openrouter.ai/docs/guides/features/tool-calling).\nDeterministic tests establish serialization, rejection and governed composition.\nA maintainer-authorized synthetic named-tool probe on 2026-09-17 succeeded with\nmedium and xhigh; the latter returned nonzero reasoning usage. This is not a\nquality evaluation, live batch proof or consumer integration claim.\n","readmeFilename":"README.md"}