开发规范
新应用默认使用标准 plugin.json;旧 aidc.app.json 继续支持。Apps 与 OpenAI Plugin 的包、UI、默认 AIDC 登录和可选 OAuth 规范见 Plugin 兼容。
AIDC 内部与客户开发者共用的一套规范。AIDC 成员在 aidc-cloud 仓库里开发时,完整版在 Skill aidc-development(.claude/skills/aidc-development/)与 docs/api-standards.md;这里是面向所有开发者的摘要。
1. 先 API + CLI,先智能体后 UI
每个能力先有 API(契约化、可发现),再有 CLI(API 的薄封装),最后才是 UI——UI 只调同一套 API。设备能力(摄像头、麦克风)在浏览器 SDK 里实现,但凡涉及服务端的一步(票据、模型、数据)仍然走 API。
2. 给智能体用的形态
- API 永远返回信封:
{ok:true, data, meta}或{ok:false, error:{code, message, details}, meta};错误码稳定、可枚举(见 OpenAPI)。 - CLI 每条命令都有
--json,stdout 不是终端时默认 JSON;进度提示走 stderr。 - 永不交互;缺参数直接报错并说明怎么补。
- 退出码:
0成功、1一般错误、2参数、3未登录、4无权限、5不存在、6冲突、7限流 / 额度、8上游故障。
3. 幂等与 dry-run
- 发布是幂等的:版本内容寻址(同样的文件 = 同一个版本),通道晋升是「把指针设为版本 N」。重试不会产生重复数据。
- 有副作用的操作都支持预演:API 带
x-aidc-dry-run: true,CLI 加--dry-run,返回 202 与将要发生的计划。
4. 复用,不重复造轮子
登录、会话、Key、计费、限流、模型上游、实时转写、Markdown 渲染……平台都已经有一份。应用里需要这些能力时调 SDK,不要自己再写一套;平台内部开发时查 aidc-development 的复用登记表。
5. 依赖:站在成熟基础设施上
- 公认的基础设施放心用,不要自研替代品:ffmpeg、PostgreSQL、Redis、浏览器原生的
getUserMedia/MediaRecorder/ WebRTC / Web Audio / canvas、OpenAI 兼容协议。 - 不成熟的第三方库(单人维护、长期无发布、依赖树深)默认不引入;确需引入时钉版本、包一层适配。
- 浏览器端只从
cdn.jsdelivr.net/cdnjs.cloudflare.com加载第三方脚本,写进清单的cdn。
6. 文档与版本
- SDK 与 CLI 同步发版(SemVer),变更记在 更新记录;浏览器 SDK 的路径带大版本(
/developer/sdk/v1/),破坏性变更才升v2,旧版继续可用。 - API 在
/api/v1/**内不做破坏性变更。
7. 安全边界
- 开发者 Key(
aidc-dk-…)只放在服务端 / CLI / 环境变量里,绝不写进前端代码。浏览器里的应用用平台注入的应用票据(aidc-at-…,短命、只能调清单里声明的模型与数据集)。 - 客户应用跑在 CSP 沙箱里(不透明源,拿不到访客的登录态),只能凭票据调 API。
- 数据只出聚合:数据集的固定报告不返回明细行。
8. 界面
- 所有应用用界面 SDK:页面引
/developer/sdk/v1/ui.css,按钮、表单、卡片、表格、对话框用它的aidc-*类;应用自己的 CSS 只写版面与业务特有的东西。 - 主按钮实心黑,信号橙只用于加载、选中与需要注意的状态;等待态用
//加载动效,不用圆环 spinner。 - 确认、输入、提示用
ui.confirm/ui.prompt/ui.toast,不用window.confirm/prompt/alert。 - React 项目用 shadcn/ui 与
@aidc注册表(AIDC UI),令牌与 HTML 应用同一套。
9. 一个 SDK 由什么组成
AIDC 的每个 SDK 都是同一副骨架(AIDC 内部的完整清单与自动检查在 aidc-development 的 SDK 标准里):
| 部分 | 在哪里 |
|---|---|
| API(有服务端的一步时) | /api/v1/**,契约进 OpenAPI;纯前端能力的契约是机器可读的登记表(如界面 SDK 的 ui.json) |
| CLI | aidc <命令组> <动作>,--json、--dry-run、稳定退出码 |
| 浏览器模块 | aidc.js 里的一个具名导出(import { ui } from "/developer/sdk/v1/aidc.js") |
| 文档 | 一页 Markdown(每页都有 .md 原文给智能体),进总览表、llms.txt 与 Agent Skill |
| 清单登记 | aidc.app.json 的 sdk;部署时静态分析,用了没登记的拒收 |
| 版本 | 与其余 SDK 同步发版,记在更新记录 |
10. 每个应用一张应用卡片
平台按清单、部署时的静态分析、通道与使用日志给每个应用自动生成应用卡片(负责部门、版本、用了哪些 SDK、是否连数据库、读写哪些数据、对外能力与依赖、访问范围、近 7 天使用),开发者不手写,但要让它是对的:
- 清单写
owner(部门 / 岗位或智能体 / 负责人)与一句话summary; sdk、semantic、streams、models如实登记(用了没登记的部署拒收,登记了没用到的卡片上会标出来);- 想被别的应用或工作流用,就把可以对外的查询 / Action 写进
exports; version每次改动都升(SemVer)。
查看:应用顶栏「卡片」、appCard()、aidc app card、GET /api/v1/developer/apps/{命名空间}/{slug}/card。
11. 成本与资源:不在不知情的状态下增加账单
- 先算账,再开:按量计费的东西(函数时长、流量、模型 token、实时转写、外部 API)上线前估一下「次数 × 单价」。
- 开完就关:临时开的服务、后台进程、测试用的 Key、测试数据、定时任务,用完就关掉、吊销、删除。
- 每个应用都有上限,清单
limits不写就用缺省值:计算分钟 2000 / 月(实时连接挂着、工作流运行、模型调用的时长)、每天 100 万 token、每 IP 每分钟 30 次请求、每天 100 场实时转写、每天 20 封通知。用完返回429 quota_exhausted,下月 / 次日恢复。调高就是允许它花更多钱,部署时会告警。用量:aidc app usage <slug>。见发布 SDK。 - 长连接只在有人看的时候开:SDK 的实时连接在页面隐藏 1 分钟后自动断开、切回来续上(不丢不重);不要用
setInterval轮询服务端(部署时告警)。
12. 触发优先于定时
- 数据一变才需要做的事,用数据流 + 工作流的
trigger.change(when条件、cooldown冷却):没变化时零成本、不写 cron。 - 定时(
trigger.schedule)只给「时间本身就是条件」的事:日报、月底对账、数据该来却没来的看门狗。每天一次是常态。 - 频率分级:比每 5 分钟还密拒收;5 分钟到 1 小时一次是高频,部署时一定告警(带上每月次数与预计的计算分钟);1 小时到 1 天提示次数;每天及以上正常。
- 告警、提醒用工作流的
notify步骤发邮件:收件人必须是本公司账号,同样的通知在冷却时间内只发一次,每天有上限,每一封发没发出去都有记录。
13. 产品自提升
我们根据每次开发遇到的问题持续改进规范:遇到新问题、或者发现规范少了一条判断,就在同一次改动里把它变成一条规则或一个自动检查(测试、部署校验),并记进问题账本——同样的问题不出第二次。提升本身也守第 11 条:不为提升去开资源,要开就先算账、用完就关。
本页由 developer/docs/standards.md 生成 · Markdown 原文 · llms.txt