重构: df-ai-core trait下沉拆crate+导入历史项目批量扫描
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
//! 灵感相关命令
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use serde::Deserialize;
|
||||
use tauri::State;
|
||||
|
||||
use df_ai::provider::LlmProvider;
|
||||
use df_core::types::{new_id, Priority};
|
||||
use df_ideas::capture::Idea;
|
||||
use df_storage::models::{IdeaRecord, ProjectRecord};
|
||||
@@ -183,10 +186,13 @@ pub async fn evaluate_idea(
|
||||
// 多维评分(0-10,IPC 层 *10 缩放为 0-100)
|
||||
let scores = df_ideas::scoring::ScoringEngine::compute_default(&idea);
|
||||
|
||||
// 对抗式评估
|
||||
let eval = df_ideas::adversarial::AdversarialEngine::evaluate(&idea)
|
||||
.await
|
||||
.map_err(err_str)?;
|
||||
// 对抗式评估(构造注入:从 DB 读默认 provider 装配 LLM,无 provider/构造失败 → 启发式兜底)
|
||||
let provider = build_default_provider(&state).await;
|
||||
let engine = match provider {
|
||||
Some(p) => df_ideas::adversarial::AdversarialEngine::new(Arc::from(p)),
|
||||
None => df_ideas::adversarial::AdversarialEngine::heuristic(),
|
||||
};
|
||||
let eval = engine.evaluate(&idea).await.map_err(err_str)?;
|
||||
|
||||
// 组装前端扁平结构(与 Ideas.vue 的 AdversarialEval interface 对齐)
|
||||
let positive_strength = eval.positive.confidence;
|
||||
@@ -248,6 +254,31 @@ pub async fn evaluate_idea(
|
||||
Ok(updated)
|
||||
}
|
||||
|
||||
/// 从 DB 读取默认 provider 配置(is_default 优先,否则首个)+ build_provider 构造实例。
|
||||
///
|
||||
/// 返回 `None` 的两种情况(统一走启发式评估兜底):
|
||||
/// - DB 未配置任何 provider(`list_all` 空或全无 is_default 且无首条)
|
||||
/// - provider 密钥不可用(keyring 无记录 / 纯空白),`build_provider_for` 返 Err
|
||||
///
|
||||
/// 复用 `commands::ai::secret::build_provider_for`(resolve→ensure→build 三步),
|
||||
/// 与 AI Chat / 项目扫描的 provider 构造路径统一(FR-S1 密钥解析一致)。
|
||||
async fn build_default_provider(state: &State<'_, AppState>) -> Option<Box<dyn LlmProvider>> {
|
||||
let providers = state.ai_providers.list_all().await.ok()?;
|
||||
let pc = providers
|
||||
.iter()
|
||||
.find(|p| p.is_default)
|
||||
.cloned()
|
||||
.or_else(|| providers.into_iter().next())?;
|
||||
match crate::commands::ai::secret::build_provider_for(&pc) {
|
||||
Ok(p) => Some(p),
|
||||
Err(e) => {
|
||||
// 密钥不可用:启发式兜底,不阻断评估(与 evaluate_idea LLM 失败降级语义一致)
|
||||
tracing::warn!("默认 provider 密钥不可用,对抗评估走启发式: {e}");
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// IdeaRecord → df_ideas::Idea(评估用,status/time 不影响评分)
|
||||
fn record_to_idea(record: &IdeaRecord) -> Idea {
|
||||
let tags: Vec<String> = record
|
||||
|
||||
Reference in New Issue
Block a user