Code as AI Skills (CaaS) 模式

aiarchitecturetypescriptdeveloper-experience
By sko11/22/20257 min read

什么是 CaaS?

Code as AI Skills (CaaS) 是一种模式,你的生产函数无需任何转换层即可成为AI能力。

核心理念:生产代码就是技能本身。 你只需编写一次函数,添加一个轻量级的 SKILL.md 文件,你的应用和AI都可以使用它。

┌────────────────────────────────────────────────────────────────────┐
│                        CaaS 飞轮                                   │
├────────────────────────────────────────────────────────────────────┤
│                                                                    │
│    开发者编写代码 ────────► 代码成为AI技能                          │
│          ▲                                │                        │
│          │                                │                        │
│          │                                ▼                        │
│    AI编写代码 ◄────────── AI获得新能力                             │
│                                                                    │
│    每次迭代:开发者和AI都变得更强大                                 │
│                                                                    │
└────────────────────────────────────────────────────────────────────┘

三个好处:

  1. 一次编写,处处使用 — 相同的函数在应用和AI上下文中都能工作
  2. AI与代码库一起成长 — 你编写的每个函数都成为AI技能
  3. 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 + 测试函数 | 只需测试一次函数 |


结论

关键要点:

  1. 一次编写,处处使用 — 生产函数同时服务于应用和AI
  2. 无需转换 — AI导入和执行相同的代码
  3. 保持精简 — SKILL.md提供发现,而非实现
  4. 复合增长 — 你和AI都为技能文件夹做贡献

入门指南:

  1. 创建 /skills 文件夹(与 /app 同级)
  2. 添加包含你的函数的域文件夹
  3. 编写一个最小的SKILL.md
  4. 在你的应用中导入函数——AI现在也可以使用它

CaaS理念: 你的代码库已经充满了能力。让它们可被发现,它们就成为了技能。


更多资源