feat: wired together graph execution and agent graph dispatch
This commit is contained in:
@@ -9,6 +9,7 @@ use super::state::StateManager;
|
||||
use super::types::AgentNode;
|
||||
use crate::config::RequestContext;
|
||||
use crate::function::supervisor::run_agent_for_graph;
|
||||
use crate::utils::dimmed_text;
|
||||
use anyhow::{Context, Result};
|
||||
use serde_json::Value;
|
||||
use std::time::Duration;
|
||||
@@ -31,6 +32,14 @@ impl AgentNodeExecutor {
|
||||
.interpolate(&node.prompt)
|
||||
.with_context(|| format!("Failed to interpolate prompt for agent '{}'", node.agent))?;
|
||||
|
||||
eprintln!(
|
||||
"{}",
|
||||
dimmed_text(&format!("▸ spawning agent '{}' with prompt:", node.agent))
|
||||
);
|
||||
for line in indent_prompt(&prompt, 6) {
|
||||
eprintln!("{}", dimmed_text(&line));
|
||||
}
|
||||
|
||||
let timeout_dur = Duration::from_secs(node.timeout.unwrap_or(DEFAULT_TIMEOUT_SECS));
|
||||
|
||||
let output = timeout(
|
||||
@@ -53,6 +62,21 @@ impl AgentNodeExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
fn indent_prompt(prompt: &str, prefix_spaces: usize) -> Vec<String> {
|
||||
const MAX_LINES: usize = 12;
|
||||
let pad = " ".repeat(prefix_spaces);
|
||||
let mut out: Vec<String> = prompt
|
||||
.lines()
|
||||
.take(MAX_LINES)
|
||||
.map(|line| format!("{pad}{line}"))
|
||||
.collect();
|
||||
let total = prompt.lines().count();
|
||||
if total > MAX_LINES {
|
||||
out.push(format!("{pad}... ({} more lines)", total - MAX_LINES));
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
/// Exposes the agent's output as `{{output}}` for template evaluation, then
|
||||
/// applies every key/template in `state_updates`. The temporary `output`
|
||||
/// state key is removed at the end so it doesn't leak into subsequent
|
||||
|
||||
Reference in New Issue
Block a user