Agent Skills は、オンデマンドの手順、リソース、スクリプトです。スキルソースはスキル名と説明のカタログを提供します。エージェントはそのカタログをシステムプロンプトに追加し、ユーザーのタスクがスキルに一致したときにモデルが使えるツールを公開します。大きな能力ライブラリで、毎回のプロンプトが膨らむのを避けられます。
スキルエンジンは agents/skills にあり、フレームワーク非依存です。任意のエージェント(プレーンな AIChatAgent の onChatMessage を含む)が SkillRegistry を構築できます。@cloudflare/think は skills 名前空間として再エクスポートし、getSkills() をターンへ自動で接続します。
バンドルされたスキルは、通常 Agents の Vite プラグインでインポートします。
import { Think, skills } from "@cloudflare/think";
import bundledSkills from "agents:skills"; // resolves to ./skills next to this file
export class MyAgent extends Think {
getSkills() {
return [
bundledSkills,
skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" }),
];
}
getSkillScriptRunner() {
return skills.runner({
loader: this.env.LOADER,
workspaceInstance: this.workspace,
});
}
}import { Think, skills } from "@cloudflare/think";
import bundledSkills from "agents:skills"; // resolves to ./skills next to this file
type Env = {
AI: Ai;
LOADER: WorkerLoader;
SKILLS_BUCKET: R2Bucket;
};
export class MyAgent extends Think<Env> {
getSkills() {
return [
bundledSkills,
skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" }),
];
}
getSkillScriptRunner() {
return skills.runner({
loader: this.env.LOADER,
workspaceInstance: this.workspace,
});
}
}agents:skills は、インポート元ファイルの隣にある ./skills ディレクトリに解決します。別名の兄弟ディレクトリを指す場合は agents:skills/<dir> を使います。agents:skills のインポート型は、agents 同梱のアンビエント宣言です。同じファイルで Think をインポートすると型がスコープに入ります(指定子だけをインポートするファイルでは /// <reference types="agents/skills-module" /> を追加します)。Agents の Vite プラグインを使わない場合は、代わりに skills.fromManifest(...) でソースを構築します。
ソースは順に適用されます。スキル名を最初に登録したソースが勝ちます。後続の重複(または読み込みに失敗したソース)は、エージェントを失敗させず、警告をログしてスキップします。
インポートするディレクトリには、スキルごとに子ディレクトリを置きます。
src/skills/release-notes/SKILL.md
src/skills/release-notes/scripts/format-release-notes.ts
src/skills/release-notes/references/style-guide.mdスキルが使えるとき、エージェントは次を公開します。
| ツール | 用途 |
|---|---|
activate_skill |
一致したスキルの手順と、バンドルされたリソース一覧を読み込みます |
read_skill_resource |
{ name, path } または skill-name/path でバンドルされたリソースを読みます |
run_skill_script |
getSkillScriptRunner() がランナーを返すとき、バンドルされたスクリプトを実行します |
スキルは、常時有効なシステムプロンプトではありません。すべてのターンに適用する振る舞いは getSystemPrompt() または Session のコンテキストブロックを使います。スキルは、関連するときだけ読み込むタスク固有の手順、参照、スクリプト、テンプレート、アセット向けです。
スクリプト実行はオプトインで、Worker Loader バインディングが必要です。
{
"worker_loaders": [{ "binding": "LOADER" }]
}[[worker_loaders]]
binding = "LOADER"skills.runner() は実験的です。scripts/ 配下の JavaScript、TypeScript、Python、Bash スクリプトを実行します。TypeScript は @cloudflare/worker-bundler でコンパイルします。Python は Python Dynamic Workers として動き、Bash は just-bash 経由です。
JavaScript と TypeScript のスクリプトは関数形式です。
export default async function run(input, ctx) {
const guide = ctx.files["references/style-guide.md"]; // bundled text resources
const docs = await ctx.workspace.readFile("README.md"); // gated by permission
const summary = await ctx.tools.call("summarize", { input }); // explicit tools
await ctx.output.writeFile("notes.md", summary); // scratch artifact
return { ok: true };
}import type { SkillRunContext } from "@cloudflare/think";
export default async function run(input: unknown, ctx: SkillRunContext) {
const guide = ctx.files["references/style-guide.md"]; // bundled text resources
const docs = await ctx.workspace.readFile("README.md"); // gated by permission
const summary = await ctx.tools.call("summarize", { input }); // explicit tools
await ctx.output.writeFile("notes.md", summary); // scratch artifact
return { ok: true };
}ctx は { skill, files, workspace, tools, output } です。ctx.files は相対パスでバンドルされたテキストリソースを保持します。ctx.workspace はワークスペース権限でゲートされます。ctx.tools はランナーに渡されたツールだけを公開します。ctx.output.writeFile(name, content) はスクラッチ成果物をモデルへ返します(ワークスペースは変更しません)。Python と Bash はパスベースの契約です。/input.json、/context.json、/skill 配下のバンドルリソース、成果物用の /output を使います。
workspaceInstance を渡すと、スクリプトはデフォルトで読み取り専用のワークスペースアクセスを得ます。ネットワーク、ツール、ワークスペースへの書き込みはオプトインです。デフォルトのタイムアウトは 30 秒です。
import { Think, skills } from "@cloudflare/think";
export class SkillsAgent extends Think {
getSkills() {
return [skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" })];
}
}import { Think, skills } from "@cloudflare/think";
export class SkillsAgent extends Think<Env> {
getSkills() {
return [skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" })];
}
}バンドルスキル、R2 バックエンドのスキル、スクリプト実行は agent-skills の例 ↗ を参照してください。
- Think —
getSkills()とgetSkillScriptRunner()をエージェントループへ接続します - Think のツール — スキルツールがワークスペース、カスタム、MCP、クライアントツールとどうマージされるか