MCPcopy Create free account
hub / github.com/experdot/pointer / suggestNewTopic

Function suggestNewTopic

src/renderer/src/services/titleService.ts:267–316  ·  view source on GitHub ↗
(
  contextMessages: ChatMessage[],
  currentMessage: ChatMessage
)

Source from the content-addressed store, hash-verified

265 * @param currentMessage 当前消息
266 */
267export 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 * 批量为消息生成标题(用于整理历史消息)

Callers

nothing calls this directly

Calls 3

getDefaultConfigsFunction · 0.85
truncateContentFunction · 0.85
generateWithAIFunction · 0.85

Tested by

no test coverage detected