فهرست منبع

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

Aiden Cline 6 ماه پیش
والد
کامیت
f96e2d4222

+ 3 - 1
packages/opencode/src/session/system.ts

@@ -64,7 +64,9 @@ export namespace SystemPrompt {
     return [
     return [
       "Skills provide specialized instructions and workflows for specific tasks.",
       "Skills provide specialized instructions and workflows for specific tasks.",
       "Use the skill tool to load a skill when a task matches its description.",
       "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")
     ].join("\n")
   }
   }
 }
 }

+ 18 - 12
packages/opencode/src/skill/skill.ts

@@ -196,17 +196,23 @@ export namespace Skill {
     return list.filter((skill) => PermissionNext.evaluate("skill", skill.name, agent.permission).action !== "deny")
     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")
   }
   }
 }
 }

+ 1 - 1
packages/opencode/src/tool/skill.ts

@@ -24,7 +24,7 @@ export const SkillTool = Tool.define("skill", async (ctx) => {
           "The following skills provide specialized sets of instructions for particular tasks",
           "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:",
           "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")
         ].join("\n")
 
 
   const examples = list
   const examples = list

+ 1 - 1
packages/opencode/test/tool/skill.test.ts

@@ -45,7 +45,7 @@ description: Skill for tool tests.
         fn: async () => {
         fn: async () => {
           const tool = await SkillTool.init()
           const tool = await SkillTool.init()
           const skillPath = path.join(tmp.path, ".opencode", "skill", "tool-skill", "SKILL.md")
           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 {
     } finally {