use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default)]
pub struct ExecutionFeedback {
pub total_tools: usize,
pub failed_tools: usize,
pub replans: usize,
pub iterations: usize,
pub elapsed_ms: u64,
pub context_overflow_retries: usize,
pub task_completed: bool,
pub task_description: Option<String>,
pub rules_used: Vec<String>,
pub tools_detail: Vec<ToolExecDetail>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolExecDetail {
pub tool: String,
pub success: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum FeedbackSignal {
ExplicitPositive,
ExplicitNegative,
#[default]
Neutral,
}
impl FeedbackSignal {
pub fn as_str(&self) -> &'static str {
match self {
Self::ExplicitPositive => "pos",
Self::ExplicitNegative => "neg",
Self::Neutral => "neutral",
}
}
}
pub fn classify_user_feedback(next_user_message: &str) -> FeedbackSignal {
let msg = next_user_message.to_lowercase();
let negative = [
"不对",
"错了",
"重来",
"重新",
"wrong",
"redo",
"fix",
"不是这样",
"不行",
"有问题",
"bug",
"失败",
];
let positive = [
"好的",
"谢谢",
"完美",
"不错",
"thanks",
"great",
"perfect",
"可以",
"没问题",
"很好",
"nice",
"done",
"ok",
];
if negative.iter().any(|k| msg.contains(k)) {
FeedbackSignal::ExplicitNegative
} else if positive.iter().any(|k| msg.contains(k)) {
FeedbackSignal::ExplicitPositive
} else {
FeedbackSignal::Neutral
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum SkillAction {
#[default]
None,
Generate,
Refine,
}