@@ -28,16 +28,24 @@ const CHAT_SYSTEM_PROMPT: &str =
2828/// 单条消息最大字符数(防误粘贴巨文——超限明确拒绝而非静默截断)。
2929const MAX_MESSAGE_CHARS : usize = 16000 ;
3030
31- /// 新建会话(标题可空——默认"新对话")。
31+ /// 新建会话(标题可空——默认"新对话";retrieval=true = 学习库问答模式,
32+ /// v0.19.1——创建时定死,已有会话不改语义)。
3233#[ tauri:: command]
33- pub fn chat_create_session ( state : State < ' _ , AppState > , title : Option < String > ) -> Result < ChatSession , String > {
34+ pub fn chat_create_session (
35+ state : State < ' _ , AppState > ,
36+ title : Option < String > ,
37+ retrieval : Option < bool > ,
38+ ) -> Result < ChatSession , String > {
3439 let title = title. unwrap_or_default ( ) ;
3540 if title. chars ( ) . count ( ) > 100 {
3641 return Err ( "会话标题过长(≤100 字符)" . to_string ( ) ) ;
3742 }
3843 let id = state
3944 . db
40- . insert_chat_session ( if title. trim ( ) . is_empty ( ) { None } else { Some ( title. trim ( ) ) } )
45+ . insert_chat_session (
46+ if title. trim ( ) . is_empty ( ) { None } else { Some ( title. trim ( ) ) } ,
47+ retrieval. unwrap_or ( false ) ,
48+ )
4149 . map_err ( |e| e. to_string ( ) ) ?;
4250 validate_session ( & state, id)
4351}
@@ -110,13 +118,24 @@ pub async fn chat_send(
110118 if content. chars ( ) . count ( ) > MAX_MESSAGE_CHARS {
111119 return Err ( "消息过长(≤16000 字符)" . to_string ( ) ) ;
112120 }
121+ let session = validate_session ( & state, session_id) ?;
122+ // v0.19.1(REQ-260):学习库问答会话——命中列表恒可用(本地能力不受
123+ // content_gate 约束),生成走 kb 双闸门 → 整链分流入 commands_ai_chat_kb
124+ if session. retrieval {
125+ return crate :: commands_ai_chat_kb:: kb_chat_send (
126+ & state,
127+ session_id,
128+ & content,
129+ resend_message_id,
130+ channel,
131+ ) ;
132+ }
113133 let settings = state
114134 . ai_settings
115135 . lock ( )
116136 . map_err ( |e| format ! ( "AI 设置锁中毒: {}" , e) ) ?
117137 . clone ( ) ;
118138 settings. content_gate ( ) ?; // 授权红线:enabled + authorized 双闸门(默认关)
119- let session = validate_session ( & state, session_id) ?;
120139 // 先解析客户端(Provider/密钥缺失 → 明确报错,不落无应答的用户消息)
121140 let ( client, provider_id) = resolve_chat_client ( & state, & session) ?;
122141 let model = client. config . model . clone ( ) ;
@@ -165,13 +184,17 @@ pub async fn chat_regenerate(
165184 session_id : i64 ,
166185 channel : Channel < ChatStreamEvent > ,
167186) -> Result < ( ) , String > {
187+ let session = validate_session ( & state, session_id) ?;
188+ // v0.19.1:学习库问答会话重生成——重跑检索 + 生成整链
189+ if session. retrieval {
190+ return crate :: commands_ai_chat_kb:: kb_chat_regenerate ( & state, session_id, channel) ;
191+ }
168192 let settings = state
169193 . ai_settings
170194 . lock ( )
171195 . map_err ( |e| format ! ( "AI 设置锁中毒: {}" , e) ) ?
172196 . clone ( ) ;
173197 settings. content_gate ( ) ?;
174- let session = validate_session ( & state, session_id) ?;
175198 // 先解析客户端(Provider/密钥失败 → 不删旧回答,保留可重发状态)
176199 let ( client, _provider_id) = resolve_chat_client ( & state, & session) ?;
177200 let model = client. config . model . clone ( ) ;
0 commit comments