🤖 TinyRobot 源码深度分析:OpenTiny 的 AI 对话组件库,让 AI 聊天 UI 不再从零搭建
做过 AI 聊天界面的同学都知道,一个"看起来还行"的对话 UI,从气泡样式到流式渲染到消息管理,写完一套至少两周。TinyRobot 说:别写了,我来。
一、这项目是干嘛的?
TinyRobot 是 OpenTiny 生态中专门面向 AI 对话场景 的 Vue 3 组件库。别误会,它不是又造了一个通用 UI 库跟 TinyVue 抢活------它的定位是垂直于 AI 对话交互的组件解决方案。
简单说:你只需要关心 AI 返回了什么内容,怎么展示、怎么交互、怎么管理状态,TinyRobot 全包了。
当前版本 v0.4.1,MIT 许可证,22 个版本迭代。语言构成:TypeScript 58.1% + Vue 35.4%,TypeScript 占大头,类型安全感拉满。
二、架构拆解:Monorepo 三包分工,各司其职
TinyRobot 用 pnpm workspace 管理 Monorepo,把功能拆成三个包:
| 包名 | 干什么 | 你需不需要装 |
|---|---|---|
@opentiny/tiny-robot |
核心组件库(bubble、sender、container 等) | 必须装 |
@opentiny/tiny-robot-kit |
AI 客户端工具(Provider适配、Composable、存储) | 可选,想对接AI就装 |
@opentiny/tiny-robot-svgs |
SVG 图标库 | 可选,想用官方图标就装 |
这三层分工背后的哲学很清晰------关注点分离:
- 组件层:只管渲染和交互,不管 AI 请求怎么发、数据怎么存
- 工具层:处理 Provider 适配、对话状态、存储策略等"脏活累活"
- 资源层:图标独立打包,不和组件耦合
你只用核心包就能拿到 UI 能力,按需引入 kit 来对接 AI。最小依赖,最大灵活。
三、Kit 包的灵魂:Composable 架构
Kit 包中最值得品的是 Vue Composable 层:
bash
packages/kit/src/vue/
├── message/ # useMessage composable
└── conversation/ # useConversation composable
useMessage ------ 消息管理 Hook
- 创建、更新、删除、流式追加消息?它都能
- 消息状态封装成 Vue reactive 对象,跟组件自动响应式绑定,零手动同步
- 按角色分类(user/ai/system),不用自己写
if (role === 'ai')
useConversation ------ 对话管理 Hook
- 管理对话上下文(轮次、历史、会话切换)
- 与存储策略集成,对话持久化不用操心
- 生命周期自动管理(创建、加载、切换、销毁)
一句话总结 :在任何 Vue 组件里 useXxx() 就能拿到对话管理能力,不用 props 层层传递,不用全局 store,清爽!
四、Provider 模式:AI 模型随便换
bash
packages/kit/src/providers/
Provider 是 TinyRobot 对接不同 AI 模型服务的核心抽象:
- 每个 Provider 实现统一接口(发消息、收流式响应)
- 换 AI 服务商?换 Provider 就行,UI 代码一行不改
- OpenAI、DeepSeek、Anthropic......哪个便宜用哪个,TinyRobot 不绑任何一家
这设计让框架保持了中立性和可扩展性。你今天用 OpenAI,明天用 DeepSeek,后天用本地部署的模型,组件层完全无感。
五、存储策略:对话持久化三种方案任选
bash
packages/kit/src/storage/
| 策略 | 场景 | 特点 |
|---|---|---|
| LocalStorage | 轻量对话、短期存储 | 简单粗暴,同步操作,容量有限 |
| IndexedDB | 大量历史、长期存储 | 异步大容量,结构化查询 |
| 自定义存储 | 接后端数据库 | 完全自定义,企业场景首选 |
只需实现 StorageAdapter 接口就能接入任何后端存储。MongoDB?MySQL?Redis?随便你,接口统一就行。
六、核心组件逐一拆解
项目结构全览
bash
tiny-robot/
├── packages/
│ ├── components/ # 核心组件库
│ │ ├── src/
│ │ │ ├── bubble/ # 聊天气泡
│ │ │ ├── sender/ # 消息输入
│ │ │ ├── container/ # 容器布局
│ │ │ ├── history/ # 对话历史
│ │ │ ├── attachments/ # 文件附件
│ │ │ └── ... # 更多组件
│ ├── kit/ # AI工具包
│ ├── svgs/ # 图标库
│ ├── playground/ # 开发实验场
│ └── test/ # 测试套件
├── docs/ # 文档站点
├── scripts/ # 构建脚本
└── package.json
Bubble(聊天气泡)
每条消息的视觉单元。核心设计点:
role属性:ai/user/system 三种角色,样式自动区分placement属性:start/end 左右对齐,AI在左人在右(或者反过来,随你配)- 流式渲染:AI 流式响应时逐步追加内容,不用等全部返回才渲染
- Markdown 渲染:代码块、列表、链接自动格式化,不用自己写 Markdown 解析器
Sender(消息输入)
用户发消息的入口:
- 文本输入、多行、快捷键发送(Enter/Ctrl+Enter 可配置)
- 文件附件上传(跟 attachments 组件联动)
- 发送状态管理(发送中/成功/失败,不用自己写 loading 状态)
- 前缀/后缀插槽(加表情选择器?加语音按钮?随你插)
Container(对话容器)
编排全局布局的大管家:
- 子组件编排和布局(Bubble、Sender、History 的位置关系)
- 自动滚动到最新消息(这个功能自己实现的话,坑多得你想骂人)
- 响应式布局适配(桌面/移动端自动切换)
七、主题系统:OpenTiny Design 体系的一员
- Token 化设计变量:颜色、间距、字号、圆角全用 CSS 变量,改主题不用改源码
- 暗黑模式:一键切换,不用自己写 Dark Mode CSS
- 自定义主题:覆盖 CSS 变量就行,适配品牌风格零成本
八、Tree Shaking:按需引入,包体积可控
js
// 只引入你需要的组件
import { TrBubble } from '@opentiny/tiny-robot'
- 每个组件独立导出,打包工具正确 tree-shake 未使用的组件
- Kit 和 Svgs 作为可选依赖,不引入不影响核心功能
- 包体积不会因为"组件库"三个字就膨胀
九、在 OpenTiny 生态中的位置
| 搭档 | 关系 |
|---|---|
| TinyVue | 同属 OpenTiny Design 体系,但 TinyRobot 专攻 AI 对话而非通用 UI |
| GenUI SDK | GenUI Vue 渲染器可能复用 TinyRobot 的对话组件做基础 UI |
| NEXT SDK | @opentiny/next-remoter 直接基于 TinyRobot 构建 AI 聊天 UI |
| TinyEngine | TinyEngine 接入 LLM 时,对话 UI 可直接用 TinyRobot |
TinyRobot 是 OpenTiny AI 生态链的 UI 基础层,为上层应用提供标准化的对话交互组件。
十、总结:值不值得用?
👍 优势
- 垂直定位精准 ------ 不做通用 UI,专注 AI 对话,不和 TinyVue 内卷
- Composable 架构 ------ useMessage/useConversation 让对话逻辑和 UI 解耦,干净
- Provider 模式 ------ AI 模型可插拔切换,今天用 OpenAI 明天用 DeepSeek 随你
- 三层包设计 ------ 组件/工具/资源分离,按需引入不拉全家桶
- 流式支持 ------ AI 流式响应渲染是刚需,这个不内置你就得自己写
🤔 可以更好的地方
- Provider 的具体实现文档不够透明------到底适配了哪些 LLM?得翻源码看
- 51 Stars,社区还在早期------用起来没问题,但踩坑了可能搜不到解决方案
- 组件种类还可扩展------思考链展示、工具调用结果渲染等 AI 特有交互还没覆盖
🎯 适用场景
- 企业 AI 助手/客服的对话 UI
- AI 编程助手的交互界面
- 低代码平台的 AI 对话模块
- 任何需要 AI 对话交互的 Vue 3 应用
📚 项目资源
| 资源 | 地址 |
|---|---|
| 🏠 GitHub 源码 | github.com/opentiny/ti... |
| 📖 官方文档 | docs.opentiny.design/tiny-robot/ |
| 🚀 快速入门 | docs.opentiny.design/tiny-robot/... |
| 🎨 主题配置 | docs.opentiny.design/tiny-robot/... |
| 🔗 官网首页 | opentiny.design/tiny-robot |
| 📦 npm 核心包 | www.npmjs.com/package/@op... |
如果你觉得这篇文章有帮助,别忘了点赞👍收藏⭐,关注 OpenTiny 社区更多好货!有问题欢迎在评论区交流~