use tinyagents::graph::END;
use tinyagents::harness::message::Message;
use tinyagents::{GraphBuilder, NodeContext, NodeResult, Result};
#[derive(Clone, Debug)]
struct AgentState {
messages: Vec<Message>,
needs_tool: bool,
}
#[tokio::main]
async fn main() -> Result<()> {
let graph = GraphBuilder::<AgentState, AgentState>::overwrite()
.add_node(
"agent",
|mut state: AgentState, _ctx: NodeContext| async move {
state
.messages
.push(Message::assistant("I should check the local tool."));
Ok(NodeResult::Update(state))
},
)
.add_node(
"tool",
|mut state: AgentState, _ctx: NodeContext| async move {
state
.messages
.push(Message::tool("echo", "tool result: hello from tinyagents"));
state.needs_tool = false;
Ok(NodeResult::Update(state))
},
)
.set_entry("agent")
.add_conditional_edges(
"agent",
|state: &AgentState| {
if state.needs_tool {
"tool".to_string()
} else {
"done".to_string()
}
},
[("tool", "tool"), ("done", END)],
)
.add_edge("tool", "agent")
.compile()?;
let run = graph
.run(AgentState {
messages: vec![Message::user("Can you use a tool?")],
needs_tool: true,
})
.await?;
for message in &run.state.messages {
let role = match message {
Message::System(_) => "system",
Message::User(_) => "user",
Message::Assistant(_) => "assistant",
Message::Tool(_) => "tool",
};
println!("{role}: {}", message.text());
}
println!("visited: {:?}", run.visited);
Ok(())
}