fix: 修复守护进程日志中文截取 panic

- daemon.rs: 使用字符索引替代字节索引截取日志文本
- agents.md: 添加踩坑记录
This commit is contained in:
2026-04-25 07:38:26 +08:00
parent 96b3aa4a37
commit ceeb6a3c31
2 changed files with 20 additions and 1 deletions

View File

@@ -91,3 +91,21 @@
- 文本内标签:保留原有逻辑(`[激动]` 等格式)
- 两者可以并存,互不影响
**经验**:设计 API 时要考虑不同层次的需求,宏观参数和微观标签可以互相补充
#### 问题daemon.rs 中日志截取文本导致 panic
**现象**:守护进程处理包含中文字符的长文本时 panic: "byte index 50 is not a char boundary; it is inside '嘴' (bytes 48..51)"
**原因**:使用 `text.len()` 获取字节长度,用 `text[..text.len().min(50)]` 按字节索引截取,中文字符占 3 字节,在字符中间截断
**解决方案**`text.chars().take(50).collect::<String>()` 按字符截取
**经验**:处理多字节字符(中文)时,必须使用字符索引而非字节索引
#### 问题Windows PowerShell 测试效率
**现象**:测试守护进程时创建了多个 .ps1 临时文件,繁琐且不便管理
**原因**:不熟悉 PowerShell 命令<E591BD><E4BBA4>直接执行的方式
**解决方案**
- 使用 `mimo-tts daemon start -d --port XXXX` 后台启动守护进程
- 使用 PowerShell 一条命令直接发送 TCP 请求测试:
```powershell
powershell -Command "$c=New-Object System.Net.Sockets.TcpClient;$c.Connect('127.0.0.1',9888);$s=$c.GetStream();$w=New-Object System.IO.StreamWriter($s);$w.Write('{\"text\":\"中文文本\"}');$w.Flush();$w.Close();$c.Close()"
```
- 无需创建 .ps1 临时文件
**经验**Windows PowerShell 可以在命令行中直接执行,无需临时文件

View File

@@ -330,8 +330,9 @@ async fn process_tts_request(request: DaemonRequest) -> Result<String> {
let format = request.format.unwrap_or_else(|| "wav".to_string());
let style = request.style;
let text_preview: String = text.chars().take(50).collect();
write_log(&format!("处理 TTS: text={}, voice={}, format={}, style={:?}",
&text[..text.len().min(50)], voice, format, style))?;
text_preview, voice, format, style))?;
// 处理风格标签
let mut final_text = text.clone();