feat: added skill hint prompt injection and configuration

This commit is contained in:
2026-06-05 14:48:54 -06:00
parent 70dc7c9680
commit 165d0d113d
17 changed files with 618 additions and 48 deletions
+31 -1
View File
@@ -2,7 +2,10 @@ use super::state::StateManager;
use super::structured;
use super::types::LlmNode;
use crate::client::{Model, ModelType, call_chat_completions};
use crate::config::{Input, RequestContext, Role, RoleLike, SkillPolicy};
use crate::config::prompts::DEFAULT_SKILL_INSTRUCTIONS;
use crate::config::{
Input, RequestContext, Role, RoleLike, SkillPolicy, should_inject_skill_instructions,
};
use crate::function::skill::skill_function_declarations;
use crate::utils::create_abort_signal;
use anyhow::{Context, Error, Result, anyhow, bail};
@@ -139,6 +142,31 @@ async fn run(
role.set_enabled_tools(Some(tools));
}
if should_inject_skill_instructions(&parent_ctx.app.config, &policy) {
let app = &parent_ctx.app.config;
let agent = parent_ctx.agent.as_ref();
let inject = node
.inject_skill_instructions
.or_else(|| agent.map(|a| a.inject_skill_instructions()))
.unwrap_or(app.inject_skill_instructions);
if inject {
let instructions = node
.skill_instructions
.clone()
.or_else(|| agent.and_then(|a| a.skill_instructions_value()))
.or_else(|| app.skill_instructions.clone());
let separator = if role.is_empty_prompt() { "" } else { "\n\n" };
role.append_to_prompt(separator);
role.append_to_prompt(
instructions
.as_deref()
.unwrap_or(DEFAULT_SKILL_INSTRUCTIONS),
);
}
}
let composed_role = parent_ctx.skill_registry.effective_role(&role, &policy);
let saved_role = parent_ctx.role.clone();
@@ -456,6 +484,8 @@ mod tests {
timeout: None,
skills_enabled: None,
enabled_skills: None,
inject_skill_instructions: None,
skill_instructions: None,
}
}
+12
View File
@@ -37,6 +37,12 @@ pub struct Graph {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enabled_skills: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub inject_skill_instructions: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub skill_instructions: Option<String>,
#[serde(default)]
pub conversation_starters: Vec<String>,
@@ -305,6 +311,12 @@ pub struct LlmNode {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enabled_skills: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub inject_skill_instructions: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub skill_instructions: Option<String>,
}
fn default_llm_max_attempts() -> u32 {
+4
View File
@@ -950,6 +950,8 @@ mod tests {
mcp_servers: Vec::new(),
skills_enabled: None,
enabled_skills: None,
inject_skill_instructions: None,
skill_instructions: None,
conversation_starters: Vec::new(),
variables: Vec::new(),
settings: GraphSettings::default(),
@@ -1051,6 +1053,8 @@ mod tests {
timeout: None,
skills_enabled: None,
enabled_skills: None,
inject_skill_instructions: None,
skill_instructions: None,
}),
next: next.map(NextTargets::from),
}