agent-robot-avatar 0.3.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,396 +1,202 @@
1
- # Agent Robot Avatar
2
-
3
- <p align="center">
4
- <img src="../assets/readme/agent-robot-avatar-header.jpg" alt="Agent Robot Avatar">
5
- </p>
6
-
7
- [English](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/README.md) | [简体中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-CN.md) | [繁體中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-TW.md) | [日本語](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ja.md) | [한국어](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ko.md) | [Español](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.es.md) | [Português](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.pt.md) | [Deutsch](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.de.md) | [Français](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.fr.md)
8
-
9
- ![Version](https://img.shields.io/badge/version-v0.3.2-111111?style=flat-square) [![License](https://img.shields.io/badge/license-MIT-0A7EA4?style=flat-square)](../LICENSE) [![CI](https://github.com/CX-ArtLab/agent-robot-avatar/actions/workflows/validate.yml/badge.svg?branch=main)](https://github.com/CX-ArtLab/agent-robot-avatar/actions/workflows/validate.yml) [![Ko-fi](https://img.shields.io/badge/Ko--fi-Support-FF5E5B?style=flat-square&logo=ko-fi&logoColor=white)](https://ko-fi.com/P0E625WIOI)
10
-
11
- ![Vanilla JavaScript](https://img.shields.io/badge/Vanilla-JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=000) ![Web Component](https://img.shields.io/badge/Web-Native%20Component-5A67D8?style=flat-square) ![SVG](https://img.shields.io/badge/Rendering-SVG-FFB13B?style=flat-square&logo=svg&logoColor=000) ![Zero Dependencies](https://img.shields.io/badge/Dependencies-0-2EA44F?style=flat-square) ![14 Agent States](https://img.shields.io/badge/Agent%20states-14-8B5CF6?style=flat-square) ![Pointer Following](https://img.shields.io/badge/Pointer-following-00A67E?style=flat-square) ![Jelly Drag](https://img.shields.io/badge/Drag-jelly%20physics-FF69B4?style=flat-square)
12
-
13
- 一个轻量、富有表现力的机器人头像 Web Component,可用于 AI Agent,也可用于其他需要交互反馈的应用。
14
-
15
- 适用于 AI 助手和 Agent 交互界面,也可用于桌面宠物、数字吉祥物、聊天机器人头像以及其他互动角色体验。
16
-
17
- Agent Robot Avatar 基于 SVG 与原生 JavaScript 构建,不依赖第三方动画框架,作为原生自定义元素工作,并提供尽量精简的公开 API。
18
-
19
- **当前公开版本:v0.3.2**
20
-
21
- <p align="center">
22
- <img src="../assets/demo/agent-robot-avatar-demo.gif" alt="Agent Robot Avatar 交互动画演示" width="560">
23
- </p>
24
-
25
- ## 在线演示
26
-
27
- 直接体验交互效果:[打开 Agent Robot Avatar 在线演示](https://cx-artlab.github.io/agent-robot-avatar/?lang=zh-CN)
28
-
29
- ## 主要特点
30
-
31
- - 纯 SVG + 原生 JavaScript
32
- - 原生 Web Component
33
- - 零运行时第三方依赖
34
- - 自动眨眼、视线与头部跟随
35
- - 局部果冻式拖拽形变与弹性回弹
36
- - 程序控制的 Agent 状态与表情
37
- - 独立的 `action-state` 语义动作生命周期事件
38
- - `wake-on` 睡眠唤醒策略
39
- - `motion` 减少动态效果支持
40
- - 不可见时暂停持续绘制
41
- - 可调整头部圆角
42
- - 悬浮式天线与可选状态闪动
43
-
44
- ## 快速开始
45
-
46
- 直接使用仓库源码时,请保持根目录的 `agent-robot-avatar.js` 与 `src/` 目录一起使用:
47
-
48
- ```html
49
- <script type="module" src="./agent-robot-avatar.js"></script>
50
- <agent-robot-avatar id="avatar"></agent-robot-avatar>
51
- ```
52
-
53
- 最小示例位于 [`examples/basic.html`](../examples/basic.html),无障碍语义状态示例位于 [`examples/accessibility.html`](../examples/accessibility.html)。
54
-
55
- 通过 npm:
56
-
57
- ```bash
58
- npm install agent-robot-avatar
59
- ```
60
-
61
- ```js
62
- import 'agent-robot-avatar';
63
- ```
64
-
65
- npm 包内置 TypeScript 类型声明。
66
-
67
- ## 基本 API
68
-
69
- ```js
70
- const avatar = document.querySelector('#avatar');
71
-
72
- avatar.play('success');
73
- avatar.play('failure');
74
- avatar.play('warning');
75
- avatar.play('inspect');
76
- avatar.play('blocked');
77
- avatar.play('error');
78
- ```
79
-
80
- 恢复默认待机:
81
-
82
- ```js
83
- avatar.reset();
84
- ```
85
-
86
- `reset()` 会统一取消当前程序动作、待完成计时、头部动画、拖拽/回弹和尚未触发的拖拽表情,然后回到 `idle`。被取消的动画 Promise 仍按原约定正常结束,不会因为取消而产生未处理拒绝。移除组件时会执行同类内部清理,但不会额外发送用于清理的 `face-state` 或 `action-state` 通知;同时会释放该实例的媒体偏好监听和观察器,清理过程不会反向重启渲染。重新挂载后从 `idle` 开始、保留配置,并只初始化一次连接期运行资源。
87
-
88
- 真正开始的新动作会替换旧动作;旧动作不能在之后恢复并覆盖新动作。未知动作会在破坏性清理前抛错。已经醒着时调用 `wake`、已经处于持续输入时再次调用 `input` 等无操作调用不会破坏当前动作,也不会产生虚假的语义生命周期事件。
89
-
90
- ## 状态与表情
91
-
92
- | 状态 | API 名称 | 典型用途 |
93
- | --- | --- | --- |
94
- | 默认待机 | `idle` | 正常待机状态 |
95
- | 发呆 | `bored` | 长时间无任务或空闲 |
96
- | 等待 | `waiting` | 请求已经发出,正在等待结果返回 |
97
- | 输入中 | `input` | 用户正在输入 |
98
- | 发送 | `send` | 内容已发送 / 点头反馈 |
99
- | 成功 | `success` | 任务成功完成 |
100
- | 失败 | `failure` | 任务完成但结果失败 |
101
- | 警告确认 | `warning` | 高风险操作需要再次确认 |
102
- | 审视 | `inspect` | 检查、核对或验证结果 |
103
- | 内容阻止 | `blocked` | 请求被阻止、不允许执行或无法继续 |
104
- | 系统错误 | `error` | 网络、服务或系统本身发生错误 |
105
- | 惊讶 | `surprise` | 出现意外事件或结果 |
106
- | 睡眠 | `sleep` | 组件进入睡眠姿态 |
107
- | 唤醒 | `wake` | 从睡眠姿态恢复 |
108
-
109
- `sleep` 只描述头像组件自身的状态,不表示真实 Agent 已离线。
110
-
111
- 语义别名:
112
-
113
- ```js
114
- avatar.play('failed'); // failure
115
- avatar.play('fail'); // failure
116
- avatar.play('verify'); // inspect
117
- avatar.play('review'); // inspect
118
- avatar.play('angry'); // 与 blocked 使用相同视觉表情
119
- avatar.play('policy-blocked'); // blocked
120
- avatar.play('system-error'); // error
121
- avatar.play('connection-error'); // error
122
- ```
123
-
124
- ## 持续等待
125
-
126
- ```js
127
- avatar.startWaiting();
128
-
129
- // 请求在没有被其他动作替换的情况下结束时:
130
- avatar.stopWaiting();
131
- ```
132
-
133
- `startWaiting()` 会一直保持到 `stopWaiting()`、`reset()` 或新的程序动作将其替换。当前确实处于 waiting 时,`stopWaiting()` 对 waiting 的语义生命周期是正常 `end`。为保持既有行为,如果在其他活跃程序动作期间调用 `stopWaiting()`,头像仍会回到 `idle`,但该动作现在会且只会记录一次 `cancel`;没有活跃动作时不会制造虚假的终止事件。
134
-
135
- 等待、输入或其他尚未结束的程序动作期间仍可以拖拽产生形变,但拖拽表情不会覆盖程序动作;被抑制的拖拽表情会直接丢弃,不会在动作结束后补播。
136
-
137
- 典型请求生命周期:
138
-
139
- ```js
140
- avatar.startWaiting();
141
- try {
142
- const result = await runAgentRequest();
143
- await avatar.play(result.ok ? 'success' : 'failure');
144
- } catch (error) {
145
- await avatar.play('error');
146
- }
147
- ```
148
-
149
- `error` 动画播放完并回到 `idle`,只表示头像动画结束,不表示真实连接或业务错误已经解决。真实请求状态始终由宿主应用决定。
150
-
151
- ## `action-state` 语义动作事件
152
-
153
- 现有 `face-state` 保留兼容,它描述视觉状态,可能出现 `happy`、`sad` 等视觉词,不建议直接拿它判断真实任务结果。
154
-
155
- 新增 `action-state`:
156
-
157
- ```js
158
- avatar.addEventListener('action-state', (event) => {
159
- const { action, phase, source } = event.detail;
160
- console.log(action, phase, source);
161
- });
162
- ```
163
-
164
- 约定:
165
-
166
- - `action`:规范化后的动作名;`failed` / `fail` → `failure`,`verify` / `review` → `inspect`。
167
- - `phase`:`start`,之后且仅之后一个 `end` 或 `cancel`。
168
- - `source`:`api`、`interaction`、`automatic`。
169
- - 持续 waiting / input 不会因为单次视觉循环完成而产生 `end`。
170
- - `stopWaiting()` 在 waiting 活跃时正常记录 `end`;若它把其他活跃程序动作重置为 idle,则该动作记录 `cancel`。
171
- - 无操作调用不产生虚假事件。
172
- - 普通拖拽反馈使用 `action: "reaction"`、`source: "interaction"`,不会被误认为 API 发出的任务成功/失败。
173
- - 事件会冒泡,并设置为 `composed`,可跨越组件的 Shadow DOM 边界监听。
174
- - 卸载只清理内部工作,不额外制造宿主播报事件。
175
-
176
- ## 无障碍接入
177
-
178
- 建议宿主根据 `action-state` 将程序动作映射为本地化文字,并使用普通的 `role="status"`:
179
-
180
- ```html
181
- <div id="agent-status" role="status" aria-live="polite"></div>
182
- ```
183
-
184
- ```js
185
- const status = document.querySelector('#agent-status');
186
- const messages = {
187
- waiting: '正在处理…',
188
- failure: '任务失败。',
189
- error: '连接异常。',
190
- };
191
-
192
- avatar.addEventListener('action-state', ({ detail }) => {
193
- if (detail.source === 'interaction') return;
194
- if (detail.phase === 'start' && messages[detail.action]) {
195
- status.textContent = messages[detail.action];
196
- }
197
- });
198
- ```
199
-
200
- 不要播报眨眼、视线变化或普通拖拽反应;也不要默认把所有错误都做成打断式警报。如果宿主本身已经播报同一状态,可以把头像视为装饰,避免重复通知。
201
-
202
- 完整示例见 [`examples/accessibility.html`](../examples/accessibility.html),其中覆盖等待、成功、失败、连接错误、宿主取消、新请求替换旧请求,以及旧请求迟到结果不能覆盖新状态;无障碍文字由宿主请求状态驱动,不重复播报底层表情变化。
203
-
204
- ## 睡眠唤醒策略
205
-
206
- 新增属性:
207
-
208
- ```html
209
- <agent-robot-avatar wake-on="manual"></agent-robot-avatar>
210
- ```
211
-
212
- | 值 | 行为 |
213
- | --- | --- |
214
- | `activity` | 默认值;保留原行为,页面指针/键盘活动可以自动唤醒头像。 |
215
- | `interaction` | 只有直接与这个头像交互时自动唤醒;页面其他区域活动不唤醒。 |
216
- | `manual` | 页面活动和头像交互都不会自动唤醒,由宿主显式控制。 |
217
-
218
- 显式调用仍保持显式语义:`avatar.play('wake')` 在所有模式下都可唤醒;`avatar.noteActivity()` 默认记录活动并唤醒,即使宿主是在真实 `keydown`、`pointerdown` 或 `click` 事件处理函数中调用它也一样。`noteActivity(false)` 只记录活动、不唤醒。页面环境活动与头像直接交互的自动唤醒会走独立来源并继续遵守 `wake-on`;自动唤醒的 `action-state` source 为 `automatic`,宿主显式唤醒仍为 `api`。其他程序动作可以按照动作语义离开睡眠;`reset()` 始终回到 `idle`。不同实例可以使用不同策略。
219
-
220
- ## 减少动态效果
221
-
222
- 新增:
223
-
224
- ```html
225
- <agent-robot-avatar motion="auto"></agent-robot-avatar>
226
- ```
227
-
228
- | 值 | 行为 |
229
- | --- | --- |
230
- | `auto` | 默认;遵循系统 `prefers-reduced-motion`,并响应运行期间的偏好变化。 |
231
- | `reduce` | 保留可辨认的静态状态,减少持续、弹性和闪烁类动画。 |
232
- | `full` | 始终使用普通动画,不受系统减少动态效果偏好影响。 |
233
-
234
- reduce 模式会简化等待转圈、待机游走/眨眼、惯性跟随、弹性回弹、天线弹簧和闪烁等装饰动态,但 waiting / input 等语义生命周期仍持续存在,直到宿主结束或替换。自动睡眠使用独立、可取消的计时调度,不依赖持续绘制,因此 reduce 已暂停绘制时仍能按 `auto-sleep` 进入睡眠;用户活动和运行时修改超时会重新调度,waiting/input 不会被自动睡眠覆盖。影响画面的静态状态会先提交最终 SVG 再暂停,包括最终闭眼的 sleep 姿态。切换 motion 不会恢复已经被取消的旧动作,也不会改变 `action-state` 的语义。
235
-
236
- ## 鼠标 / 指针跟随
237
-
238
- ```js
239
- avatar.setPointerFollow(false);
240
- avatar.setPointerFollow(true);
241
- ```
242
-
243
- 高频指针更新会合并为每个动画帧最多处理最新位置一次,普通模式下的视线跟随保持不变。
244
-
245
- ## 移动端拖拽
246
-
247
- 头像交互区域使用 `touch-action: pinch-zoom`:单指移动交给头像拖拽逻辑,同时保留双指缩放能力;从头像外部开始的页面滚动仍按页面正常手势处理。
248
-
249
- `pointercancel`、指针捕获丢失、reset、动作替换或卸载都会恢复形状,并且不会把手势取消误判成 `success` / `angry`。
250
-
251
- ## 天线闪动
252
-
253
- ```js
254
- avatar.setAntennaFlash(true);
255
- avatar.setAntennaFlash(false);
256
- ```
257
-
258
- 状态闪动默认关闭;reduce 模式会停止不必要的持续闪烁。
259
-
260
- ## 审视表情配置
261
-
262
- 可以在加载组件前配置:
263
-
264
- ```html
265
- <script>
266
- window.AgentRobotAvatarInspectConfig = {
267
- aperture: 24,
268
- scanOffset: 12,
269
- };
270
- </script>
271
- <script type="module" src="./agent-robot-avatar.js"></script>
272
- ```
273
-
274
- 加载前已经提供的有效值会被保留,只对缺失或无效项补默认值。配置通过 `Number(...)` 转换并要求有限值;`aperture` 限制在 `6–40`,`scanOffset` 限制在 `0–24`,时间参数限制在对应的 `0/40–2400 ms` 范围。加载后仍可修改同一个 `window.AgentRobotAvatarInspectConfig` 对象,每次开始 inspect 时会再次规范化。默认配置的视觉效果保持不变。
275
-
276
- ## 头部圆角
277
-
278
- ```js
279
- avatar.setHeadRoundness(0); // 更方
280
- avatar.setHeadRoundness(50); // 默认
281
- avatar.setHeadRoundness(100); // 更圆
282
-
283
- console.log(avatar.getHeadRoundness());
284
- ```
285
-
286
- 输入值限制在 `0–100`。天线模块和圆角模块现在复用同一套头部扁平化几何计算,避免默认形状出现实现偏差。
287
-
288
- `head-roundness-change`:
289
-
290
- ```js
291
- avatar.addEventListener('head-roundness-change', (event) => {
292
- console.log(event.detail.value);
293
- });
294
- ```
295
-
296
- ## `face-state` 视觉事件
297
-
298
- ```js
299
- avatar.addEventListener('face-state', (event) => {
300
- console.log(event.detail.state);
301
- });
302
- ```
303
-
304
- 该事件继续用于视觉同步和旧接入;涉及真实 Agent 生命周期和无障碍播报时优先使用 `action-state`。
305
-
306
- ## 基础属性
307
-
308
- ```html
309
- <agent-robot-avatar
310
- size="160px"
311
- color="#08090b"
312
- auto-sleep="30000"
313
- wake-on="activity"
314
- motion="auto">
315
- </agent-robot-avatar>
316
- ```
317
-
318
- | 属性 | 说明 |
319
- | --- | --- |
320
- | `size` | 正像素尺寸;支持 `140` 和 `140px`。不支持的单位、非法字符串、0、负数和非有限值统一回退到 `112px`。 |
321
- | `color` | 头像主色。 |
322
- | `auto-sleep` | 无操作后自动睡眠的毫秒数;`0` 关闭。 |
323
- | `wake-on` | `activity`(默认)、`interaction`、`manual`。 |
324
- | `motion` | `auto`(默认)、`reduce`、`full`。 |
325
-
326
- 动态修改尺寸后,拖拽坐标和指针跟随会使用当前实际布局尺寸。
327
-
328
- ## 默认行为
329
-
330
- 普通模式下继续保留随机眨眼、轻微视线活动、指针跟随、头部惯性和自然回待机等既有风格。开启 reduce 后会简化这些装饰动作。
331
-
332
- ## 拖拽交互
333
-
334
- - 空闲状态大幅向外拉:恢复后触发 `angry` 视觉反馈
335
- - 空闲状态大幅向中心挤压:恢复后触发 `success` 视觉反馈
336
- - 小幅拖动:只产生形变
337
- - 程序动作活跃时:可以形变,但拖拽表情不覆盖程序动作
338
- - reset / 新动作 / pointercancel / 丢失捕获 / 卸载:统一取消旧拖拽后续反应
339
-
340
- ## 不可见暂停与性能
341
-
342
- 组件在自身或父容器没有可见布局区域、或离开视口后暂停持续帧绘制;重新可见时按当前有效状态恢复,不补播已经失效的动作。有限动作的计时和 Promise 不依赖持续绘制,因此不会因为不可见而无限挂起。
343
-
344
- 指针移动按动画帧合并,只处理每帧最新位置。现有页面隐藏和稳定 sleep 暂停机制继续保留;实例卸载时会清理观察器与媒体查询监听。
345
-
346
- ## 交互 Demo
347
-
348
- `demo/index.html` 是完整交互 Demo,包含全部公开表情、指针跟随、拖拽形变、等待生命周期、圆角、颜色与模拟 Agent 对话状态。Demo 专用 JavaScript 与 npm 运行时保持分离。
349
-
350
- ## 项目结构
351
-
352
- ```text
353
- agent-robot-avatar.js 正式组件入口
354
- src/ 可复用组件运行时与表情模块
355
- demo/ 完整交互 Demo 与 Demo 专用辅助脚本
356
- examples/ 最小集成与无障碍示例
357
- assets/support/ 支持项目 / 支付二维码素材
358
- docs/ 多语言文档
359
- README.md 英文主文档
360
- CHANGELOG.md 正式版本记录
361
- CONTRIBUTING.md 贡献指南
362
- package.json 包与分发元数据
363
- LICENSE MIT License
364
- ```
365
-
366
- ## 分发
367
-
368
- 软件包以 `agent-robot-avatar` 名称发布到 npm。npm 包包含公开入口、TypeScript 类型声明、`src/` 运行时、文档和支持项目素材;Demo 专用文件和测试文件不会进入运行时包。
369
-
370
- ## 兼容性与验证
371
-
372
- 面向支持 ES Modules、Custom Elements、SVG、Pointer Events、Web Animations API、`IntersectionObserver`、`ResizeObserver` 和 `matchMedia` 的现代浏览器。
373
-
374
- 自动浏览器测试覆盖 Chromium、Firefox 和 WebKit;移动端拖拽取消另外使用 Chromium 可信触摸模拟验证。真实手机是否验证以对应 PR / 发布说明为准。
375
-
376
- ## 参与贡献
377
-
378
- 欢迎提交 Issue 和 Pull Request。提交修改前请先阅读 [`CONTRIBUTING.md`](../CONTRIBUTING.md)。
379
-
380
- ## 项目状态
381
-
382
- v0.3.2 是当前公开版本。当前刻意保持较小的公开 API,以便在未来 `1.0.0` 稳定性承诺之前继续谨慎演进。
383
-
384
- Agent Robot Avatar 为独立开发的开源项目,不隶属于、代表或获得任何 AI 平台或品牌的官方背书。
385
-
386
- ## License
387
-
388
- MIT License。详见 [`LICENSE`](../LICENSE)。
389
-
390
- ## 请我喝杯咖啡
391
-
392
- 如果这个项目对你有帮助,也可以请我喝杯咖啡:
393
-
394
- | Ko-fi | 支付宝 | 微信支付 |
395
- | --- | --- | --- |
396
- | <a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a> | <img src="../assets/support/alipay.png" alt="支付宝收款码" width="160"> | <img src="../assets/support/wechat-pay.png" alt="微信支付收款码" width="160"> |
1
+ # Agent Robot Avatar
2
+
3
+ <p align="center">
4
+ <img src="../assets/readme/agent-robot-avatar-header.jpg" alt="Agent Robot Avatar">
5
+ </p>
6
+
7
+ [English](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/README.md) | [简体中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-CN.md) | [Español](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.es.md) | [Русский](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ru.md) | [Français](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.fr.md) | [Português](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.pt.md) | [Deutsch](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.de.md) | [日本語](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ja.md) | [한국어](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ko.md) | [繁體中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-TW.md)
8
+
9
+ ![Version](https://img.shields.io/badge/version-v0.6.0-111111?style=flat-square) [![License](https://img.shields.io/badge/license-MIT-0A7EA4?style=flat-square)](../LICENSE) [![CI](https://github.com/CX-ArtLab/agent-robot-avatar/actions/workflows/validate.yml/badge.svg?branch=main)](https://github.com/CX-ArtLab/agent-robot-avatar/actions/workflows/validate.yml) [![Ko-fi](https://img.shields.io/badge/Ko--fi-Support-FF5E5B?style=flat-square&logo=ko-fi&logoColor=white)](https://ko-fi.com/P0E625WIOI)
10
+
11
+ ![Vanilla JavaScript](https://img.shields.io/badge/Vanilla-JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=000) ![Web Component](https://img.shields.io/badge/Web-Native%20Component-5A67D8?style=flat-square) ![SVG](https://img.shields.io/badge/Rendering-SVG-FFB13B?style=flat-square&logo=svg&logoColor=000) ![Zero Dependencies](https://img.shields.io/badge/Dependencies-0-2EA44F?style=flat-square)
12
+
13
+ 一个轻量、富表现力的机器人头像 Web Component,适用于 AI Agent 与交互式应用。
14
+
15
+ 可用于 AI 助手、Agent 界面、桌面伙伴、虚拟宠物、数字吉祥物、聊天机器人头像及其他交互角色体验。
16
+
17
+ 可用于 AI 助手、Agent 界面,包括类似 ChatGPT、Claude、Codex、Cursor、Grok Bot、Gemini CLI 和 OpenCode 的产品与体验。
18
+
19
+ 使用 SVG 与原生 JavaScript 构建,以原生 Custom Element 运行,运行时零依赖。
20
+
21
+ Agent Robot Avatar 还可作为 AG-UI 风格 Agent 界面的视觉反馈层。
22
+
23
+ <p align="center">
24
+ <img src="../assets/demo/agent-robot-avatar-demo.gif" alt="Agent Robot Avatar 交互动画演示" width="560">
25
+ </p>
26
+
27
+ ## 嵌入式眼睛版本(实验性)
28
+
29
+ 独立的 C++11 眼睛表情核心,在机器人和开发板的屏幕上画出同样的 18 种表情。固件示例覆盖 26 种开发板与屏幕组合(ESP32、ESP32-S3、RP2040;ST7789、ST7735、GC9A01 圆屏、ILI9341/9342/9488、CO5300 AMOLED、ST7701S RGB 屏、SSD1306/SH1106 OLED,含 LilyGO、M5Stack、微雪、Seeed、乐鑫等开发板)。所有示例都在 CI 中编译通过,尚未实机验证;如果你在实物上试过,欢迎提交实机验证报告。
30
+
31
+ [查看硬件接入说明](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/embedded/README.zh-CN.md)。现有 Web 组件与 Demo 保持不变。
32
+
33
+ ## 在线 Demo
34
+
35
+ [打开交互 Demo](https://cx-artlab.github.io/agent-robot-avatar/?lang=zh-CN)
36
+
37
+ ## 特点
38
+
39
+ - 原生 Web Component
40
+ - SVG 渲染 + 原生 JavaScript
41
+ - 运行时零依赖
42
+ - 自动眨眼与轻微待机动作
43
+ - 眼睛跟随指针与头部惯性运动
44
+ - 果冻式局部拖拽形变与弹性恢复
45
+ - 按住挤压与可拖动的弹簧天线交互
46
+ - 可通过程序控制 Agent 状态与表情
47
+ - 支持 waiting、success、failure、warning、review、blocked、system error 等反馈
48
+ - 支持减少动态效果
49
+ - 可配置自动睡眠行为
50
+ - 可调头部圆角
51
+ - 可选天线状态闪烁
52
+ - 内置 TypeScript 类型声明
53
+
54
+ ## 安装
55
+
56
+ ```bash
57
+ npm install agent-robot-avatar
58
+ ```
59
+
60
+ ```js
61
+ import 'agent-robot-avatar';
62
+ ```
63
+
64
+ 也可以直接加载仓库源码:
65
+
66
+ ```html
67
+ <script type="module" src="./agent-robot-avatar.js"></script>
68
+ ```
69
+
70
+ 然后添加组件:
71
+
72
+ ```html
73
+ <agent-robot-avatar id="avatar"></agent-robot-avatar>
74
+ ```
75
+
76
+ 无需初始化代码,头像会自动进入默认待机状态。
77
+
78
+ ## 基础用法
79
+
80
+ ```js
81
+ const avatar = document.querySelector('#avatar');
82
+
83
+ avatar.play('success');
84
+ avatar.play('wary');
85
+ avatar.play('refuse');
86
+
87
+ avatar.reset();
88
+ ```
89
+
90
+ 可用动作:
91
+
92
+ `idle` · `bored` · `waiting-spin` · `waiting-wrap` · `waiting-wave` · `input` · `affirm` · `success` · `failure` · `wary` · `inspect` · `angry` · `refuse` · `surprise` · `love` · `random` · `sleep` · `wake`
93
+
94
+ `waiting-wave`(等待 · 波动):双眼错开节奏上下起伏,每轮周期 1.1 秒、振幅 10 SVG 单位。`play('waiting-wave')` 连续播放三轮并回正;`startWaiting({ variant: 'wave' })` 持续循环,直到被其他动作替换或调用 `stopWaiting()`。支持减少动态效果设置,动作生命周期事件统一使用 `waiting`。
95
+
96
+ 动作名描述的是头像做出的样子:`refuse` 是摇头,用于 Agent 不能或不会执行某个请求;`failure` 用于任务或连接没有成功;`wary` 是侧头、上下打量的警惕眼神,用于需要用户确认的操作。0.5 版的旧名字(`send`、`warning`、`error`、`blocked` 等)在 1.0 之前仍可使用,但会在控制台提示改名,详见[升级对照表](../CHANGELOG.md#upgrading-from-05x)。
97
+
98
+ `love` 用于表达喜欢或感谢:两只眼睛向中间靠拢合成一颗爱心,跳动三下后恢复。
99
+
100
+ `random` 播放老虎机式的转动:两只眼睛各自在滚筒上滚动,随后左眼减速、弹跳着停下,右眼稍后停下。`slot` 是它的别名。
101
+
102
+ 一个典型的 Agent 请求流程:
103
+
104
+ ```js
105
+ avatar.startWaiting();
106
+
107
+ // 第二种等待:眼睛从一侧转出,再从另一侧转入。
108
+ avatar.startWaiting({ variant: 'wrap' });
109
+
110
+ // 另一种等待动作:双眼错开节奏上下波动。
111
+ avatar.startWaiting({ variant: 'wave' });
112
+
113
+ try {
114
+ const result = await runAgentRequest();
115
+ await avatar.play(result.ok ? 'success' : 'failure');
116
+ } catch (error) {
117
+ await avatar.play('failure');
118
+ }
119
+ ```
120
+
121
+ ## 常用选项
122
+
123
+ ```html
124
+ <agent-robot-avatar
125
+ size="160"
126
+ color="#08090b"
127
+ auto-sleep="30000"
128
+ wake-on="activity"
129
+ motion="auto">
130
+ </agent-robot-avatar>
131
+ ```
132
+
133
+ | 属性 | 用途 |
134
+ | --- | --- |
135
+ | `size` | 头像像素尺寸 |
136
+ | `color` | 头像主色 |
137
+ | `auto-sleep` | 自动睡眠前的空闲时间;`0` 为关闭 |
138
+ | `wake-on` | 自动唤醒策略:`activity`、`interaction` 或 `manual` |
139
+ | `motion` | 动态效果策略:`auto`、`reduce` 或 `full` |
140
+ | `press-squeeze` | 按住头像中心进行挤压;设为 `false` 可关闭 |
141
+ | `antenna-drag` | 拖动天线、弹簧复原并接愤怒表情;设为 `false` 可关闭 |
142
+
143
+ 常用运行时控制:
144
+
145
+ ```js
146
+ avatar.setPointerFollow(false);
147
+ avatar.setHeadRoundness(75);
148
+ avatar.setPressSqueeze(true);
149
+ avatar.setAntennaDrag(true);
150
+ ```
151
+
152
+ 按住头像中心会开始挤压;移动超过 4 个 CSS 像素后,同一次指针操作会切换为原有的头部拖动。拖动天线沿用头部拖动的距离限制,复原后接原有的愤怒反应。
153
+
154
+ ## 事件与集成
155
+
156
+ 组件通过 `face-state` 报告视觉状态变化,通过 `action-state` 报告语义动作生命周期变化。
157
+
158
+ 宿主应用集成和无障碍状态播报优先使用 `action-state`。可查看 [`examples/accessibility.html`](../examples/accessibility.html) 中的请求生命周期示例。
159
+
160
+ 最小集成示例位于 [`examples/basic.html`](../examples/basic.html)。
161
+
162
+ ## 兼容性
163
+
164
+ 面向支持 ES Modules、Custom Elements、SVG、Pointer Events、Web Animations API、`IntersectionObserver`、`ResizeObserver` 和 `matchMedia` 的现代浏览器。
165
+
166
+ 自动浏览器测试覆盖 Chromium、Firefox 和 WebKit。
167
+
168
+ ## 参与贡献
169
+
170
+ 欢迎提交 Issue 和 Pull Request。提交修改前请阅读 [`CONTRIBUTING.md`](../CONTRIBUTING.md)。
171
+
172
+ ## 项目状态
173
+
174
+ **当前公开版本:v0.6.0**
175
+
176
+ 公开 API 会在未来 `1.0.0` 稳定性承诺前继续保持精简并谨慎演进。
177
+
178
+ Agent Robot Avatar 为独立开发的开源项目,不隶属于、代表或获得任何 AI 平台或品牌的官方背书。
179
+
180
+ ## 角色设计与视觉标识
181
+
182
+ Agent Robot Avatar 角色,包括机器人外观与视觉标识,均为 CX ArtLab 的原创设计。
183
+
184
+ MIT License 适用于软件和源代码,允许在应用中使用、修改和分发该头像,但不会转移 Agent Robot Avatar 名称、角色身份或视觉标识的所有权,也不授予将其作为其他方原创角色或独立品牌进行展示的权利。
185
+
186
+ 本项目提及的第三方产品名称仅用于说明可能的使用场景,不代表任何关联或官方认可。
187
+
188
+ ## 许可证
189
+
190
+ MIT License。详见 [`LICENSE`](../LICENSE)。
191
+
192
+ ---
193
+
194
+ ## 请我喝杯咖啡
195
+
196
+ 如果这个项目对你有帮助,也可以请我喝杯咖啡:
197
+
198
+ | Ko-fi | 支付宝 | 微信支付 |
199
+ | --- | --- | --- |
200
+ | <a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a> | <img src="../assets/support/alipay.png" alt="支付宝收款码" width="160"> | <img src="../assets/support/wechat-pay.png" alt="微信支付收款码" width="160"> |
201
+
202
+