SummarizeSession 生成 Session 摘要
(ctx context.Context, messages []types.Message)
| 55 | |
| 56 | // SummarizeSession 生成 Session 摘要 |
| 57 | func (s *Summarizer) SummarizeSession(ctx context.Context, messages []types.Message) (*SessionSummary, error) { |
| 58 | if len(messages) < s.minMessages { |
| 59 | return nil, fmt.Errorf("not enough messages to summarize (need at least %d)", s.minMessages) |
| 60 | } |
| 61 | |
| 62 | // 限制消息数量 |
| 63 | if len(messages) > s.maxMessages { |
| 64 | messages = messages[len(messages)-s.maxMessages:] |
| 65 | } |
| 66 | |
| 67 | // 构建摘要提示词 |
| 68 | prompt := s.buildSummaryPrompt(messages) |
| 69 | |
| 70 | // 调用 Provider 生成摘要 |
| 71 | summaryMessages := []types.Message{ |
| 72 | { |
| 73 | Role: types.MessageRoleUser, |
| 74 | ContentBlocks: []types.ContentBlock{ |
| 75 | &types.TextBlock{Text: prompt}, |
| 76 | }, |
| 77 | }, |
| 78 | } |
| 79 | |
| 80 | // 临时设置系统提示词 |
| 81 | originalSysPrompt := "" |
| 82 | if caps := s.provider.Capabilities(); caps.SupportSystemPrompt { |
| 83 | // 保存原始系统提示词(如果需要恢复) |
| 84 | if err := s.provider.SetSystemPrompt(s.sysPrompt); err != nil { |
| 85 | return nil, fmt.Errorf("set system prompt: %w", err) |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | response, err := s.provider.Complete(ctx, summaryMessages, nil) |
| 90 | if err != nil { |
| 91 | return nil, fmt.Errorf("generate summary: %w", err) |
| 92 | } |
| 93 | |
| 94 | // 恢复原始系统提示词 |
| 95 | if originalSysPrompt != "" { |
| 96 | _ = s.provider.SetSystemPrompt(originalSysPrompt) |
| 97 | } |
| 98 | |
| 99 | // 提取文本内容 |
| 100 | summaryText := "" |
| 101 | if len(response.Message.ContentBlocks) > 0 { |
| 102 | if textBlock, ok := response.Message.ContentBlocks[0].(*types.TextBlock); ok { |
| 103 | summaryText = textBlock.Text |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | summary := &SessionSummary{ |
| 108 | Text: summaryText, |
| 109 | MessageCount: len(messages), |
| 110 | GeneratedAt: time.Now(), |
| 111 | TokensUsed: int(response.Usage.TotalTokens), |
| 112 | KeyTopics: extractKeyTopics(summaryText), |
| 113 | Participants: extractParticipants(messages), |
| 114 | } |
no test coverage detected