修复: max_iterations 不收敛卡死 + stopBtnState 残留红

This commit is contained in:
lxy
2026-07-21 00:31:59 +08:00
parent 0b68c5bed9
commit 365af554da
3 changed files with 13 additions and 13 deletions
+10 -11
View File
@@ -1829,25 +1829,24 @@ pub(crate) async fn run_agentic_loop(
tracing::warn!( tracing::warn!(
conv_id = %conv_id, conv_id = %conv_id,
max_iter = max_iterations, max_iter = max_iterations,
"[ai] agentic 循环达最大轮次(max_iterations={})仍未收敛,转暂停态询问用户(F-260616-03)", "[ai] agentic 循环达最大轮次仍未收敛,自动完成(incomplete=true)",
max_iterations,
); );
// 轮 token 落库(保留末轮已生成内容,续跑/停止都据此累加)
let usage = df_ai::provider::TokenUsage { let usage = df_ai::provider::TokenUsage {
prompt_tokens: tokens.prompt(), prompt_tokens: tokens.prompt(),
completion_tokens: tokens.completion(), completion_tokens: tokens.completion(),
total_tokens: tokens.total(), total_tokens: tokens.total(),
}; };
save_conversation(&session_arc, &db, &conv_id, Some(&usage), Some(&resolved_model), true).await; save_conversation(&session_arc, &db, &conv_id, Some(&usage), Some(&resolved_model), true).await;
// 暂停态保持 generating=true(防其他 send 抢占,仿审批),disarm guard 跳过 Drop 兜底复位 guard.reset().await;
guard.disarm(); let _ = app_handle.emit("ai-chat-event", AiChatEvent::AiCompleted {
let ev = AiChatEvent::AiMaxRoundsReached { total_tokens: usage.total_tokens,
prompt_tokens: tokens.prompt(),
completion_tokens: tokens.completion(),
incomplete: Some(true),
conversation_id: Some(conv_id.clone()), conversation_id: Some(conv_id.clone()),
}; pinned_goals: pinned_goals_snapshot.clone(),
let _ = app_handle.emit("ai-chat-event", ev.clone()); });
// L3 emit 双写:tunnel subscriber(阶段2)透传 miniapp return;
let _ = app_handle.state::<AppState>().ai_event_bus.publish_event(ev);
return; // generating 保持 true,等 ai_continue_loop / ai_stop_loop
} }
// 正常完成 // 正常完成
+1
View File
@@ -527,6 +527,7 @@ fn classify_status_or_class(status_or_class: &str) -> bool {
// ============================================================ // ============================================================
// 单测:诊断提取/格式化(纯函数,不发 HTTP、不依赖 app_handle // 单测:诊断提取/格式化(纯函数,不发 HTTP、不依赖 app_handle
// ============================================================ // ============================================================
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
+2 -2
View File
@@ -244,8 +244,8 @@ const stopBtnState = computed<'idle' | 'stop' | 'stopping' | 'retry'>(() => {
if (cs === 'stopping') return 'stopping' if (cs === 'stopping') return 'stopping'
if (cs === 'error') return 'retry' if (cs === 'error') return 'retry'
if (cs === 'generating' || cs === 'compressed') return 'stop' if (cs === 'generating' || cs === 'compressed') return 'stop'
// conv_state (idle null) 退 streaming bool // cs === null (conv_state idle ) cs === 'idle'
return store.state.streaming ? 'stop' : 'idle' return 'idle'
}) })
// `/` // `/`