vv_agent/sdk/types/
run.rs1use 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}