{"_id":"@codehz/ai","_rev":"29-31e4c57a449195b43f0d62a048771acb","name":"@codehz/ai","dist-tags":{"latest":"0.9.1"},"versions":{"0.1.0":{"name":"@codehz/ai","version":"0.1.0","_id":"@codehz/ai@0.1.0","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"1a115c779d50b3d54f813346c9db38597b3ae2a6","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.0.tgz","fileCount":37,"integrity":"sha512-hkUOPVLtNicNbp4LDzmBQCF65sLQKNs2ot5fdvKo9+3jQ/GQEqASsd+pmBM2aDUusu4NK1zMzmsI+Sh5Lx3/Og==","signatures":[{"sig":"MEUCIDNtZ116deOoH1GRoRvrYys8et1V3g9M+pulPsEQf5JmAiEA5tjKGJTGTNSd2C2+X+gBg14+vcJsxDtZZ+K9ZaX1aDg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":549923},"type":"module","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"eb7cc3bec1fc44896c4edcbd2fd70600b2aeab76","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_npmVersion":"11.18.0","description":"统一流式 AI 客户端 — 一套 canonical API，三种后端协议（`responses` / `messages` / `chat.completions`）。","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.0_1783450035109_0.5853806345426433","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@codehz/ai","version":"0.1.1","_id":"@codehz/ai@0.1.1","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"b0b9a132331551db3711f95cf93031b8c4db597b","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.1.tgz","fileCount":38,"integrity":"sha512-RHM1QHFZa2G7je765/ClGGjPbSSW1y2afz9V5zO0HDz+Akmoj+PjHUFNuqsLUuwOimveLiym54zOqdC7xhvraw==","signatures":[{"sig":"MEYCIQDNcVFnoIapfrVbiaDL8h2izQTQxtI2OBrnU6wLrRYFRAIhAJKrvUNKGtxxXRtkEO/VxGwUbwIuCH6VDgiqlEEP6Rpy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":571922},"type":"module","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"c266e9db9664b09a604a9f243a6e3d75d17c8ff3","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_npmVersion":"11.18.0","description":"统一流式 AI 客户端 — 一套 canonical API，支持真实模型后端与面向测试的脚本化 `MockAdapter`（`responses` / `messages` / `chat.completions` / `ollama` / `mock`）。","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.1_1783480031320_0.2637526868831126","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@codehz/ai","version":"0.1.2","_id":"@codehz/ai@0.1.2","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"b38410a5a2c930c619f85b38bf85214524ff5a0c","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.2.tgz","fileCount":38,"integrity":"sha512-LVeMBIFyqdNSjvofk1BpyRvnkxHsCOfqF23ZWRfzCNOWHXVYPQHqE4a1Pp13f0dFrIe9+JnM+fVbG4sY9+Edcg==","signatures":[{"sig":"MEYCIQCqxULbzBseowLIm2w8VgMKltQosZfY0/HUZHu0I1RHMwIhAKpgMfQah6PMfo1q9ONrsTGI6hWZ/l0GmVc70NlaaM7u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":616185},"type":"module","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"02b74f1bd72ccd0555a82f10c4dd36d5b718db3a","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_npmVersion":"11.18.0","description":"统一流式 AI 客户端 — 一套 canonical API，支持真实模型后端与面向测试的脚本化 `MockAdapter`（`responses` / `messages` / `chat.completions` / `ollama` / `mock`）。","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.2_1783484769559_0.09644853583761881","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@codehz/ai","version":"0.1.3","_id":"@codehz/ai@0.1.3","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"f168192734c781f67b86aa88ccd2579ee7bce52d","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.3.tgz","fileCount":39,"integrity":"sha512-mAnBvNWKO+/JZZ88hC3oWiiPiARDV6MThqYu+ijlk9WOeJYOmGomJ+pUZf39urcje73/8oGwgTSOnswevVjYVw==","signatures":[{"sig":"MEUCIHgJESuYn2K4uwk57xLOs/e6ay0M9jPMLM+F55Jg4u+jAiEA3qtID169ohG8zf4AFR2vhjVzdp9VO7D2afiRQE2TC7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":616050},"type":"module","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"907cbd76f0995408caf3e973c18c5c5cbef932c4","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_npmVersion":"11.18.0","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的脚本化 `MockAdapter`（`responses` / `messages` / `chat.completions` / `ollama` / `mock`）。","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.3_1783487365227_0.9656926563955242","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@codehz/ai","version":"0.1.4","_id":"@codehz/ai@0.1.4","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"128de43f12e7e5e08eba25bc405b1d28adde9e96","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.4.tgz","fileCount":39,"integrity":"sha512-y53Dk2XqeAUnNMRexD+AnlU7HMEHBQ9URYaXIoZME+4OlcDbO3z1Md9snssPmzJvG4PpBecpKvlA35z/RLUa7g==","signatures":[{"sig":"MEQCIAyHgsfFfOvxJH2h1lzxnhbZcMNBqxgA8gUcXs6960siAiALl45nDH/dF4IU2l4Ckji/eGi1EcfFy0UCLJAvSrT0OQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":618157},"type":"module","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"ec6225e448965e3a9975a7385f5a21e87642b92c","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_npmVersion":"11.18.0","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat.completions` / `ollama` / `mock`）。","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.4_1783494171222_0.23907506641398069","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@codehz/ai","version":"0.1.5","_id":"@codehz/ai@0.1.5","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"06f67b3a10acd7ed4a5a93a36987f8cf92dace74","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.5.tgz","fileCount":38,"integrity":"sha512-ucZUlR7AeyXDpH+oWuzDI4Kfw3q0rf4EkDb6sJAZvklb9c7LMRXkxaiVhPpcFe+oPH9xQyyIM6qsyulG3bHoeg==","signatures":[{"sig":"MEUCIQDgqjsYTNhAo3mV611r6ohDcMcPt3P+T4OWtRm5AKCSyQIgSX8kCxwyhQDWaf2usnbeXxZx/Y4hmOm8zVuQXWaaU0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":592972},"type":"module","module":"dist/index.mjs","shasum":"06f67b3a10acd7ed4a5a93a36987f8cf92dace74","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-ucZUlR7AeyXDpH+oWuzDI4Kfw3q0rf4EkDb6sJAZvklb9c7LMRXkxaiVhPpcFe+oPH9xQyyIM6qsyulG3bHoeg==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.5_1783785723083_0.29156661890162194","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@codehz/ai","version":"0.1.6","_id":"@codehz/ai@0.1.6","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"8250c912260aa66618b8140d3983e6ff2d2c5c75","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.6.tgz","fileCount":39,"integrity":"sha512-e1D0iWSNzB6N1x3n0r3WFThCQgO1SdHHUtz5g+3VnkFRYQdH/WJGTvAqCfXH1vr2MtAnsi8j97pT91enc9NfCw==","signatures":[{"sig":"MEQCIDLOfI+U2d7NZ3Ey5motcFG28WFG+BUxeGeWdUrNXglbAiA586VGo5klmZQ7ki+9UvhOejrR7FKIDLhJh7PpfcKDtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":610353},"type":"module","module":"dist/index.mjs","shasum":"8250c912260aa66618b8140d3983e6ff2d2c5c75","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-e1D0iWSNzB6N1x3n0r3WFThCQgO1SdHHUtz5g+3VnkFRYQdH/WJGTvAqCfXH1vr2MtAnsi8j97pT91enc9NfCw==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.6_1783836822415_0.6861658061366276","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@codehz/ai","version":"0.1.7","_id":"@codehz/ai@0.1.7","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"01cfccca0c09982b8a6dabf344358e8f17fd7721","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.7.tgz","fileCount":39,"integrity":"sha512-OJz4wlvpKu5UtfE73DWZtynS1hB2Vw9cfX7Y2I0yt4NxzYswkQHK4XdEbCGRgFmr/9hm/tOuO5poTaTU6LbWfg==","signatures":[{"sig":"MEUCIQCg//WasTBv7dhukf5iyO+6wSFarUoMKJDrePHD0Fcl5wIgci1dNEbu8RohKp/2Z05KkpCJfAMlshaQncZaTKQHzjU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":611748},"type":"module","module":"dist/index.mjs","shasum":"01cfccca0c09982b8a6dabf344358e8f17fd7721","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-OJz4wlvpKu5UtfE73DWZtynS1hB2Vw9cfX7Y2I0yt4NxzYswkQHK4XdEbCGRgFmr/9hm/tOuO5poTaTU6LbWfg==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.7_1783837784655_0.9000759644647471","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@codehz/ai","version":"0.1.8","_id":"@codehz/ai@0.1.8","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"53dccacf6f3bfc6eeb138a390737804879e1b36e","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.1.8.tgz","fileCount":39,"integrity":"sha512-48NifCjevPVhw5h2Ax1I+eAvPfa1SUOmdfTpW22ThN6waG6ylUqh3y+BECCEM1WMYV2dhfK6UmAj6IArajKAdQ==","signatures":[{"sig":"MEUCIQCaaCfjflYpwic9KkWE3/rLcnk4Nsznvq254u/ENVmLOQIgCaU3Ctb3343V/JJ7vksRLPMTUF8j2APy58Bz959Waaw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":611849},"type":"module","module":"dist/index.mjs","shasum":"53dccacf6f3bfc6eeb138a390737804879e1b36e","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-48NifCjevPVhw5h2Ax1I+eAvPfa1SUOmdfTpW22ThN6waG6ylUqh3y+BECCEM1WMYV2dhfK6UmAj6IArajKAdQ==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.8_1783838737106_0.4705263812633229","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@codehz/ai","version":"0.2.0","_id":"@codehz/ai@0.2.0","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"f40c79fddc503efb0980ea95916869e50dea00dd","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.2.0.tgz","fileCount":39,"integrity":"sha512-y0tgxMcySe7s2tphLjEuSLwfLklSaWkoMXG5m+uUGmBWvRn9nihuBTDnaqCW9ayUHRNITtQN4ralUXVpXHvfzg==","signatures":[{"sig":"MEYCIQCYB4h1DPWf16RysEtDAXLlOG0dzwF5AFH2uWJauz4+egIhAOxOd7D/KN8JmCQUN1OLBdKeWEUtZHKqLuced6SQIxHh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":606894},"type":"module","module":"dist/index.mjs","shasum":"f40c79fddc503efb0980ea95916869e50dea00dd","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-y0tgxMcySe7s2tphLjEuSLwfLklSaWkoMXG5m+uUGmBWvRn9nihuBTDnaqCW9ayUHRNITtQN4ralUXVpXHvfzg==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.0_1783839172067_0.014967627944204587","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@codehz/ai","version":"0.2.1","_id":"@codehz/ai@0.2.1","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"bdcf322fc61950f0b8c2dd8c1ee62ea170230cd1","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.2.1.tgz","fileCount":43,"integrity":"sha512-1Suna1EuSMAfLzeEJoxcHXjFskKLoH9OjVjrk/Xmf69GiIIV56KGY6lnbphpOoTujRhs2ozcZu8PMGXpOFCBXg==","signatures":[{"sig":"MEYCIQDZf8Mn9hj9JD7DhnJaqbhglGvHyKML1jQ8uJsSDTLqxwIhAOP56d+KIf8ilRyeiUFuFv9SrwJ98PUyeYTBO+wa7GPF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":701205},"type":"module","module":"dist/index.mjs","shasum":"bdcf322fc61950f0b8c2dd8c1ee62ea170230cd1","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-1Suna1EuSMAfLzeEJoxcHXjFskKLoH9OjVjrk/Xmf69GiIIV56KGY6lnbphpOoTujRhs2ozcZu8PMGXpOFCBXg==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.1_1783862794440_0.3824857742648631","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@codehz/ai","version":"0.2.2","_id":"@codehz/ai@0.2.2","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"7d99243ef5f661643fc2c14563530c0501082690","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.2.2.tgz","fileCount":43,"integrity":"sha512-ReLpXkNS1T7t9ojQaDvAY1JZ3UEuztBkdJNXqDAbXQINYhpfGGRQrDREyXjK1B618xRJsMIOoF106JFQBs7JCA==","signatures":[{"sig":"MEUCIQCQIVFCjXyNIv7HD8qz0IamgEHm5QQe4j7H+MhiTBk6WQIgax4wLSgTPEw57+D8UCZlWNgi1LWdgpNh6dCMDPPaXJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":702091},"type":"module","module":"dist/index.mjs","shasum":"7d99243ef5f661643fc2c14563530c0501082690","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-ReLpXkNS1T7t9ojQaDvAY1JZ3UEuztBkdJNXqDAbXQINYhpfGGRQrDREyXjK1B618xRJsMIOoF106JFQBs7JCA==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.2_1783864149300_0.00901127995099582","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@codehz/ai","version":"0.2.3","_id":"@codehz/ai@0.2.3","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"590d182b2a4969a9e68687cb2c4d3963712aedf1","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.2.3.tgz","fileCount":43,"integrity":"sha512-CBczexdcyHprFUmCQRxp9VwznSsaK2sEblN/DgitBbbkf5a1NZuJQ0lIHJOw/I1/j+zEi59TAQQlCd8D+S3zIA==","signatures":[{"sig":"MEUCIAW5oE6v4cCBL/dNia/8/5Pm8oFTGcJuqv4yC9RVx1oTAiEA2q2R8EJQ87+4bLNrhkap9O9FaCjPhmW+0yXH3Y59JcE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":703752},"type":"module","module":"dist/index.mjs","shasum":"590d182b2a4969a9e68687cb2c4d3963712aedf1","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-CBczexdcyHprFUmCQRxp9VwznSsaK2sEblN/DgitBbbkf5a1NZuJQ0lIHJOw/I1/j+zEi59TAQQlCd8D+S3zIA==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.3_1783864663297_0.46213289960826365","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@codehz/ai","version":"0.2.4","_id":"@codehz/ai@0.2.4","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"eea61cd7fd8fe57b1c95017309be1eaa4d1c275b","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.2.4.tgz","fileCount":43,"integrity":"sha512-Ze3dGuJc7OigHGdJyjcfGAedyAhjbdiJJLJ2ratX1aOIybX4ofApLnHhmjfGecFFNPMF1z+Sn2zaW194bmhCNQ==","signatures":[{"sig":"MEQCIBFLY+kJiaj9EIVNO5ZZKM5yZ4Zu3E5kGaP9mq2pVj2mAiA0hI1gxkS+5R/SHWI5RkMcLhCNzXqqiF1QPSJDxWCHPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":707759},"type":"module","module":"dist/index.mjs","shasum":"eea61cd7fd8fe57b1c95017309be1eaa4d1c275b","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-Ze3dGuJc7OigHGdJyjcfGAedyAhjbdiJJLJ2ratX1aOIybX4ofApLnHhmjfGecFFNPMF1z+Sn2zaW194bmhCNQ==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.4_1783877230620_0.9574712148415025","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@codehz/ai","version":"0.3.0","_id":"@codehz/ai@0.3.0","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"5bfecf7509efcd709d8e0682f306af19b9385455","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.3.0.tgz","fileCount":43,"integrity":"sha512-zE4H1L7d3WdWr7E17t54jRVxeY85gj5ACPOkhT4H+4LDVENy7+2X3ZzicSTnRuM6yHBqdm2dJ4FXPQIMgDq3Ng==","signatures":[{"sig":"MEQCIFJmjt7dAIsLOW5q+CuKL8T69TjafZQozNfCmiVPK7rtAiBsldDGjIV+EfSEuwy1AGCBFyn6srF0R4ODgOpPvfVYgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":696780},"type":"module","module":"dist/index.mjs","shasum":"5bfecf7509efcd709d8e0682f306af19b9385455","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-zE4H1L7d3WdWr7E17t54jRVxeY85gj5ACPOkhT4H+4LDVENy7+2X3ZzicSTnRuM6yHBqdm2dJ4FXPQIMgDq3Ng==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.3.0_1783920668747_0.6187612175585719","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@codehz/ai","version":"0.4.0","_id":"@codehz/ai@0.4.0","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"2960e0bdba765364c27e6cbbe889335f92aa05c5","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.4.0.tgz","fileCount":43,"integrity":"sha512-2Rncr+1Vs80XHZh3CxuNBpQzMTezDJB6lcogQams0C1JjebncoFw6HMGcZdeGUlqzT6Tfb7h4UzJr4w5QVZF5w==","signatures":[{"sig":"MEUCIC0HKr47GYBkL6gdQl+qDr1HKtuwo/BBFQsvyHrSDNNJAiEA4aEjCQmF54+u7SEDfdJ14sZT5Pb/dqhoJe627/0KrUg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":668890},"type":"module","module":"dist/index.mjs","shasum":"2960e0bdba765364c27e6cbbe889335f92aa05c5","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-2Rncr+1Vs80XHZh3CxuNBpQzMTezDJB6lcogQams0C1JjebncoFw6HMGcZdeGUlqzT6Tfb7h4UzJr4w5QVZF5w==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.0_1783922347256_0.20657975998157418","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@codehz/ai","version":"0.4.1","_id":"@codehz/ai@0.4.1","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"3543caae1d385bc7e1e8fb2a48c0115cba2a693c","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.4.1.tgz","fileCount":43,"integrity":"sha512-A3w05sEjwboh//R6Gxjf1m19uI86lCWF34ay54cTv7CQ7ZVlQOvpPkP3hh3Qt0HrK/J1mbCzmhVnPImhc66H4w==","signatures":[{"sig":"MEUCIQC2z8Fi7Uo+d+obq4Dv8Zi9Gk9od44iE/MKlK1WKoHjKwIgPi3y7z+jxQWrvKBlCitvWZMZTyiStWm1ydJhHhc7aag=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":668982},"type":"module","module":"dist/index.mjs","shasum":"3543caae1d385bc7e1e8fb2a48c0115cba2a693c","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-A3w05sEjwboh//R6Gxjf1m19uI86lCWF34ay54cTv7CQ7ZVlQOvpPkP3hh3Qt0HrK/J1mbCzmhVnPImhc66H4w==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.1_1783926593885_0.3965486457439591","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@codehz/ai","version":"0.4.2","_id":"@codehz/ai@0.4.2","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"67d8770c9290767e6b9518dd06e057b48b20d3d0","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.4.2.tgz","fileCount":43,"integrity":"sha512-AyjX9yTk0IAHWIy4Ib6Zfqxr1ptak9P2b0Nz3arYssQEPdCBxqLsStjItnVqX9xmdrlbzqmirzHRr4rtROCUFQ==","signatures":[{"sig":"MEUCIBJ2CFwCABG969uJUvhpDDbrR+m61n41IZb2wWdMFiVHAiEAsSCBRl3UIIAUyXcOXrCVr6ulohD4ko0vlii/zmPKGKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":668970},"type":"module","module":"dist/index.mjs","shasum":"67d8770c9290767e6b9518dd06e057b48b20d3d0","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-AyjX9yTk0IAHWIy4Ib6Zfqxr1ptak9P2b0Nz3arYssQEPdCBxqLsStjItnVqX9xmdrlbzqmirzHRr4rtROCUFQ==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.2_1783967445722_0.5145734267537272","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@codehz/ai","version":"0.4.3","_id":"@codehz/ai@0.4.3","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"97b5ec018b9f1afc9e77333035728435a56bf67a","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.4.3.tgz","fileCount":43,"integrity":"sha512-IlY/aTYFTG+byvXRsbsqbCDPK4d1MT4xX2DVtVEDkkhATWo8ff2sjctUkA+V1gyvQFiWFR3SYeXmS+K8GXvlmw==","signatures":[{"sig":"MEYCIQDfXEHcUfn/kIB4KgX+vv5noWg+Cf1RvrJX/Mz21xJFxAIhAL7fV7lDt8B4rO/PFMkUebm5W/+b7FFTrtDgvfB3Jq08","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":695017},"type":"module","module":"dist/index.mjs","shasum":"97b5ec018b9f1afc9e77333035728435a56bf67a","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-IlY/aTYFTG+byvXRsbsqbCDPK4d1MT4xX2DVtVEDkkhATWo8ff2sjctUkA+V1gyvQFiWFR3SYeXmS+K8GXvlmw==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.3_1783967777480_0.17111920237084433","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@codehz/ai","version":"0.4.4","_id":"@codehz/ai@0.4.4","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"dist":{"shasum":"c81006798d80724740788afb97a4a3854ea441a5","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.4.4.tgz","fileCount":43,"integrity":"sha512-RnwWfAszQjIVIRDY+y8pw+3m+iWkFMopLJkG5YcdGocKVdcxXl86GWHo/NWfLlq16n7vEFKh9CX7oslGubMWhQ==","signatures":[{"sig":"MEUCIQDQsrnSaZ7At00n6oAdyliwkt+gEPyY00Bmb0Nu7vA1ggIgX1QIlGLWAvGhy9vcUiK/pcLOlpD47+AIcus/wqtLHA8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":706028},"type":"module","module":"dist/index.mjs","shasum":"c81006798d80724740788afb97a4a3854ea441a5","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"_integrity":"sha512-RnwWfAszQjIVIRDY+y8pw+3m+iWkFMopLJkG5YcdGocKVdcxXl86GWHo/NWfLlq16n7vEFKh9CX7oslGubMWhQ==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.4_1783968156427_0.6655329539487356","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@codehz/ai","version":"0.4.5","_id":"@codehz/ai@0.4.5","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"7989181d50fbfbc6637856e3b997fcd5e3bf3a32","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.4.5.tgz","fileCount":46,"integrity":"sha512-GboQnUorlCNXIW1hE2FQxZic7hFSHDPAMSUuqQrNQJRRMEHmNbk1+Tw9moZca8uB1BJ66OIwrfkSZ8CNOLrPew==","signatures":[{"sig":"MEUCIBbrIqNCaB3++bSkehBd4Z/FZ81DkBV3fxZDqwJyYL/SAiEA4K5k/xsrbUSqCx6DLNMohvKyJVecjNS5t5yqc5g/3j8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":736801},"type":"module","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"9d4b56fe9bc3e8a109571bf3f662a475f99e9475","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"codehz","email":"CodeHz@Outlook.com"},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.1","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `mock`）。","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.5_1784007481296_0.5028344282958266","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@codehz/ai","version":"0.4.6","_id":"@codehz/ai@0.4.6","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"4fd0a4accc9e2dd644aa80279e47fcdd9cdca918","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.4.6.tgz","fileCount":46,"integrity":"sha512-vH1yhCQ6C4kZulswBjFgeAAz83z5rh1bl07o19IrQtE3ilPwO/bFK4+wCkWhZOXwsTklDpuiJ5aUJ/7JIPKbIw==","signatures":[{"sig":"MEQCIQCnYb5Hyufw/+czFcwPc/Fi4jR2bMjhgsr26FwTZGjWWQIfTgGyQ55XespRUq/eTq3zsPypxAmvJ6+cr42DNJzKVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":736991},"type":"module","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"e92a932eced8057458e7eb1597e7b1a61211fe37","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.1","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `mock`）。","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.6_1784009379575_0.7533082790176779","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@codehz/ai","version":"0.7.0","_id":"@codehz/ai@0.7.0","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"675965e2dbb2be220f2b7c73c933104a636fe111","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.7.0.tgz","fileCount":5,"integrity":"sha512-DSSHnckM35vTS1M5zJ0VNiRub53LOF1AyQ91CSG1jBnmtfh34lfuCOjKIeXQxqhTGAV1njxmkHC4q8DOEwmlMQ==","signatures":[{"sig":"MEUCIEwaZZClRhCT6piNKL9iIinqyxEIeXI8sgD6cgIzj7tfAiEAyCbFfUkGPLNrRSWLbDG0bNzdPOxgKIjVkVfWqer+hFI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":706685},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"bun":">=1.1.0","node":">=18"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"6b35809cfe59bc32b4b6349a432892c60deb0180","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts","example:server-tools":"bun run examples/server-tools.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.2","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.7.0_1786073129027_0.27655032855733763","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@codehz/ai","version":"0.7.1","_id":"@codehz/ai@0.7.1","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"85cec7d648de20c3e31fbb445451ad08e63cc748","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.7.1.tgz","fileCount":5,"integrity":"sha512-ZDw6HrfNjXrhpaCK2rMjhmX40hxxs64k52RjF2PJ368EneLfYGUI67yYRLlLxH2Ajw9Q5iAvM4u7MtYbWUAsOw==","signatures":[{"sig":"MEYCIQDR79kgAgQ1hc3gGIRpHXCAUvKyxVrLk3metn6tGnNOdgIhAK61iGPInsq1eiB1PYiddtWGo/jfMFBYRhLxPMGdljk7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":716659},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"bun":">=1.1.0","node":">=18"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"844aadcefc505ed0ab0fb786a76108d57f295686","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts","example:server-tools":"bun run examples/server-tools.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.2","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.7.1_1786088096038_0.9864125176076421","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@codehz/ai","version":"0.8.0","_id":"@codehz/ai@0.8.0","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"da8ddeb36ffa5c6533c622991516d1949399454f","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.8.0.tgz","fileCount":5,"integrity":"sha512-k0iTzPWAV5x0OeivXFvkh7pp2rSKtqkF03NWv6UUZEeSKGaEHYGTWMonOKrUfp2i+U5c7Uc1p/hYu69xjIHwuQ==","signatures":[{"sig":"MEQCIEQiHnQs0IHsddFyGfIK/qgeYfk9IUy7hOyRRDDKpAjhAiBpJS+FmPBwuzHpCrMEIp6MEVD6IF7a2Sizvuww6SSJ6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":678778},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"bun":">=1.1.0","node":">=18"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"e8c5abc5f639864a20a5f065e6fb2e692f424f64","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts","example:server-tools":"bun run examples/server-tools.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.2","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.8.0_1787131614914_0.032829694104185014","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@codehz/ai","version":"0.8.1","_id":"@codehz/ai@0.8.1","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"439e3c2fce1331efcf84c75367b1cad11c08bbc5","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.8.1.tgz","fileCount":5,"integrity":"sha512-x473QOLw9C1DuGGJW3nEv27ns2vyT7TZp9ybhWRcVPdPIvhd+fMtc5s37iOjHt4X596RwLUzp4BNHikJYukq4A==","signatures":[{"sig":"MEYCIQCNd32Y+JPK0ULWl54QWrvksYnzSSCtP3jhDSo6cwl5hQIhANXZj1GgcMf4lWjnP417fueF+vPPVbz9TPmmEThLsbkg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":686951},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"bun":">=1.1.0","node":">=18"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"c80aa76d39e76fc01001bcecd2d14c1ab0d3e261","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts","example:server-tools":"bun run examples/server-tools.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.2","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.8.1_1787140965252_0.9148886632733859","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@codehz/ai","version":"0.8.2","_id":"@codehz/ai@0.8.2","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"3ac3024ea428b3134c4d7dac52139f0e7552de93","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.8.2.tgz","fileCount":5,"integrity":"sha512-C1ymqVwphA7pw/KZ21m3E1Q7c/AXrkKgOvDs5oicz8V17yZVxqanhTYU3HsFpSTEz6iE/09WHjkvtjt+VeLwZw==","signatures":[{"sig":"MEUCIQDKpeLBc8HF3YppUVDNdPso1ru5PIRoDFgJ02Tf69HqYAIgbpZFkcKAj4ztwKoYNs7vRwVJYwdTaX1HnX6EvlAZYn8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":708497},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"bun":">=1.1.0","node":">=18"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"4f88ee3f5aaa17a9eb1f01e91b69daa92241a551","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts","example:server-tools":"bun run examples/server-tools.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.2","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.8.2_1787159695632_0.5955596809452717","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@codehz/ai","version":"0.9.0","_id":"@codehz/ai@0.9.0","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"homepage":"https://github.com/codehz/nano-ai#readme","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"dist":{"shasum":"ec3e5fb4ca111cf4fb804f9762bf1967fdfad068","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.9.0.tgz","fileCount":5,"integrity":"sha512-LqEFpQq9D5fjWpXMmfndXWIcNvaH+AFPA79bsvq/xpOA5dA4BezGxQf5ZmHv6rItgxeVq+bLF5LOJrpdJx48DA==","signatures":[{"sig":"MEQCIGHbWu8t4K+JDVNztYon2cWuNJCTlope41UmjLFBrienAiAt5uZeYD8EoSHDFNBt+v/4LMHc2AmeAOWjIuewCg5afA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":709347},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"bun":">=1.1.0","node":">=18"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"gitHead":"8d5e4353f610cf2efbab6a0ad5baaf279a761c5b","scripts":{"lint":"oxlint","test":"bun test","format":"oxfmt --write","prepack":"tsdown","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","format:check":"oxfmt --check","example:basic":"bun run examples/basic.ts","example:tool-loop":"bun run examples/tool-loop.ts","example:multi-turn":"bun run examples/multi-turn.ts","example:server-tools":"bun run examples/server-tools.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"repository":{"url":"git+https://github.com/codehz/nano-ai.git","type":"git"},"_npmVersion":"12.0.2","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","@types/bun":"latest","typescript":"^6"},"_npmOperationalInternal":{"tmp":"tmp/ai_0.9.0_1787556332520_0.864296593541233","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@codehz/ai","version":"0.9.1","repository":{"type":"git","url":"git+https://github.com/codehz/nano-ai.git"},"type":"module","sideEffects":false,"main":"./dist/index.mjs","module":"./dist/index.mjs","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"typecheck":"tsc --noEmit","lint":"oxlint","lint:fix":"oxlint --fix","format":"oxfmt --write","format:check":"oxfmt --check","test":"bun test","example:basic":"bun run examples/basic.ts","example:multi-turn":"bun run examples/multi-turn.ts","example:tool-loop":"bun run examples/tool-loop.ts","debug:cli":"bun run scripts/debug-cli.ts","example:server-tools":"bun run examples/server-tools.ts","prepack":"tsdown"},"devDependencies":{"@types/bun":"latest","oxfmt":"^0.58.0","oxlint":"^1.73.0","tsdown":"^0.22.3","typescript":"^6"},"engines":{"bun":">=1.1.0","node":">=18"},"gitHead":"02cfae99eff4fad527946cff7aeeae2b9d23dfa3","_id":"@codehz/ai@0.9.1","description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"homepage":"https://github.com/codehz/nano-ai#readme","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-D29TreQvUjLoYCmxy00Cehso1PhsgW8Masj7e7fwuxXTYGiwVQVl7J92f2CLoJsypIIhcYyn4TadeEo6oQH+vw==","shasum":"ffc65687171a07d26184d9f02b0aef75bfa80bfd","tarball":"https://registry.npmjs.org/@codehz/ai/-/ai-0.9.1.tgz","fileCount":5,"unpackedSize":747179,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codehz%2fai@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD77I6hhPpmEmoLMTIUy3SDYgsTdJBmtx/2nEuDSmgLCQIgcDvuT4bQtBG7NNyCQS0QkBXTmlkYS3v9DGVaE2sc/gI="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:08c7c8f8-01dc-4ceb-bd25-5db192fcb9ec"}},"directories":{},"maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai_0.9.1_1787990951465_0.6759465492214247"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-07T18:47:14.894Z","modified":"2026-08-29T08:09:11.873Z","0.1.0":"2026-07-07T18:47:15.249Z","0.1.1":"2026-07-08T03:07:11.467Z","0.1.2":"2026-07-08T04:26:09.715Z","0.1.3":"2026-07-08T05:09:25.462Z","0.1.4":"2026-07-08T07:02:51.503Z","0.1.5":"2026-07-11T16:02:03.225Z","0.1.6":"2026-07-12T06:13:42.576Z","0.1.7":"2026-07-12T06:29:44.836Z","0.1.8":"2026-07-12T06:45:37.272Z","0.2.0":"2026-07-12T06:52:52.195Z","0.2.1":"2026-07-12T13:26:34.593Z","0.2.2":"2026-07-12T13:49:09.448Z","0.2.3":"2026-07-12T13:57:43.480Z","0.2.4":"2026-07-12T17:27:10.790Z","0.3.0":"2026-07-13T05:31:08.952Z","0.4.0":"2026-07-13T05:59:07.405Z","0.4.1":"2026-07-13T07:09:54.030Z","0.4.2":"2026-07-13T18:30:45.913Z","0.4.3":"2026-07-13T18:36:17.721Z","0.4.4":"2026-07-13T18:42:36.589Z","0.4.5":"2026-07-14T05:38:01.497Z","0.4.6":"2026-07-14T06:09:39.716Z","0.7.0":"2026-08-07T03:25:29.239Z","0.7.1":"2026-08-07T07:34:56.223Z","0.8.0":"2026-08-19T09:26:55.073Z","0.8.1":"2026-08-19T12:02:45.458Z","0.8.2":"2026-08-19T17:14:55.831Z","0.9.0":"2026-08-24T07:25:32.669Z","0.9.1":"2026-08-29T08:09:11.623Z"},"bugs":{"url":"https://github.com/codehz/nano-ai/issues"},"homepage":"https://github.com/codehz/nano-ai#readme","repository":{"type":"git","url":"git+https://github.com/codehz/nano-ai.git"},"description":"统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。","maintainers":[{"name":"codehz","email":"CodeHz@Outlook.com"}],"readme":"# @codehz/ai\n\n统一流式 AI 客户端，提供一套 canonical API，对接真实模型后端与面向测试的回调驱动 `MockAdapter`（`responses` / `messages` / `chat-completions` / `ollama` / `gemini` / `mock`）。\n\n## 0.6.0 迁移说明\n\n小 breaking：warnings 形状、tool_call 校验与 Chat Completions opaque 入站。\n\n### `warnings` 结构化\n\n`AIResponse.warnings` / `response.warning` / `response.completed.warnings` 由 `string[]` 改为：\n\n```ts\ntype StreamWarning = { message: string; code?: WarningCode };\n// AIResponse.warnings?: StreamWarning[]\n```\n\n迁移：原先 `for (const w of response.warnings ?? []) console.log(w)` 改为读取 `w.message`（及可选 `w.code`）。\n\n### `tool_call.argumentsText` 校验\n\n运行时 `validateRequest` **不再**对 `tool_call.argumentsText` 做 `JSON.parse`；只校验为 `string`。object-wire adapter（ollama / messages / gemini）在入站映射（`parseToolArguments` / `parseJsonStrictObject`）时若参数不是合法 JSON object，抛 `AIRecoverableError`（`TOOL_CALL_ARGUMENTS_INVALID`）：`AdapterBase` soft-complete 为 `response.warning` + `response.completed`（`stopReason: \"error\"`），不向调用方抛错、也不发 provider HTTP。chat-completions / responses 仍按字符串透传。\n\n### Chat Completions opaque\n\n入站 opaque 仅接受 `messages` 形（`{ messages: ChatMessage[] }`）。单条 `{ role, content }` 已 **deprecate**（有效 envelope 下未识别 shape 会被跳过，不再当完整 assistant turn 还原）。出站仍写 `messages: [assistantReplayMessage]`。\n\nopaque replay 只检查 object 和 JSON 可序列化性；客户端不再强制 1MiB/8MiB 大小或嵌套深度上限，也不会因这些通用限制丢弃 replay。实际请求大小和 provider 可接受的 payload 由 provider / transport 决定。\n\n### 其余行为（0.6 一并落地，多为兼容增强）\n\n- HTTP adapter 错误码与 incomplete 流完成路径收敛；Chat Completions 支持 arguments-before-id 与 `function_call`/`tool_calls` 互斥 warning。\n- Aggregator 在 finalize 时从 `output` 派生 `text` / `toolCalls` / `serverTool*`；`argumentsText` 分块累积。\n- 四家厚 adapter 拆为 `map-request` / `map-stream`（对齐 `responses`）；opaque 恒尾置。\n\n### 请求校验边界\n\n`normalizeRequest` 和 `createAIClient` 不再自动运行通用 `validateRequest`。客户端只做默认值合并、`include` 归一化和 request id 生成；`temperature`、`maxOutputTokens`、tool 名称及其他 provider/model policy 交给目标 provider。adapter 仍保留构造合法 wire request 所需的 capability、shape 和 JSON object 检查。\n\n通用校验器不再从 runtime 入口导出；应用如果需要严格输入检查，应在自己的信任边界显式实现。\n\n## 0.5.0 迁移说明（摘要）\n\n`0.5.0` 收紧了根入口公开面：`AdapterBase`、`createEventFactory`、`aggregateEvents`、`normalizeRequest`、transport / `syntheticStream` 等**不再**从 `@codehz/ai` 根导出（内部模块）。\n\n**仍从根导出：** `createAIClient`、`collectStream`、错误类型与 `WarningCode`、全部 adapters 与 Mock 夹具、canonical 构造、`REASONING_LEVELS`，以及 canonical 类型。自定义 adapter 请实现 `BackendAdapter`。\n\n### 错误通道语义\n\n- `AIRequestError` / `AIProviderError` / `AIStreamError`：致命，同步或在异步迭代中抛出，不伪造 `response.completed`。\n- `AIMappingError`：由内部 `AdapterBase` 捕获后降级为 `response.warning`（`WarningCode.MAPPING_ERROR`）+ 空 output 的 `response.completed`（无 `stopReason`）；生产 adapter 原则上不抛。\n- `AIRecoverableError`：由内部 `AdapterBase` 捕获后 soft-complete 为 `response.warning`（code 取自错误）+ 空 replay 的 `response.completed`（`stopReason` 默认 `\"error\"`）。用于可清理历史后重试的回合失败（如 object-wire 入站非法 `tool_call.argumentsText`）。\n- 非致命差异走 `response.warning` 与 `WarningCode`（0.6 起为结构化对象）。\n\n## 安装\n\n```bash\nbun add @codehz/ai\n```\n\n依赖：Bun（内置 `fetch`、`crypto`），无需额外运行时依赖。\n\n## 快速开始\n\n```ts\nimport { createAIClient, ResponsesAdapter } from \"@codehz/ai\";\n\nconst client = createAIClient({\n  adapter: new ResponsesAdapter({ apiKey: process.env.OPENAI_API_KEY! }),\n  model: \"gpt-4o\",\n});\n\nconst stream = client.stream({\n  input: [{ type: \"message\", role: \"user\", content: [{ type: \"text\", text: \"What's the weather in Hangzhou?\" }] }],\n});\n\nfor await (const event of stream) {\n  if (event.type === \"message.delta\") {\n    process.stdout.write(event.delta.text);\n  }\n}\n```\n\n## 核心概念\n\n### 统一请求模型\n\n所有 adapter 接受同一形状的 `AIRequest`：\n\n```ts\ntype AIRequest = {\n  instructions?: string | InstructionBlock[]; // 系统级指令\n  input: InputItem[]; // 输入 items\n  tools?: ToolDefinition[]; // 客户端函数工具（由调用方执行）\n  serverTools?: ServerToolDefinition[]; // Provider 托管工具（web_search / code_execution / mcp）\n  toolChoice?: ToolChoice; // 客户端工具选择策略\n  temperature?: number; // provider/model-defined generation parameter\n  maxOutputTokens?: number; // 最大输出 token\n  reasoningLevel?: \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\"; // 可移植思考力度\n  include?: {\n    usage?: \"off\" | \"best_effort\" | \"required\";\n    billing?: \"off\" | \"best_effort\" | \"required\";\n    providerMetadata?: \"off\" | \"best_effort\";\n  };\n};\n```\n\n`tools` 与 `serverTools` 可在同一请求中共存。客户端 `tool_call` / 手动 tool-loop 语义不变；服务端工具由 provider 在请求内执行，**不会**把 `stopReason` 设为 `tool_call`。\n\n`reasoningLevel` 是 portable 枚举，由各 adapter 映射到 provider 原生字段；未设置时不写相关 wire 字段。adapter 无法映射的 level（如 Ollama 的 `minimal` / `xhigh` / `max`）会抛 `AIRequestError`（`UNSUPPORTED_REASONING_LEVEL`）。需要 budget / summary 等特化参数时，仍可用构造期 `extraBody` 覆盖同名顶层键。\n\n| Adapter                  | 映射                                                                                                                               |\n| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- |\n| `ResponsesAdapter`       | `reasoning: { effort }`                                                                                                            |\n| `ChatCompletionsAdapter` | 顶层 `reasoning_effort`                                                                                                            |\n| `MessagesAdapter`        | `thinking: { type: \"disabled\" }` 或 `{ type: \"enabled\", budget_tokens }`（由 `maxOutputTokens` 按比例推导，默认 4096）             |\n| `OllamaAdapter`          | `think: false \\| \"low\" \\| \"medium\" \\| \"high\"`                                                                                      |\n| `GeminiAdapter`          | `generationConfig.thinkingConfig`（`none` 关闭 thoughts；`minimal`/`low`/`medium`/`high` → `thinkingLevel`；`xhigh`/`max` 不支持） |\n| `MockAdapter`            | 透传到 `MockHandlerContext.reasoningLevel`                                                                                         |\n\n`input` 是 item 数组，每个 item 可以是：\n\n| Item 类型               | 用途                                |\n| ----------------------- | ----------------------------------- |\n| `message`               | 用户 / 助手消息（可带 `citations`） |\n| `reasoning`             | 思维链（输入侧 replay）             |\n| `tool_call`             | 客户端工具调用（输入侧 replay）     |\n| `tool_result`           | 客户端工具执行结果                  |\n| `server_tool_call`      | Provider 托管工具调用               |\n| `server_tool_result`    | Provider 托管工具结果               |\n| `server_tool_discovery` | MCP 等远端工具发现列表              |\n| `opaque`                | Provider 私有续接材料               |\n\n### 统一事件流\n\n所有 adapter 产出 `AsyncIterable<AIStreamEvent>`，事件语义一致：\n\n```\nresponse.started → (item.started → item.delta* → item.completed)* → response.completed\n```\n\n事件类型：\n\n| 事件                                    | 含义                                        |\n| --------------------------------------- | ------------------------------------------- |\n| `response.started`                      | 响应开始                                    |\n| `message.{started,delta,completed}`     | 消息输出（`completed` 可带 `citations`）    |\n| `reasoning.{started,delta,completed}`   | 思维链                                      |\n| `tool_call.{started,delta,completed}`   | 客户端工具调用                              |\n| `server_tool.{started,delta,completed}` | 服务端工具调用                              |\n| `server_tool_result.completed`          | 服务端工具结果（原子）                      |\n| `server_tool_discovery.completed`       | MCP 工具发现（原子）                        |\n| `response.warning`                      | 非致命警告                                  |\n| `response.auxiliary`                    | usage / billing 辅助信息                    |\n| `response.completed`                    | 响应结束，携带 replay、终止原因及最终元数据 |\n\n### 统一终结结果\n\n**`AIResponse` 的完整形态以 `collectStream()` / 事件聚合器为唯一真相源。**\n流式消费者读 `AIStreamEvent`；`response.completed` 只携带 `replay`、终止原因、usage/billing 等元数据，**不**携带完整 `output`/`text`/`toolCalls` 账本。\n\n流结束后可通过 `collectStream()` 聚合为 `AIResponse`：\n\n```ts\nimport { collectStream } from \"@codehz/ai\";\n\nconst response = await collectStream(client.stream({ input }));\nconsole.log(response.text); // 全部文本\nconsole.log(response.toolCalls); // 工具调用列表\nconsole.log(response.usage); // token 统计\nconsole.log(response.replay); // 续接材料\n```\n\n`AIResponse` 包含：\n\n| 字段                | 类型                     | 说明                               |\n| ------------------- | ------------------------ | ---------------------------------- |\n| `output`            | `OutputItem[]`           | 当前轮输出                         |\n| `replay`            | `ReplayItem[]`           | 续接材料（下次请求带回）           |\n| `text`              | `string`                 | 全部文本拼接                       |\n| `toolCalls`         | `ToolCallItem[]`         | 客户端工具调用                     |\n| `serverToolCalls`   | `ServerToolCallItem[]`   | 服务端工具调用                     |\n| `serverToolResults` | `ServerToolResultItem[]` | 服务端工具结果                     |\n| `stopReason`        | `StopReason?`            | 终止原因（可选）                   |\n| `usage`             | `Usage?`                 | token 统计（可选）                 |\n| `billing`           | `BillingInfo?`           | 计费信息（可选）                   |\n| `auxiliary`         | `AuxiliaryInfo?`         | Provider 辅助信息（可选）          |\n| `warnings`          | `StreamWarning[]?`       | 非致命警告（`{ message; code? }`） |\n| `backend`           | `BackendTrace`           | 调用链路元数据                     |\n\n流式 `message.delta` / `reasoning.delta` 保持后端分片粒度；完成态 `output` 中的\n`message` / `reasoning` 会合并相邻 `text` content blocks（直接拼接且不添加分隔符），\n非文本 block 仍保留原有边界。\n\n## 后端 Adapter\n\n| Adapter                 | 类                       | 说明                           |\n| ----------------------- | ------------------------ | ------------------------------ |\n| OpenAI Responses API    | `ResponsesAdapter`       | OpenAI Responses 端点          |\n| Anthropic Messages API  | `MessagesAdapter`        | Anthropic Messages 端点        |\n| OpenAI Chat Completions | `ChatCompletionsAdapter` | Chat Completions 端点          |\n| Ollama Chat API         | `OllamaAdapter`          | 本地或自托管 Ollama            |\n| Google Gemini API       | `GeminiAdapter`          | Gemini `streamGenerateContent` |\n| Scripted Test Backend   | `MockAdapter`            | 脚本化测试夹具                 |\n\n```ts\nimport {\n  ResponsesAdapter,\n  MessagesAdapter,\n  ChatCompletionsAdapter,\n  OllamaAdapter,\n  GeminiAdapter,\n  MockAdapter,\n  withMockStreaming,\n} from \"@codehz/ai\";\n\n// OpenAI Responses API\nconst responses = new ResponsesAdapter({\n  apiKey: \"sk-...\",\n  // 可选：自定义请求头 / body 额外顶层字段（构造期静态，后写覆盖内置鉴权头与同名 body 键）\n  headers: { \"OpenAI-Organization\": \"org-...\" },\n  extraBody: { top_p: 0.9 },\n});\n\n// Anthropic Messages API\nconst messages = new MessagesAdapter({\n  apiKey: \"sk-ant-...\",\n  headers: { \"anthropic-beta\": \"...\" },\n  extraBody: { top_p: 0.9 },\n});\n\n// OpenAI Chat Completions\nconst chat = new ChatCompletionsAdapter({\n  apiKey: \"sk-...\",\n  headers: { \"OpenAI-Organization\": \"org-...\" },\n  extraBody: { top_p: 0.9 },\n});\n\n// Ollama\nconst ollama = new OllamaAdapter({\n  baseUrl: \"http://localhost:11434\",\n  headers: { \"X-Custom\": \"...\" },\n  extraBody: { keep_alive: \"10m\" },\n});\n\n// Google Gemini Developer API（原生 generateContent 流，非 OpenAI 兼容层）\nconst gemini = new GeminiAdapter({\n  apiKey: process.env.GEMINI_API_KEY!,\n  // 可选：代理 / Vertex 兼容端点\n  // baseUrl: \"https://generativelanguage.googleapis.com/v1beta\",\n  headers: { \"X-Custom\": \"...\" },\n  extraBody: { safetySettings: [] },\n});\n\n// 面向测试的回调驱动 mock backend\nconst mock = new MockAdapter({\n  handler: withMockStreaming(\n    async function* () {\n      yield { type: \"message\", content: \"我先调用天气工具。\" };\n      yield {\n        type: \"tool_call\",\n        id: \"mock-call-weather\",\n        name: \"get_weather\",\n        argumentsText: '{\"city\":\"Hangzhou\"}',\n      };\n    },\n    {\n      charsPerSecond: 24,\n      chunkSize: 1,\n    },\n  ),\n});\n```\n\n公开 adapter 接口暴露稳定标识和流来源：\n\n```ts\nadapter.kind; // \"responses\" | \"messages\" | \"chat-completions\" | ...\nadapter.isSyntheticStream;\n```\n\n响应级 `backend.isSyntheticStream` 使用同一标记；具体响应内容仍应从\n本次事件流、warning 和 `replay` 判断。\n\n### 上下文压缩（可选能力）\n\n部分 adapter 原生支持上下文压缩，通过独立接口暴露，**不**挂在 `BackendAdapter` / `AIClient` 上：\n\n| Adapter            | `supportsContextCompress` | 说明                                                                    |\n| ------------------ | ------------------------- | ----------------------------------------------------------------------- |\n| `ResponsesAdapter` | 是                        | `POST /responses/compact`；结果为 opaque `compacted_window`             |\n| `MockAdapter`      | 是                        | 构造期可选 `compressHandler`；未配置则抛 `MOCK_COMPRESS_NOT_CONFIGURED` |\n| 其余内置 adapter   | 否                        | 本期无客户端摘要 fallback                                               |\n\n```ts\nimport { ResponsesAdapter, supportsContextCompress, createAIClient, collectStream } from \"@codehz/ai\";\nimport type { InputItem } from \"@codehz/ai\";\n\nconst adapter = new ResponsesAdapter({ apiKey: process.env.OPENAI_API_KEY! });\nconst client = createAIClient({ adapter, model: \"gpt-5.1\" });\n\nlet transcript: InputItem[] = [/* 多轮累积 */];\n\nif (supportsContextCompress(adapter)) {\n  // 用 replay 替换旧 transcript（不要 append 全文）\n  const { replay } = await adapter.compress({\n    model: \"gpt-5.1\",\n    input: transcript,\n  });\n  transcript = [...replay];\n}\n\ntranscript.push({\n  type: \"message\",\n  role: \"user\",\n  content: [{ type: \"text\", text: \"继续上一任务\" }],\n});\n\nconst response = await collectStream(client.stream({ input: transcript }));\n```\n\n边界：\n\n- 本期仅覆盖 **独立** `compress()`；不支持在 `stream` 请求里自动 `context_management` / `compact_threshold`。\n- Anthropic Messages 的请求内 compaction 未接入（无独立端点，另期）。\n- 调用方负责何时压缩与 transcript 替换；库不托管会话状态。\n\n## Mock 后端\n\n`MockAdapter` 是一个面向测试的回调驱动 adapter，用来验证长流程工具调用、`replay` 续接和异常路径。\n\n如果你要调试前端逐字渲染效果，可以用 `withMockStreaming()` 给非流式 handler 包一层分片输出：\n\n```ts\nconst handler = withMockStreaming(\n  async function* () {\n    yield { type: \"message\", content: \"Streaming preview for the frontend.\" };\n  },\n  {\n    charsPerSecond: 20, // 每秒约 20 个字符\n    chunkSize: 1, // 默认 1，即逐字输出\n    initialDelayMs: 150, // 可选：首字前停顿\n  },\n);\n```\n\n默认会发出单个完整 `message.delta`。只有经 `withMockStreaming()` 注入默认流速后，`message` / `reasoning` / `tool_call` 参数才会被拆成多个 delta。单个 step 也可用 `stream: false` 关闭包装器的默认流速配置。\n\n核心思路是每轮请求执行一次 handler：\n\n- handler 会拿到 `request` 和 `context`\n- `context` 内建 `previousReplay`、`pendingToolCalls`、`history`\n- handler 可脚本化发出 `message` / `reasoning` / `tool_call` / `server_tool_*`\n- message step 可附带 `citations`\n- 可注入 `warning`、`content_filter`、transport interruption、provider-style error\n- 可用 `assertMockRequest()` 验证 `replay` / `tool_result` / `serverTools` 等期望\n\n```ts\nimport { assertMockRequest, createAIClient, MockAdapter } from \"@codehz/ai\";\n\nconst client = createAIClient({\n  adapter: new MockAdapter({\n    handler: async function* (request, context) {\n      if (context.turnIndex === 0) {\n        assertMockRequest(\n          request,\n          {\n            items: [{ type: \"message\", role: \"user\", textIncludes: \"weather\" }],\n            tools: \"present\",\n            toolChoice: \"present\",\n          },\n          context,\n        );\n\n        yield { type: \"message\", content: \"Checking weather now.\" };\n        yield {\n          type: \"tool_call\",\n          id: \"mock-call-weather\",\n          name: \"get_weather\",\n          argumentsText: '{\"city\":\"Hangzhou\"}',\n        };\n        return;\n      }\n\n      assertMockRequest(\n        request,\n        {\n          requireReplayFromPreviousTurn: true,\n          requireToolResultsForPendingCalls: true,\n        },\n        context,\n      );\n\n      yield { type: \"message\", content: \"Hangzhou is 28C and sunny.\" };\n    },\n  }),\n  model: \"mock-model\",\n});\n```\n\n核心类型：\n\n```ts\ntype MockHandler = (request: NormalizedRequest, context: MockHandlerContext) => AsyncIterable<MockStep>;\n\ntype MockHandlerContext = {\n  turnIndex: number;\n  previousReplay: ReplayItem[];\n  pendingToolCalls: readonly ToolCallItem[];\n  history: readonly MockHistoryRecord[];\n};\n```\n\n测试工具循环时，第二轮通常会要求：\n\n- `requireReplayFromPreviousTurn: true`\n- `requireToolResultsForPendingCalls: true`\n\n畸形路径示例：\n\n```ts\nyield { type: \"message\", content: \"partial answer\" };\nyield { type: \"interrupt\" }; // 不发 response.completed，collectStream() 应失败\n```\n\n```ts\nyield { type: \"warning\", message: \"content filtered by policy\", code: \"CONTENT_FILTER\" };\nyield { type: \"complete\", stopReason: \"content_filter\" };\n```\n\n## 多轮对话\n\n库不托管会话状态。调用方自行保留 `response.replay` 并在下一轮带回：\n\n```ts\nconst transcript: InputItem[] = [{ type: \"message\", role: \"user\", content: [{ type: \"text\", text: \"Hello\" }] }];\n\nconst r1 = await collectStream(client.stream({ input: transcript }));\ntranscript.push(...r1.replay);\ntranscript.push({ type: \"message\", role: \"user\", content: [{ type: \"text\", text: \"Continue\" }] });\n\nconst r2 = await collectStream(client.stream({ input: transcript }));\n```\n\n详细示例见 [examples/multi-turn.ts](./examples/multi-turn.ts)。\n\n## 服务端工具（`serverTools`）\n\nProvider 托管工具（不进客户端 tool loop）。首版由 `ResponsesAdapter` 落地：\n\n| Canonical `serverTools` | Responses wire             | 说明                                           |\n| ----------------------- | -------------------------- | ---------------------------------------------- |\n| `web_search`            | `type: \"web_search\"`       | 域名过滤、`userLocation`、`searchContextSize`  |\n| `code_execution`        | `type: \"code_interpreter\"` | 仅 auto container（`memoryLimit` / `fileIds`） |\n| `mcp`                   | `type: \"mcp\"`              | 远程 MCP；**仅** `requireApproval: \"never\"`    |\n\n```ts\nconst stream = client.stream({\n  input: [{ type: \"message\", role: \"user\", content: [{ type: \"text\", text: \"杭州今天天气？\" }] }],\n  serverTools: [\n    {\n      type: \"web_search\",\n      allowedDomains: [\"example.com\"],\n      searchContextSize: \"low\",\n    },\n    {\n      type: \"code_execution\",\n      container: { type: \"auto\", memoryLimit: \"4g\" },\n    },\n    {\n      type: \"mcp\",\n      serverLabel: \"dmcp\",\n      serverUrl: \"https://dmcp-server.example/mcp\",\n      requireApproval: \"never\",\n      // authorization 每请求由调用方重传；不会写入 opaque 回放\n      authorization: process.env.MCP_TOKEN,\n    },\n  ],\n});\n\nconst result = await collectStream(stream);\nconsole.log(result.serverToolCalls);\nconsole.log(result.serverToolResults);\n// 消息 citations（url / container_file）挂在 MessageItem.citations\n```\n\n支持矩阵：\n\n| Adapter                                              | `serverTools`                                                          |\n| ---------------------------------------------------- | ---------------------------------------------------------------------- |\n| `ResponsesAdapter`                                   | 请求映射 + SSE 解析                                                    |\n| `MockAdapter`                                        | 可脚本化产出 `server_tool_*` 事件与 citations                          |\n| `ChatCompletions` / `Messages` / `Ollama` / `Gemini` | 传入非空 `serverTools` → `AIRequestError`（`UNSUPPORTED_SERVER_TOOL`） |\n\n范围说明（刻意不做）：\n\n- 客户端自动 tool-loop（仍由调用方编排）\n- computer_use / shell 托管\n- Chat Completions 搜索专用模型\n- MCP approval 交互回路（出现 `mcp_approval_request` 会 `response.warning`）\n- Containers REST 管理 API\n\n多轮续写推荐用 Responses 的 `previous_response_id` opaque replay，无需把 server tool result 当客户端 `tool_result` 回传。Mock 演示见 [examples/server-tools.ts](./examples/server-tools.ts)。\n\n## 手动工具循环\n\n模型返回 `tool_call` → 调用方执行工具 → 下一轮带入 `tool_result`：\n\n```ts\nconst r1 = await collectStream(client.stream({ input, tools }));\n\nfor (const call of r1.toolCalls) {\n  const result = await myTool(call);\n  input.push(...r1.replay);\n  input.push({\n    type: \"tool_result\",\n    callId: call.id,\n    toolName: call.name,\n    outcome: \"success\",\n    content: [{ type: \"json\", json: result }],\n  });\n}\n\nconst r2 = await collectStream(client.stream({ input, tools }));\n```\n\n详细示例见 [examples/tool-loop.ts](./examples/tool-loop.ts)。\n\n## 模拟流式\n\n真实 adapter 在原生流不可用时，库内部会用 synthetic 路径包装为规范事件流。应用层一般只需消费 `client.stream()` / `collectStream()`；`0.5.0` 起 `syntheticStream` 不再从根入口导出（test-first helper，不展开 `server_tool_*`）。\n\n若只需前端逐字预览效果，请优先使用 `MockAdapter` + `withMockStreaming()`（见上文 Mock 后端）。\n\n## 辅助信息采集\n\n`usage` / `billing` / `providerMetadata` 由 adapter 在流结束时经 `response.auxiliary` 与 `AIResponse` 字段交付。`AuxiliaryCollector` 是 provider 内部实现细节，`0.5.0` 起不再从根入口导出。`lookup` / `postprocessBilling` 为 experimental 扩展点，库内 HTTP adapter 默认未接线。\n\n`usage` 与 `billing` 的 `include` 支持三种模式：`off` 表示不采集；`best_effort`（默认）表示尽可能采集，缺失时静默；`required` 表示缺失时发出 `USAGE_MISSING` 或 `BILLING_MISSING` warning。估算 billing 仍会发出 `BILLING_ESTIMATED` warning。\n\n## 开发命令\n\n`examples/` 下的三个示例默认都基于 `MockAdapter`，可直接运行，无需配置真实模型或 API key。\n\n```bash\nbun run typecheck    # TypeScript 类型检查\nbun run test         # 运行全部测试\nbun run example:basic\nbun run example:multi-turn\nbun run example:tool-loop\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}