Skip to content

Commit b928c8e

Browse files
committed
feat(ws): split ws-server config and resolve voicebot by device
1 parent 926ba96 commit b928c8e

13 files changed

Lines changed: 957 additions & 58 deletions

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,24 @@ cp voicebot.example.json data/voicebot.json
9090
go run cmd/voicebot/main.go
9191
```
9292

93+
### 运行 ws-server(独立配置)
94+
95+
```bash
96+
cp ws-server.example.json data/ws-server.json
97+
go run cmd/ws-server/main.go -config data/ws-server.json
98+
```
99+
100+
`ws-server` 配置与本地 `voicebot` 配置分离:
101+
102+
- `data/voicebot.json``cmd/voicebot` / `cmd/agent`
103+
- `data/ws-server.json``cmd/ws-server`
104+
105+
`ws-server` 会按 `device-id` 解析会话级 `voicebot` 配置:
106+
107+
- 先查 `voicebot.local_bindings`
108+
- 未命中则用 `voicebot.default`
109+
-`voicebot.default` 设为 `null`,未绑定设备会被拒绝(需先绑定)
110+
93111
## 配置说明
94112

95113
```json

cmd/ws-server/main.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,14 @@ import (
1919
)
2020

2121
func main() {
22-
configPath := flag.String("config", config.DefaultPath, "config file path")
22+
configPath := flag.String("config", config.DefaultWSServerPath, "config file path")
2323
flag.Parse()
2424

25-
appConfig, err := config.Load(*configPath)
25+
appConfig, err := config.LoadWSServer(*configPath)
2626
if err != nil {
2727
fmt.Fprintf(os.Stderr, "Failed to load config: %v\n", err)
2828
os.Exit(1)
2929
}
30-
if err := appConfig.ValidateKeys(true, true, true); err != nil {
31-
fmt.Fprintf(os.Stderr, "Invalid config: %v\n", err)
32-
os.Exit(1)
33-
}
3430

3531
if err := logging.Init(logging.Config{
3632
Level: appConfig.Logging.Level,

docs/config.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
- 通过 `-config` 参数覆盖默认路径
1414
- 示例配置: `voicebot.example.json`
1515

16+
> `cmd/ws-server` 使用独立配置:默认路径 `data/ws-server.json`,示例 `ws-server.example.json`
17+
1618
## 加载顺序
1719

1820
1. 代码默认值(由各模块 `Default*Config` 提供)
@@ -124,3 +126,27 @@
124126
- **MCP 工具**:使用完整前缀名称配置(如 `mcp.demo.get_device_status`)。
125127
- 未配置的工具类型默认为 `query`
126128
- Metrics 默认独立端口暴露 `/metrics`,可通过 `bearer_token` 简单鉴权。
129+
130+
## ws-server 独立配置
131+
132+
`cmd/ws-server` 不再直接复用 `voicebot.json`,而是使用独立配置模型:
133+
134+
- `logging` / `server` / `metrics`:服务端运行级配置
135+
- `voicebot`:会话级配置池(ASR/TTS/LLM/Audio/Tools/Memory)
136+
137+
核心字段:
138+
139+
- `voicebot.default`:默认会话配置(可选)
140+
- `voicebot.profiles`:按 profile id 管理多个 voicebot 配置
141+
- `voicebot.local_bindings``device-id -> profile-id` 本地绑定
142+
143+
解析规则(当前实现):
144+
145+
1. 命中 `voicebot.local_bindings[device-id]`,使用对应 profile
146+
2. 未命中时,若 `voicebot.default` 存在则使用 default
147+
3.`voicebot.default``null`(关闭默认配置),则该设备视为未开通,需要绑定后才能接入
148+
149+
说明:
150+
151+
- `voicebot.default` 设置为 `null` 时,服务端不会兜底,未绑定设备会被拒绝。
152+
- manager 服务(设备与 voicebot 关联管理)尚未实现,当前以本地绑定为准。

docs/voicebot-todo.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@
172172
- [ ] 实现HTTP API
173173
- [ ] 客户端SDK
174174

175+
### 16.1 配置与设备管理服务 (优先级: 中)
176+
- [ ] 设计并实现 manager 服务(管理设备与 voicebot 配置绑定关系)
177+
- [ ] ws-server 接入 manager 查询(device-id -> voicebot),并支持超时降级策略
178+
175179
## 优先级说明
176180

177181
- ****: 核心功能,必须先实现

docs/ws-server-design.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,27 @@ S -> C: hello (确认后的 audio_params)
3737
## Session 生命周期
3838

3939
1. 建立连接并完成 hello 交换
40-
2. 初始化音频管线(Mixer + WebSocketSink + AudioOutPipe)
40+
2. 基于 `device-id` 解析会话级 `voicebot` 配置
41+
3. 初始化音频管线(Mixer + WebSocketSink + AudioOutPipe)
4142
3. 监听 JSON / 二进制消息
4243
4. 断开连接后释放:
4344
- Orchestrator.Stop()
4445
- AudioInPipe.Stop()
4546
- Mixer.Stop()
4647

48+
## 配置分层
49+
50+
- 服务端配置(`server`/`metrics`/`logging`)只负责 WS 服务运行。
51+
- 会话配置放在 `voicebot` 下,包含 ASR/TTS/LLM/Audio/Tools/Memory。
52+
53+
会话配置解析规则:
54+
55+
1. 先查 `voicebot.local_bindings[device-id]`
56+
2. 未命中则尝试 `voicebot.default`
57+
3.`voicebot.default = null`,设备未绑定则拒绝连接(未开通)
58+
59+
> manager 服务(设备绑定查询)当前未接入,后续作为扩展。
60+
4761
## 依赖
4862

4963
- WebSocket: `github.com/gorilla/websocket`

0 commit comments

Comments
 (0)