@@ -271,7 +271,13 @@ fn run_refine_task(st: AppState, task_id: u64, session_id: i64, mock: bool) {
271271 set_task ( & st, task_id, AiTaskState :: Succeeded ) ;
272272 }
273273 Err ( reason) => {
274- eprintln ! ( "[refine-task] task={} failed kind={}" , task_id, reason. kind( ) ) ;
274+ // 打印具体 message——区分"未配置密钥"vs"密钥无效(401/403)"(真机排查)
275+ eprintln ! (
276+ "[refine-task] task={} failed kind={} msg={}" ,
277+ task_id,
278+ reason. kind( ) ,
279+ reason. message( )
280+ ) ;
275281 set_task ( & st, task_id, AiTaskState :: Failed { reason } ) ;
276282 }
277283 }
@@ -333,7 +339,22 @@ fn run_refine_task_inner(
333339 . lock ( )
334340 . map_err ( |e| AiTaskFailure :: Other ( e. to_string ( ) ) ) ?
335341 . clone ( ) ;
336- let client = AiClient :: from_settings ( & settings, st. ai_credentials . load_key ( ) . ok ( ) . flatten ( ) ) ;
342+ let env_key = std:: env:: var ( "SILICONFLOW_API_KEY" ) . ok ( ) . filter ( |k| !k. is_empty ( ) ) ;
343+ let stored_key = st. ai_credentials . load_key ( ) . ok ( ) . flatten ( ) ;
344+ // 密钥来源诊断(脱敏:只打长度+前 6 字符;真机 unauthorized 排查 2026-08-21)
345+ eprintln ! (
346+ "[refine-task] task={} key: env={} stored={}" ,
347+ task_id,
348+ env_key
349+ . as_ref( )
350+ . map( |k| format!( "{}:{}.." , k. len( ) , & k[ ..6 . min( k. len( ) ) ] ) )
351+ . unwrap_or_else( || "无" . to_string( ) ) ,
352+ stored_key
353+ . as_ref( )
354+ . map( |k| format!( "{}:{}.." , k. len( ) , & k[ ..6 . min( k. len( ) ) ] ) )
355+ . unwrap_or_else( || "无" . to_string( ) ) ,
356+ ) ;
357+ let client = AiClient :: from_settings ( & settings, stored_key) ;
337358 let adapter = AiNoteRefineAdapter :: new ( client. clone ( ) ) ;
338359 let mock_adapter = AiMockAdapter ;
339360 let mut refined = String :: new ( ) ;
0 commit comments