wesichain-core 0.3.0

Rust-native LLM agents & chains with resumable ReAct workflows
Documentation
use std::collections::HashMap;

use serde::{de::DeserializeOwned, Deserialize, Serialize};

use crate::{ToolCall, Value};

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum ReActStep {
    Thought(String),
    Action(ToolCall),
    Observation(Value),
    FinalAnswer(String),
    Error(String),
}

pub trait ScratchpadState: Serialize + DeserializeOwned {
    fn scratchpad(&self) -> &Vec<ReActStep>;
    fn scratchpad_mut(&mut self) -> &mut Vec<ReActStep>;
    fn iteration_count(&self) -> u32;
    fn increment_iteration(&mut self);
    fn ensure_scratchpad(&mut self) {}
}

pub trait HasUserInput {
    fn user_input(&self) -> &str;
}

pub trait HasFinalOutput {
    fn final_output(&self) -> Option<&str>;
    fn set_final_output(&mut self, value: String);
}

impl HasUserInput for HashMap<String, Value> {
    fn user_input(&self) -> &str {
        self.get("input").and_then(|v| v.as_str()).unwrap_or("")
    }
}

impl HasFinalOutput for HashMap<String, Value> {
    fn final_output(&self) -> Option<&str> {
        self.get("final_output").and_then(|v| v.as_str())
    }

    fn set_final_output(&mut self, value: String) {
        self.insert("final_output".to_string(), Value::String(value));
    }
}