walrus_core/agent/
parser.rs1use crate::{agent::config::AgentConfig, utils::split_yaml_frontmatter};
6use serde::Deserialize;
7
8#[derive(Deserialize)]
10struct AgentFrontmatter {
11 name: String,
12 #[serde(default)]
13 description: String,
14 #[serde(default)]
15 tools: Vec<String>,
16 #[serde(default)]
17 skill_tags: Vec<String>,
18 #[serde(default)]
19 model: Option<String>,
20}
21
22pub fn parse_agent_md(content: &str) -> anyhow::Result<AgentConfig> {
27 let (frontmatter, body) = split_yaml_frontmatter(content)?;
28 let fm: AgentFrontmatter = serde_yaml::from_str(frontmatter)?;
29
30 let config = AgentConfig {
31 name: fm.name.into(),
32 description: fm.description.into(),
33 system_prompt: body.trim().to_owned(),
34 model: fm.model.map(Into::into),
35 tools: fm.tools.into_iter().map(Into::into).collect(),
36 skill_tags: fm.skill_tags.into_iter().map(Into::into).collect(),
37 ..AgentConfig::default()
38 };
39
40 Ok(config)
41}