新增: AI Chat多项增强(审批去重/编辑重发/导出/实体引用/会话置顶搜索)+任务推进链df-nodes落地
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
//!
|
||||
//! 模块布局:
|
||||
//! - [`commands`] — 所有 `#[tauri::command]` IPC 函数
|
||||
//! - [`agentic`] — run_agentic_loop / try_continue_agent_loop / MAX_AGENT_ITERATIONS
|
||||
//! - [`agentic`] — run_agentic_loop / try_continue_agent_loop / DEFAULT_MAX_AGENT_ITERATIONS
|
||||
//! - [`stream_recv`] — stream_llm 流式接收
|
||||
//! - [`conversation`] — save_conversation / TokenAccumulator / accumulate_tokens
|
||||
//! - [`title`] — 对话标题生成
|
||||
@@ -36,7 +36,7 @@ use std::collections::HashMap;
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
|
||||
use serde::Serialize;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use df_ai::ai_tools::RiskLevel;
|
||||
use df_ai::context::ContextManager;
|
||||
@@ -65,6 +65,26 @@ pub use self::tool_registry::build_ai_tool_registry;
|
||||
// 事件载荷类型(放 mod.rs,各子文件经 use super::* 拿到)
|
||||
// ============================================================
|
||||
|
||||
/// AI 错误分类(B-260615-42):供前端按错误源差异化提示(如 auth 引导填 key,
|
||||
/// network 提示检查连接,provider_config 引导检查 base_url/model)。
|
||||
///
|
||||
/// 设计:`Option<ErrorType>` 向后兼容——旧 emit 点若难精确分类填 `None`,
|
||||
/// 旧前端消费方忽略未填值;新点尽量精确填并在注释标注映射理由。
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum ErrorType {
|
||||
/// 鉴权失败:API key 缺失/无效/钥匙串损坏(resolve_provider_secret / ensure_resolved_key 失败)
|
||||
Auth,
|
||||
/// 网络错误:连接失败/DNS 解析失败/流中途断(SSE 传输断)
|
||||
Network,
|
||||
/// 超时:连接超时/idle timeout(120s 无 chunk)
|
||||
Timeout,
|
||||
/// Provider 配置错误:base_url/model/provider_type 错或无可用 provider(配置丢失/全删)
|
||||
ProviderConfig,
|
||||
/// 未分类(达最大轮次/provider 流式错误事件等难精确归类的旧点)
|
||||
Unknown,
|
||||
}
|
||||
|
||||
/// AI 聊天事件(推送到前端)
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
#[serde(tag = "type")]
|
||||
@@ -82,11 +102,24 @@ pub enum AiChatEvent {
|
||||
/// AI 响应完成
|
||||
AiCompleted { total_tokens: u32, prompt_tokens: u32, completion_tokens: u32, conversation_id: Option<String> },
|
||||
/// 错误
|
||||
AiError { error: String, conversation_id: Option<String> },
|
||||
///
|
||||
/// `error_type` 为错误源分类(B-260615-42),`None` 表示未分类(向后兼容旧 emit 点)。
|
||||
AiError {
|
||||
error: String,
|
||||
/// 错误源分类(可选,便于前端差异化提示);旧点/难精确分类填 None
|
||||
error_type: Option<ErrorType>,
|
||||
conversation_id: Option<String>,
|
||||
},
|
||||
/// Agent 循环新一轮(前端需新建 assistant 消息)
|
||||
AiAgentRound { round: u32, conversation_id: Option<String> },
|
||||
/// 流式心跳(静默期报活,前端 watchdog reset,区分「LLM 在跑」与「真断」)
|
||||
AiHeartbeat { conversation_id: Option<String> },
|
||||
/// 达最大轮次仍未收敛(F-260616-03:转暂停态询问用户继续/停止)
|
||||
///
|
||||
/// 触发时 generating 仍为 true(仿审批等待),前端展示独立操作卡:
|
||||
/// - 点继续 → ai_continue_loop → try_continue_agent_loop 再跑 max_iterations 轮
|
||||
/// - 点停止 → ai_stop_loop → 走完成流程(save + AiCompleted + generating=false)
|
||||
AiMaxRoundsReached { conversation_id: Option<String> },
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
|
||||
Reference in New Issue
Block a user