在 TEN Framework 中用 Node.js 构建 HTTP 服务器扩展:http_server_extension_nodejs 实战指南
发布时间:2026/9/25 2:19:30来源:尧图网络
人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载导读本文围绕 TEN Framework 开源仓库中的官方示例包http_server_extension_nodejs示例包目录系统讲解如何在对话式 AI Agent 应用中通过 Node.js 编写一个 HTTP 服务器扩展将外部 HTTP 请求转换为 TEN 框架内的 Cmd 消息并驱动扩展图中的其他节点。读完本文你将掌握该扩展的安装方式、manifest.json与图配置的写法、server_port参数配置、以及HTTP 请求 → Cmd → CmdResult → HTTP 响应的完整调用链并了解仓库集成测试如何验证这一链路。一、扩展概览这个示例包解决什么问题该扩展是 TEN Framework 的一个软件包组件extension package用 Node.jsTypeScript编写核心能力是在 TEN 应用内部启动一个 HTTP 服务器并把收到的 JSON 请求转译成 TEN 的 Cmd 消息下发到图中其他扩展再把执行结果回写为 HTTP 响应。在真实应用场景中这一模式常用于外部 Web 前端、移动端或第三方服务通过 HTTP 与 TEN 对话应用交互例如触发关闭应用调用某个扩展能力等操作而不必直接接触 TEN 的消息协议。从仓库元信息看manifest.json包类型为extension名称为http_server_extension_nodejs当前版本0.11.73标签为nodejs运行时依赖ten_runtime_nodejs版本与主框架保持一致提供多语言展示名与描述en-US / zh-CN / zh-TW / ja-JP / ko-KR并声明了多语言 README 的import_uri。二、前提条件与安装2.1 前提条件一个可用的 TEN Framework 运行环境含ten_runtime系统包Node.js 运行时组件ten_runtime_nodejs版本与扩展一致即0.11.73用于加载与执行 TypeScript/JavaScript 扩展TypeScript 构建工具链仓库中package.json使用 TypeScript^5.7.2与types/node ^22.13.5。2.2 安装该扩展作为标准 TEN 软件包按TEN Framework 软件包安装指南安装即可如使用tman或构建系统自动拉取依赖。其依赖关系已在 manifest.json 中声明dependencies: [ { type: system, name: ten_runtime_nodejs, version: 0.11.73 } ]包发布时包含的文件由 BUILD.gn 与manifest.json的package.include共同约束包括manifest.json、property.json、BUILD.gn、src/**、tsconfig.json、package.json、LICENSE以及docs/**下的多语言文档。三、扩展的声明与图集成配置3.1 包声明manifest.jsonmanifest.json是 TEN 包的身份证核心字段包括字段取值/说明typeextension标识这是一个扩展包namehttp_server_extension_nodejsversion0.11.73与框架版本对齐dependencies依赖ten_runtime_nodejs系统包api空对象本示例未额外导出 API3.2 在应用图中挂载扩展扩展只有被挂载进应用app的predefined graph才会随应用启动。以仓库集成测试应用 manifest.json 为例应用声明依赖{ type: app, name: default_app_nodejs, version: 0.11.73, dependencies: [ { type: system, name: ten_runtime, version: 0.11.73 }, { type: system, name: ten_runtime_nodejs, version: 0.11.73 }, { type: extension, name: http_server_extension_nodejs, version: 0.11.73 }, { type: extension, name: simple_echo_cpp, version: 0.11.73 } ] }对应 property.json 中的图配置{ ten: { predefined_graphs: [ { name: default, auto_start: true, graph: { nodes: [ { type: extension, name: http_server_extension_nodejs, addon: http_server_extension_nodejs, extension_group: default_extension_group, property: { server_port: 8002 } }, { type: extension, name: simple_echo_cpp, addon: simple_echo_cpp, extension_group: default_extension_group } ], connections: [ { extension: http_server_extension_nodejs, cmd: [ { name: test, dest: [ { extension: simple_echo_cpp } ] } ] } ] } } ] } }这里的核心点addon名称http_server_extension_nodejs必须与扩展内RegisterAddonAsExtension(http_server_extension_nodejs)的注册名一致通过节点property中的server_port指定监听端口此处为 8002未配置时扩展会回退到默认端口 8001见下文源码分析connections定义了http_server_extension_nodejs发出的名为test的 Cmd 路由到simple_echo_cpp这是HTTP 请求驱动其他扩展的关键一步。四、源码剖析HTTP 服务器扩展的实现原理扩展的全部业务逻辑位于 src/index.ts其结构清晰体现了 TEN Node.js 扩展的标准生命周期。4.1 类结构与注册机制import { Addon, RegisterAddonAsExtension, Extension, TenEnv, Cmd, StatusCode, CmdResult, TenError } from ten-runtime-nodejs; class HttpServerExtension extends Extension { tenEnv: TenEnv | undefined undefined; httpServer: http.Server | undefined undefined; ... } RegisterAddonAsExtension(http_server_extension_nodejs) class HttpServerExtensionAddon extends Addon { async onCreateInstance(_tenEnv: TenEnv, instanceName: string): PromiseExtension { return new HttpServerExtension(instanceName); } }扩展本体继承Extension通过装饰器RegisterAddonAsExtension(http_server_extension_nodejs)将 addon 与扩展名绑定onCreateInstance负责按实例名创建扩展实例这是 TEN 在图中实例化扩展的入口。4.2 生命周期回调配置 → 初始化 → 启动 → 停止 → 销毁回调职责实现要点onConfigure读取/下发配置仅记录日志onInit初始化资源保存tenEnv引用onStart启动服务读取server_port并创建 HTTP 服务器onStop优雅停止关闭 HTTP 服务器并等待回调onDeinit释放资源清空tenEnv引用onStart是核心实现src/index.tsasync onStart(tenEnv: TenEnv): Promisevoid { tenEnv.logInfo(HttpServerExtension onStart); const hostname 127.0.0.1; let [port, err] await tenEnv.getPropertyNumber(server_port); if (err ! undefined) { port 8001; // 默认端口 } const server http.createServer(this.handler.bind(this)); server.listen(port, () { tenEnv.logInfo(Server running at http:// hostname : port /); }); this.httpServer server; }注意两点端口来源通过tenEnv.getPropertyNumber(server_port)从图中节点的property读取端口读取失败时默认8001监听地址固定绑定127.0.0.1即仅本机可访问符合示例的安全设定。4.3 请求处理HTTP → Cmd → CmdResult → HTTPhandler方法定义了完整的请求处理流程src/index.ts第一步方法与会话类型校验。仅接受POST且Content-Type: application/json的请求否则静默返回。第二步解析 JSON body并进行三类分支处理JSON 解析失败→ 返回400与Failed to parse JSON请求不含ten字段→ 返回400与No \ten in JSON dataten.type close_app→ 创建ten:close_app命令并发送给应用closeAppCmd.setDests([{ appUri: }])随后返回200 {message: OK}实现通过 HTTP 优雅关闭应用ten.name存在→ 以该名称创建 Cmd将原始 body 通过cmd.setPropertyFromJson(, body)注入并附加method、url两个属性然后通过this.tenEnv.sendCmd(cmd)下发const cmd Cmd.Create(name); cmd.setPropertyFromJson(, body); cmd.setPropertyString(method, req.method!); cmd.setPropertyString(url, req.url!); this.tenEnv!.sendCmd(cmd).then(([cmdResult, error]) { if (error) { res.writeHead(500, { Content-Type: text/plain }); res.end(Error: error.errorMessage); } else if (cmdResult?.getStatusCode() StatusCode.OK) { const [detail, err] cmdResult!.getPropertyToJson(detail); res.writeHead(200, { Content-Type: application/json }); res.end(detail); } else { res.writeHead(500, { Content-Type: text/plain }); res.end(Internal Server Error); } });响应契约约定下游扩展执行成功后其 CmdResult 的detail属性会被原样作为 HTTP 响应体返回。因此若要让 HTTP 调用方拿到业务数据下游扩展应在结果中写入detail。第三步ten结构无效→ 返回400与Invalid ten。由此可归纳出对外 JSON 请求的两种协议格式// 1) 调用图中任意扩展能力 { ten: { name: cmd名称, ...任意业务字段 } } // 2) 关闭应用 { ten: { type: close_app } }4.4 编译与运行配置package.jsonmain: ./build/index.jstype: module通过npm run build即tsc --listEmittedFiles把 TypeScript 编译到build/tsconfig.jsontarget: ES2023、module: NodeNext、开启experimentalDecorators与emitDecoratorMetadata装饰器语法必需、strict严格模式输出到build目录并生成sourceMap。五、集成测试如何验证这条调用链仓库在 tests/ten_runtime/integration/nodejs/http_server_nodejs 提供了完整的集成测试从测试角度印证了上述行为测试应用http_server_nodejs_app将 HTTP 扩展与simple_echo_cpp连成图并把server_port设为8002test_case.py 的核心逻辑组装并构建应用包prepare_and_build_app编译 TypeScript 扩展build_nodejs_extensions启动应用bin/start并轮询等待应用在 8002 端口就绪向http://127.0.0.1:8002/发送请求def http_request(): return http.post( http://127.0.0.1:8002/, { ten: { name: test, }, }, )断言响应码不等于 500验证HTTP POST → Cmdtest→simple_echo_cpp→ CmdResult → HTTP 响应整条链路可用结束后通过stop_app优雅关闭应用并断言退出码为 0。该测试同时验证了跨语言协作HTTP 扩展是 Node.js而目标扩展simple_echo_cpp是 C说明 HTTP 网关式扩展可以无缝驱动任意语言实现的扩展节点。六、快速上手从零集成到你的 TEN 应用准备应用在应用manifest.json的dependencies中加入http_server_extension_nodejs与ten_runtime_nodejs版本对齐配置图在应用property.json的predefined_graphs中挂载该扩展节点设置server_port例如 8002并通过connections把你要暴露的 Cmd 名称路由到目标扩展构建扩展进入扩展目录执行npm install与npm run buildtsc编译到build/启动应用启动 TEN 应用后扩展会在http://127.0.0.1:server_port/提供 HTTP 服务发起请求curl -X POST http://127.0.0.1:8002/ \ -H Content-Type: application/json \ -d {ten:{name:test}}七、常见问题与注意事项端口冲突/未生效确认图中节点的property.server_port已正确配置扩展读取失败时默认回退 8001可能与其他服务冲突请求被静默忽略仅POSTapplication/json会被处理其他方法与 Content-Type 不会进入处理分支400 响应排查检查请求体是否含ten字段、JSON 是否合法、ten内是否有name或type500 响应排查sendCmd返回error或目标扩展返回的CmdResult状态码不是StatusCode.OK此时可检查图中 Cmd 名称的路由connections是否配置正确以及下游扩展是否在结果中写入detail安全边界示例固定监听127.0.0.1仅本机可访问生产环境如需对外暴露应在网络层做好鉴权与安全策略。八、许可证本扩展包隶属于 TEN Framework 项目遵循 Apache License 2.0见 LICENSE与框架本身的开源许可保持一致。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐LFM2.5-VL-450M社区资源整合指南Discord、Playground、Colab Notebooks终极使用教程LFM2.5 VL 450M社区资源整合指南Discord、Playground、Colab Notebooks终极使用教程 LFM2.5 VL 450M是L人工智能AI Agent多模态语音AI 应用TEN Framework Go 扩展实战以 simple_http_server_go 为例完整解析一个 HTTP 服务扩展包TEN Framework Go 扩展实战以 simple_http_server_go 为例完整解析一个 HTTP 服务扩展包 本文以 TEN Framew人工智能AI Agent多模态语音AI 应用TEN Framework 异步 HTTP 服务器 Python 扩展深度解析基于 aiohttp 的 HTTP/WebSocket 桥接到 TEN 命令的实现指南TEN Framework 异步 HTTP 服务器 Python 扩展深度解析基于 aiohttp 的 HTTP/WebSocket 桥接到 TEN 命令的实人工智能AI Agent多模态语音AI 应用上一篇【亲测免费】 sse.js 使用与安装指南下一篇RCX安全最佳实践如何安全地管理和传输云存储文件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网