{"_id":"@ai_wanjia/sdk","_rev":"10-9f2e6932a62fe3a90ccc5570c9679fac","name":"@ai_wanjia/sdk","dist-tags":{"latest":"1.0.10"},"versions":{"1.0.0":{"name":"@ai_wanjia/sdk","version":"1.0.0","_id":"@ai_wanjia/sdk@1.0.0","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"458c405b840a553101d101e9583cca4014586731","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.0.tgz","fileCount":10,"integrity":"sha512-V1Z0fyls8WhhG4wB8hW9ezNWR2WevcXF1Fn9CoreC5miotHoGoTaP8vsjAx3HG+PVr5/2nA4eDtUs9CA59kvkA==","signatures":[{"sig":"MEUCIQC6epdmCrVaxj49EnjZT2BsQAs4OFxUjiW3wnq/RjXGZQIgKda68H32aoMtdS2X4Hct9FyQo7uSvJSyP8R4n1AOzxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152175},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"c64337dc2429747f47e9a76aecc1fdeb6bd79cec","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1776422111752_0.7635319561899185","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@ai_wanjia/sdk","version":"1.0.1","_id":"@ai_wanjia/sdk@1.0.1","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"b96f450f5832de0a585326986f5d3b2275d0db97","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.1.tgz","fileCount":11,"integrity":"sha512-ftF9hWy0zAQ4BWhaE2jvhMTkouOMtD+UcR3RT38/46S1LeV/Oq/Jl+MpVxWM+jJ5PbR+7XXlbXO3aCAdpSOneA==","signatures":[{"sig":"MEUCIQCBXUtKU9HM3NxMrPuQrAHeqdxjz7Kxsjyvr/nw9tljtwIgUgq97VdOUpP77OulUBlxCYEptaEixyTgviIzczpVPdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179922},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"0fdf505d1aa40ea8bbd8cadbf26a1fe1fdc0a3a8","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.1_1776430340172_0.45854378152538566","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@ai_wanjia/sdk","version":"1.0.2","_id":"@ai_wanjia/sdk@1.0.2","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"a5a5c8490e54e46fb66b55e243f363de412ef23a","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.2.tgz","fileCount":11,"integrity":"sha512-a0onaqgdtaaa1n6G9iFnn2/gw0gt0c8yAisTa50G2TyhDLYMv91MufXOHV/Nxe00VYCiyKf7xt7l8UZf7jNh1A==","signatures":[{"sig":"MEUCIDP9+eU6cvsVki/i046OXJiKoe2VSKP469un/CkLJ1ZQAiEAv+cqJ6FSKL6ZeirbveXNLHtDIQurIjibdalsDO5BB2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204398},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"02a1507f9960cab93b572f9cf38ac84150422159","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.2_1776858611023_0.5724808971218296","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@ai_wanjia/sdk","version":"1.0.3","_id":"@ai_wanjia/sdk@1.0.3","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"664988ba74ed415ef4aa403e9e625522c74be5e4","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.3.tgz","fileCount":11,"integrity":"sha512-PAH6z/1OP5Nm0SeKo0yXEXeAmkXZjhcb1VHdN8sEBfyCZqEXN8YNvSMZYkfoNtzRFjoirW8IrZPCKcMiocJdMg==","signatures":[{"sig":"MEQCIGs9FA1a5PsVwXcehgSoIv53+NKNF76DqTJlQ+LyOAk5AiAyw3FFYWMCRud5h0OQsF5Frs5aN2hCcgkNA3IA67fCFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":226495},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"5215469d47d21d187af73cc2d08d87b287e63391","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.3_1777293966258_0.3132652030784624","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@ai_wanjia/sdk","version":"1.0.4","_id":"@ai_wanjia/sdk@1.0.4","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"1b6abe89d0b2dc67bf8b3d2ea692fa181e45c44a","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.4.tgz","fileCount":11,"integrity":"sha512-6iGLjnRkc5DEk8cB194NAASgUPnONYSLMlqjGcF8WzUhk6w3Qpi+Ho539zvngA1xoJO4faX1dE282L5tAqNxqA==","signatures":[{"sig":"MEUCIQDNlMZH6C/on7FM536izXUwrHlIzPwRgy2vE/FM3K/yCwIgYjsNfzDB3qMCiFQ8wbzLflVFrwdUb+ZJVVsL5stzazM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":227850},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"5f54c308464b336e7539f9845caa59b4d2961804","scripts":{"dev":"tsup --watch","test":"tsx --test src/**/*.test.ts","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","tsup":"^8.0.0","typescript":"^5.4.0","@types/node":"^22.15.30","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.4_1778668348665_0.6270720827279603","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@ai_wanjia/sdk","version":"1.0.5","_id":"@ai_wanjia/sdk@1.0.5","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"bca3f8d04c0980f09cca09b4dcd8fa401f8aff5f","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.5.tgz","fileCount":11,"integrity":"sha512-VXhzlGfKmvM2pGS01yV2DsFbpCWL48SOS6vJbMQOZMGHzX2aspAhy6/c8mKnWVEdwJ0FMC0Sx4NVY1fmx+nzCg==","signatures":[{"sig":"MEUCIGffSfPumESGErTNoBi56a1tSZ4c0vX+IXh0LErrAT0nAiEA8QKVP0gZ+WuWzzQz+7H9GcgnRUv+JGsoPKJs8V1GOgc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228055},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"cdb68047e3a48c862a2e869fb28a5c6c1fcf483d","scripts":{"dev":"tsup --watch","test":"tsx --test src/**/*.test.ts","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","tsup":"^8.0.0","typescript":"^5.4.0","@types/node":"^22.15.30","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.5_1779962031953_0.3245901001872933","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@ai_wanjia/sdk","version":"1.0.6","_id":"@ai_wanjia/sdk@1.0.6","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"d7b4e43d68ab888c627793b126963cf6ef916f5e","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.6.tgz","fileCount":11,"integrity":"sha512-A5LIYhaAdHO7iWEdGFZK/gIIFJB+b1sL8Ce38sx/sIbmA80OmWWAPeIcdUOegVzvz/ZwN0pHmSDtFWXT6AlyqQ==","signatures":[{"sig":"MEQCID0o4V98QScZZCcXDsKQMGAWneWheyYac4l2u2m30lnMAiBfmf0fbCSF6OR5wvJ2LEJFwBEbyCENr6QqCYLU4BN/vQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248256},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"fe9ee72c8c288138a4b91654876e7224cd07dbed","scripts":{"dev":"tsup --watch","test":"tsx --test src/**/*.test.ts","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","tsup":"^8.0.0","typescript":"^5.4.0","@types/node":"^22.15.30","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.6_1780325979874_0.4554271383163757","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@ai_wanjia/sdk","version":"1.0.7","_id":"@ai_wanjia/sdk@1.0.7","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"17c0da5d5c20d8d40ca6a7d20ed98640b756ea4e","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.7.tgz","fileCount":11,"integrity":"sha512-f+JrJS8OTSc4x2cjbDrZWOdolAGRC/6XhL725nIqHuH46IGV63tdcr3NRg2wmVpb8nP3qOupVMd/jL1gM+7N4g==","signatures":[{"sig":"MEYCIQCoBq/rgz0hH2KY3oPq1LXr5mwzdSbdBrNgrk2nQNd5mQIhAJYk4R9XElYLgHXt0c2ue1YGexcYp+n9QmeOBOgMfEhx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278563},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"87625e2c740d79e39b454a6264514c8aad46c114","scripts":{"dev":"tsup --watch","test":"tsx --test src/**/*.test.ts","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","tsup":"^8.0.0","typescript":"^5.4.0","@types/node":"^22.15.30","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.7_1781081513108_0.8010011224272753","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@ai_wanjia/sdk","version":"1.0.8","_id":"@ai_wanjia/sdk@1.0.8","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"dist":{"shasum":"b4d35e6e2021d5cf0df250b7e3afefbb5bfd3146","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.8.tgz","fileCount":11,"integrity":"sha512-c967fg5YEvk6S81oFzY4NNTAX8gRywJhpvxiQ50CarjwuxDkU0HuIc+sPCA8LWpd8ZjvFswZuHiAYBLdXDQUZA==","signatures":[{"sig":"MEQCIHXvWMN8JBEUWMcHULpN9b9lJR8IioNmx6cNzXM8CVY3AiAyNhcNoGqxuhV6Fy20outP0Xzan8G45IC/XoNeKzLoBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":330816},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"cb9a4f68fe8c653fa076fa9dfa22f668166486e6","scripts":{"dev":"tsup --watch","test":"tsx --test src/**/*.test.ts","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","tsup":"^8.0.0","react":"^18.3.1","typescript":"^5.4.0","@types/node":"^22.15.30","@types/react":"^18.0.0","react-test-renderer":"^18.3.1","@types/react-test-renderer":"^18.3.1"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.8_1788327730445_0.04666167255035325","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"_id":"@ai_wanjia/sdk@1.0.10","dist":{"shasum":"406d7590185602246b3256599fa9a37490d6115a","tarball":"https://registry.npmjs.org/@ai_wanjia/sdk/-/sdk-1.0.10.tgz","fileCount":11,"integrity":"sha512-M0O//SG8MmNejB3ZBveU0/NoA+VjfOWbbpdy4cCmgPa+2bo9IJ2ASXQPm7Zi22+3ki60tVE877LaeJ/nec6Xxw==","signatures":[{"sig":"MEQCIB8zL3rWmvoQKgJB27OSfN927+pt1DrU5WrLH4RvN9r/AiAzR89kSIs+65jLCyMuPVgqKZShFfG9zl1AWrS3iYQ/DQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIByN+unJfAgT9Q+VUdgLtr/SQEgKtBYdQstAkjGRmSU0AiAOfYsy+nX/yD8fGhAAShAH35VWDYY51pCkXFFtzZCwRQ=="}],"unpackedSize":387747},"main":"./dist/index.js","name":"@ai_wanjia/sdk","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx --test src/**/*.test.ts","build":"tsup","typecheck":"tsc --noEmit"},"version":"1.0.10","_npmUser":{"name":"loser7659","email":"xs765911@gmail.com"},"_npmVersion":"11.9.0","description":"Charx SDK for creator iframe integration","directories":{},"maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","tsup":"^8.0.0","react":"^18.3.1","typescript":"^5.4.0","@types/node":"^22.15.30","@types/react":"^18.0.0","react-test-renderer":"^18.3.1","@types/react-test-renderer":"^18.3.1"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.0.10_1789810736270_0.5359547520072561"}}},"time":{"created":"2026-04-17T10:35:11.668Z","modified":"2026-09-19T09:38:56.531Z","1.0.0":"2026-04-17T10:35:11.903Z","1.0.1":"2026-04-17T12:52:20.374Z","1.0.2":"2026-04-22T11:50:11.171Z","1.0.3":"2026-04-27T12:46:06.416Z","1.0.4":"2026-05-13T10:32:28.852Z","1.0.5":"2026-05-28T09:53:52.087Z","1.0.6":"2026-06-01T14:59:40.059Z","1.0.7":"2026-06-10T08:51:53.258Z","1.0.8":"2026-09-02T05:42:10.595Z","1.0.10":"2026-09-19T09:38:56.351Z"},"description":"Charx SDK for creator iframe integration","maintainers":[{"name":"loser7659","email":"xs765911@gmail.com"}],"readme":"# @ai_wanjia/sdk\n\n玩家AI 平台的创作者 SDK。\n\n当前源码版本为 **1.0.10**。本版本新增宿主校验的模型列表、当前模型读取与会话模型切换能力，同时保留 1.0.9 的消息操作取消语义、React 回溯接口和确认型操作超时策略。完整接入需同步更新宿主桥接；旧 HTML 中已打包的 SDK 不会自动替换。\n\n它用于运行在平台 iframe 内的独立页面，通过 `postMessage RPC` 与平台通信，读取角色信息、读写变量、发送消息、控制界面，并在 React 项目中提供现成的 Hooks 和组件。\n\n---\n\n\n## 1.0.10 模型选择\n\n- `sdk.model.list()` 返回宿主当前允许用户选择的模型配置及扣点、活动、上下文预算和健康状态信息。\n- `sdk.model.getCurrent()` 返回当前会话显式选择的配置名；返回 `null` 表示使用后台默认模型。\n- `sdk.model.select(model)` 切换当前会话模型；传入 `null` 恢复后台默认模型。宿主会校验配置是否仍可用，独立页面不能提交任意供应商模型 ID。\n- `sdk.model.onChanged(callback)` 订阅平台原生选择器或其他界面触发的模型变化。\n- React 项目可用 `useModels()` 统一读取、刷新和切换模型。\n\n```typescript\nconst models = await sdk.model.list()\nconst current = await sdk.model.getCurrent()\n\nawait sdk.model.select(models.find(model => model.healthStatus !== 'abnormal')?.value ?? null)\n\nconst unsubscribe = sdk.model.onChanged((model) => {\n  console.log('当前模型：', model ?? '后台默认模型')\n})\n```\n\n模型列表中的 `value` 是平台 AI 配置名称，不是供应商原始模型 ID。正式 Web/App 会把选择保存到当前对话；Creator 编辑和测试宿主只修改当前预览会话。Creator 预览返回与普通对话相同的用户模型列表，并通过受信任的草稿预览链路调用这些模型，不会把 Creator 专用模型暴露给独立界面。\n\n## 1.0.9 消息操作\n\n- `sdk.chat.messages.delete(id, options?)` 成功仍返回 `void`。支持新协议的宿主在用户取消时拒绝为 `ChatActionCanceledError`，可用 `isChatActionCanceledError(error)` 识别。\n- `useChat().deleteMessage()` 静默处理取消，并从宿主重新读取历史。旧宿主即使把取消返回为 `void`，也不会导致 React 面板误删本地消息。\n- `sdk.chat.rewind(id, options?)` / `useChat().rewind(id, options?)` 取消返回 `false`，成功返回 `true`（当前运行时仍存活时）。调用前必须 `await sdk.init()`，可通过 `sdk.supports('chat.rewind')` 判断能力。\n- 正式聊天声明 `chat.rewind`、`chat.messages.metadata`、`chat.messages.delete.cancel` 和 `chat.getLastDiagnostics`。创作者预览不声明正式会话回溯能力，调用会明确拒绝。\n- `ChatActionOptions.timeoutMs` 默认 `null`，等待用户确认时不使用整体倒计时；正数可指定包含确认等待的总时限。普通 RPC 仍默认 60 秒，实际网络执行继续受宿主 API 超时约束。销毁 SDK 会拒绝尚未完成的请求。\n- `ui.alert/confirm/prompt`、重生成和继续对话同样不因确认等待触发 SDK 总超时。旧宿主可能还有自己的超时限制，需更新宿主才能完整生效。\n- `Message` 增加可选 `updatedAt`（毫秒时间戳）、`generationStatus`、`generationError`、`rewindReady`。没有这些字段的旧宿主仍兼容；`rewindReady: false` 只表示没有精确快照，不代表历史节点一定不能回溯。\n\n```typescript\nimport { CharxSdk, isChatActionCanceledError } from '@ai_wanjia/sdk'\n\nconst sdk = CharxSdk.getInstance()\nawait sdk.init()\n\nasync function removeMessage(id: string) {\n  try {\n    await sdk.chat.messages.delete(id)\n  } catch (error) {\n    if (!isChatActionCanceledError(error)) throw error\n  }\n}\n\nasync function rewindTo(id: string) {\n  if (!sdk.supports('chat.rewind')) return false\n  return sdk.chat.rewind(id)\n}\n```\n\nReact 面板可直接使用 `const { messages, deleteMessage, rewind } = useChat()`。回溯成功可能重建整个页面 / WebView；原 iframe 中的后续业务代码不能依赖继续执行。新版 Hook 在仍存活的运行时中刷新历史并使旧流回调失效。\n\n宿主决定是否展示操作确认：App SDK 删除需要确认，Web SDK 删除沿用直接操作行为；平台自带的删除按钮仍需确认。旧 SDK 可以继续使用，但要获得上述 Hook 兼容逻辑及取消错误辅助函数，需要更新卡片依赖并重新打包。\n\n## 适用场景\n\n| 场景 | 是否适合 |\n|------|----------|\n| 独立 HTML 页面、原生 JS 页面 | ✅ |\n| React 独立页面 | ✅ |\n| 角色卡里需要完整自定义 UI 的游戏界面 | ✅ |\n| 仅在 AI 消息里插一个小卡片 | 更推荐直接用平台注入的 `window.$charx` |\n| Node.js 服务端、后端任务 | ❌ |\n\n---\n\n## 官方 Starter\n\n仓库内已经提供两套官方快速开发模板：\n\n| 模板 | 目录 | 适用场景 |\n|------|------|----------|\n| `charx-h5-starter` | `sdk/examples/charx-h5-starter` | 原生 `html + css + js`，零构建起步 |\n| `charx-react-starter` | `sdk/examples/charx-react-starter` | `Vite + React + TypeScript`，适合组件化开发 |\n\n这两套模板都支持：\n\n- 本地开发态自动切到 mock 运行时\n- 平台 iframe 内自动切到真实 SDK\n- 首页自带 `character / variable / storage / chat / ui.toast` 示例\n\n---\n\n## 安装\n\n```bash\nnpm install @ai_wanjia/sdk\n```\n\n---\n\n## 五分钟上手\n\n### 原生 JavaScript / TypeScript\n\n```typescript\nimport { CharxSdk } from '@ai_wanjia/sdk'\n\nconst sdk = CharxSdk.getInstance()\nawait sdk.init()\n\nconst info = await sdk.character.getInfo()\nconsole.log('角色名：', info.name)\n\nconst hp = await sdk.variable.get<number>('hp') ?? 100\nconsole.log('当前 HP：', hp)\n\nsdk.chat.send('总结一下我当前的状态', {\n  onData: (chunk) => {\n    console.log('流式片段：', chunk)\n  },\n  onComplete: (message) => {\n    console.log('完整回复：', message.content)\n  },\n  onError: (error) => {\n    console.error(error)\n  },\n})\n```\n\n### React\n\n```tsx\nimport { CharxProvider, useChat, useVariable, useCharacter } from '@ai_wanjia/sdk/react'\n\nexport default function App() {\n  return (\n    <CharxProvider fallback={<div>连接平台中...</div>}>\n      <GamePage />\n    </CharxProvider>\n  )\n}\n\nfunction GamePage() {\n  const character = useCharacter()\n  const { messages, send, status, stop } = useChat()\n  const [hp, setHp] = useVariable<number>('hp', 100)\n\n  return (\n    <div>\n      <h1>{character?.name}</h1>\n      <p>HP: {hp}</p>\n\n      {messages.map((message) => (\n        <div key={message.id}>{message.content}</div>\n      ))}\n\n      {status === 'streaming' ? (\n        <button onClick={stop}>停止</button>\n      ) : (\n        <button onClick={() => send('继续推进剧情')}>继续</button>\n      )}\n\n      <button onClick={() => setHp(hp + 5)}>恢复 5 点 HP</button>\n    </div>\n  )\n}\n```\n\n---\n\n## 运行时规则\n\n### 1. 必须在平台 iframe 内运行\n\n`sdk.init()` 会向父窗口发起握手。\n\n```typescript\nconst sdk = CharxSdk.getInstance()\nawait sdk.init()\n```\n\n如果页面不是由玩家AI平台加载，而是直接在浏览器里打开，`init()` 会在超时后抛错。\n\n### 2. `init()` 之前不要调用其他 API\n\n推荐做法：\n\n```typescript\nconst sdk = CharxSdk.getInstance()\nawait sdk.init()\n\n// 从这里开始再调用其他模块\n```\n\n### 3. `variable` 和 `storage` 不是一回事\n\n| 能力 | 作用域 | 是否随当前对话变化 | 适合存什么 |\n|------|--------|--------------------|------------|\n| `sdk.variable` | 当前对话 | 是 | HP、MP、好感度、剧情阶段、当前位置 |\n| `sdk.storage` | 当前会话 | 否 | 当前剧情存档、会话设置和背包 |\n\n### 4. SDK 负责界面层，不负责替代平台 AI 运行时\n\nSDK 能做的事情：\n\n- 发送消息到平台聊天链路\n- 读写变量和持久化存储\n- 读取角色信息\n- 控制当前独立页面 UI\n\nSDK 不做的事情：\n\n- 不直接调用模型\n- 不绕开平台上下文组装\n- 不替代角色卡、世界书、正则、系统提示词\n\n---\n\n## API 概览\n\n`CharxSdk` 是单例对象，所有能力都挂在它的模块上：\n\n```text\nCharxSdk\n├── chat\n├── character\n├── variable\n├── storage\n├── ui\n├── media\n├── game\n├── worldbook\n└── utils\n```\n\n### `sdk.character`\n\n读取当前角色、人设和对话配置。\n\n```typescript\nconst info = await sdk.character.getInfo()\nconst persona = await sdk.character.getPersona()\nconst settings = await sdk.character.getSettings()\n```\n\n`sdk.character.getPersona()` 在用户没有设置 persona 时返回 `null`。\n\n### `sdk.chat`\n\n负责发消息、停止生成、切开场白、读取历史消息。\n\n```typescript\nsdk.chat.send('你好', {\n  onData: (chunk) => console.log(chunk),\n  onComplete: (message) => console.log(message.content),\n})\n\nconst task = sdk.chat.sendStream('继续推进剧情', {\n  timeoutMs: 60_000,\n  temperature: 0.8,\n  injectedSystemPrompts: ['本次回复优先输出行动结果。'],\n  onStart: ({ requestId, assistantMessageId }) => {\n    console.log('开始生成：', requestId, assistantMessageId)\n  },\n  onData: (chunk) => console.log(chunk),\n  onComplete: (message) => console.log('完成：', message.content),\n  onError: (error) => console.error(error),\n})\n\n// `timeoutMs` 表示流式事件空闲超时。持续输出超过 60 秒不会被中断。\n// 不传 `model` 时，平台会使用当前会话配置的模型。\nawait task.done\n\nawait sdk.chat.stop()\nawait sdk.chat.regenerate()\nawait sdk.chat.continue()\n\nsdk.chat.setInput('帮我润色这句话')\nconst input = await sdk.chat.getInput()\n\nawait sdk.chat.setGreetingIndex(1)\nconst greetingIndex = await sdk.chat.getGreetingIndex()\n\nconst allMessages = await sdk.chat.messages.getAll()\nconst page = await sdk.chat.messages.list({ limit: 20, offset: 0 })\nconst secondPage = await sdk.chat.messages.list({ page: 2, pageSize: 20 })\n```\n\n### `sdk.model`\n\n负责读取平台开放的模型配置，并切换当前会话后续生成所使用的模型。\n\n```typescript\nconst models = await sdk.model.list()\nconst current = await sdk.model.getCurrent()\n\nconst healthy = models.find(model => model.healthStatus !== 'abnormal')\nawait sdk.model.select(healthy?.value ?? null)\n\nconst unwatch = sdk.model.onChanged((model) => {\n  console.log(model ?? '后台默认模型')\n})\n```\n\n切换只影响之后的生成请求。若只想覆盖单次请求，仍可传 `sdk.chat.send(message, { model })`。\n\n### `sdk.variable`\n\n负责当前对话变量。\n\n```typescript\nconst hp = await sdk.variable.get<number>('hp') ?? 100\nconst vars = await sdk.variable.getAll()\n\nawait sdk.variable.set('hp', 80)\nawait sdk.variable.setMany({ hp: 80, mp: 50 })\n\nawait sdk.variable.increment('hp', 5)\nawait sdk.variable.decrement('mp', 2)\n\nconst unwatch = sdk.variable.watch<number>('hp', (value) => {\n  console.log('新的 HP：', value)\n})\n```\n\n`sdk.variable.get<T>(key)` 在变量不存在时返回 `null`。需要默认值时直接使用 `??`。\n`watch()` 在变量被删除或完整快照中不存在时也会推送 `null`。\n\n### `sdk.storage`\n\n负责当前会话内的持久化数据。同一角色卡的新会话不会读取旧会话存档；回溯恢复对应节点存档。方法签名不变，由 Web / App 宿主绑定会话范围。\n正式聊天宿主会写入平台后端；创作者编辑器和测试页只提供本地预览态。\n\n```typescript\nawait sdk.storage.set('preferredTheme', 'deep-sea')\n\nconst theme = await sdk.storage.get<string>('preferredTheme') ?? 'deep-sea'\nconst settings = await sdk.storage.getOrDefault('settings', { bgm: true })\nconst keys = await sdk.storage.keys()\n```\n\n`sdk.storage.get<T>(key)` 在 key 不存在时返回 `null`。需要默认值时可以用 `??`，或直接使用 `getOrDefault()`。\n\n### `sdk.ui`\n\n负责 Toast、弹窗、主题、滚动和面板控制。\n\n```typescript\nsdk.ui.toast({ text: '获得道具', type: 'success' })\n\nawait sdk.ui.alert('任务失败')\nawait sdk.ui.alert({ title: '任务失败', message: '线索不足', confirmText: '知道了' })\nconst confirmed = await sdk.ui.confirm('确认继续？')\nconst shouldContinue = await sdk.ui.confirm({ title: '继续剧情', message: '是否消耗 1 点行动力？', confirmText: '继续', cancelText: '返回' })\nconst input = await sdk.ui.prompt('请输入角色名', '默认值')\nconst named = await sdk.ui.prompt({ title: '角色命名', message: '请输入角色名', placeholder: '例如：林见鹿', defaultValue: '林见鹿' })\n\nsdk.ui.scrollToBottom()\nsdk.ui.setTheme('dark')\n\nawait sdk.ui.openPanel({\n  url: 'https://your-panel-url',\n  title: '角色状态',\n  mode: 'sidebar',\n  width: '420px',\n})\nawait sdk.ui.closePanel()\n```\n\n### `sdk.media`\n\n负责 TTS、背景音乐和音效。\n\n```typescript\nawait sdk.media.speak('欢迎来到这里', { voice: 'character' })\nsdk.media.stopSpeak()\n\nawait sdk.media.bgm.play('/assets/bgm.mp3', { loop: true, volume: 0.7 })\nawait sdk.media.bgm.stop({ fadeOut: 500 })\nsdk.media.bgm.pause()\nsdk.media.bgm.resume()\nsdk.media.bgm.setVolume(0.5)\n\nawait sdk.media.sfx.play('/assets/hit.mp3', { volume: 0.8 })\nsdk.media.sfx.preload(['/assets/hit.mp3'])\n```\n\n### `sdk.game`\n\n`save/load/listSaves/deleteSave` 只访问当前会话的槽位，不跨会话继承。成就和排行榜仍属于账号游戏统计。\n\n负责存档、成就和排行榜。\n正式聊天宿主会走平台后端；创作者编辑器和测试页仍使用本地预览态 runtime。\n\n```typescript\nawait sdk.game.save({ slot: 1, description: '第三章开头' })\nconst saveData = await sdk.game.load({ slot: 1 })\nconst saves = await sdk.game.listSaves()\nawait sdk.game.deleteSave(1)\n\nawait sdk.game.achievements.unlock('first_victory')\nconst achievements = await sdk.game.achievements.list()\n\nawait sdk.game.ranking.submit(9800, { category: 'story_mode' })\nconst top10 = await sdk.game.ranking.getTop({ limit: 10, category: 'story_mode' })\nconst myRank = await sdk.game.ranking.getSelf({ category: 'story_mode' })\n```\n\n### `sdk.worldbook`\n\n负责当前对话内的世界书动态控制。\n\n所有操作只影响当前对话，不会改角色卡模板。\n\n```typescript\nconst worldbook = await sdk.worldbook.getAll()\nconst enabledEntries = worldbook.entries.filter(entry => entry.enabled)\n\nawait sdk.worldbook.enable('combat-mode')\nawait sdk.worldbook.disable('peace-mode')\n\nawait sdk.worldbook.batchToggle([\n  { entryKey: 'combat-mode', enabled: true },\n  { entryKey: 'peace-mode', enabled: false },\n])\n\nawait sdk.worldbook.setContent('combat-mode', '新的世界书内容')\nawait sdk.worldbook.clearContent('combat-mode')\nawait sdk.worldbook.reset()\n```\n\n### `sdk.utils`\n\n负责剪贴板和轻量格式处理。\n\n```typescript\nawait sdk.utils.clipboard.writeText('复制这段文本')\nconst text = await sdk.utils.clipboard.readText()\n\nconst html = sdk.utils.format.markdown('**加粗** *斜体* `代码`')\nconst safeHtml = sdk.utils.format.sanitize('<script>alert(1)</script>')\n```\n\n---\n\n## React 集成\n\n### 导出入口\n\n```typescript\nimport { CharxSdk } from '@ai_wanjia/sdk'\nimport { CharxProvider, useChat, useVariable, useCharacter, usePersona, useStorage } from '@ai_wanjia/sdk/react'\n```\n\n### `CharxProvider`\n\n`CharxProvider` 负责初始化 SDK 并通过 React Context 向下提供实例。\n\n```tsx\nimport { CharxProvider } from '@ai_wanjia/sdk/react'\n\nexport default function App() {\n  return (\n    <CharxProvider\n      fallback={<div>连接中...</div>}\n      errorFallback={(error) => <div>初始化失败：{error.message}</div>}\n    >\n      <YourApp />\n    </CharxProvider>\n  )\n}\n```\n\n### Hooks\n\n| Hook | 作用 |\n|------|------|\n| `useChat()` | 管理消息列表、发送、流式任务、停止、继续、重试 |\n| `useVariable(key, defaultValue)` | 订阅单个变量，变量不存在时显示默认值，`setValue` 写入成功后会立即同步本地状态 |\n| `useVariables()` | 订阅全部变量 |\n| `useCharacter()` | 读取当前角色信息 |\n| `usePersona()` | 读取当前用户人设 |\n| `useStorage(key, defaultValue)` | 读取并同步一个持久化存储值，返回 `[value, setValue, removeValue]` |\n\n示例：\n\n```tsx\nimport { useChat, useVariable, useCharacter, useStorage } from '@ai_wanjia/sdk/react'\n\nfunction GamePanel() {\n  const character = useCharacter()\n  const { messages, send, status } = useChat()\n  const [hp, setHp] = useVariable<number>('hp', 100)\n  const [theme, setTheme, removeTheme] = useStorage('preferredTheme', 'deep-sea')\n\n  return (\n    <div>\n      <h2>{character?.name}</h2>\n      <p>HP: {hp}</p>\n      <p>Theme: {theme}</p>\n\n      <button onClick={() => setHp(hp + 5)}>恢复 5 点 HP</button>\n      <button onClick={() => setTheme('mist')}>切换主题</button>\n      <button disabled={status !== 'idle'} onClick={() => send('继续')}>\n        继续\n      </button>\n\n      {messages.map((message) => (\n        <div key={message.id}>{message.content}</div>\n      ))}\n    </div>\n  )\n}\n```\n\n### 组件\n\n#### `Thread.MessageList`\n\n`Thread` 是一个命名空间对象，当前导出的是 `Thread.MessageList` 和 `Thread.MessageItem`。\n\n```tsx\nimport { Thread, useChat } from '@ai_wanjia/sdk/react'\n\nfunction ChatView() {\n  const { messages, status, loadMore } = useChat()\n\n  return (\n    <Thread.MessageList\n      messages={messages}\n      isStreaming={status === 'streaming'}\n      onLoadMore={loadMore}\n    />\n  )\n}\n```\n\n#### `MdRenderer`\n\n```tsx\nimport { MdRenderer } from '@ai_wanjia/sdk/react'\n\nfunction MessageBody({ content }: { content: string }) {\n  return <MdRenderer content={content} />\n}\n```\n\n---\n\n## 包导出\n\n| 导出路径 | 内容 |\n|----------|------|\n| `@ai_wanjia/sdk` | 核心 SDK、事件常量、类型 |\n| `@ai_wanjia/sdk/react` | React Provider、Hooks、组件 |\n| `@ai_wanjia/sdk/types` | 独立类型导出 |\n\n---\n\n## 通信协议\n\nSDK 通过 `postMessage` 与平台通信。\n\n| 方向 | 消息类型 | 说明 |\n|------|----------|------|\n| iframe → 平台 | `__charx_rpc__` | 方法调用 |\n| 平台 → iframe | `__charx_ready__` | 初始化握手成功 |\n| 平台 → iframe | `__charx_rpc_response__` | RPC 响应 |\n| 平台 → iframe | `__charx_push__` | 平台主动推送事件 |\n\n如果要直接订阅底层推送事件，可以使用：\n\n```typescript\nimport { CharxSdk, PUSH } from '@ai_wanjia/sdk'\n\nconst sdk = CharxSdk.getInstance()\nawait sdk.init()\n\nconst unwatch = sdk.getRpc().push(PUSH.CHAT_STREAM_CHUNK, (data) => {\n  console.log(data)\n})\n```\n\n---\n\n## 构建与开发\n\n```bash\nnpm run build\nnpm run dev\nnpm run typecheck\n```\n\n输出目录为 `dist/`。\n\n---\n\n## 相关文档\n\n- 仓库内创作者教程：`docs/sdk-creator-guide.md`\n- 原生模板：`sdk/examples/charx-h5-starter`\n- React 模板：`sdk/examples/charx-react-starter`\n\n---\n\n## 许可\n\n内部使用，版权归玩家AI平台所有。\n","readmeFilename":"README.md"}