diff --git a/Agents.md b/Agents.md index 470d739..28cf42c 100644 --- a/Agents.md +++ b/Agents.md @@ -715,18 +715,58 @@ best judgment. This tool is automatically available to any agent with `can_spawn_agents: true`. -# 9. Auto-Injected Prompts +## 9. Skills + +[Skills](Skills) are modular knowledge or capability packs that the model loads and unloads mid-conversation +via `skill__list` and `skill__load`. Where a [role](Roles) defines who the assistant is, a skill layers a +methodology (`code-review`), a toolkit (`git-master`), or a one-shot helper onto whatever role/agent/session is +active. Multiple skills can be loaded at once; their instructions stack and their granted tools/MCP servers union. + +Agents can override the global skill policy in their own `config.yaml`: + +```yaml +# agents/my-agent/config.yaml +skills_enabled: true # Master switch for this agent (false wins at any level; unset inherits global) +enabled_skills: # Allowlist for this agent (most-specific-wins: agent > role > global) + - code-review + - git-master +inject_skill_instructions: true # Inject the skill-discovery hint into this agent's system prompt +skill_instructions: null # Override the built-in hint text (null uses the default) +``` + +- **`skills_enabled`** (default unset): Setting `false` disables skills for this agent. `skill__list`, + `skill__load`, and `skill__unload` are not exposed when this agent runs. If unset, the agent inherits the + global setting. +- **`enabled_skills`** (default unset): When set, restricts which skills this agent can load. Skills not in this + list are filtered out of `skill__list`, and `skill__load` rejects them with `"Skill 'X' is not enabled in this + context"`. If unset, the agent inherits the role or global allowlist. Accepts a YAML list or a comma-separated + string. +- **`inject_skill_instructions`** (default `true`): Controls whether Coyote appends a short hint to the system + prompt telling the model to call `skill__list` early in a task. Suppressed automatically when the effective + `enabled_skills` set is empty. +- **`skill_instructions`** (default unset): Replaces the built-in hint text with your own wording. + +Skills require function calling (`function_calling_support: true`); the skill subsystem is silently disabled +otherwise. For the full skills model, including the frontmatter format, validation rules, built-in skills, and +the graph-agent variant, see the [Skills Guide](Skills). + +For working examples of agents that use skills heavily, see the bundled +[`file-reviewer`](https://github.com/Dark-Alex-17/coyote/blob/main/assets/agents/file-reviewer) and [`code-reviewer`](https://github.com/Dark-Alex-17/coyote/blob/main/assets/agents/code-reviewer) agents. + +## 10. Auto-Injected Prompts Coyote automatically appends usage instructions to your agent's system prompt for each enabled built-in system. These instructions are injected into both **static and dynamic instructions** after your own instructions, ensuring agents always know how to use their available tools. -| System | Injected When | Toggle | -|--------------------|----------------------------------------------------------------|-----------------------------| -| Todo tools | `auto_continue: true` AND `inject_todo_instructions: true` | `inject_todo_instructions` | -| Spawning tools | `can_spawn_agents: true` AND `inject_spawn_instructions: true` | `inject_spawn_instructions` | -| Teammate messaging | Always (all agents) | None (always injected) | -| User interaction | Always (all agents) | None (always injected) | +| System | Injected When | Toggle | +|----------------------|----------------------------------------------------------------------------------------------------------|-----------------------------| +| Todo tools | `auto_continue: true` AND `inject_todo_instructions: true` | `inject_todo_instructions` | +| Spawning tools | `can_spawn_agents: true` AND `inject_spawn_instructions: true` | `inject_spawn_instructions` | +| Teammate messaging | Always (all agents) | None (always injected) | +| User interaction | Always (all agents) | None (always injected) | +| Skill discovery hint | `skills_enabled: true` AND `inject_skill_instructions: true` AND effective `enabled_skills` is non-empty | `inject_skill_instructions` | + If you prefer to write your own instructions for a system, set the corresponding `inject_*` flag to `false` and include your custom instructions in the agent's `instructions` field. The built-in tools will still be diff --git a/Graph-Agents.md b/Graph-Agents.md index 9298358..cc14f94 100644 --- a/Graph-Agents.md +++ b/Graph-Agents.md @@ -72,6 +72,9 @@ skills_enabled: true # optional; master switch for skills in `ll enabled_skills: # optional; the *universe* of skills referenceable by any llm node - code-review - git-master +inject_skill_instructions: true # Inject a hint pointing the model at `skill__list`. Defaults to true; suppressed +# automatically when no skills are available. +skill_instructions: null # Custom text for the skill hint (optional; uses the built-in default if omitted). conversation_starters: # suggested prompts in the UI - "Research WebAssembly outside of the browser" variables: # optional; agent variables diff --git a/REPL.md b/REPL.md index b6ae52d..9b39c87 100644 --- a/REPL.md +++ b/REPL.md @@ -114,13 +114,14 @@ For more information on sessions and how to use them in Coyote, refer to the [se Coyote lets you build OpenAI GPT-style agents. The following commands let you interact with and manage your agents in Coyote: -| Command | Description | -|----------------------|-------------------------------------------------------------------| -| `.agent` | Use an agent | -| `.starter` | Display and use conversation starters for the active agent | -| `.edit agent-config` | Open the agent configuration in your preferred text editor | -| `.info agent` | Display information about the active agent | -| `.exit agent` | Leave the active agent | +| Command | Description | +|----------------------|----------------------------------------------------------------------------------------------| +| `.agent` | Use an agent | +| `.starter` | Display and use conversation starters for the active agent | +| `.clear todo` | Clear the todo list and stop auto-continuation (requires `auto_continue: true` on the agent) | +| `.edit agent-config` | Open the agent configuration in your preferred text editor | +| `.info agent` | Display information about the active agent | +| `.exit agent` | Leave the active agent | ![agent](./images/agents/sql.gif) diff --git a/Skills.md b/Skills.md index 4c271dc..9162aa4 100644 --- a/Skills.md +++ b/Skills.md @@ -227,8 +227,9 @@ have no skill surface. Skills only apply where a model call happens. ## Graph level — the universe -The top-level `skills_enabled` and `enabled_skills` fields in `graph.yaml` work just like they do on a normal agent's -`config.yaml`: they declare the policy ceiling for the whole graph. +The top-level `skills_enabled`, `enabled_skills`, `inject_skill_instructions`, and `skill_instructions` fields in +`graph.yaml` work just like they do on a normal agent's `config.yaml`: they declare the policy ceiling and the +skill-hint behavior for the whole graph. ```yaml name: coder @@ -237,6 +238,8 @@ enabled_skills: - code-review - git-master - verification-gates +inject_skill_instructions: true # Inject the skill-discovery hint into every `llm` node's system prompt +skill_instructions: null # Override the built-in hint text (null uses the default) ``` - **`skills_enabled: false`** at the graph level turns skills off for every `llm` node in the graph regardless of @@ -244,14 +247,19 @@ enabled_skills: - **`enabled_skills`** at the graph level is the *universe*: the set of skill names any `llm` node in the graph is allowed to reference in its own `enabled_skills`. The validator rejects per-node entries that aren't in this set at load time. +- **`inject_skill_instructions`** at the graph level is the agent-layer toggle for the skill-discovery hint. + Defaults to `true`. Suppressed automatically when the effective `enabled_skills` set is empty. +- **`skill_instructions`** at the graph level replaces the built-in hint text with your own wording. Leave `null` + to use the default. - Omitting `enabled_skills` inherits whatever the role / global cascade resolves to (typically "all visible"). ## Per-node: discovery-only on `llm` nodes -`llm` nodes can independently declare `skills_enabled` and `enabled_skills`. The graph-level field gates what's -*allowed* in the graph at all; the node-level field narrows that universe to what *this* node's model can see and -load. Nothing is auto-loaded. The model uses `skill__list` and `skill__load` to bring skills in as it needs them, -matching the rest of Coyote's skill model. +`llm` nodes can independently declare `skills_enabled`, `enabled_skills`, `inject_skill_instructions`, and +`skill_instructions`. The graph-level fields gate what's *allowed* in the graph at all; the node-level fields +narrow that universe to what *this* node's model can see and load, and let you customize the skill-discovery hint +for just that node. Nothing is auto-loaded. The model uses `skill__list` and `skill__load` to bring skills in as +it needs them, matching the rest of Loki's skill model. ```yaml nodes: @@ -259,10 +267,12 @@ nodes: type: llm prompt: "{{plan_summary}}" tools: [fs_write, fs_patch, fs_cat] - enabled_skills: # must be a subset of graph-level enabled_skills + enabled_skills: # must be a subset of graph-level enabled_skills - code-review - verification-gates - # skills_enabled: false # would disable skills for this node only + # skills_enabled: false # would disable skills for this node only + # inject_skill_instructions: false # would suppress the skill-discovery hint for this node only + # skill_instructions: "..." # would substitue custom hint text for this node only ``` Semantics: @@ -278,6 +288,10 @@ Semantics: - **`skills_enabled: false`** at the node level is an off-switch: no `skill__*` meta-tools are exposed and no skills can be loaded from this node. Useful when one node in an otherwise skill-enabled graph should run with a strict, narrow context (for example a structured-output extraction step that shouldn't load editorial conventions). +- **Injection cascade.** `inject_skill_instructions` and `skill_instructions` resolve `node > graph > app` (most + specific wins). Setting `inject_skill_instructions: false` on a node suppresses the skill-discovery hint for + just that node; setting `skill_instructions: "..."` substitutes custom hint text for just that node. Both are + optional and inherit the graph-level value when omitted. - **Skill state carry-over.** Skills the model loads during a node persist into subsequent nodes (they're real registry insertions, not node-scoped state). If you want a skill to clean up automatically at turn end, mark it `auto_unload: true` in the skill's own frontmatter.