tweak: adjust skill presentation to be a little less token heavy (#17098)

This commit is contained in:
Aiden Cline
2026-03-11 16:03:15 -05:00
committed by GitHub
parent 387ab78bf6
commit f96e2d4222
4 changed files with 23 additions and 15 deletions

View File

@@ -64,7 +64,9 @@ export namespace SystemPrompt {
return [
"Skills provide specialized instructions and workflows for specific tasks.",
"Use the skill tool to load a skill when a task matches its description.",
list.length === 0 ? "No skills are currently available." : "\n" + Skill.fmt(list),
// the agents seem to ingest the information about skills a bit better if we present a more verbose
// version of them here and a less verbose version in tool description, rather than vice versa.
Skill.fmt(list, { verbose: true }),
].join("\n")
}
}

View File

@@ -196,17 +196,23 @@ export namespace Skill {
return list.filter((skill) => PermissionNext.evaluate("skill", skill.name, agent.permission).action !== "deny")
}
export function fmt(list: Info[]) {
return [
"<available_skills>",
...list.flatMap((skill) => [
` <skill>`,
` <name>${skill.name}</name>`,
` <description>${skill.description}</description>`,
` <location>${pathToFileURL(skill.location).href}</location>`,
` </skill>`,
]),
"</available_skills>",
].join("\n")
export function fmt(list: Info[], opts: { verbose: boolean }) {
if (list.length === 0) {
return "No skills are currently available."
}
if (opts.verbose) {
return [
"<available_skills>",
...list.flatMap((skill) => [
` <skill>`,
` <name>${skill.name}</name>`,
` <description>${skill.description}</description>`,
` <location>${pathToFileURL(skill.location).href}</location>`,
` </skill>`,
]),
"</available_skills>",
].join("\n")
}
return ["## Available Skills", ...list.flatMap((skill) => `- **${skill.name}**: ${skill.description}`)].join("\n")
}
}

View File

@@ -24,7 +24,7 @@ export const SkillTool = Tool.define("skill", async (ctx) => {
"The following skills provide specialized sets of instructions for particular tasks",
"Invoke this tool to load a skill when a task matches one of the available skills listed below:",
"",
Skill.fmt(list),
Skill.fmt(list, { verbose: false }),
].join("\n")
const examples = list

View File

@@ -45,7 +45,7 @@ description: Skill for tool tests.
fn: async () => {
const tool = await SkillTool.init()
const skillPath = path.join(tmp.path, ".opencode", "skill", "tool-skill", "SKILL.md")
expect(tool.description).toContain(`<location>${pathToFileURL(skillPath).href}</location>`)
expect(tool.description).toContain(`**tool-skill**: Skill for tool tests.`)
},
})
} finally {