Code as AI Skills (CaaS) 模式
什么是 CaaS?
Code as AI Skills (CaaS) 是一种模式,你的生产函数无需任何转换层即可成为AI能力。
核心理念:生产代码就是技能本身。 你只需编写一次函数,添加一个轻量级的 SKILL.md 文件,你的应用和AI都可以使用它。
┌────────────────────────────────────────────────────────────────────┐
│ CaaS 飞轮 │
├────────────────────────────────────────────────────────────────────┤
│ │
│ 开发者编写代码 ────────► 代码成为AI技能 │
│ ▲ │ │
│ │ │ │
│ │ ▼ │
│ AI编写代码 ◄────────── AI获得新能力 │
│ │
│ 每次迭代:开发者和AI都变得更强大 │
│ │
└────────────────────────────────────────────────────────────────────┘
三个好处:
- 一次编写,处处使用 — 相同的函数在应用和AI上下文中都能工作
- AI与代码库一起成长 — 你编写的每个函数都成为AI技能
- AI可以自我扩展 — AI编写的代码成为新技能
工作原理
单个函数同时服务于你的应用程序和AI代理:
skills/user-management/
├── SKILL.md ← AI读取这个来发现函数
└── createUser.ts ← 实际的函数(两者都使用)
你的应用直接导入:
// 在 app/api/register/route.ts 中
import { createUser } from '@/skills/user-management/createUser';
const result = await createUser({ email: 'user@example.com', name: 'John' });
AI读取SKILL.md,然后导入完全相同的函数:
// AI生成的代码(相同)
import { createUser } from '@/skills/user-management/createUser';
const result = await createUser({ email: 'user@example.com', name: 'John' });
重点: 没有"应用版本"和"AI版本"。相同的导入,相同的函数,相同的执行。AI只需要 SKILL.md 来发现它的存在。
┌────────────────────────────────────────────────────────────────────────────┐
│ │
│ ┌───────────────────────┐ ┌───────────────────────┐ │
│ │ 开发者 │ │ AI代理 │ │
│ │ │ │ │ │
│ │ 直接编写和导入 │ │ 通过SKILL.md │ │
│ │ 函数 │ │ 发现和使用 │ │
│ └───────────┬───────────┘ └───────────┬───────────┘ │
│ │ │ │
│ │ import { createUser } │ 读取SKILL.md │
│ │ from '@/skills/...' │ 然后导入 │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ /skills 文件夹 │ │
│ │ (共享代码层) │ │
│ │ │ │
│ │ 无论是应用还是AI调用,运行的都是相同的代码 │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────────┘
复合效应
AI创建新技能
AI可以使用现有技能创建新技能。
示例: 你要求AI"创建用户入职流程"
AI发现现有技能,然后组合它们:
// skills/onboarding/onboardUser.ts (AI生成)
import { sendWelcomeEmail } from '@/skills/email/sendWelcomeEmail';
import { createUser } from '@/skills/user-management/createUser';
export async function onboardUser(email: string, name: string) {
const user = await createUser({ email, name });
if (user.success) {
await sendWelcomeEmail(email, name);
}
return user;
}
AI还会生成SKILL.md,现在 onboardUser 可供你的应用、AI和未来的组合使用。
你创建新技能(相同模式)
你做同样的事情——组合现有技能(包括AI生成的):
// skills/admin/bulkOnboard.ts (你编写)
import { onboardUser } from '@/skills/onboarding/onboardUser';
// AI生成
import { assignRole } from '@/skills/permissions/assignRole';
export async function bulkOnboardAdmins(
users: Array<{ email: string; name: string }>,
) {
const results = [];
for (const user of users) {
const result = await onboardUser(user.email, user.name);
if (result.success) {
await assignRole(result.userId, 'admin');
}
results.push(result);
}
return results;
}
添加SKILL.md(或让AI为你生成),AI现在也可以使用你的代码。
增长循环
┌──────────────────────────────────────────────────────────────────────────┐
│ │
│ 开发者贡献 结果 │
│ ──────────────────────── ────── │
│ │
│ • 编写新的实用函数 → AI现在可以使用它 │
│ • 重构现有代码 → AI获得改进版本 │
│ • 添加新的域文件夹 → AI发现新能力 │
│ │
│ AI贡献 结果 │
│ ──────────────── ────── │
│ │
│ • AI编写新函数 → 开发者可以导入它 │
│ • AI生成SKILL.md → 记录自己的工作 │
│ • AI扩展现有技能 → 两者立即受益 │
│ │
└──────────────────────────────────────────────────────────────────────────┘
/skills 文件夹
┌───────────────────────┐
第1周: │ 5个函数 │
└───────────────────────┘
↓
┌───────────────────────┐
第2周: │ 12个函数 │ ← 开发者添加4个,AI添加3个
└───────────────────────┘
↓
┌───────────────────────┐
第4周: │ 28个函数 │ ← 复合增长
└───────────────────────┘
数学: 如果你编写10个函数,你就创建了10个AI技能。如果AI再编写5个,你现在有15个函数和15个AI技能。"你的应用能做什么"和"AI能做什么"之间的差距变为零。
设置技能
文件夹结构
/skills 文件夹位于应用文件夹之外:
project-root/
├── app/ # 你的应用程序路由
├── skills/ # ← 技能在这里(与app同级)
│ ├── user-management/
│ │ ├── SKILL.md # ← 必需:AI发现
│ │ └── createUser.ts
│ ├── email/
│ │ ├── SKILL.md
│ │ └── sendWelcome.ts
│ └── {subdomain}/ # 允许嵌套技能
│ └── SKILL.md
└── package.json
必需 vs 灵活:
| 必需 | 灵活 |
| ------------------- | ------------------------- |
| 每个域的 SKILL.md | 如何组织 .ts 文件 |
| 域文件夹名称 | _models/、_utils/ 等 |
| | 额外的 .md 文档(可选) |
| | 文件命名约定 |
SKILL.md 格式
保持精简(30-50行)。AI经常读取这些内容。
---
name: email
description: 通过Resend API发送邮件。用于欢迎邮件、通知。
---
## 可用函数
### sendWelcomeEmail
**签名:** `sendWelcomeEmail(to: string, name: string): Promise<{ success }>`
**作用:** 向新用户发送欢迎邮件
**位置:** `sendWelcome.ts`
## 子域
- **Templates:** `templates/SKILL.md` - 邮件模板管理
内容分配:
| 在SKILL.md中 | 在单独的.md文件中 | | ------------------ | ------------------ | | 函数签名 | 分步工作流 | | 单行描述 | 详细代码示例 | | 文件位置 | 边缘情况和注意事项 | | 指向其他文档的指针 | 完整API文档 |
经验法则: 如果能帮助AI决定是否使用函数 → SKILL.md。如果能帮助AI在复杂场景中正确使用 → 参考文件。
为什么选择CaaS而不是传统工具?
传统AI工具需要维护两个独立的东西:
┌───────────────────────────────────────────────────────────────────────┐
│ 传统方式:需要维护两个东西 │
├───────────────────────────────────────────────────────────────────────┤
│ │
│ 1. JSON Schema(给AI用) 2. 实际函数(给应用用) │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ { │ │ function createUser() { │ │
│ │ "name": "create_user",│ ←→ │ // 实现 │ │
│ │ "inputSchema": {...} │ │ } │ │
│ │ } │ └─────────────────────────┘ │
│ └─────────────────────────┘ │
│ │
│ 问题:这些必须保持同步。它们总是会偏离。 │
│ │
└───────────────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────────────┐
│ CaaS:只需维护一个东西 │
├───────────────────────────────────────────────────────────────────────┤
│ │
│ 你的函数 + SKILL.md(指向它) │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ function createUser() { │ ←── │ SKILL.md说: │ │
│ │ // 实现 │ │ "createUser在这里" │ │
│ │ } │ └─────────────────────────┘ │
│ └─────────────────────────┘ │
│ │
│ SKILL.md只是一个指针。函数是唯一的真实来源。 │
│ │
└───────────────────────────────────────────────────────────────────────┘
| 传统方式 | CaaS | | ------------------------- | -------------------- | | Schema定义AI看到什么 | 代码定义AI看到什么 | | Schema可能对实现撒谎 | SKILL.md指向实际代码 | | 更新函数 → 必须更新schema | 更新函数 → 完成 | | 测试schema + 测试函数 | 只需测试一次函数 |
结论
关键要点:
- 一次编写,处处使用 — 生产函数同时服务于应用和AI
- 无需转换 — AI导入和执行相同的代码
- 保持精简 — SKILL.md提供发现,而非实现
- 复合增长 — 你和AI都为技能文件夹做贡献
入门指南:
- 创建
/skills文件夹(与/app同级) - 添加包含你的函数的域文件夹
- 编写一个最小的SKILL.md
- 在你的应用中导入函数——AI现在也可以使用它
CaaS理念: 你的代码库已经充满了能力。让它们可被发现,它们就成为了技能。