feat: added additional support for all RAG-configuration fields in RAG nodes
This commit is contained in:
+15
-18
@@ -198,21 +198,19 @@ fn build_inline_role(
|
||||
role.set_top_p(Some(p));
|
||||
}
|
||||
|
||||
if let Some(tool_entries) = &node.tools {
|
||||
if tool_entries.is_empty() {
|
||||
role.set_enabled_tools(Some(String::new()));
|
||||
role.set_enabled_mcp_servers(Some(String::new()));
|
||||
if node.tools.as_deref().unwrap_or_default().is_empty() {
|
||||
role.set_enabled_tools(Some(String::new()));
|
||||
role.set_enabled_mcp_servers(Some(String::new()));
|
||||
} else {
|
||||
if !regular_tools.is_empty() {
|
||||
role.set_enabled_tools(Some(regular_tools.join(",")));
|
||||
} else {
|
||||
if !regular_tools.is_empty() {
|
||||
role.set_enabled_tools(Some(regular_tools.join(",")));
|
||||
} else {
|
||||
role.set_enabled_tools(Some(String::new()));
|
||||
}
|
||||
if !mcp_servers.is_empty() {
|
||||
role.set_enabled_mcp_servers(Some(mcp_servers.join(",")));
|
||||
} else {
|
||||
role.set_enabled_mcp_servers(Some(String::new()));
|
||||
}
|
||||
role.set_enabled_tools(Some(String::new()));
|
||||
}
|
||||
if !mcp_servers.is_empty() {
|
||||
role.set_enabled_mcp_servers(Some(mcp_servers.join(",")));
|
||||
} else {
|
||||
role.set_enabled_mcp_servers(Some(String::new()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -370,9 +368,8 @@ fn format_schema_hint(schema: &Value) -> String {
|
||||
|
||||
fn describe_tools_filter(tools: Option<&[String]>) -> String {
|
||||
match tools {
|
||||
None => "<inherit>".into(),
|
||||
Some(t) if t.is_empty() => "<none>".into(),
|
||||
Some(t) => t.join(","),
|
||||
Some(t) if !t.is_empty() => t.join(","),
|
||||
_ => "<none>".into(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -531,7 +528,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn describe_tools_filter_renders_each_case() {
|
||||
assert_eq!(describe_tools_filter(None), "<inherit>");
|
||||
assert_eq!(describe_tools_filter(None), "<none>");
|
||||
assert_eq!(describe_tools_filter(Some(&[])), "<none>");
|
||||
let tools = vec!["a".to_string(), "b".to_string()];
|
||||
assert_eq!(describe_tools_filter(Some(&tools)), "a,b");
|
||||
|
||||
+24
-9
@@ -31,10 +31,6 @@ pub struct Graph {
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub top_p: Option<f64>,
|
||||
|
||||
/// Session to start the agent in (e.g. `temp`). Single-file mode only.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub agent_session: Option<String>,
|
||||
|
||||
/// Global tools available to the agent's nodes. Single-file mode only.
|
||||
#[serde(default)]
|
||||
pub global_tools: Vec<String>,
|
||||
@@ -282,8 +278,8 @@ pub struct LlmNode {
|
||||
/// Each entry is either an exact function name (`global_tools`
|
||||
/// entry or `tools.{sh,py,ts}` subcommand) or the shorthand
|
||||
/// `mcp:<server>` (where `<server>` must be in the agent's
|
||||
/// `mcp_servers`). Unset = inherit agent's full set; `[]` = no
|
||||
/// tools.
|
||||
/// `mcp_servers`). Unset or `[]` = no tools — tools are strictly
|
||||
/// opt-in.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub tools: Option<Vec<String>>,
|
||||
|
||||
@@ -351,6 +347,28 @@ pub struct RagNode {
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub top_k: Option<usize>,
|
||||
|
||||
/// Embedding model for building the knowledge base. When this plus
|
||||
/// `chunk_size` and `chunk_overlap` are all set, knowledge-base
|
||||
/// construction runs non-interactively (no prompts).
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub embedding_model: Option<String>,
|
||||
|
||||
/// Chunk size for splitting documents at build time.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub chunk_size: Option<usize>,
|
||||
|
||||
/// Chunk overlap for splitting documents at build time.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub chunk_overlap: Option<usize>,
|
||||
|
||||
/// Reranker model applied to hybrid-search results.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub reranker_model: Option<String>,
|
||||
|
||||
/// Embedding-request batch size at build time.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub batch_size: Option<usize>,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub state_updates: Option<HashMap<String, String>>,
|
||||
|
||||
@@ -812,7 +830,6 @@ start: e
|
||||
model: anthropic:claude-sonnet-4-6
|
||||
temperature: 0.2
|
||||
top_p: 0.9
|
||||
agent_session: temp
|
||||
global_tools:
|
||||
- web_search_loki.sh
|
||||
mcp_servers:
|
||||
@@ -829,7 +846,6 @@ nodes:
|
||||
assert_eq!(graph.model.as_deref(), Some("anthropic:claude-sonnet-4-6"));
|
||||
assert_eq!(graph.temperature, Some(0.2));
|
||||
assert_eq!(graph.top_p, Some(0.9));
|
||||
assert_eq!(graph.agent_session.as_deref(), Some("temp"));
|
||||
assert_eq!(graph.global_tools, vec!["web_search_loki.sh"]);
|
||||
assert_eq!(graph.mcp_servers, vec!["pubmed-search"]);
|
||||
assert_eq!(graph.conversation_starters, vec!["Look up 2160-0"]);
|
||||
@@ -842,7 +858,6 @@ nodes:
|
||||
assert!(graph.model.is_none());
|
||||
assert!(graph.temperature.is_none());
|
||||
assert!(graph.top_p.is_none());
|
||||
assert!(graph.agent_session.is_none());
|
||||
assert!(graph.global_tools.is_empty());
|
||||
assert!(graph.mcp_servers.is_empty());
|
||||
assert!(graph.conversation_starters.is_empty());
|
||||
|
||||
@@ -382,7 +382,6 @@ mod tests {
|
||||
model: None,
|
||||
temperature: None,
|
||||
top_p: None,
|
||||
agent_session: None,
|
||||
global_tools: Vec::new(),
|
||||
mcp_servers: Vec::new(),
|
||||
conversation_starters: Vec::new(),
|
||||
@@ -453,6 +452,11 @@ mod tests {
|
||||
documents: documents.iter().map(|s| (*s).into()).collect(),
|
||||
query: None,
|
||||
top_k: None,
|
||||
embedding_model: None,
|
||||
chunk_size: None,
|
||||
chunk_overlap: None,
|
||||
reranker_model: None,
|
||||
batch_size: None,
|
||||
state_updates,
|
||||
timeout: None,
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user