尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ZerolanLiveRobot开发者指南:如何扩展一个新服务并注册自定义事件(附完整实战示例)
【免费下载链接】ZerolanLiveRobotAI VTuber with LLM, ASR, TTS, OCR, CV and more technologies to live stream or play Minecraft with you.项目地址https://gitcode.com/gh_mirrors/ze/ZerolanLiveRobot点击查看免费下载如果你想在开源项目ZerolanLiveRobotAI VTuber 直播机器人中扩展一个新服务或者注册自定义事件这篇文章将带你从零走完整条链路事件驱动架构、服务注册机制、TypedEventEmitter 监听器以及一个可参考的完整实战示例。只需跟着做你就能让自己的 AI 直播机器人多出一种新能力。一、先搞懂ZerolanLiveRobot 的事件驱动架构ZerolanLiveRobot 是一款基于事件驱动Event-Driven设计模式的 AI VTuber 直播机器人它没有轮询等待而是有事件才行动。理解了这一点扩展新服务就只是填空题。整个事件系统的核心分布在event/目录下的三个文件文件职责event/registry.py事件名注册表EventKeyRegistry所有事件类型必须在这里登记event/event_data.py所有事件数据类继承自BaseEventevent/event_emitter.py核心TypedEventEmitter负责事件派发与监听器执行其中 BaseEvent 是所有事件的基类只需一个type字段标记事件类型class BaseEvent(BaseModel): type: str而emitter是一个全局单例event/event_emitter.py#L250提供两个最关键的 APIemitter.on(event_key)注册监听器。异步函数会作为协程任务执行同步函数则丢进默认 4 个 worker 的线程池执行emitter.emit(event)发送事件触发所有已注册的监听器。 一个直观的例子QQ 服务收到消息后并不是直接调用 LLM而是发出QQMessageEvent事件services/qqbot/napcat.py#L80-L98再由 bot.py 中注册的监听器去处理。服务之间完全解耦这就是扩展的精髓。二、扩展一个新服务的标准流程按照官方约定每个服务放在services/下独立文件夹中并包含专属的config.py。整体流程分 6 步定义配置 → 定义事件 → 实现服务类 → 挂到 ServiceConfig → 在 Context 中实例化 → 在 Bot 中启动并监听下面用一个天气播报服务完整走一遍假设你已 clone 仓库并在自己的工作分支上操作。第 1 步定义服务配置新建services/weather/config.py用 Pydantic 模型声明配置项。description里的说明会直接展示在 WebUI 配置页面上由 common/generator/gradio_gen.py 自动生成from pydantic import BaseModel, Field class WeatherServiceConfig(BaseModel): enable: bool Field(defaultFalse, description是否启用天气播报服务。) city: str Field(default北京, description要播报天气的城市。) interval: int Field(default60, description推送间隔秒。)然后在 services/config.py 的ServiceConfig中挂上它这一步会让你的新服务自动出现在resources/config.yaml的service段里from services.weather.config import WeatherServiceConfig class ServiceConfig(BaseModel): # ... 原有字段 weather: WeatherServiceConfig Field( defaultWeatherServiceConfig(), descriptionConfiguration for the Weather service. )第 2 步注册自定义事件自定义事件分两处登记。先在 event/registry.py 的事件名注册表中新增一个类别命名建议沿用service.xxx.yyy的风格class EventKeyRegistry: # ... class Weather: UPDATE service.weather.update再在 event/event_data.py 中定义事件数据类把要传递的字段声明清楚Pydantic 会自动做校验class WeatherUpdateEvent(BaseEvent): city: str text: str type: str EventKeyRegistry.Weather.UPDATE第 3 步实现服务类新建services/weather/service.py。如果服务需要长期后台运行循环拉取数据、维持连接等建议继承 ThreadRunnable——它在start()时会自动注册到全局可运行组件表中程序退出时能被统一stop()回收import time from loguru import logger from common.concurrent.abs_runnable import ThreadRunnable from event.event_data import WeatherUpdateEvent from event.event_emitter import emitter from services.weather.config import WeatherServiceConfig class WeatherService(ThreadRunnable): def __init__(self, config: WeatherServiceConfig): super().__init__() self._config config def start(self): super().start() while self._activate: text self._fetch_weather() # 换成你自己的真实 API 调用 emitter.emit(WeatherUpdateEvent(cityself._config.city, texttext)) logger.info(f天气推送: {self._config.city} {text}) time.sleep(self._config.interval) def _fetch_weather(self) - str: return 晴26°C def name(self): return WeatherService def stop(self): self._activate False logger.info(WeatherService stopped.)注意服务内部只负责发事件不要在这里直接调用 LLM、TTS 等重逻辑——处理逻辑留给监听器这是保持架构解耦的关键。第 4 步在 Context 中实例化framework/context.py 是资源初始化的唯一入口其类注释明确要求只放资源初始化不放事件逻辑。参考 QQ 服务的写法framework/context.py#L127-L130按配置开关实例化if _config.service.weather.enable: from services.weather.service import WeatherService self.weather WeatherService(_config.service.weather)第 5 步在 Bot 中启动服务线程服务的后台线程在 bot.py 的start()方法中统一拉起。参照 OBS 客户端的启动方式用KillableThread包装成守护线程if self.weather: weather_thread KillableThread(targetself.weather.start, daemonTrue, nameWeatherThread) threads.append(weather_thread)第 6 步注册监听器让事件产生价值最后在 bot.py 的init()方法中用装饰器注册监听器把天气事件交给 LLM 用语音播报出去emitter.on(EventKeyRegistry.Weather.UPDATE) def on_weather_update(event: WeatherUpdateEvent): logger.info(f收到天气事件: {event.city} {event.text}) self.emit_llm_prediction( f{event.city}现在{event.text}。请用一句话在直播间播报一下天气。 )至此事件链闭环完成WeatherService 定时emit→ 监听器收到WeatherUpdateEvent→emit_llm_prediction驱动 LLM 推理 → 触发 TTS 播报bot.py#L486-L487。启动python main.py入口见 main.py并在配置文件中打开service.weather.enable新服务就跑起来了。三、进阶自定义事件的注册规则与注意事项同步监听器 vs 异步监听器TypedEventEmitter在派发时会检查监听器类型event/event_emitter.py#L206-L216async def监听器作为asyncio.Task提交到事件循环适合调用异步管线xxAsyncPipeline普通def监听器提交到线程池默认 4 个 worker适合耗时 IO 操作若只需执行一次用emitter.once(event_key)替代on触发后自动移除。⚠️ 三条实战避坑指南不要阻塞主线程。事件循环运行在主线程上任何同步阻塞调用都会卡死整个机器人README 中明确警告过这一点。注意线程安全。同步监听器运行在线程池中多个监听器可能并发访问同一服务涉及共享状态时请加锁或避免共享可变数据。留意 5 秒超时告警。每个任务默认带 5 秒Timer超时只会在日志中打印 warningevent/event_emitter.py#L37-L60可用于诊断耗时过长的监听器。四、相关文件速查路径作用event/registry.py事件名注册表新事件键在这里登记event/event_data.py事件数据类定义event/event_emitter.pyTypedEventEmitter 核心实现services/config.py所有服务配置的聚合入口framework/context.py服务实例化的唯一入口bot.py服务线程启动与事件监听器注册common/concurrent/abs_runnable.pyThreadRunnable / AsyncRunnable 基类五、总结扩展 ZerolanLiveRobot 的新服务本质上是沿一条清晰的链路做填空config.py声明配置 →event/registry.py登记事件名 →event/event_data.py定义事件类 → 服务类中emitter.emit发事件 →context.py实例化 →bot.py启动线程并注册监听器。由于服务之间通过事件解耦你添加的天气服务、硬件控制服务或任何自定义能力都不会侵入现有代码逻辑。掌握这套事件驱动 服务注册的扩展模式后你就可以基于 LLM、ASR、TTS、OCR、CV 这些现成管线pipeline/目录构建完全属于自己的 AI VTuber 直播机器人了。️赞分享【免费下载链接】ZerolanLiveRobotAI VTuber with LLM, ASR, TTS, OCR, CV and more technologies to live stream or play Minecraft with you.项目地址https://gitcode.com/gh_mirrors/ze/ZerolanLiveRobot点击查看免费下载相关推荐Strapi strapi/openapi 包扩展指南如何开发并注册一个自定义 Routes ProviderStrapi strapi/openapi 包扩展指南如何开发并注册一个自定义 Routes Provider 本文以 Strapi 仓库中 strapi后端CMS前端企业应用Ising-Decoder-SurfaceCode-1-Fast量子纠错领域的革命性表面码解码器Ising Decoder SurfaceCode 1 Fast量子纠错领域的革命性表面码解码器 Ising Decoder SurfaceCode 1 FaStarRailAssistant扩展系统开发者指南如何从零写一个自定义扩展StarRailAssistant扩展系统开发者指南如何从零写一个自定义扩展 StarRailAssistantSRA是一款基于图像识别的 崩坏星穹铁道自创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

WorkBuddy_新建任务与工作模式20_新手推荐路径

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

📅 2026/10/27 0:06:09
WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

📅 2026/10/27 0:06:09
数据仓库分层建模:ODS/DWD/DWS/ADS四层设计与边界守则

数据仓库分层建模:ODS/DWD/DWS/ADS四层设计与边界守则

简介:本资源是一份面向数据工程师、数仓开发人员及大数据初学者的系统性实践指南,聚焦数据仓库中核心难点——数据模型设计方法论与分层落地规范。内容覆盖ODS/CDM(含DWD、DWS、DIM)/ADS全链路分层逻辑、总线矩阵构建、数据域划分…

📅 2026/10/27 0:01:08
MORE NEWS

更多资讯

📰

agent-skills协议:可插拔AI技能的声明式交付标准

1. “agent-skills”不是功能模块,而是一套可插拔的能力交付协议你第一次在 GitHub 仓库名里看到agent-skills,或在 CLI 工具的--skills参数后跟一串路径时,大概率会下意识把它理解成“AI Agent 能做的几件事列表”——比如“查天气”“读文件…

📰

前端Leader转AI Agent 66天:从组件思维到工具调用的技术平移

1. 前端Leader转Agent,第66天我到底在折腾什么先交代一下背景。我自己做了十一年多前端,从写jQuery插件到带前端团队搞微前端、组件库、工程化基建,算是个标准的"老前端"。今年年初开始系统性地学AI Agent,Day 66这个节…

📰

Claude-Mem:面向 Claude API 的轻量级本地记忆压缩中间件

1. 项目概述:Claude-Mem 是什么,它解决的到底是什么问题?Claude-Mem 这个名字一出现,很多人第一反应是“这是 Claude 的某个新版本?还是官方推出的记忆插件?”——其实都不是。它既不是 Anthropic 官方产品…

📰

计算机视觉底层原理:滤波定义、SIFT双塔与感受野的闭环理解

简介:本资源是北京交通大学2024年计算机视觉课程核心考点精要汇总,面向高校本科生、考研备考学生及CV入门学习者,系统梳理课程必考的40个关键知识点,覆盖图像滤波原理、边缘与角点检测(Canny/Harris)、多尺…

📰

Paper2Slides:从PDF到演示稿的自动化生成与排版实践

简介:Paper2Slides 是一款面向科研人员、教师与会议汇报者的开源演示稿生成工具,旨在解决从论文、报告到幻灯片与海报之间反复排版耗时的痛点。它支持 PDF、Word、Excel、Markdown 等多种文档格式,借助 RAG 技术精准提取关键内容并建立索引&a…

📰

AI时代程序员的核心竞争力重构与转型指南

1. 程序员与AI的共生时代:重新定义核心竞争力最近GitHub Copilot、ChatGPT等AI编程工具的出现,确实让不少同行感到焦虑。作为一个在代码堆里摸爬滚打十多年的老程序员,我想分享一个核心观点:AI不会让程序员失业,但会彻…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬