| 639 | } |
| 640 | |
| 641 | func extractManualTitleTurns(messages []database.ChatMessage) []manualTitleTurn { |
| 642 | turns := make([]manualTitleTurn, 0, len(messages)) |
| 643 | for _, message := range messages { |
| 644 | if message.Visibility == database.ChatMessageVisibilityModel { |
| 645 | continue |
| 646 | } |
| 647 | |
| 648 | role := "" |
| 649 | switch message.Role { |
| 650 | case database.ChatMessageRoleUser: |
| 651 | role = string(database.ChatMessageRoleUser) |
| 652 | case database.ChatMessageRoleAssistant: |
| 653 | role = string(database.ChatMessageRoleAssistant) |
| 654 | default: |
| 655 | continue |
| 656 | } |
| 657 | |
| 658 | parts, err := chatprompt.ParseContent(message) |
| 659 | if err != nil { |
| 660 | continue |
| 661 | } |
| 662 | |
| 663 | text := strings.TrimSpace(contentBlocksToText(parts)) |
| 664 | if text == "" { |
| 665 | continue |
| 666 | } |
| 667 | |
| 668 | turns = append(turns, manualTitleTurn{ |
| 669 | role: role, |
| 670 | text: text, |
| 671 | }) |
| 672 | } |
| 673 | |
| 674 | return turns |
| 675 | } |
| 676 | |
| 677 | func selectManualTitleTurnIndexes(turns []manualTitleTurn) []int { |
| 678 | firstUserIndex := slices.IndexFunc(turns, func(turn manualTitleTurn) bool { |