Skip to main content

vv_agent/sdk/types/
run.rs

1use std::collections::BTreeMap;
2
3use serde_json::Value;
4
5use crate::config::ResolvedModelConfig;
6use crate::types::{AgentResult, AgentStatus};
7
8#[derive(Debug, Clone)]
9pub struct AgentRun {
10    pub agent_name: String,
11    pub result: AgentResult,
12    pub resolved: ResolvedModelConfig,
13}
14
15impl AgentRun {
16    pub fn to_dict(&self) -> BTreeMap<String, Value> {
17        let mut payload = BTreeMap::new();
18        payload.insert("agent".to_string(), Value::String(self.agent_name.clone()));
19        payload.insert(
20            "status".to_string(),
21            Value::String(agent_status_value(self.result.status).to_string()),
22        );
23        payload.insert(
24            "final_answer".to_string(),
25            self.result
26                .final_answer
27                .clone()
28                .map(Value::String)
29                .unwrap_or(Value::Null),
30        );
31        payload.insert(
32            "wait_reason".to_string(),
33            self.result
34                .wait_reason
35                .clone()
36                .map(Value::String)
37                .unwrap_or(Value::Null),
38        );
39        payload.insert(
40            "error".to_string(),
41            self.result
42                .error
43                .clone()
44                .map(Value::String)
45                .unwrap_or(Value::Null),
46        );
47        payload.insert(
48            "cycles".to_string(),
49            Value::Number(serde_json::Number::from(self.result.cycles.len() as u64)),
50        );
51        payload.insert(
52            "todo_list".to_string(),
53            Value::Array(self.result.todo_list()),
54        );
55        payload.insert(
56            "token_usage".to_string(),
57            serde_json::to_value(&self.result.token_usage).unwrap_or(Value::Null),
58        );
59        let mut resolved = serde_json::Map::new();
60        resolved.insert(
61            "backend".to_string(),
62            Value::String(self.resolved.backend.clone()),
63        );
64        resolved.insert(
65            "selected_model".to_string(),
66            Value::String(self.resolved.selected_model.clone()),
67        );
68        resolved.insert(
69            "model_id".to_string(),
70            Value::String(self.resolved.model_id.clone()),
71        );
72        resolved.insert(
73            "endpoint".to_string(),
74            self.resolved
75                .endpoint()
76                .map(|endpoint| Value::String(endpoint.endpoint_id.clone()))
77                .unwrap_or(Value::Null),
78        );
79        payload.insert("resolved".to_string(), Value::Object(resolved));
80        payload
81    }
82}
83
84pub(crate) fn agent_status_value(status: AgentStatus) -> &'static str {
85    match status {
86        AgentStatus::Pending => "pending",
87        AgentStatus::Running => "running",
88        AgentStatus::WaitUser => "wait_user",
89        AgentStatus::Completed => "completed",
90        AgentStatus::Failed => "failed",
91        AgentStatus::MaxCycles => "max_cycles",
92    }
93}