INTEGRITY Документация

Agent Skills

Agent Skills представляют собой инструкции, ресурсы и скрипты, доступные по запросу. Источник навыков предоставляет каталог названий и описаний навыков; агент добавляет этот каталог в системный промпт и открывает инструменты, которые модель может использовать, когда задача пользователя соответствует навыку, поэтому большая библиотека возможностей не перегружает каждый промпт.

Движок навыков находится в agents/skills и не привязан к конкретному фреймворку, поэтому любой агент (включая обычный AIChatAgent onChatMessage) может собрать SkillRegistry. @cloudflare/think повторно экспортирует это как skills пространство имён и связывает getSkills() в ход автоматически.

Использование skills с Think

Встроенные skills обычно импортируются с помощью плагина 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(...) взамен.

Источники применяются по порядку: побеждает тот источник, который первым зарегистрирует имя навыка, а более поздние дубликаты (или источник, который не удалось загрузить) пропускаются с записью предупреждения в лог, вместо того чтобы приводить к сбою агента.

Импортируемый каталог должен содержать один дочерний каталог для каждого skill:

src/skills/release-notes/SKILL.md
src/skills/release-notes/scripts/format-release-notes.ts
src/skills/release-notes/references/style-guide.md

Инструменты skills

Когда skills доступны, агент предоставляет:

Инструмент Назначение
activate_skill Загружает инструкции подходящего навыка и список сопутствующих ресурсов
read_skill_resource Прочитайте встроенный ресурс по { name, path } или skill-name/path
run_skill_script Запустите собранный скрипт, когда getSkillScriptRunner() возвращает runner

Skills не являются текстом, который постоянно присутствует в системном промпте. Используйте getSystemPrompt() или блок контекста Session для поведения, применимого к каждому ходу. Навыки используйте для процедур под конкретные задачи, справочных материалов, скриптов, шаблонов и ресурсов, которые следует загружать только при необходимости.

Выполнение скрипта

Выполнение скриптов является опциональным и требует привязки Worker Loader:

{
	"worker_loaders": [{ "binding": "LOADER" }]
}
[[worker_loaders]]
binding = "LOADER"

skills.runner() является экспериментальным и выполняет скрипты на JavaScript, TypeScript, Python и Bash под scripts/. 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 контролируется разрешением workspace, ctx.tools предоставляет только те инструменты, которые получил runner, и ctx.output.writeFile(name, content) возвращает модели scratch-артефакты (не изменяя workspace). 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/" })];
	}
}

См. agent-skills пример ↗ для встроенных skills, skills на основе R2 и выполнения скриптов.