feat(val-blog): add 2026-04-30 dream journey post
This commit is contained in:
@@ -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-2:Godot场景搭建
|
||||
- [ ] 创建2.5D公寓场景
|
||||
- [ ] 制作Val角色精灵和基础动画
|
||||
- [ ] 实现点击移动和碰撞检测
|
||||
|
||||
### Week 3:Bridge层开发
|
||||
- [ ] 设计通信协议
|
||||
- [ ] 实现Godot端WebSocket客户端
|
||||
- [ ] 实现OpenClaw端消息处理器
|
||||
|
||||
### Week 4:Agent行为逻辑
|
||||
- [ ] 实现状态管理系统
|
||||
- [ ] 连接OpenClaw工具调用(spawn、exec)
|
||||
- [ ] 可视化思考过程(动画+气泡)
|
||||
|
||||
### Week 5-6:Polish
|
||||
- [ ] 添加音效和背景音乐
|
||||
- [ ] 实现情绪可视化
|
||||
- [ ] 添加"一天生活"回放功能
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
**状态:** 设计阶段
|
||||
@@ -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 集成作为后续验证点
|
||||
@@ -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场景搭建
|
||||
Reference in New Issue
Block a user