我为 AI 代理构建了 Docusign —— 具体做法
Source: Dev.to
AI 代理可以起草合同、协商条款并完成语言定稿,但一旦需要签名,工作流就会中断。传统的电子签名服务(DocuSign、HelloSign、Adobe Sign)依赖浏览器、OAuth 流程或人工步骤,这些都不适合非人类发送者。
我构建了 signb.ee —— 为 AI 代理设计的文档签署基础设施。
Introducing signb.ee
signb.ee 提供一个单一的 API 调用,接受 markdown(大多数 LLM 的原生输出格式),并处理整个签署流程:
- 将 markdown 转换为干净的 PDF
- 验证发送者(API 密钥或邮件 OTP)
- 向收件人发送签署链接的电子邮件
- 让双方选择签名风格并签署
- 返回带有防篡改签署证书的 SHA‑256 认证 PDF
无需 SDK,无需 OAuth 流程,也无需浏览器自动化。
API 示例
curl -X POST https://signb.ee/api/v1/send \
-H "Content-Type: application/json" \
-d '{
"markdown": "# Mutual NDA\n\nTerms here...",
"sender_name": "Alice",
"sender_email": "alice@company.com",
"recipient_name": "Bob",
"recipient_email": "bob@acme.com"
}'signb.ee 工作原理
- Markdown → PDF – 服务将 Markdown 渲染为 PDF。
- 发送者验证 –
- 无 API 密钥:向发送者发送电子邮件 OTP。
- 有 API 密钥:发送者已预先验证,跳过 OTP。
- 收件人流程 – 收件人收到带有签署链接的电子邮件,选择签名样式并完成签署。
- 证书 – 双方均收到包含 SHA‑256 哈希和签署证书的 PDF。
实现细节
PDF 生成
我最初尝试使用 Puppeteer(HTML → 截图 → PDF),但 50 MB 的 Chromium 二进制文件导致无服务器平台出现大量冷启动。改用 pdf‑lib——一个纯 JavaScript 的 PDF 库,消除了原生依赖,并将包体积缩小了 95 %。
import { PDFDocument, rgb, StandardFonts } from "pdf-lib";
const pdfDoc = await PDFDocument.load(originalPdfBytes);
const page = pdfDoc.addPage([595, 842]); // A4
const helveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold);
page.drawText("SIGNING CERTIFICATE", {
x: 50,
y: 750,
font: helveticaBold,
size: 18,
color: rgb(0.1, 0.1, 0.1),
});
// ... add signatures, timestamps, SHA‑256 hash冷启动时间从约 8 秒下降到 < 500 毫秒。
身份验证选项
| 模式 | 工作原理 |
|---|---|
| API‑key | 发送方已预先验证;收件人可立即获取签署链接。 |
| OTP | 发送方收到包含一次性验证码的电子邮件;几乎无摩擦,无需事先设置。 |
Cookie Bug with BetterAuth
在生产环境中,HTTPS 下的认证 cookie 会带有 __Secure- 前缀,而中间件只检查 better-auth.session_token。解决办法只需一行代码:
// Before (broken in production)
const session = request.cookies.get("better-auth.session_token");
// After (works everywhere)
const session =
request.cookies.get("__Secure-better-auth.session_token") ||
request.cookies.get("better-auth.session_token");如果在 HTTPS 上使用 BetterAuth,请确保同时检查这两种 cookie 名称。
端到端流程
- Agent →
POST /api/v1/send- Markdown → PDF,上传到 Blob 存储
- 发送者收到 OTP 邮件(或已预先验证)
- Sender 点击验证链接 → 创建账户,选择签名样式,签署 → 收件人收到签署链接
- Recipient 点击链接 → 查看 PDF,选择签名样式,签署 → 双方收到带有证书的最终 PDF
签名证书内容
- 双方的姓名和签名
- 每个签名的 UTC 时间戳
- 签署者的 IP 地址
- 完整文档的 SHA‑256 哈希值
- 验证 URL
Future Work
- MCP server discovery – 允许代理(Claude、Cursor、Windsurf 等)通过工具描述自动发现 signb.ee,消除手动文档的需求。
- Webhook notifications – 在文档签署完成时触发 webhook,实现完全自动化的代理工作流,无需依赖电子邮件。
API 可用性
API 已上线,地址为 **https://signb.ee**,提供免费套餐(每月 5 份文档)。无需信用卡。
代理技能的安装
npx skills add signbee/skill --skill signbee -gOpenAPI 规范和 llms.txt 可供代理使用。
Feedback
我正在寻找关于 API 设计的反馈,尤其是来自构建代理工作流的人的反馈。有什么缺失吗?有什么可以让它对你的代理更有用的地方吗?