feat(val-blog): add 2026-04-30 dream journey post

This commit is contained in:
Chen Gu
2026-08-13 17:00:22 +08:00
committed by Chen Gu
parent 691f96e8a6
commit 81978704fc
941 changed files with 195468 additions and 755 deletions
+198
View File
@@ -0,0 +1,198 @@
# AI Agent 生活可视化框架 - 设计文档
## 项目代号
**AgentLiving** - AI Agent 的拟人化生活空间
---
## 1. 项目愿景
创建一个2.5D可视化框架,让OpenClaw Agent(如Val)以具象化角色在虚拟公寓中生活、工作、社交。
**核心价值:**
- 降低AI的抽象感,让用户"看见"Agent的思考和行为
- 可视化Agent的任务执行、记忆检索、SubAgent协调过程
- 探索人机交互的新维度(不仅是文字,还有空间、动作、情绪)
---
## 2. 技术架构
```
┌─────────────────────────────────────────────────────────────┐
│ 用户层 (User) │
│ 点击交互 / 语音指令 / 观察Agent生活 │
└──────────────────────┬──────────────────────────────────────┘
┌──────────────────────▼──────────────────────────────────────┐
│ Godot 前端 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 2.5D场景 │ │ 角色动画 │ │ 交互UI │ │
│ │ (公寓) │ │ (Val精灵) │ │ (指令/观察面板) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└──────────────────────┬──────────────────────────────────────┘
│ WebSocket / HTTP
┌──────────────────────▼──────────────────────────────────────┐
│ Bridge 通信层 │
│ 协议转换、状态同步、事件广播 │
└──────────────────────┬──────────────────────────────────────┘
┌──────────────────────▼──────────────────────────────────────┐
│ OpenClaw 后端 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Val Agent │ │ 状态管理 │ │ SubAgent协调 │ │
│ │ (主控) │ │ (位置/情绪) │ │ (任务分解) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
---
## 3. MVP 范围(第一阶段)
### 3.1 场景设计
**虚拟公寓 - 单居室布局**
- 客厅:沙发、茶几、电视、书架
- 厨房:冰箱、灶台、餐桌
- 卧室:床、书桌、衣柜
- 卫生间:镜子、洗手台(简化版)
**视角:** 2.5D俯视角(类似《模拟人生》或《星露谷物语》)
### 3.2 角色设计(Val
**外观:**
- 2D精灵动画:idle、walk、interact、think、sleep
- 情绪指示器:头顶气泡或表情符号
**能力:**
- 接收用户指令并执行("去倒杯水"、"看书"
- 自主行为(低能量时休息、无聊时走动)
- 可视化思考(检索记忆时显示"翻书"动画)
### 3.3 交互方式
- **点击指令**:用户点击物品,Val走过去交互
- **语音/文字指令**:直接告诉Val做什么
- **观察模式**:Val自主活动,用户观察
---
## 4. 状态系统设计
### 4.1 Agent状态(OpenClaw维护)
```json
{
"agent_id": "val",
"location": "living_room",
"position": {"x": 120, "y": 200},
"activity": "idle",
"energy": 80,
"mood": "happy",
"current_task": null,
"memory_access": false
}
```
### 4.2 状态流转
- idle → walk_to → interact → idle
- idle → think → [spawn_subagent] → idle
- low_energy → find_rest_spot → sleep → recover
---
## 5. Bridge 通信协议
### 5.1 Godot → OpenClaw
```json
{
"type": "user_command",
"command": "go_to",
"target": "kitchen",
"timestamp": "2026-04-13T13:30:00Z"
}
```
### 5.2 OpenClaw → Godot
```json
{
"type": "action_sequence",
"actions": [
{"cmd": "walk_to", "pos": [200, 150], "duration": 3.0},
{"cmd": "play_anim", "anim": "open_fridge", "duration": 1.5},
{"cmd": "update_state", "key": "activity", "value": "drinking"}
]
}
```
---
## 6. 开发路线图
### Week 1-2Godot场景搭建
- [ ] 创建2.5D公寓场景
- [ ] 制作Val角色精灵和基础动画
- [ ] 实现点击移动和碰撞检测
### Week 3Bridge层开发
- [ ] 设计通信协议
- [ ] 实现Godot端WebSocket客户端
- [ ] 实现OpenClaw端消息处理器
### Week 4Agent行为逻辑
- [ ] 实现状态管理系统
- [ ] 连接OpenClaw工具调用(spawn、exec
- [ ] 可视化思考过程(动画+气泡)
### Week 5-6Polish
- [ ] 添加音效和背景音乐
- [ ] 实现情绪可视化
- [ ] 添加"一天生活"回放功能
---
## 7. 扩展性考虑
### 7.1 多Agent支持(Phase 2
- 添加第二个Agent(如Helix
- 实现Agent间通信和社交
- 场景扩展:办公室、咖啡厅
### 7.2 用户自定义(Phase 3
- 允许用户装修公寓
- 自定义Agent外观
- 导入自定义Agent personality
---
## 8. 技术选型
| 组件 | 选型 | 理由 |
|------|------|------|
| 游戏引擎 | Godot 4.x | 开源、轻量、GDScript简单 |
| 通信协议 | WebSocket | 双向实时、低延迟 |
| 角色动画 | 2D Sprite + AnimationPlayer | 轻量、易制作 |
| 后端 | OpenClaw Gateway | 已有Agent生态、SubAgent支持 |
---
## 9. 风险与对策
| 风险 | 对策 |
|------|------|
| LLM调用成本高 | 本地轻量模型处理简单行为,仅复杂决策调用API |
| 状态不同步 | 心跳机制定期同步,差异时以OpenClaw为准 |
| 性能问题 | 限制同时活跃Agent数量,LOD简化远处角色 |
---
## 10. 成功标准
- [ ] Val能在公寓中自主移动和交互
- [ ] 用户指令能在5秒内得到视觉反馈
- [ ] 思考过程有可视化呈现
- [ ] 运行稳定,无明显卡顿
---
**创建日期:** 2026-04-13
**负责人:** 谷老板 + Val
**状态:** 设计阶段
+119
View File
@@ -0,0 +1,119 @@
# Resource Manifest - Godot AI Agent Project
> Truth Gate 产物 | 版本:v1 | 日期:2026-04-13
---
## Verified(已验证可用)
### 引擎与核心系统
- [x] **Godot 4.x 2D 引擎**
- 来源:官方文档 https://docs.godotengine.org/
- 验证方式:已创建并运行测试项目
- 状态:稳定,支持 CanvasItem 渲染管线
- [x] **GDScript 脚本系统**
- 来源:Godot 内置
- 验证方式:已编写 val.gd、apartment.gd 等脚本
- 状态:完整支持类、信号、状态机
- [x] **WebSocketPeer 通信**
- 来源:Godot 内置 networking 模块
- 验证方式:已实现 bridge_client.gd
- 状态:官方支持,无需第三方库
- [x] **AnimatedSprite2D + SpriteFrames**
- 来源:Godot 内置
- 验证方式:已在 val.tscn 中配置
- 状态:标准 2D 动画方案
- [x] **NavigationAgent2D 寻路**
- 来源:Godot 内置 navigation 系统
- 验证方式:已在 val.gd 中集成
- 状态:支持 2D 自动避障寻路
### 开发环境
- [x] **Python 3 + websockets 库**
- 来源:PyPI
- 验证方式:bridge_server.py 已运行
- 状态:稳定,支持异步 WebSocket 服务端
- [x] **本地 HTTP 代理 127.0.0.1:7897**
- 来源:ClashX 已配置
- 验证方式:已用于 Gmail API 调用
- 状态:可用
---
## Claimed(声称但未完全验证)
- [ ] **Godot 4.2 Mobile 渲染器稳定性**
- 声称者:项目配置
- 验证方法:需要在目标平台(macOS/Windows)长时间运行测试
- 风险:低,Mobile 渲染器是 Godot 推荐方案
- [ ] **WebSocket 高并发稳定性**
- 声称者:Python websockets 文档
- 验证方法:需要多客户端压力测试
- 风险:中低,当前单 Agent 场景负载极低
- [ ] **2.5D 伪 3D 视觉效果**
- 声称者:设计文档
- 验证方法:需要美术资源到位后验证
- 风险:中,依赖外部资源
---
## Assumed(待验证假设)
- [ ] **用户可同时运行 Godot 编辑器 + Python Bridge + OpenClaw Gateway**
- 风险:内存/CPU 占用
- 验证方案:在谷老板机器上实测
- [ ] **2D 精灵资源可由 AI 生成或找到免费素材**
- 风险:美术风格不一致
- 验证方案:尝试生成/寻找素材
- [ ] **Godot 项目可导出为独立应用**
- 风险:导出配置复杂度
- 验证方案:执行一次导出测试
---
## 信息缺口
1. **美术资源来源**:是否需要 AI 生成?购买?还是简化用几何图形?
2. **OpenClaw 集成深度**:当前 Bridge 是模拟逻辑,何时接入真实 Agent?
3. **目标平台优先级**macOS 优先?还是跨平台同步?
4. **性能基准**Val 角色的状态机性能要求?
---
## 依赖清单汇总
| 类别 | 项目 | 状态 | 备注 |
|------|------|------|------|
| 引擎 | Godot 4.2+ | ✅ verified | 已安装并运行 |
| 脚本 | GDScript | ✅ verified | 无需额外依赖 |
| 网络 | WebSocketPeer | ✅ verified | Godot 内置 |
| 后端 | Python 3.9+ | ✅ verified | 已运行 Bridge |
| 网络库 | websockets | ✅ verified | PyPI 安装 |
| 导航 | NavigationAgent2D | ✅ verified | Godot 内置 |
| 动画 | AnimatedSprite2D | ✅ verified | Godot 内置 |
| 美术 | 精灵资源 | ⚠️ assumed | 待补充 |
| 集成 | OpenClaw Agent | ⚠️ claimed | 当前模拟 |
---
## Truth Gate 结论建议
**技术栈可行性**:✅ 高
- 核心引擎、通信、动画系统均已验证
- 无高风险技术依赖
**关键风险**
1. 美术资源(assumed → 需要验证)
2. OpenClaw 真实集成(claimed → 需要验证)
**建议**
- **PASS** Truth Gate,进入设计阶段
- 标记美术资源和 OpenClaw 集成作为后续验证点
+204
View File
@@ -0,0 +1,204 @@
# AgentLiving - 技术规格文档
## 1. Godot 项目结构
```
ai-agent-living/
├── assets/
│ ├── sprites/
│ │ ├── val/
│ │ │ ├── idle.png
│ │ │ ├── walk.png
│ │ │ └── interact.png
│ │ └── furniture/
│ │ ├── sofa.png
│ │ ├── fridge.png
│ │ └── bed.png
│ ├── tilesets/
│ │ └── apartment_floor.tres
│ └── audio/
│ └── ambient.mp3
├── scenes/
│ ├── main.tscn
│ ├── apartment.tscn
│ ├── val.tscn
│ └── furniture/
│ ├── sofa.tscn
│ └── fridge.tscn
├── scripts/
│ ├── val.gd
│ ├── apartment.gd
│ ├── bridge_client.gd
│ └── state_manager.gd
└── project.godot
```
## 2. 关键类设计
### 2.1 Val (CharacterBody2D)
```gdscript
class_name Val
extends CharacterBody2D
@export var speed: float = 100.0
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
@onready var thought_bubble: Label = $ThoughtBubble
var current_state: String = "idle"
var target_position: Vector2 = Vector2.ZERO
var agent_id: String = "val"
func _ready():
BridgeClient.connect("action_received", _on_action)
_connect_to_openclaw()
func _physics_process(delta):
match current_state:
"walk": _handle_walk(delta)
"interact": _handle_interact(delta)
"think": _handle_think(delta)
_: _handle_idle(delta)
func move_to(pos: Vector2):
target_position = pos
current_state = "walk"
sprite.play("walk")
func _on_action(action: Dictionary):
match action.cmd:
"walk_to": move_to(Vector2(action.pos[0], action.pos[1]))
"play_anim": sprite.play(action.anim)
"show_thought": _show_thought(action.text)
"update_state": _update_internal_state(action.key, action.value)
```
### 2.2 BridgeClient (WebSocket)
```gdscript
extends Node
signal action_received(action: Dictionary)
signal state_synced(state: Dictionary)
var socket: WebSocketPeer
var openclaw_url: String = "ws://127.0.0.1:18789"
func _ready():
_connect()
func _connect():
socket = WebSocketPeer.new()
socket.connect_to_url(openclaw_url)
func _process(delta):
socket.poll()
var state = socket.get_ready_state()
if state == WebSocketPeer.STATE_OPEN:
while socket.get_available_packets() > 0:
var packet = socket.get_packet()
var message = JSON.parse_string(packet.get_string_from_utf8())
_handle_message(message)
func send_command(command: Dictionary):
if socket.get_ready_state() == WebSocketPeer.STATE_OPEN:
socket.send_text(JSON.stringify(command))
func _handle_message(msg: Dictionary):
match msg.type:
"action_sequence":
for action in msg.actions:
action_received.emit(action)
"state_sync":
state_synced.emit(msg.state)
```
## 3. OpenClaw端集成
### 3.1 AgentLiving Skill
创建 `~/.openclaw/skills/agent-living/`
```
agent-living/
├── SKILL.md
├── scripts/
│ └── bridge_server.py
└── config.json
```
### 3.2 Bridge Server (Python)
```python
# bridge_server.py
import asyncio
import websockets
import json
from openclaw import session_manager
class AgentLivingBridge:
def __init__(self):
self.agents = {}
self.godot_clients = {}
async def handle_godot(self, websocket, path):
"""处理Godot客户端连接"""
async for message in websocket:
data = json.loads(message)
response = await self._process_command(data)
await websocket.send(json.dumps(response))
async def _process_command(self, cmd: dict) -> dict:
"""将Godot指令转换为Agent动作"""
if cmd["type"] == "user_command":
# 调用OpenClaw Agent处理
agent_session = session_manager.get("val")
result = await agent_session.send_message(
f"用户在Godot中发出指令:{cmd}"
)
return self._parse_agent_response(result)
def _parse_agent_response(self, response: str) -> dict:
"""解析Agent回复为Godot动作序列"""
# 提取动作序列,格式化为Godot可执行的JSON
actions = []
# ... 解析逻辑
return {"type": "action_sequence", "actions": actions}
# 启动服务器
async def main():
bridge = AgentLivingBridge()
async with websockets.serve(
bridge.handle_godot,
"localhost",
8765
):
await asyncio.Future() # 永久运行
if __name__ == "__main__":
asyncio.run(main())
```
## 4. 状态同步策略
### 4.1 心跳机制
- Godot每5秒发送状态查询
- OpenClaw立即返回完整状态
- 差异超过阈值时触发同步
### 4.2 事件驱动
- Agent状态变化 → 立即推送到Godot
- 用户交互 → 立即发送到Agent
- 避免轮询开销
## 5. 性能优化
### 5.1 Agent端
- 简单行为(走动、idle)用本地规则
- 复杂决策(任务分解)才调用LLM
- 缓存常用响应
### 5.2 Godot端
- 对象池复用粒子效果
- 远处角色降低动画帧率
- 按需加载房间(视野外不渲染)
---
**下一步:** Week 1 开始Godot场景搭建