fix: 自动标题取消语义、清洗循环与拒绝占位回写

spawn_task 标题 20s 超时且父 ctx 取消不建任务;清洗循环剥前缀内外引号;
异步标题拒绝「新对话」并用条件更新防手改竞态;会话 profile 失败回退全局。
This commit is contained in:
artex-bot committed 2026-10-27 13:07:09 +08:00
1 parent 6c781f21f4
commit 3d3ee8827e
6 files changed
+93 -39

No files matched your search

+16 -15
View File
@@ -51,22 +51,23 @@ func cleanAutoTitle(raw string) string {
if i := strings.IndexAny(title, "\r\n"); i >= 0 {
title = strings.TrimSpace(title[:i])
}
for len(title) >= 2 {
first, firstSize := utf8.DecodeRuneInString(title)
last, lastSize := utf8.DecodeLastRuneInString(title)
if (first == '"' && last == '"') || (first == '\'' && last == '\'') || (first == '“' && last == '”') || (first == '「' && last == '」') {
title = strings.TrimSpace(title[firstSize : len(title)-lastSize])
continue
for {
previous := title
if len(title) >= 2 {
first, firstSize := utf8.DecodeRuneInString(title)
last, lastSize := utf8.DecodeLastRuneInString(title)
if (first == '"' && last == '"') || (first == '\'' && last == '\'') || (first == '“' && last == '”') || (first == '「' && last == '」') {
title = title[firstSize : len(title)-lastSize]
}
}
break
}
lines := strings.FieldsFunc(title, func(r rune) bool { return r == '\r' || r == '\n' })
if len(lines) > 0 {
title = strings.TrimSpace(lines[0])
}
for _, prefix := range []string{"标题:", "标题:"} {
if strings.HasPrefix(title, prefix) {
title = strings.TrimSpace(strings.TrimPrefix(title, prefix))
for _, prefix := range []string{"标题:", "标题:"} {
if strings.HasPrefix(title, prefix) {
title = strings.TrimPrefix(title, prefix)
break
}
}
title = strings.TrimSpace(title)
if title == previous {
break
}
}
+9
View File
@@ -41,6 +41,15 @@ func TestGenerateAutoTitleCleansResponse(t *testing.T) {
if p.req.Thinking != "disabled" || p.req.MaxTokens != 96 || len(p.req.Tools) != 0 {
t.Fatalf("request options: %+v", p.req)
}
quoted := &autoTitleProvider{reply: `标题:"整理项目设置"`}
got, err = GenerateAutoTitle(t.Context(), quoted, "整理项目设置")
if err != nil {
t.Fatal(err)
}
if got != "整理项目设置" {
t.Fatalf("nested quote/prefix cleanup: got %q", got)
}
}
func TestGenerateAutoTitleProviderError(t *testing.T) {