( contextMessages: ChatMessage[], currentMessage: ChatMessage )
| 265 | * @param currentMessage 当前消息 |
| 266 | */ |
| 267 | export async function suggestNewTopic( |
| 268 | contextMessages: ChatMessage[], |
| 269 | currentMessage: ChatMessage |
| 270 | ): Promise<TopicSuggestionResult> { |
| 271 | const { llmConfig, modelConfig } = getDefaultConfigs() |
| 272 | |
| 273 | if (!llmConfig) { |
| 274 | return { shouldCreateTopic: false, success: false, error: '未配置 LLM' } |
| 275 | } |
| 276 | |
| 277 | try { |
| 278 | // 构建上下文 |
| 279 | const contextStr = contextMessages |
| 280 | .slice(-5) // 最近5条 |
| 281 | .map((m) => `[${m.role}]: ${truncateContent(m.content, 200)}`) |
| 282 | .join('\n') |
| 283 | |
| 284 | const prompt = TOPIC_SUGGESTION_PROMPT.replace('{context}', contextStr).replace( |
| 285 | '{currentMessage}', |
| 286 | `[${currentMessage.role}]: ${truncateContent(currentMessage.content, 300)}` |
| 287 | ) |
| 288 | |
| 289 | const result = await generateWithAI(prompt, llmConfig, modelConfig || undefined) |
| 290 | |
| 291 | // 解析结果 |
| 292 | const cleanResult = result.trim() |
| 293 | if (cleanResult === '继续' || cleanResult.toLowerCase() === 'continue') { |
| 294 | return { shouldCreateTopic: false, success: true } |
| 295 | } |
| 296 | |
| 297 | // 清理 topic 名称 |
| 298 | let topicName = cleanResult |
| 299 | .replace(/^["'""]|["'""]$/g, '') |
| 300 | .replace(/^(新话题|话题|主题)[::]\s*/i, '') |
| 301 | .trim() |
| 302 | |
| 303 | if (topicName.length > 15) { |
| 304 | topicName = topicName.slice(0, 15) |
| 305 | } |
| 306 | |
| 307 | return { |
| 308 | shouldCreateTopic: true, |
| 309 | topicName, |
| 310 | success: true |
| 311 | } |
| 312 | } catch (error) { |
| 313 | console.error('Failed to suggest topic:', error) |
| 314 | return { shouldCreateTopic: false, success: false, error: String(error) } |
| 315 | } |
| 316 | } |
| 317 | |
| 318 | /** |
| 319 | * 批量为消息生成标题(用于整理历史消息) |
nothing calls this directly
no test coverage detected