- topic_description.rs: LLM 返回空字符串时返回 Err 而非 Ok(""),防止空值写回 DB 触发循环生成
- processor.rs: 添加 Arc<Mutex<HashSet>> 生成中守卫防止重复触发,改用 DB 中真正第一条用户消息生成描述
- useChat.ts: assistant_response 时检测当前话题描述为空则递增刷新信号
- App.tsx: 监听刷新信号,500ms 防抖后自动发送 list_topics 获取新描述
31 lines
1003 B
Rust
31 lines
1003 B
Rust
use crate::providers::{ChatCompletionRequest, LLMProvider, Message};
|
||
|
||
pub async fn generate_topic_description(
|
||
provider: &dyn LLMProvider,
|
||
first_user_message: &str,
|
||
) -> Result<String, Box<dyn std::error::Error + Send + Sync>> {
|
||
let prompt = format!(
|
||
"请根据用户的第一句话,用简短的词语(不超过15字)描述这个对话的主题或意图。只输出描述内容,不要其他解释。\n\n用户消息:{}",
|
||
first_user_message
|
||
);
|
||
|
||
let request = ChatCompletionRequest {
|
||
messages: vec![Message::user(prompt)],
|
||
temperature: Some(0.3),
|
||
max_tokens: Some(50),
|
||
tools: None,
|
||
};
|
||
|
||
let response = provider.chat(request).await?;
|
||
let description = response.content.trim().to_string();
|
||
|
||
if description.is_empty() {
|
||
return Err("LLM returned empty description".into());
|
||
}
|
||
|
||
if description.len() > 50 {
|
||
Ok(description.chars().take(50).collect())
|
||
} else {
|
||
Ok(description)
|
||
}
|
||
} |