use std::pin::pin;
use futures_util::StreamExt;
use serde_json::json;
use uarp_sdk::api::ListAgentsParams;
use uarp_sdk::models::CreateAgentRequest;
use uarp_sdk::{Client, Error};
const LANGUAGE: &str = "rust";
const MISSING_ID: &str = "00000000-0000-4000-8000-000000000000";
const DECODE_FAILED: &str = "decode failed";
#[tokio::main]
async fn main() -> Result<(), Error> {
let agent_name = format!("smoke-live-{LANGUAGE}");
let client = Client::builder()
.api_key(std::env::var("UARP_API_KEY").expect("UARP_API_KEY is not set"))
.base_url(std::env::var("UARP_BASE_URL").unwrap_or_else(|_| "https://api.snaga.ai".into()))
.max_retries(2)
.build()?;
let mut report = serde_json::Map::new();
report.insert("language".into(), json!(LANGUAGE));
let health = client.health().get().await?.status;
report.insert(
"health".into(),
json!(health.map(|s| s.as_str().to_string()).unwrap_or_else(|| "absent".into())),
);
let me = client.auth().get_me().await?;
report.insert("role".into(), json!(me.role));
let auth_method = serde_json::to_value(&me.auth_method).unwrap_or(serde_json::Value::Null);
report.insert("auth_method".into(), auth_method);
let params = ListAgentsParams {
limit: Some(2),
..Default::default()
};
match client.agents().list(¶ms).await {
Ok(page) => {
report.insert("page_size".into(), json!(page.items.len().min(2)));
}
Err(Error::Decode(error)) => {
eprintln!("page_size: {error}");
report.insert("page_size".into(), json!(DECODE_FAILED));
}
Err(other) => return Err(other),
}
match client.agents().get(MISSING_ID).await {
Err(Error::Api(error)) => {
report.insert("not_found_status".into(), json!(error.status));
report.insert(
"problem_has_title".into(),
json!(error
.problem
.title
.as_deref()
.is_some_and(|title| !title.is_empty())),
);
}
Err(other) => return Err(other),
Ok(_) => {
report.insert("not_found_status".into(), json!("no error"));
}
}
let created = client
.agents()
.create(&CreateAgentRequest {
name: agent_name.clone(),
..Default::default()
})
.await;
let created_id = match created {
Ok(agent) => {
report.insert("created".into(), json!(!agent.agent_id.is_empty()));
Some(agent.agent_id)
}
Err(Error::Api(error)) => {
report.insert("created".into(), json!(false));
report.insert("create_error".into(), json!(error.status));
None
}
Err(Error::Decode(error)) => {
eprintln!("created: {error}");
report.insert("created".into(), json!(DECODE_FAILED));
None
}
Err(other) => return Err(other),
};
if let Some(id) = created_id {
match client.agents().get(&id).await {
Ok(fetched) => {
report.insert("name_round_trips".into(), json!(fetched.name == agent_name));
}
Err(Error::Decode(error)) => {
eprintln!("name_round_trips: {error}");
report.insert("name_round_trips".into(), json!(DECODE_FAILED));
}
Err(other) => return Err(other),
}
match client.agents().delete(&id).await {
Ok(_) => {
report.insert("deleted".into(), json!(true));
}
Err(Error::Api(error)) => {
report.insert("deleted".into(), json!(false));
report.insert("delete_error".into(), json!(error.status));
}
Err(other) => return Err(other),
}
}
{
let agents = client.agents();
let all_params = ListAgentsParams {
limit: Some(2),
..Default::default()
};
let mut all = pin!(agents.list_all(&all_params));
let mut seen = 0usize;
let mut decoded = true;
while let Some(agent) = all.next().await {
match agent {
Ok(_) => seen += 1,
Err(Error::Decode(_)) => {
decoded = false;
break;
}
Err(other) => return Err(other),
}
if seen >= 6 {
break;
}
}
report.insert(
"paged_items".into(),
if decoded {
json!(seen)
} else {
json!(DECODE_FAILED)
},
);
}
println!("{}", serde_json::Value::Object(report));
Ok(())
}