diff options
| author | Michelle Tilley <michelle@michelletilley.net> | 2026-04-23 13:43:01 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-23 13:43:01 -0700 |
| commit | 461ef4c43589c6ca68176c180fd04f2755c9f036 (patch) | |
| tree | c646ea272d6016533c4941592f9a22baa2a54488 /crates/atuin-ai/src/stream.rs | |
| parent | feat: Send user-defined context with `TERMINAL.md` (#3443) (diff) | |
| download | atuin-461ef4c43589c6ca68176c180fd04f2755c9f036.zip | |
feat: Add skill discovery, loading, and invocation (#3444)
Adds a skills system that lets users define reusable LLM instructions as `SKILL.md` files with YAML frontmatter.
Diffstat (limited to 'crates/atuin-ai/src/stream.rs')
| -rw-r--r-- | crates/atuin-ai/src/stream.rs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/crates/atuin-ai/src/stream.rs b/crates/atuin-ai/src/stream.rs index e7155a08..d921b39c 100644 --- a/crates/atuin-ai/src/stream.rs +++ b/crates/atuin-ai/src/stream.rs @@ -63,7 +63,10 @@ impl ChatRequest { capabilities: &AiCapabilities, invocation_id: String, ) -> Self { - let mut caps = vec!["client_invocations".to_string()]; + let mut caps = vec![ + "client_invocations".to_string(), + "client_v1_load_skill".to_string(), + ]; if capabilities.enable_history_search.unwrap_or(true) { caps.push("client_v1_atuin_history".to_string()); } @@ -93,6 +96,7 @@ impl ChatRequest { } } +#[allow(clippy::too_many_arguments)] pub(crate) fn create_chat_stream( hub_address: String, token: String, @@ -101,6 +105,8 @@ pub(crate) fn create_chat_stream( send_cwd: bool, last_command: Option<String>, user_contexts: Vec<crate::user_context::UserContext>, + skill_summaries: Vec<crate::skills::SkillSummary>, + skill_overflow: Option<String>, ) -> std::pin::Pin<Box<dyn futures::Stream<Item = Result<StreamFrame>> + Send>> { Box::pin(async_stream::stream! { ensure_crypto_provider(); @@ -124,6 +130,13 @@ pub(crate) fn create_chat_stream( config["user_contexts"] = serde_json::json!(user_contexts); } + if !skill_summaries.is_empty() { + config["skills"] = serde_json::json!(skill_summaries); + if let Some(ref overflow) = skill_overflow { + config["skills_overflow"] = serde_json::json!(overflow); + } + } + let mut request_body = serde_json::json!({ "messages": request.messages, "context": context, |
