vv-agent 0.1.3

VectorVein agent runtime, SDK, CLI, tools, and workspace backends
Documentation
use std::collections::BTreeMap;

use serde_json::Value;

use crate::config::ResolvedModelConfig;
use crate::types::{AgentResult, AgentStatus};

#[derive(Debug, Clone)]
pub struct AgentRun {
    pub agent_name: String,
    pub result: AgentResult,
    pub resolved: ResolvedModelConfig,
}

impl AgentRun {
    pub fn to_dict(&self) -> BTreeMap<String, Value> {
        let mut payload = BTreeMap::new();
        payload.insert("agent".to_string(), Value::String(self.agent_name.clone()));
        payload.insert(
            "status".to_string(),
            Value::String(agent_status_value(self.result.status).to_string()),
        );
        payload.insert(
            "final_answer".to_string(),
            self.result
                .final_answer
                .clone()
                .map(Value::String)
                .unwrap_or(Value::Null),
        );
        payload.insert(
            "wait_reason".to_string(),
            self.result
                .wait_reason
                .clone()
                .map(Value::String)
                .unwrap_or(Value::Null),
        );
        payload.insert(
            "error".to_string(),
            self.result
                .error
                .clone()
                .map(Value::String)
                .unwrap_or(Value::Null),
        );
        payload.insert(
            "cycles".to_string(),
            Value::Number(serde_json::Number::from(self.result.cycles.len() as u64)),
        );
        payload.insert(
            "todo_list".to_string(),
            Value::Array(self.result.todo_list()),
        );
        payload.insert(
            "token_usage".to_string(),
            serde_json::to_value(&self.result.token_usage).unwrap_or(Value::Null),
        );
        let mut resolved = serde_json::Map::new();
        resolved.insert(
            "backend".to_string(),
            Value::String(self.resolved.backend.clone()),
        );
        resolved.insert(
            "selected_model".to_string(),
            Value::String(self.resolved.selected_model.clone()),
        );
        resolved.insert(
            "model_id".to_string(),
            Value::String(self.resolved.model_id.clone()),
        );
        resolved.insert(
            "endpoint".to_string(),
            self.resolved
                .endpoint()
                .map(|endpoint| Value::String(endpoint.endpoint_id.clone()))
                .unwrap_or(Value::Null),
        );
        payload.insert("resolved".to_string(), Value::Object(resolved));
        payload
    }
}

pub(crate) fn agent_status_value(status: AgentStatus) -> &'static str {
    match status {
        AgentStatus::Pending => "pending",
        AgentStatus::Running => "running",
        AgentStatus::WaitUser => "wait_user",
        AgentStatus::Completed => "completed",
        AgentStatus::Failed => "failed",
        AgentStatus::MaxCycles => "max_cycles",
    }
}