GenerateSummary 生成会话摘要
( ctx context.Context, sessionID string, messages []types.Message, )
| 126 | |
| 127 | // GenerateSummary 生成会话摘要 |
| 128 | func (m *SessionSummaryManager) GenerateSummary( |
| 129 | ctx context.Context, |
| 130 | sessionID string, |
| 131 | messages []types.Message, |
| 132 | ) (*SessionSummary, error) { |
| 133 | if !m.config.Enabled { |
| 134 | return nil, errors.New("session summary is disabled") |
| 135 | } |
| 136 | |
| 137 | // 构建提示词 |
| 138 | prompt := m.buildPrompt(messages) |
| 139 | |
| 140 | // 调用 LLM 生成摘要 |
| 141 | resp, err := m.provider.Complete(ctx, []types.Message{ |
| 142 | { |
| 143 | Role: "user", |
| 144 | Content: prompt, |
| 145 | }, |
| 146 | }, &provider.StreamOptions{ |
| 147 | MaxTokens: 1000, |
| 148 | Temperature: 0.3, // 较低的温度以获得更一致的输出 |
| 149 | }) |
| 150 | if err != nil { |
| 151 | return nil, fmt.Errorf("failed to generate summary: %w", err) |
| 152 | } |
| 153 | |
| 154 | // 解析响应 |
| 155 | summary, err := m.parseSummaryResponse(resp.Message.Content) |
| 156 | if err != nil { |
| 157 | return nil, fmt.Errorf("failed to parse summary: %w", err) |
| 158 | } |
| 159 | |
| 160 | // 设置基本信息 |
| 161 | summary.SessionID = sessionID |
| 162 | summary.CreatedAt = time.Now() |
| 163 | summary.UpdatedAt = time.Now() |
| 164 | summary.MessageCount = len(messages) |
| 165 | |
| 166 | // 计算 token 数量(粗略估计) |
| 167 | totalTokens := 0 |
| 168 | for _, msg := range messages { |
| 169 | totalTokens += len(msg.Content) / 4 // 粗略估计:4个字符 ≈ 1个token |
| 170 | } |
| 171 | summary.TokenCount = totalTokens |
| 172 | |
| 173 | // 存储摘要 |
| 174 | m.mu.Lock() |
| 175 | m.summaries[sessionID] = summary |
| 176 | m.mu.Unlock() |
| 177 | |
| 178 | return summary, nil |
| 179 | } |
| 180 | |
| 181 | // UpdateSummary 更新会话摘要 |
| 182 | func (m *SessionSummaryManager) UpdateSummary( |