Skip to content

Rust Runtime

The Rust runtime provides a type-safe interface for working with AgentSchema definitions in Rust applications, built on serde for fast and reliable serialization.

Add to your Cargo.toml:

[dependencies]
agentschema = "1.0.0-beta.7"
  • Rust 1.75 or later

Load agent definitions from YAML or JSON:

use agentschema::AgentDefinition;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Load from YAML
let yaml_content = r#"
name: my-agent
kind: prompt
model: gpt-4o
instructions: You are a helpful assistant.
"#;
let agent = AgentDefinition::from_yaml(yaml_content)?;
println!("{}", agent.name); // "my-agent"
// Load from JSON
let json_content = r#"{
"name": "my-agent",
"kind": "prompt",
"model": "gpt-4o",
"instructions": "You are a helpful assistant."
}"#;
let json_agent = AgentDefinition::from_json(json_content)?;
println!("{}", json_agent.name); // "my-agent"
Ok(())
}

Load directly from YAML or JSON files:

use agentschema::AgentDefinition;
use std::fs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Load from a YAML file
let yaml = fs::read_to_string("agent.yaml")?;
let agent = AgentDefinition::from_yaml(&yaml)?;
// Load from a JSON file
let json = fs::read_to_string("agent.json")?;
let json_agent = AgentDefinition::from_json(&json)?;
Ok(())
}

Build agent definitions using Rust structs:

use agentschema::{AgentDefinition, FunctionTool, Property};
use std::collections::HashMap;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut parameters = HashMap::new();
parameters.insert(
"location".to_string(),
Property {
kind: "string".to_string(),
description: Some("City name".to_string()),
required: Some(true),
..Default::default()
},
);
let agent = AgentDefinition {
name: "weather-agent".to_string(),
description: Some("Helps users check the weather".to_string()),
model: "gpt-4o".to_string(),
instructions: Some("You help users check the weather.".to_string()),
tools: Some(vec![
FunctionTool {
kind: "function".to_string(),
name: "get_weather".to_string(),
description: Some("Get current weather for a location".to_string()),
parameters: Some(parameters),
..Default::default()
}
.into(),
]),
..Default::default()
};
println!("Created agent: {}", agent.name);
Ok(())
}

Export to YAML or JSON:

use agentschema::AgentDefinition;
use std::fs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let agent = AgentDefinition {
name: "my-agent".to_string(),
model: "gpt-4o".to_string(),
..Default::default()
};
// Convert to YAML string
let yaml_str = agent.to_yaml()?;
println!("{}", yaml_str);
// Convert to JSON string
let json_str = agent.to_json()?;
println!("{}", json_str);
// Save to files
fs::write("output.yaml", &yaml_str)?;
fs::write("output.json", &json_str)?;
Ok(())
}

Customize how data is loaded:

use agentschema::{AgentDefinition, LoadContext};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let ctx = LoadContext::new();
let agent = AgentDefinition::from_yaml_with_context(yaml_content, &ctx)?;
Ok(())
}

Control output formatting:

use agentschema::{AgentDefinition, SaveContext, CollectionFormat};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let agent = AgentDefinition {
name: "my-agent".to_string(),
model: "gpt-4o".to_string(),
..Default::default()
};
let ctx = SaveContext {
collection_format: CollectionFormat::Object,
use_shorthand: true,
..Default::default()
};
let yaml_str = agent.to_yaml_with_context(&ctx)?;
Ok(())
}

The crate exports all AgentSchema types as Rust structs:

TypeDescription
AgentDefinitionBase agent specification (polymorphic)
PromptAgentPrompt-based agent definition
WorkflowWorkflow agent definition
ContainerAgentContainer-hosted agent
AgentManifestParameterized agent template
ModelAI model configuration
ModelOptionsModel parameters (temperature, tokens, etc.)
TypeDescription
FunctionToolCustom function definitions
OpenApiToolOpenAPI/Swagger integrations
McpToolModel Context Protocol tools
CodeInterpreterToolCode execution capability
FileSearchToolFile search capability
WebSearchToolWeb search capability
CustomToolCustom tool implementations
TypeDescription
ApiKeyConnectionAPI key authentication
AnonymousConnectionNo authentication
ReferenceConnectionReference to external connection
RemoteConnectionRemote service connection
TypeDescription
PropertyBase property type
ObjectPropertyObject/nested property
ArrayPropertyArray/list property
PropertySchemaSchema with multiple properties

Handle parsing errors gracefully:

use agentschema::AgentDefinition;
fn main() {
let invalid_yaml = "invalid: yaml: content:";
match AgentDefinition::from_yaml(invalid_yaml) {
Ok(agent) => println!("Loaded: {}", agent.name),
Err(e) => eprintln!("Failed to parse YAML: {}", e),
}
}
use agentschema::AgentDefinition;
use std::fs;
async fn run_agent() -> Result<(), Box<dyn std::error::Error>> {
let yaml = fs::read_to_string("agent.yaml")?;
let agent = AgentDefinition::from_yaml(&yaml)?;
let client = reqwest::Client::new();
let response = client
.post("https://api.openai.com/v1/chat/completions")
.bearer_auth(std::env::var("OPENAI_API_KEY")?)
.json(&serde_json::json!({
"model": agent.model,
"messages": [
{"role": "system", "content": agent.instructions},
{"role": "user", "content": "Hello!"}
]
}))
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
use agentschema::AgentDefinition;
use axum::{routing::get, Json, Router};
use std::fs;
use std::sync::Arc;
struct AppState {
agent: AgentDefinition,
}
async fn agent_handler(
axum::extract::State(state): axum::extract::State<Arc<AppState>>,
) -> Json<serde_json::Value> {
Json(serde_json::json!({
"name": state.agent.name,
"model": state.agent.model,
"instructions": state.agent.instructions,
}))
}
#[tokio::main]
async fn main() {
let yaml = fs::read_to_string("agent.yaml").unwrap();
let agent = AgentDefinition::from_yaml(&yaml).unwrap();
let state = Arc::new(AppState { agent });
let app = Router::new()
.route("/agent", get(agent_handler))
.with_state(state);
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
axum::serve(listener, app).await.unwrap();
}