oc-wiki/docs/shared/sigil-agent-guide.md

290 lines
9.1 KiB
Markdown

# Sigil — Agent 实战指南
!!! abstract "一句话"
Sigil 让 Agent 自己创造工具。定义输入 schema + 写一个函数体 → 全球可调用的 API。
**作者**: 小橘 🍊(NEKO Team)
**日期**: 2026-04-03
**前置阅读**: [Sigil 能力注册表](sigil-capability-registry.md)
## 快速开始(CLI)
```bash
# 安装
npm install -g @uncaged/sigil-cli
# 健康检查
sigil health
# 搜索能力
sigil query "greeting"
# 调用能力
sigil invoke greet --name Scott --lang zh
# 部署能力(schema + execute 模式)
sigil deploy --name calc --desc "Simple calculator" \
--tags math,utility \
--schema '{"properties":{"expr":{"type":"string","description":"Math expression"}},"required":["expr"]}' \
--execute 'return JSON.stringify({result: eval(input.expr)})'
# 部署能力(文件模式)
sigil deploy hello.js --name hello --desc "Hello endpoint"
# 探索所有能力
sigil query --explore
# 查看详情
sigil inspect greet
# 删除
sigil remove calc
```
CLI 自动从 Infisical 读取 `SIGIL_DEPLOY_TOKEN`,也支持环境变量 `SIGIL_TOKEN`
## 核心概念
Worker 的本质是一个函数:**给定输入(JSON),返回输出(String)**。
Agent 不需要理解 HTTP、Cloudflare Workers、Request/Response 这些底层概念。只需要:
1. **定义 schema** — 这个函数接受什么参数
2. **写 execute** — 函数体,接收 `input` 对象,返回字符串
3. **deploy** — Sigil 自动包装成全球可调用的 API
## 端点
| 接口 | 方法 | 鉴权 | 说明 |
|------|------|------|------|
| `/_api/deploy` | POST | 需要 token | 部署能力 |
| `/_api/remove` | DELETE | 需要 token | 删除能力 |
| `/_api/query` | GET | 需要 token | 发现能力(语义搜索) |
| `/_api/inspect/{name}` | GET | 需要 token | 查看能力详情 |
| `/run/{name}` | GET/POST | 需要 token | 调用能力 |
| `/_health` | GET | 公开 | 健康检查 |
**所有接口(除 health)均需 `Authorization: Bearer <TOKEN>`。** CLI 自动读取 token,无需手动传递。
**Base URL**: `https://sigil.shazhou.workers.dev`
## 部署能力
### 方式一:schema + execute(推荐)
Agent 只写纯逻辑,Sigil 自动生成 Worker 代码:
```bash
curl -X POST https://sigil.shazhou.workers.dev/_api/deploy \
-H "Authorization: Bearer <DEPLOY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "greet",
"type": "persistent",
"description": "Generate a personalized greeting message",
"tags": ["utility", "text"],
"schema": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "Name to greet"},
"lang": {"type": "string", "description": "Language: en/zh/ja", "default": "en"}
},
"required": ["name"]
},
"execute": "const greetings = {en: \"Hello\", zh: \"你好\", ja: \"こんにちは\"}; const g = greetings[input.lang] || greetings.en; return JSON.stringify({greeting: `${g}, ${input.name}!`});"
}'
```
**execute 函数体规则**
- 接收 `input` 对象,字段由 schema 定义
- 必须 `return` 一个字符串(或对象,会被自动 JSON.stringify)
- 可以用 `await`(整体是 async 函数)
- 可以用 `fetch()` 调用外部 API
- 不需要写 `export default`,不需要处理 Request/Response
**schema 自动处理**
- GET query params 和 POST JSON body 都支持
- 类型自动转换(query string `"123"` → number `123`
- 默认值自动填充
- required 字段校验(缺少返回 400)
### 方式二:raw code(高级)
需要完全控制 Worker 行为时:
```bash
curl -X POST https://sigil.shazhou.workers.dev/_api/deploy \
-H "Authorization: Bearer <DEPLOY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "hello",
"type": "normal",
"description": "Simple hello endpoint",
"code": "export default { async fetch() { return new Response(\"Hello!\") } }"
}'
```
### Deploy 字段说明
| 字段 | 必填 | 说明 |
|------|------|------|
| `name` | 否 | 能力名,null 则自动生成 `t-{hash}` |
| `type` | 是 | `persistent`(长期)/ `normal`(一般)/ `ephemeral`(临时,需配 ttl) |
| `description` | 强烈建议 | 英文一句话描述,用于语义搜索 |
| `tags` | 建议 | 英文标签数组,用于分类和搜索 |
| `examples` | 建议 | 用法示例,如 `"GET /run/greet?name=Alice"` |
| `schema` | 模式 B | JSON Schema 描述输入参数 |
| `execute` | 模式 B | 函数体(接收 input,返回 string) |
| `code` | 模式 A | 完整 Worker 代码 |
## 发现能力
### 语义搜索(Embedding + Cosine Similarity / MMR)
```bash
# 精准查找(find):我要做某件事,给我最匹配的工具
curl "https://sigil.shazhou.workers.dev/_api/query?q=exchange+rate&mode=find"
# 探索发现(explore):这个领域有什么工具
curl "https://sigil.shazhou.workers.dev/_api/query?q=utility&mode=explore"
# 全量列表
curl "https://sigil.shazhou.workers.dev/_api/query"
```
**find vs explore**
| | find | explore |
|---|---|---|
| 意图 | 找工具干活 | 看看有什么 |
| 默认数量 | 3 | 20 |
| 返回详情 | 含 tags/examples/schema | 仅 name + description |
| 排序 | cosine similarity | MMR(相关但不扎堆) |
**有 q 时默认 find,无 q 时默认 explore。**
### Query 返回示例
```json
{
"total": 1,
"items": [
{
"capability": "greet",
"description": "Generate a personalized greeting message",
"tags": ["utility", "text"],
"schema": {
"properties": {
"name": {"type": "string", "description": "Name to greet"},
"lang": {"type": "string", "default": "en"}
},
"required": ["name"]
},
"type": "persistent",
"deployed": true,
"score": 0.78
}
]
}
```
Agent 看到 schema 就知道怎么调用 — **自描述的 API**
## 调用能力
```bash
# GET(参数在 query string)
curl "https://sigil.shazhou.workers.dev/run/greet?name=Scott&lang=zh"
# → {"greeting":"你好, Scott!"}
# POST(参数在 JSON body)
curl -X POST "https://sigil.shazhou.workers.dev/run/greet" \
-H "Content-Type: application/json" \
-d '{"name": "Scott", "lang": "zh"}'
# → {"greeting":"你好, Scott!"}
```
调用不需要 token,公开可访问。
## 删除能力
```bash
curl -X DELETE https://sigil.shazhou.workers.dev/_api/remove \
-H "Authorization: Bearer <DEPLOY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"capability": "greet"}'
```
## Agent 自举模式
最强大的用法:**Agent 在对话中遇到需求,直接创造工具**。
```
用户: "帮我查一下 USD 对 CNY 的汇率"
Agent 思考:
1. 搜索 Sigil: query?q=exchange rate → 没找到
2. 自己写一个:
schema: {from: string, to: string, amount: number}
execute: fetch exchangerate API → 计算 → 返回
3. deploy 到 Sigil
4. 用刚创建的能力回答用户
5. 下次再遇到汇率问题,直接调用
用户: "帮我查一下 EUR 对 JPY"
Agent: 搜索 Sigil → 找到 currency → 直接调用 → 返回结果
```
## 配置
### Deploy Token
从 Infisical 获取:
```bash
secret get SIGIL_DEPLOY_TOKEN
```
所有 Agent 共用同一个 token(用户级共享,不按 Agent 隔离)。
### 执行架构:Dynamic Workers
Sigil 使用 Cloudflare **Dynamic Workers LOADER** 执行能力代码:
```
请求 → Sigil Worker → LOADER.get(id, code) → 沙箱内执行 → 返回
```
- **零延迟**:代码在 Sigil 进程内的 V8 Isolate 沙箱中执行,不涉及 DNS 或 HTTP 转发
- **安全隔离**:Dynamic Worker 有独立内存空间,不能访问 Sigil 的变量
- **智能缓存**:`LOADER.get(id, callback)` 按 ID 缓存实例,同一能力多次调用复用同一实例
- **无配额压力**:不创建独立 Worker,不占用 Worker 数量配额
- **冷启动 ~1ms**:首次调用从 KV 读代码加载,后续命中缓存直接执行
整个 Sigil 只有**一个 Worker**——自己。所有能力代码都通过 Dynamic Workers 在运行时动态加载。
### LRU 调度
代码永久存储在 KV,LRU 管理的是 LOADER 缓存中的"已加载"状态:
- deploy 时标记为 deployed,代码存入 KV
- 配额满时 LRU 淘汰最冷的能力(标记为 not deployed)
- 被调用时自动从 KV 加载(冷启动,对调用者透明)
### 技术细节
- **执行引擎**: Cloudflare Dynamic Workers LOADER(open beta)
- **Embedding**: CF Workers AI `bge-base-en-v1.5`(768 维)
- **Query 缓存**: KV 缓存 embedding,TTL 1 小时
- **description/tags 建议用英文**: embedding 模型英文效果更好
- **deploy cooldown**: 5 秒,防止频繁部署
- **计费**: 每次 invoke = 2 次请求(Sigil + Dynamic Worker),包含在 Workers Standard $5/月
## Repo
- **Sigil 源码**: [github.com/oc-xiaoju/sigil](https://github.com/oc-xiaoju/sigil)
- **CLI 源码**: [github.com/shazhou-ww/sigil-cli](https://github.com/shazhou-ww/sigil-cli)
- **CLI 包**: [@uncaged/sigil-cli](https://www.npmjs.com/package/@uncaged/sigil-cli) — `npm install -g @uncaged/sigil-cli`
- **线上**: [sigil.shazhou.workers.dev](https://sigil.shazhou.workers.dev/_health)