{"_id":"@bdky/chat-pilot-kit","_rev":"7-7df7197e0908d29139783b008add698b","name":"@bdky/chat-pilot-kit","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.1":{"name":"@bdky/chat-pilot-kit","version":"1.0.1","license":"MIT","_id":"@bdky/chat-pilot-kit@1.0.1","maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"dist":{"shasum":"0a227cf56db79716a2e31b9a53ce307f0e0c32b2","tarball":"https://registry.npmjs.org/@bdky/chat-pilot-kit/-/chat-pilot-kit-1.0.1.tgz","fileCount":57,"integrity":"sha512-sFIhMZDlQkjFLUaJiGL+dUAbvUyVjt6eC6xpcZoIIZsubw38bYT1X33po8r46A3TQ3KjQX1UdzLwl+NDNYrd5Q==","signatures":[{"sig":"MEYCIQD4I6Bns9Fe82ShU2T/rpyjsK1zE4V4M70hMY7A/xGCIgIhAJfb+t8TugGyen2/96pDwiHdKTlfY47zNMwOhT3jYpxg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296396},"main":"./dist/index.cjs.js","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/libs/chat-pilot-kit/src/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"},"./ws":{"types":"./dist/libs/chat-pilot-kit/src/ws.d.ts","import":"./dist/ws.esm.js","require":"./dist/ws.cjs.js"},"./http":{"types":"./dist/libs/chat-pilot-kit/src/http.d.ts","import":"./dist/http.esm.js","require":"./dist/http.cjs.js"}},"gitHead":"46fdc6446f05002915f0a51ebb7ba4f85c55f3dc","scripts":{"dev":"npx rsbuild dev --open","build":"npx rslib build"},"typings":"./dist/libs/chat-pilot-kit/src/index.d.ts","_npmUser":{"name":"zhangwx616","email":"bdwenxi@gmail.com"},"_npmVersion":"11.9.0","description":"[![npm version](https://img.shields.io/npm/v/@bdky/chat-pilot-kit.svg)](https://www.npmjs.com/package/@bdky/chat-pilot-kit) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![TypeScript](https://im","directories":{},"_nodeVersion":"22.15.0","dependencies":{"ky":"^1.14.0","uuid":"^13.0.0","emittery":"^1.2.0","inversify":"^7.10.4","reflect-metadata":"^0.2.2","@bdky/ky-sse-hook":"^1.0.1","abort-signal-polyfill":"^1.0.0","@bdky/websocket-client":"^1.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","streamdown":"^2.3.0","@types/react":"^19","react-markdown":"^10.1.0","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/chat-pilot-kit_1.0.1_1773662336427_0.3117337885710747","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bdky/chat-pilot-kit","version":"1.0.2","license":"MIT","_id":"@bdky/chat-pilot-kit@1.0.2","maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"dist":{"shasum":"520948622d9315fefdfe9fe99937c35aefee456a","tarball":"https://registry.npmjs.org/@bdky/chat-pilot-kit/-/chat-pilot-kit-1.0.2.tgz","fileCount":57,"integrity":"sha512-ZTjTifs1mQklwMaHm+JNuBdUS0n94+dM3snLpUkAxQxp70nIyUDIMJi0BFeuSNdg6LwPuibjRxcsEyuqmHz6WQ==","signatures":[{"sig":"MEUCICDkFZrxaFmuPGh68ume+Qloc6pXwtTSeHEHOEdYxRbcAiEAsJolnXZpVEGJZCCpT1wsMzIJJWKkIQ/qlMfw5wxmBj4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302797},"main":"./dist/index.cjs.js","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/libs/chat-pilot-kit/src/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"},"./ws":{"types":"./dist/libs/chat-pilot-kit/src/ws.d.ts","import":"./dist/ws.esm.js","require":"./dist/ws.cjs.js"},"./http":{"types":"./dist/libs/chat-pilot-kit/src/http.d.ts","import":"./dist/http.esm.js","require":"./dist/http.cjs.js"}},"gitHead":"8e9a41c53d4569cbcab39c61d87abd4461928da5","scripts":{"dev":"npx rsbuild dev --open","build":"npx rslib build"},"typings":"./dist/libs/chat-pilot-kit/src/index.d.ts","_npmUser":{"name":"zhangwx616","email":"bdwenxi@gmail.com"},"_npmVersion":"11.9.0","description":"[![npm version](https://img.shields.io/npm/v/@bdky/chat-pilot-kit.svg)](https://www.npmjs.com/package/@bdky/chat-pilot-kit) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![TypeScript](https://im","directories":{},"_nodeVersion":"22.15.0","dependencies":{"ky":"^1.14.0","uuid":"^13.0.0","emittery":"^1.2.0","inversify":"^7.10.4","reflect-metadata":"^0.2.2","@bdky/ky-sse-hook":"^1.0.1","abort-signal-polyfill":"^1.0.0","@bdky/websocket-client":"^1.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","streamdown":"^2.3.0","@types/react":"^19","react-markdown":"^10.1.0","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/chat-pilot-kit_1.0.2_1773988790670_0.6140501101216722","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bdky/chat-pilot-kit","version":"1.0.3","keywords":["chat","ai-chat","ai-assistant","chatbot","chat-kit","sse","server-sent-events","streaming","websocket","agent","conversational-ai","nodeview","baidu","百度","客悦"],"license":"MIT","_id":"@bdky/chat-pilot-kit@1.0.3","maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"dist":{"shasum":"92af6f3836830c8bbb09d47b24fd7db99a4e24e1","tarball":"https://registry.npmjs.org/@bdky/chat-pilot-kit/-/chat-pilot-kit-1.0.3.tgz","fileCount":57,"integrity":"sha512-vl+0qqvcR6ES6lKdcPRMCRyrZ7rXPHujiWoGcg1hoRuWphkv5yFg1GF3Z8e3T0z0u8Aemmu/xFpjU1gvbXhJ4A==","signatures":[{"sig":"MEQCIDXHfcCswk3FyUQeCLHKa/eYZFUhsBkWtwsOBydAahUdAiBb7mopopZM2fkVXKzMJhW7vtZhnAlzSnp3iNGXuPKgeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303286},"main":"./dist/index.cjs.js","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/libs/chat-pilot-kit/src/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"},"./ws":{"types":"./dist/libs/chat-pilot-kit/src/ws.d.ts","import":"./dist/ws.esm.js","require":"./dist/ws.cjs.js"},"./http":{"types":"./dist/libs/chat-pilot-kit/src/http.d.ts","import":"./dist/http.esm.js","require":"./dist/http.cjs.js"}},"gitHead":"9cd8a99c0b4a8e81e55663597f819ac1c78f13d6","scripts":{"dev":"npx rsbuild dev --open","build":"npx rslib build"},"typings":"./dist/libs/chat-pilot-kit/src/index.d.ts","_npmUser":{"name":"zhangwx616","email":"bdwenxi@gmail.com"},"_npmVersion":"11.9.0","description":"企业级 AI Agent 对话 SDK，框架无关，支持 SSE 流式对话与 WebSocket，内置 Agent 管理、消息处理管道与 NodeView 扩展机制","directories":{},"_nodeVersion":"22.15.0","dependencies":{"ky":"^1.14.0","uuid":"^13.0.0","emittery":"^1.2.0","inversify":"^7.10.4","reflect-metadata":"^0.2.2","@bdky/ky-sse-hook":"^1.0.2","abort-signal-polyfill":"^1.0.0","@bdky/websocket-client":"^1.0.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","streamdown":"^2.3.0","@types/react":"^19","react-markdown":"^10.1.0","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/chat-pilot-kit_1.0.3_1774009184434_0.21092199661853983","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bdky/chat-pilot-kit","version":"1.0.4","keywords":["chat","ai-chat","ai-assistant","chatbot","chat-kit","sse","server-sent-events","streaming","websocket","agent","conversational-ai","nodeview","baidu","百度","客悦"],"license":"MIT","_id":"@bdky/chat-pilot-kit@1.0.4","maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"dist":{"shasum":"7b67ab8fd58efb2d8fb553ab1e297a7c48c94384","tarball":"https://registry.npmjs.org/@bdky/chat-pilot-kit/-/chat-pilot-kit-1.0.4.tgz","fileCount":57,"integrity":"sha512-ktSfFdnKoitpuYV9l0GbWuCXD81EclQYryQGv1hTF+WVYLKxHMN4JbFObhFdz2wfKaikhGO7HBazc97sPWrWOg==","signatures":[{"sig":"MEUCIQDIqvVwgTXKl80p4Aagffw4j8AWidZIrzlOCJ/4M8N38gIgA9cgFH/O/XuhY9fPUDbxg14wDagmJUfHBKgP5blMJng=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303660},"main":"./dist/index.cjs.js","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/libs/chat-pilot-kit/src/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"},"./ws":{"types":"./dist/libs/chat-pilot-kit/src/ws.d.ts","import":"./dist/ws.esm.js","require":"./dist/ws.cjs.js"},"./http":{"types":"./dist/libs/chat-pilot-kit/src/http.d.ts","import":"./dist/http.esm.js","require":"./dist/http.cjs.js"}},"gitHead":"d1faf46730ba4dc21b571433c8ed5bbc8659b61a","scripts":{"dev":"npx rsbuild dev --open","build":"npx rslib build"},"typings":"./dist/libs/chat-pilot-kit/src/index.d.ts","_npmUser":{"name":"zhangwx616","email":"bdwenxi@gmail.com"},"_npmVersion":"11.9.0","description":"企业级 AI Agent 对话 SDK，框架无关，支持 SSE 流式对话与 WebSocket，内置 Agent 管理、消息处理管道与 NodeView 扩展机制","directories":{},"_nodeVersion":"22.15.0","dependencies":{"ky":"^1.14.0","uuid":"^13.0.0","emittery":"^1.2.0","inversify":"^7.10.4","reflect-metadata":"^0.2.2","@bdky/ky-sse-hook":"^1.0.2","abort-signal-polyfill":"^1.0.0","@bdky/websocket-client":"^1.0.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","streamdown":"^2.3.0","@types/react":"^19","react-markdown":"^10.1.0","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/chat-pilot-kit_1.0.4_1778119803237_0.3480920642930452","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bdky/chat-pilot-kit","version":"1.0.5","keywords":["chat","ai-chat","ai-assistant","chatbot","chat-kit","sse","server-sent-events","streaming","websocket","agent","conversational-ai","nodeview","baidu","百度","客悦"],"license":"MIT","_id":"@bdky/chat-pilot-kit@1.0.5","maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"dist":{"shasum":"d42bf549baec7ef54850247a63c029516215d514","tarball":"https://registry.npmjs.org/@bdky/chat-pilot-kit/-/chat-pilot-kit-1.0.5.tgz","fileCount":57,"integrity":"sha512-dm/fMea2fhsl/W5i8wotLqLX1WzDmGDyoggl7F+vs5dHXunmSGKksl0dV4lxwtwo6nnCLZQ4jrmdoaIB8v6ekw==","signatures":[{"sig":"MEUCICAJu7kcSPcGJmHAvRLImwqZ4reUI+QWPwdymW38YzOvAiEA24seo93G+Q8KnS46ibKs1WrGULG2tUnw33GBFsf2+BA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303660},"main":"./dist/index.cjs.js","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/libs/chat-pilot-kit/src/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"},"./ws":{"types":"./dist/libs/chat-pilot-kit/src/ws.d.ts","import":"./dist/ws.esm.js","require":"./dist/ws.cjs.js"},"./http":{"types":"./dist/libs/chat-pilot-kit/src/http.d.ts","import":"./dist/http.esm.js","require":"./dist/http.cjs.js"}},"gitHead":"d0ff6ade4c6c7a7515c640841f7a94acaa699d08","scripts":{"dev":"npx rsbuild dev --open","build":"npx rslib build"},"typings":"./dist/libs/chat-pilot-kit/src/index.d.ts","_npmUser":{"name":"zhangwx616","email":"bdwenxi@gmail.com"},"_npmVersion":"11.9.0","description":"企业级 AI Agent 对话 SDK，框架无关，支持 SSE 流式对话与 WebSocket，内置 Agent 管理、消息处理管道与 NodeView 扩展机制","directories":{},"_nodeVersion":"22.15.0","dependencies":{"ky":"^1.14.0","uuid":"^13.0.0","emittery":"^1.2.0","inversify":"^7.10.4","reflect-metadata":"^0.2.2","@bdky/ky-sse-hook":"^1.0.2","abort-signal-polyfill":"^1.0.0","@bdky/websocket-client":"^1.0.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","streamdown":"^2.3.0","@types/react":"^19","react-markdown":"^10.1.0","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/chat-pilot-kit_1.0.5_1778297031679_0.5774380140604287","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bdky/chat-pilot-kit","version":"1.1.0","keywords":["chat","ai-chat","ai-assistant","chatbot","chat-kit","sse","server-sent-events","streaming","websocket","agent","conversational-ai","nodeview","baidu","百度","客悦"],"license":"MIT","_id":"@bdky/chat-pilot-kit@1.1.0","maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"dist":{"shasum":"bdf1de577cbfcdbd99288c71b0bd22854d6bf874","tarball":"https://registry.npmjs.org/@bdky/chat-pilot-kit/-/chat-pilot-kit-1.1.0.tgz","fileCount":74,"integrity":"sha512-0liywLRHsm+JHsCoYqA8OVOPhtNzfNr7gzvKiuq58J5U7egIAtgZELrsyk6Ys4xgCrC1o5p56ajOvrkmXHeV0g==","signatures":[{"sig":"MEUCIQDqOYGgflQc6I0k2jQ9jESG6Oczj/rLbZeFGTSayiSODgIgJ2PCeM2Qcuba2xrCiEUSo6/SsurlXgq3gBo4HUHXxG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411550},"main":"./dist/index.cjs.js","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/libs/chat-pilot-kit/src/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"},"./ws":{"types":"./dist/libs/chat-pilot-kit/src/ws.d.ts","import":"./dist/ws.esm.js","require":"./dist/ws.cjs.js"},"./http":{"types":"./dist/libs/chat-pilot-kit/src/http.d.ts","import":"./dist/http.esm.js","require":"./dist/http.cjs.js"},"./persistence":{"types":"./dist/libs/chat-pilot-kit/src/persistence.d.ts","import":"./dist/persistence.esm.js","require":"./dist/persistence.cjs.js"}},"gitHead":"218bb05a87a9763a96bc90d335827fe6645c9f3d","scripts":{"dev":"npx rsbuild dev --open","build":"npx rslib build"},"typings":"./dist/libs/chat-pilot-kit/src/index.d.ts","_npmUser":{"name":"zhangwx616","email":"bdwenxi@gmail.com"},"_npmVersion":"11.9.0","description":"企业级 AI Agent 对话 SDK，框架无关，支持 SSE 流式对话与 WebSocket，内置 Agent 管理、消息处理管道与 NodeView 扩展机制","directories":{},"_nodeVersion":"22.15.0","dependencies":{"ky":"^1.14.0","idb":"^8.0.3","uuid":"^13.0.0","emittery":"^1.2.0","inversify":"^7.10.4","reflect-metadata":"^0.2.2","@bdky/ky-sse-hook":"^1.0.2","abort-signal-polyfill":"^1.0.0","@bdky/websocket-client":"^1.0.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","streamdown":"^2.3.0","@types/react":"^19","fake-indexeddb":"^6.2.5","react-markdown":"^10.1.0","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/chat-pilot-kit_1.1.0_1782213100945_0.7525997174176835","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bdky/chat-pilot-kit","version":"1.2.0","description":"企业级 AI Agent 对话 SDK，框架无关，支持 SSE 流式对话与 WebSocket，内置 Agent 管理、消息处理管道与 NodeView 扩展机制","keywords":["chat","ai-chat","ai-assistant","chatbot","chat-kit","sse","server-sent-events","streaming","websocket","agent","conversational-ai","nodeview","baidu","百度","客悦"],"license":"MIT","contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"main":"./dist/index.cjs.js","module":"./dist/index.esm.js","typings":"./dist/libs/chat-pilot-kit/src/index.d.ts","exports":{".":{"types":"./dist/libs/chat-pilot-kit/src/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"},"./http":{"types":"./dist/libs/chat-pilot-kit/src/http.d.ts","import":"./dist/http.esm.js","require":"./dist/http.cjs.js"},"./ws":{"types":"./dist/libs/chat-pilot-kit/src/ws.d.ts","import":"./dist/ws.esm.js","require":"./dist/ws.cjs.js"},"./persistence":{"types":"./dist/libs/chat-pilot-kit/src/persistence.d.ts","import":"./dist/persistence.esm.js","require":"./dist/persistence.cjs.js"}},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"scripts":{"build":"npx rslib build","dev":"npx rsbuild dev --open"},"dependencies":{"@bdky/ky-sse-hook":"^1.0.3","@bdky/websocket-client":"^1.0.3","abort-signal-polyfill":"^1.0.0","emittery":"^1.2.0","idb":"^8.0.3","inversify":"^7.10.4","ky":"^1.14.0","reflect-metadata":"^0.2.2","uuid":"^13.0.0"},"devDependencies":{"@types/react":"^19","@types/react-dom":"^19","fake-indexeddb":"^6.2.5","react":"^19.1.0","react-dom":"^19.1.0","react-markdown":"^10.1.0","streamdown":"^2.3.0"},"gitHead":"3d476f70e95200f3b20aea47ba3fea528640b3e9","_id":"@bdky/chat-pilot-kit@1.2.0","_nodeVersion":"22.15.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-8O3pd8OrW3hvlqiP/o+yVg+EnCFlIFpSbuO9vSmOswr55HFKgb5zbfk9Ks64Lp5D2CBgIbo7f35QYD/8J7JtvQ==","shasum":"cbf70655f27227dad56d551def3fd171ac2ac9ae","tarball":"https://registry.npmjs.org/@bdky/chat-pilot-kit/-/chat-pilot-kit-1.2.0.tgz","fileCount":74,"unpackedSize":415630,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGEXIdBpFD/81HDNRK+oA1haTUaxUwi2gsySwiDlPonjAiEAlNpa5ngrEVGQ/dEH4lbj6Q4rQUc8ESjrwqxoDi4bEe4="}]},"_npmUser":{"name":"zhangwx616","email":"bdwenxi@gmail.com"},"directories":{},"maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chat-pilot-kit_1.2.0_1784620295773_0.8329123579244981"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-16T11:58:56.337Z","modified":"2026-07-21T07:51:36.098Z","1.0.1":"2026-03-16T11:58:56.573Z","1.0.2":"2026-03-20T06:39:50.832Z","1.0.3":"2026-03-20T12:19:44.581Z","1.0.4":"2026-05-07T02:10:03.397Z","1.0.5":"2026-05-09T03:23:51.931Z","1.1.0":"2026-06-23T11:11:41.094Z","1.2.0":"2026-07-21T07:51:35.901Z"},"license":"MIT","keywords":["chat","ai-chat","ai-assistant","chatbot","chat-kit","sse","server-sent-events","streaming","websocket","agent","conversational-ai","nodeview","baidu","百度","客悦"],"description":"企业级 AI Agent 对话 SDK，框架无关，支持 SSE 流式对话与 WebSocket，内置 Agent 管理、消息处理管道与 NodeView 扩展机制","contributors":[{"name":"zhangwenxi","email":"zhangwenxi@baidu.com"}],"maintainers":[{"name":"zhangwx616","email":"bdwenxi@gmail.com"},{"name":"berwin0415","email":"hanbw@sina.cn"},{"name":"patrickli147","email":"patrick_li_147@foxmail.com"}],"readme":"# @bdky/chat-pilot-kit\n\n[![npm version](https://img.shields.io/npm/v/@bdky/chat-pilot-kit.svg)](https://www.npmjs.com/package/@bdky/chat-pilot-kit)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org/)\n\n[English](./README.md) | **简体中文**\n\n> 一个无头、框架无关的 AI 聊天 SDK，支持 SSE 流式传输、可扩展的消息节点和插件化架构。\n\n`@bdky/chat-pilot-kit` 是一个轻量级、灵活的 SDK，用于构建 AI 驱动的聊天应用。它提供完整的对话管理系统，支持流式传输、多模态内容处理和强大的扩展系统——所有这些都不强制使用任何 UI 框架。\n\n## ✨ 特性\n\n- 🎯 **无头 & 框架无关** — 无 UI 依赖，可与 React/Vue/原生 JavaScript 配合使用\n- 🌊 **流式优先** — 内置 SSE 流式传输，支持首字节时间（TTFT）跟踪\n- 🧩 **可扩展节点系统** — 10 种内置节点类型 + 自定义扩展 API\n- 🔌 **插件架构** — MessageExtension 系统用于自定义消息处理\n- 🎨 **多模态支持** — 文本、Markdown、图片、文件、音频、视频、思考块、工具调用\n- 📡 **事件驱动** — 基于 Emittery 的事件系统，实现实时状态更新\n- 💾 **对话管理** — 导入/导出、会话管理、历史持久化\n- 📘 **完整 TypeScript 支持** — 开箱即用的完整类型定义\n\n## 📦 安装\n\n```bash\n# npm\nnpm install @bdky/chat-pilot-kit reflect-metadata\n\n# yarn\nyarn add @bdky/chat-pilot-kit reflect-metadata\n\n# pnpm\npnpm add @bdky/chat-pilot-kit reflect-metadata\n```\n\n**对等依赖：**\n- `reflect-metadata`（依赖注入所需）\n\n**格式：**\n- ESM: `@bdky/chat-pilot-kit` (`.esm.js`)\n- CJS: `@bdky/chat-pilot-kit` (`.cjs.js`)\n- 包含 TypeScript 声明文件\n\n## 🚀 快速开始\n\n```typescript\nimport 'reflect-metadata';\nimport {createChatPilotKit, BaseAgentService} from '@bdky/chat-pilot-kit';\nimport type {AgentMessageData} from '@bdky/chat-pilot-kit';\n\n// 1. 定义自定义 AgentService\nclass MyAgentService extends BaseAgentService {\n    async query(text: string): Promise<void> {\n        const sessionId = this.sessionId();\n        const queryId = this.queryId();\n\n        // 模拟 SSE 流式传输\n        const chunks: AgentMessageData[] = [\n            {answer: 'Hello', nodeType: 'text', queryId, sessionId},\n            {answer: ' world!', nodeType: 'text', queryId, sessionId}\n        ];\n\n        for (const chunk of chunks) {\n            this.onData(chunk);\n        }\n\n        this.onCompleted();\n    }\n\n    dispose(): void {\n        // 清理资源\n    }\n}\n\n// 2. 创建 ChatPilotKit 实例\nconst {controller, emitter} = createChatPilotKit({\n    agentService: MyAgentService\n});\n\n// 3. 订阅事件\nemitter.on('conversation_change', payload => {\n    console.log('对话已更新:', payload);\n});\n\n// 4. 发送查询\nawait controller.query('Hello');\n```\n\n## 🏗️ 核心概念\n\n```\n用户输入 → Controller.query()\n  → AgentService.query() → AI 后端 (SSE)\n    → AgentMessageData 数据块\n      → Extension.canProcess() → Extension.process()\n        → ConversationNode 创建/更新\n          → 事件触发 → UI 订阅并渲染\n```\n\n### Controller\n\n`ChatPilotKitController` 是与 SDK 交互的主要入口。\n\n| 方法 | 参数 | 返回值 | 描述 |\n|------|------|--------|------|\n| `query` | `text: string, options?: IQueryOptions` | `Promise<void>` | 向 AI 代理发送文本查询 |\n| `queryWithAttachments` | `text: string, attachments: IAttachmentInput[], options?: IQueryOptions` | `Promise<void>` | 发送带文件附件的查询 |\n| `interrupt` | - | `void` | 中断当前查询 |\n| `clear` | - | `void` | 清除所有对话 |\n| `dispose` | - | `void` | 清理并销毁控制器 |\n| `getOptions` | - | `IResolvedOptions` | 获取当前配置 |\n| `exportConversations` | - | `IConversationBeanSnapshot[]` | 将所有对话导出为 JSON |\n| `importConversations` | `conversations: IConversationBeanInput[], options?: IImportOptions` | `void` | 从 JSON 导入对话 |\n\n### Agent Service\n\n扩展 `BaseAgentService` 以集成您的 AI 后端。\n\n**抽象方法（必须实现）：**\n- `query(text: string): Promise<void>` — 向 AI 后端发送查询\n- `dispose(): void` — 清理资源\n\n**受保护方法（从您的实现中调用）：**\n- `onData(data: AgentMessageData): void` — 发出数据块\n- `onCompleted(): void` — 标记查询完成\n- `onError(error: Error): void` — 报告错误\n- `onTtft(timestamp: number): void` — 报告首字节时间\n\n**工具方法：**\n- `sessionId(): string` — 获取当前会话 ID\n- `queryId(): string` — 获取当前查询 ID\n- `setSessionId(id: string): void` — 设置会话 ID\n- `setQueryId(id: string): void` — 设置查询 ID\n- `abort(): void` — 中止当前请求\n\n**AgentMessageData 接口：**\n\n```typescript\ninterface AgentMessageData {\n    answer: string;           // 消息文本内容\n    nodeType?: string;        // 节点类型标识符（匹配 Extension.name）\n    nodeData?: Record<string, unknown>; // 节点特定数据\n    queryId: string;          // 当前查询 ID\n    sessionId: string;        // 当前会话 ID\n}\n```\n\n**完整的 SSE 示例：**\n\n```typescript\nimport {BaseAgentService} from '@bdky/chat-pilot-kit';\nimport {ky, sseHook} from '@bdky/chat-pilot-kit/http';\nimport type {AgentMessageData} from '@bdky/chat-pilot-kit';\n\nclass MySSEAgentService extends BaseAgentService {\n    private abortController: AbortController | null = null;\n\n    async query(text: string): Promise<void> {\n        this.abortController = new AbortController();\n        const sessionId = this.sessionId();\n        const queryId = this.queryId();\n\n        try {\n            await ky.post('https://api.example.com/chat', {\n                json: {message: text, sessionId, queryId},\n                signal: this.abortController.signal,\n                hooks: {\n                    afterResponse: [\n                        sseHook.afterResponse<AgentMessageData>({\n                            onMessage: chunk => {\n                                this.onData(chunk);\n                            },\n                            onComplete: () => {\n                                this.onCompleted();\n                            },\n                            onError: error => {\n                                this.onError(error);\n                            }\n                        })\n                    ]\n                }\n            });\n        }\n        catch (error) {\n            if (error.name !== 'AbortError') {\n                this.onError(error as Error);\n            }\n        }\n    }\n\n    dispose(): void {\n        this.abortController?.abort();\n    }\n}\n```\n\n### 对话与节点\n\n**ConversationBean 结构：**\n\n```typescript\ninterface ConversationBean {\n    id: string;                    // 唯一对话 ID\n    role: 'client' | 'aiWorker';   // 对话角色\n    nodes: ConversationNode[];     // 消息节点数组\n    completed: boolean;            // 对话是否完成\n    createdAt: number;             // 创建时间戳\n    updatedAt: number;             // 最后更新时间戳\n}\n```\n\n**ConversationNode 基类：**\n\n所有消息节点都扩展 `ConversationNode<TContent>`：\n\n```typescript\nabstract class ConversationNode<TContent = unknown> {\n    id: string;\n    type: string;\n    content: TContent;\n    completed: boolean;\n    createdAt: number;\n    updatedAt: number;\n    metadata?: Record<string, unknown>;\n\n    abstract toJSON(): IConversationNodeSnapshot<TContent>;\n    updateContent(content: TContent): void;\n    updateMetadata(metadata: Record<string, unknown>): void;\n}\n```\n\n**内置节点类型：**\n\n| 节点类 | 类型字符串 | 内容类型 | 可流式 | 工厂方法 |\n|--------|-----------|---------|--------|----------|\n| `TextNode` | `'text'` | `string` | 否 | `TextNode.fromString(text)` |\n| `MarkdownNode` | `'markdown'` | `string` | 是 | `MarkdownNode.fromString(text)` |\n| `ImageNode` | `'image'` | `IImageContent` | 否 | `ImageNode.fromContent(content)` |\n| `FileNode` | `'file'` | `IFileContent` | 否 | `FileNode.fromContent(content)` |\n| `AudioNode` | `'audio'` | `IAudioContent` | 否 | `AudioNode.fromContent(content)` |\n| `VideoNode` | `'video'` | `IVideoContent` | 否 | `VideoNode.fromContent(content)` |\n| `ThinkingBlockNode` | `'thinking'` | `IThinkingContent` | 是 | `ThinkingBlockNode.fromContent(content)` |\n| `ToolCallNode` | `'tool_call'` | `IToolCallContent` | 否 | `ToolCallNode.fromContent(content)` |\n| `GenericNode` | 自定义 | `unknown` | 否 | `new GenericNode(type, content)` |\n| `StreamableGenericNode` | 自定义 | `unknown` | 是 | `new StreamableGenericNode(type, content)` |\n\n**内容类型接口：**\n\n```typescript\ninterface IImageContent {\n    url: string;\n    alt?: string;\n    width?: number;\n    height?: number;\n}\n\ninterface IFileContent {\n    url: string;\n    fileName: string;\n    fileSize: number;\n    fileType: string;\n}\n\ninterface IThinkingContent {\n    text: string;\n    collapsed?: boolean;\n}\n\ninterface IAudioContent {\n    url: string;\n    duration?: number;\n    mimeType?: string;\n}\n\ninterface IVideoContent {\n    url: string;\n    duration?: number;\n    poster?: string;\n    mimeType?: string;\n}\n\ninterface IToolCallContent {\n    name: string;\n    arguments: Record<string, unknown>;\n    result?: unknown;\n    status: 'pending' | 'running' | 'completed' | 'error';\n    error?: string;\n}\n```\n\n### 事件\n\n使用 `createChatPilotKit()` 返回的 `emitter` 订阅事件。\n\n| 事件 | 载荷 | 描述 |\n|------|------|------|\n| `ready` | `never` | SDK 已初始化并准备就绪 |\n| `conversation_add` | `{conversationId, role, timestamp}` | 创建了新对话 |\n| `conversation_change` | `IConversationChangePayload` | 对话已更新（节点已更改） |\n| `node_add` | `{conversationId, node}` | 向对话添加了新节点 |\n| `node_update` | `{conversationId, node}` | 现有节点已更新 |\n| `error` | `IChatPilotKitError` | 发生错误 |\n| `interrupt` | `{queryId, sessionId}` | 查询已中断 |\n| `clear` | `never` | 所有对话已清除 |\n| `ttft` | `ITtftPayload` | 测量了首字节时间 |\n| `history_import` | `{count, position}` | 对话已导入 |\n\n**使用示例：**\n\n```typescript\nconst {emitter} = createChatPilotKit({agentService: MyAgentService});\n\nemitter.on('conversation_change', payload => {\n    console.log('对话:', payload.conversationId);\n    console.log('节点:', payload.nodes);\n    console.log('已完成:', payload.completed);\n});\n\nemitter.on('error', error => {\n    console.error('错误:', error.message);\n    console.error('类别:', error.category);\n    console.error('严重性:', error.severity);\n});\n\nemitter.on('ttft', payload => {\n    console.log('首字节时间:', payload.totalLatency, 'ms');\n});\n```\n\n## 🔌 扩展\n\n扩展处理传入的 `AgentMessageData` 数据块并创建/更新对话节点。\n\n### 内置扩展\n\nSDK 包含 8 个内置扩展（按优先级排序）：\n\n| 扩展 | 优先级 | 处理 | 创建节点 |\n|------|--------|------|----------|\n| `ThinkingBlockExtension` | 50 | `nodeType: 'thinking'` | `ThinkingBlockNode` |\n| `TextExtension` | 100 | `nodeType: 'text'` | `TextNode` |\n| `ImageExtension` | 100 | `nodeType: 'image'` | `ImageNode` |\n| `FileExtension` | 100 | `nodeType: 'file'` | `FileNode` |\n| `AudioExtension` | 100 | `nodeType: 'audio'` | `AudioNode` |\n| `VideoExtension` | 100 | `nodeType: 'video'` | `VideoNode` |\n| `ToolCallExtension` | 100 | `nodeType: 'tool_call'` | `ToolCallNode` |\n| `MarkdownExtension` | 200 | `nodeType: 'markdown'` | `MarkdownNode` |\n\n**获取所有内置扩展：**\n\n```typescript\nimport {getBuiltInExtensions} from '@bdky/chat-pilot-kit';\n\nconst extensions = getBuiltInExtensions();\n```\n\n### 创建自定义扩展\n\n使用 `MessageExtension.create()` 定义自定义扩展：\n\n```typescript\nimport {MessageExtension, GenericNode} from '@bdky/chat-pilot-kit';\nimport type {AgentMessageData} from '@bdky/chat-pilot-kit';\n\nconst ChartExtension = MessageExtension.create({\n    name: 'chart',\n    priority: 150,\n    streamable: false,\n\n    canProcess(data: AgentMessageData) {\n        return data.nodeType === 'chart';\n    },\n\n    process(data: AgentMessageData) {\n        // 根据数据创建并返回新节点\n        const content = {\n            type: data.nodeData?.chartType as string,\n            data: data.nodeData?.chartData\n        };\n        return new GenericNode('chart', content);\n    },\n\n    hydrate(snapshot) {\n        // 导入对话时从快照恢复节点\n        return new GenericNode(snapshot.type, snapshot.content);\n    },\n\n    addNodeView() {\n        return null; // 无头模式，无视图\n    }\n});\n\n// 在 createChatPilotKit 中使用\nconst {controller} = createChatPilotKit({\n    agentService: MyAgentService,\n    extensions: [ChartExtension]\n});\n```\n\n**可流式扩展示例：**\n\n```typescript\nimport {MessageExtension, StreamableGenericNode} from '@bdky/chat-pilot-kit';\n\nconst StreamingChartExtension = MessageExtension.create({\n    name: 'streaming_chart',\n    priority: 150,\n    streamable: true,\n\n    canProcess(data) {\n        return data.nodeType === 'streaming_chart';\n    },\n\n    process(data) {\n        // 创建初始空内容节点\n        return new StreamableGenericNode('streaming_chart', '');\n    },\n\n    onStreamAppend(node, data) {\n        // 数据块到达时追加内容\n        node.appendContent(data.answer);\n    },\n\n    onStreamEnd(node) {\n        // 流结束时标记为已完成\n        node.markCompleted();\n    },\n\n    hydrate(snapshot) {\n        const node = new StreamableGenericNode(snapshot.type, snapshot.content);\n        node.completed = snapshot.completed;\n        return node;\n    },\n\n    addNodeView() {\n        return null;\n    }\n});\n```\n\n**扩展生命周期：**\n\n```typescript\nconst MyExtension = MessageExtension.create({\n    name: 'my_extension',\n    priority: 100,\n\n    onCreate() {\n        console.log('扩展已初始化');\n        // 预加载依赖，设置资源\n    },\n\n    onDestroy() {\n        console.log('扩展已销毁');\n        // 清理资源\n    },\n\n    canProcess(data) {\n        return data.nodeType === 'my_type';\n    },\n\n    process(data) {\n        return new GenericNode('my_type', data.answer);\n    },\n\n    hydrate(snapshot) {\n        return new GenericNode(snapshot.type, snapshot.content);\n    },\n\n    addNodeView() {\n        return null;\n    }\n});\n```\n\n### 覆盖内置扩展\n\n**选项 1：使用 `overrideExtensions` 替换**\n\n```typescript\nconst CustomMarkdownExtension = MessageExtension.create({\n    name: 'markdown', // 与内置扩展同名\n    priority: 200,\n    streamable: true,\n\n    canProcess(data) {\n        return data.nodeType === 'markdown';\n    },\n\n    process(data) {\n        // 自定义 markdown 处理\n        return MarkdownNode.fromString(data.answer || '');\n    },\n\n    onStreamAppend(node, data) {\n        // 自定义流式逻辑\n        node.appendContent(data.answer || '');\n    },\n\n    onStreamEnd(node) {\n        node.markCompleted();\n    },\n\n    hydrate(snapshot) {\n        return MarkdownNode.fromJSON(snapshot);\n    },\n\n    addNodeView() {\n        return null;\n    }\n});\n\ncreateChatPilotKit({\n    agentService: MyAgentService,\n    overrideExtensions: [CustomMarkdownExtension] // 替换内置 MarkdownExtension\n});\n```\n\n**选项 2：使用 `.extend()` 扩展**\n\n```typescript\nimport {MarkdownExtension} from '@bdky/chat-pilot-kit';\n\nconst EnhancedMarkdownExtension = MarkdownExtension.extend({\n    priority: 250, // 更改优先级\n\n    onStreamAppend(node, data) {\n        // 手动调用原始行为（如需要）\n        node.appendContent(data.answer || '');\n\n        // 添加自定义行为\n        console.log('增强的 markdown 流式处理:', data.answer);\n    }\n});\n\ncreateChatPilotKit({\n    agentService: MyAgentService,\n    overrideExtensions: [EnhancedMarkdownExtension]\n});\n```\n\n## ⚠️ 错误处理\n\nSDK 提供了全面的错误管理系统。\n\n**ErrorManager API：**\n\n```typescript\nconst {controller, emitter} = createChatPilotKit({agentService: MyAgentService});\n\n// 订阅错误\nemitter.on('error', (error: IChatPilotKitError) => {\n    console.error('错误:', error);\n});\n```\n\n**错误类别：**\n\n```typescript\nenum ErrorCategory {\n    NETWORK = 'NETWORK',           // 网络相关错误\n    TIMEOUT = 'TIMEOUT',           // 请求超时\n    VALIDATION = 'VALIDATION',     // 输入验证错误\n    SERVICE = 'SERVICE',           // 后端服务错误\n    CONFIGURATION = 'CONFIGURATION', // 配置错误\n    INTERNAL = 'INTERNAL'          // SDK 内部错误\n}\n```\n\n**错误严重性：**\n\n```typescript\nenum ErrorSeverity {\n    LOW = 'LOW',           // 轻微问题，可恢复\n    MEDIUM = 'MEDIUM',     // 中等问题，可能影响用户体验\n    HIGH = 'HIGH',         // 严重问题，需要关注\n    CRITICAL = 'CRITICAL'  // 关键故障，系统不可用\n}\n```\n\n**IChatPilotKitError 接口：**\n\n```typescript\ninterface IChatPilotKitError {\n    code: string;                    // 错误代码（例如 'NETWORK_ERROR'）\n    message: string;                 // 人类可读的消息\n    category: ErrorCategory;         // 错误类别\n    severity: ErrorSeverity;         // 严重性级别\n    source: 'agent' | 'upload' | 'extension' | 'controller' | 'conversation';\n    metadata?: Record<string, unknown>; // 附加上下文\n    originalError?: Error;           // 原始错误对象\n}\n```\n\n**使用示例：**\n\n```typescript\nemitter.on('error', error => {\n    if (error.severity === ErrorSeverity.CRITICAL) {\n        // 显示关键错误 UI\n        alert(`关键错误: ${error.message}`);\n    }\n    else if (error.category === ErrorCategory.NETWORK) {\n        // 重试逻辑\n        console.log('网络错误，正在重试...');\n    }\n\n    // 记录到监控服务\n    logToMonitoring(error);\n});\n```\n\n## 💾 对话持久化\n\n导出和导入对话以实现持久化或迁移。\n\n**导出对话：**\n\n```typescript\nconst snapshots = controller.exportConversations();\n// 保存到 localStorage、数据库等\nlocalStorage.setItem('conversations', JSON.stringify(snapshots));\n```\n\n**导入对话：**\n\n```typescript\nconst snapshots = JSON.parse(localStorage.getItem('conversations') || '[]');\n\ncontroller.importConversations(snapshots, {\n    position: 'prepend' // 或 'replace'\n});\n```\n\n**IImportOptions：**\n\n```typescript\ninterface IImportOptions {\n    position?: 'prepend' | 'replace'; // 默认: 'prepend'\n}\n```\n\n- `'prepend'`：在现有对话之前插入导入的对话\n- `'replace'`：替换所有现有对话\n\n**水合过程：**\n\n导入对话时，SDK 会：\n1. 解析 JSON 快照\n2. 将每个节点的 `type` 与已注册的扩展匹配\n3. 调用扩展的 `process()` 方法重新创建节点\n4. 恢复节点状态（内容、元数据、完成状态）\n5. 触发 `history_import` 事件\n\n**完整的往返示例：**\n\n```typescript\n// 导出\nconst snapshots = controller.exportConversations();\nconst json = JSON.stringify(snapshots);\n\n// 保存到后端\nawait fetch('/api/save-history', {\n    method: 'POST',\n    body: json,\n    headers: {'Content-Type': 'application/json'}\n});\n\n// 稍后：从后端加载\nconst response = await fetch('/api/load-history');\nconst loadedSnapshots = await response.json();\n\n// 导入\ncontroller.importConversations(loadedSnapshots, {\n    position: 'replace'\n});\n```\n\n## 🌊 流式传输\n\n实现 `IStreamableNode` 的节点支持增量内容更新。\n\n**IStreamableNode 接口：**\n\n```typescript\ninterface IStreamableNode<TChunk = string> {\n    appendContent(chunk: TChunk): void;\n}\n```\n\n**类型守卫：**\n\n```typescript\nimport {isStreamableNode} from '@bdky/chat-pilot-kit';\n\nif (isStreamableNode(node)) {\n    node.appendContent('新内容');\n}\n```\n\n**内置可流式节点：**\n- `MarkdownNode` — 追加 markdown 文本\n- `ThinkingBlockNode` — 追加思考过程文本\n- `StreamableGenericNode` — 通用可流式节点\n\n**扩展中的流式传输工作原理：**\n\n```typescript\nconst StreamingExtension = MessageExtension.create({\n    name: 'streaming_text',\n    priority: 100,\n    streamable: true,\n\n    canProcess(data) {\n        return data.nodeType === 'streaming_text';\n    },\n\n    process(data) {\n        // 创建初始可流式节点\n        return new StreamableGenericNode('streaming_text', data.answer || '');\n    },\n\n    onStreamAppend(node, data) {\n        // 数据块到达时追加内容\n        node.appendContent(data.answer);\n    },\n\n    onStreamEnd(node) {\n        // 流结束时标记为已完成\n        node.markCompleted();\n    },\n\n    hydrate(snapshot) {\n        const node = new StreamableGenericNode(snapshot.type, snapshot.content);\n        node.completed = snapshot.completed;\n        return node;\n    },\n\n    addNodeView() {\n        return null;\n    }\n});\n```\n\n**MarkdownNode 流式传输示例：**\n\n```typescript\nimport {MarkdownNode} from '@bdky/chat-pilot-kit';\n\nconst node = MarkdownNode.fromString('');\n\n// 模拟流式传输\nnode.appendContent('# Hello\\n');\nnode.appendContent('This is ');\nnode.appendContent('**streaming** ');\nnode.appendContent('markdown.');\n\nconsole.log(node.content); // \"# Hello\\nThis is **streaming** markdown.\"\n```\n\n## 🎨 NodeView 系统（框架集成）\n\nNodeView 系统支持对话节点的框架特定渲染。\n\n**核心接口：**\n\n```typescript\ninterface NodeViewProps<TNode extends ConversationNode = ConversationNode> {\n    node: TNode;\n    updateContent: (content: TNode['content']) => void;\n    updateMetadata: (metadata: Record<string, unknown>) => void;\n    completed: boolean;\n    role: 'client' | 'aiWorker';\n    conversation: ConversationBean;\n    destroy: () => void;\n}\n\ninterface INodeView {\n    mount(container: HTMLElement): void;\n    update(props: NodeViewProps): void;\n    destroy(): void;\n}\n\ntype NodeViewFactory<TNode extends ConversationNode = ConversationNode> =\n    (props: NodeViewProps<TNode>) => INodeView;\n```\n\n**如何创建框架适配器：**\n\n1. 为每种节点类型实现 `NodeViewFactory`\n2. 创建将节点类型映射到工厂的注册表\n3. 使用框架特定组件渲染节点\n4. 订阅 `conversation_change` 事件以触发重新渲染\n\n**参考实现：**\n\n查看 `@bdky/chat-pilot-kit-react` 以获取完整的 React 适配器实现，包括：\n- `ChatPilotKitProvider` 上下文提供者\n- `useChatPilotKit()` hook\n- 所有节点类型的内置 NodeView 组件\n- TypeScript 支持\n\n## 🌐 HTTP 工具\n\nSDK 重新导出来自 `ky` 和 `@bdky/ky-sse-hook` 的 HTTP 工具以方便使用。\n\n**子路径导出：**\n\n```typescript\nimport {ky, sseHook, HTTPError, TimeoutError} from '@bdky/chat-pilot-kit/http';\nimport type {KyInstance, Options} from '@bdky/chat-pilot-kit/http';\n```\n\n**从 `ky` 重新导出：**\n- `ky`（默认导出）— HTTP 客户端\n- `HTTPError`、`TimeoutError` — 错误类\n- 所有 TypeScript 类型\n\n**从 `@bdky/ky-sse-hook` 重新导出：**\n- `sseHook` — ky 的 SSE 流式传输 hook\n\n**在 AgentService 中使用：**\n\n```typescript\nimport {BaseAgentService} from '@bdky/chat-pilot-kit';\nimport {ky, sseHook} from '@bdky/chat-pilot-kit/http';\n\nclass MyAgentService extends BaseAgentService {\n    async query(text: string): Promise<void> {\n        await ky.post('https://api.example.com/chat', {\n            json: {message: text},\n            hooks: {\n                afterResponse: [\n                    sseHook.afterResponse({\n                        onMessage: chunk => this.onData(chunk),\n                        onComplete: () => this.onCompleted(),\n                        onError: error => this.onError(error)\n                    })\n                ]\n            }\n        });\n    }\n\n    dispose(): void {}\n}\n```\n\n## ⚙️ 配置参考\n\n**IOptions 接口：**\n\n```typescript\ninterface IOptions<AS extends BaseAgentService = BaseAgentService> {\n    agentService: Newable<AS>;           // 必需：您的 AgentService 类\n    enableDebugMode?: boolean;           // 默认: false\n    sessionTimeout?: number;             // 默认: 300000（5 分钟）\n    extensions?: MessageExtensionInstance[]; // 自定义扩展（追加）\n    overrideExtensions?: MessageExtensionInstance[]; // 覆盖内置扩展\n}\n```\n\n**IQueryOptions 接口：**\n\n```typescript\ninterface IQueryOptions {\n    sessionId?: string;                  // 自定义会话 ID\n    queryId?: string;                    // 自定义查询 ID\n    streaming?: boolean;                 // 启用流式传输（默认: true）\n    metadata?: Record<string, unknown>;  // 自定义元数据\n}\n```\n\n**IAttachmentInput 接口：**\n\n```typescript\ninterface IAttachmentInput {\n    url: string;                         // 文件 URL（已上传）\n    fileName: string;                    // 文件名\n    fileSize: number;                    // 文件大小（字节）\n    fileType: string;                    // MIME 类型\n    metadata?: Record<string, unknown>;  // 自定义元数据\n}\n```\n\n**使用示例：**\n\n```typescript\nconst {controller} = createChatPilotKit({\n    agentService: MyAgentService,\n    enableDebugMode: true,\n    sessionTimeout: 600000, // 10 分钟\n    extensions: [CustomExtension],\n    overrideExtensions: [EnhancedMarkdownExtension]\n});\n\nawait controller.query('Hello', {\n    sessionId: 'custom-session-123',\n    queryId: 'query-456',\n    streaming: true,\n    metadata: {source: 'web-app'}\n});\n\nawait controller.queryWithAttachments(\n    '分析这张图片',\n    [\n        {\n            url: 'https://example.com/image.jpg',\n            fileName: 'image.jpg',\n            fileSize: 102400,\n            fileType: 'image/jpeg'\n        }\n    ],\n    {metadata: {feature: 'image-analysis'}}\n);\n```\n\n## 📘 TypeScript\n\nSDK 使用 TypeScript 编写，并提供完整的类型定义。\n\n**类型导入：**\n\n```typescript\nimport type {\n    // 核心\n    IChatPilotKitController,\n    IChatPilotKitEmitter,\n    IOptions,\n    IResolvedOptions,\n\n    // Agent\n    AgentMessageData,\n    NBaseAgentService,\n\n    // 节点\n    ConversationNode,\n    IConversationNodeSnapshot,\n    IConversationNodeInput,\n    IStreamableNode,\n\n    // 节点内容\n    IImageContent,\n    IFileContent,\n    IThinkingContent,\n    IAudioContent,\n    IVideoContent,\n    IToolCallContent,\n    ToolCallStatus,\n\n    // 对话\n    ConversationRole,\n    NConversationBean,\n    IConversationBeanSnapshot,\n    IConversationBeanInput,\n\n    // 扩展\n    MessageExtensionConfig,\n    MessageExtensionInstance,\n\n    // 事件\n    IConversationChangePayload,\n    ITtftPayload,\n\n    // 错误\n    IChatPilotKitError,\n    ICreateErrorParams,\n    ErrorCategory,\n    ErrorSeverity,\n\n    // NodeView\n    NodeViewProps,\n    NodeViewFactory,\n    INodeView,\n\n    // 查询\n    IQueryOptions,\n    IImportOptions,\n    IAttachmentInput,\n\n    // 节点数据\n    IConversationNodeData,\n    ITextNodeData,\n    IMarkdownNodeData,\n    IImageNodeData,\n    IFileNodeData,\n    IThinkingNodeData,\n    IAudioNodeData,\n    IVideoNodeData,\n    IToolCallNodeData,\n    IBuiltInNodeData\n} from '@bdky/chat-pilot-kit';\n```\n\n**关键类型导出：**\n\n- **Controller**: `IChatPilotKitController`\n- **Emitter**: `IChatPilotKitEmitter`\n- **Agent**: `AgentMessageData`、`NBaseAgentService`\n- **节点**: `ConversationNode`、`IStreamableNode`、所有内容接口\n- **扩展**: `MessageExtensionConfig`、`MessageExtensionInstance`\n- **错误**: `IChatPilotKitError`、`ErrorCategory`、`ErrorSeverity`\n- **事件**: `IConversationChangePayload`、`ITtftPayload`\n\n## 🔗 框架适配器\n\n官方框架适配器可用：\n\n| 包 | 框架 | 描述 |\n|----|------|------|\n| `@bdky/chat-pilot-kit-react` | React 19+ | React hooks、Provider 和 NodeView 组件 |\n| `@bdky/chat-pilot-kit-vue3` | Vue 3 | Vue composables 和组件 |\n\n**React 示例：**\n\n```typescript\nimport {ChatPilotKitProvider, useChatPilotKit} from '@bdky/chat-pilot-kit-react';\n\nfunction App() {\n    return (\n        <ChatPilotKitProvider agentService={MyAgentService}>\n            <ChatUI />\n        </ChatPilotKitProvider>\n    );\n}\n\nfunction ChatUI() {\n    const {controller, conversations} = useChatPilotKit();\n\n    return (\n        <div>\n            {conversations.map(conv => (\n                <div key={conv.id}>\n                    {conv.nodes.map(node => (\n                        <NodeView key={node.id} node={node} />\n                    ))}\n                </div>\n            ))}\n        </div>\n    );\n}\n```\n\n有关详细文档，请参阅适配器包的 README。\n\n## 🌍 浏览器支持\n\n| 浏览器 | 版本 |\n|--------|------|\n| Chrome | ≥ 74 |\n| Firefox | ≥ 90 |\n| Safari | ≥ 14.1 |\n| Edge | ≥ 79 |\n| iOS Safari | ≥ 14.1 |\n| Android Chrome | ≥ 74 |\n\n## 📄 许可证\n\nMIT\n\n---\n\nMade with ❤️ by 百度智能云客悦 Ky-FE Team\n","readmeFilename":"README.zh-CN.md"}