@aid-framework/cli
这个 aid 命令: 脚手架、 验证、 编译、 索引和评价来自单一声明的 AI 应用程序
光谱文件 .
你写 app/app.spec.yaml。 。 。 . aid 检查它,将其编成一个可运行的服务, 并打开它的行为.
在生成的树上,没有任何东西是手写的,你写的也从未被覆盖过.
安装
npm install --save-dev @aid-framework/cli
要求节点.js 24或更新. 或运行它而不安装:
npx @aid-framework/cli --help
快开始
npx aid init my-app
cd my-app
npx aid validate
npx aid gen
3个命令,生成的应用程序存在:
my-app/
README.md
app/
app.spec.yaml
business/ ← yours: prompts, tool handlers, domain logic
generated/ ← the compiler's: never hand-edit
aid.manifest.json ← provenance and per-file hashes
为它服务
生成器拥有路径;应用程序决定挂载什么以及如何运行. 这个切入点是
你的,还有几行.. app/main.py数字 :
from fastapi import FastAPI
from app.generated.routes.answer_ticket import answer_ticket_router
app = FastAPI(title="my-app", version="0.1.0")
app.include_router(answer_ticket_router)
安装运行时间和服务器,然后运行 :
pip install aid-runtime-python "fastapi>=0.115,<1" "uvicorn>=0.30,<1"
uvicorn app.main:app --reload
aid gen 从不写 main.py 或一个 pyproject.toml: 安装和包装是应用决定,a
猜到他们的发电机 会在下一场比赛中压倒你的选择.
启动光谱宣布没有管道,所以是新鲜的 init 生成结构,但没有路径。 添加一个管道
改为 app/app.spec.yaml 和再生, 以及一个路由器模块出现在HTTP服务管道上.
图标
| 命令 | 它会做什么 |
|---|---|
aid init [dir] | 脚手架工程:一个启动点和一个README |
aid validate [spec] | 解析光谱, 构建 IR, 运行每个建时门 |
aid gen [spec] | 编译谱并调和树与它 |
aid ingest [spec] | 将检索表索引到存储处 |
aid eval [spec] | 运行 eval 闸门,或者记录它测量的基线 |
aid doctor [spec] | 分析树与谱:漂移,出处和版本不匹配,缺失和过时生成的文件. 报告; 无文字 |
每个命令都接受 --help 对其本身的选择和 --json 用于机器可读输出.
退出代码
退出代码是合同,因为这是CI的意思:
| 代码 | 含义 |
|---|---|
0 | 按照要求,该项目 |
1 | 光谱,门,目标,或者工作树说不 |
2 | 援引错误,或者CLI在内部失败 |
1 财务报告和审定财务报表 2 有意的区别。 由 spec 问题引起的红色建筑在 spec 中固定; 红色建筑
由下列人员造成: 2 在引用中被固定或是一个错误。 折叠它们会把人送到错误的文件中.
--json
每个命令都回答 --json 与 一个 JSON的文件在Stdout。 人能读到的文本和进展
到斯德尔,所以 aid validate --json | jq 工作不用过滤.
npx aid validate --json | jq -r '.diagnostics[] | select(.severity=="error") | .code'
光谱路径
没有参数,命令读取 app/app.spec.yaml - 路径 aid init 创建生成器和路径
编入. 通过一个路径来覆盖它 :
npx aid validate path/to/other.spec.yaml
目标
一个Spec宣布它的目标,和 aid gen 一次发出一个目标:
project:
name: my-app
targets:
- py-fastapi
- ts-vercel
npx aid gen # the first declared target
npx aid gen --target ts-vercel # any other declared target
--target 在宣布的光谱目标中选择;它不能发明光谱。 给目标命名时, spec 不
宣告失败 target-unsupported 并列出申报的内容。 这在目的上更为严格——一个例子是
并且默默生成一个它没有要求的堆栈 将使这个谱系成为谎言.
| 目标 | 输出 | 运行时间 |
|---|---|---|
py-fastapi | FastAPI 服务, Pydantic 模型 | aid-runtime-python |
ts-vercel | Next.js / Vercel 函数, Zod 模型 | @aid-framework/runtime |
aid gen: 规划,然后调和
gen 绝不盲目地写作。 它计划了完整的文件集 从IR, 比照该计划树
然后调和.
| 级别 | 拥有者 | 在再生时 |
|---|---|---|
app/generated/ | 编译器 | 覆写——永远不要手写 |
app/business/ | 你们 | 如果缺少, 则从未触碰过 |
不写任何东西的预览 :
npx aid gen --dry-run
py-fastapi: dry run, 16 created, 0 updated, 0 unchanged, 0 kept
created:
app/business/prompts/__init__.py
app/generated/deps.py
app/generated/requests.py
app/generated/schemas.py
...
计数是 created 编号 : updated 编号 : unchanged 编号 : kept,所以没有再生 说,而不是寻找
像进步.
当生成的文件被手工编辑时
gen 记录每个文件的 SHA-256 aid.manifest.json如为 generated/ 磁盘上的文件无
更符合其记录的散列, 一个人类编辑 gen 拒绝覆盖 这个 它写了新的
内容旁边是 <path>.aid-rej 并报告与两者的冲突.
选择权在于你明确:
npx aid gen --force # discard the hand edit and overwrite
或移动文件到 business/ 并点 商业接合它。 无论哪种方式,编辑都不沉默地丢失,
这才是最重要的故障模式:一个无条件覆盖其唯一信号的生成器
有人类不同意它.
aid eval: 游戏行为,而不是字节
生成的服务因运行而异——模型不具有决定性,假想以其他方式产生测试
要么永远是红色的 要么是衡量什么. aid eval 因此,取样和比较分布:
npx aid eval --record # record a baseline from the current behaviour
npx aid eval # gate the current behaviour against it
国家领导才能不是
这不是一个运行的时间。 它读取光谱,编译它,并报告;生成的应用程序导入运行时包
在没有安装CLI的情况下运行. @aid-framework/cli 是一个 devDependency 确切地说
理由,你觉得呢.
API 密码
CLI 也可以导入, 因此一个构建工具可以在没有子进程的情况下驱动它:
import { main, runCli } from '@aid-framework/cli';
process.exitCode = await runCli(process.argv.slice(2));
| 导出 | 目的 |
|---|---|
runCli(argv) | 运行命令并返回其退出代码 |
main | 命令调度器 |
EXIT_OK, (中文(简体) ), EXIT_REJECTED, (中文(简体) ), EXIT_USAGE | 退出码常数( E)0, (中文(简体) ), 1, (中文(简体) ), 2(中文(简体) ) |
相关软件包
@aid-framework/spec- 语种语言@aid-framework/ir- IR及其建造时的大门@aid-framework/generator-py-fastapi@aid-framework/generator-ts-vercel
许可证
阿帕奇 - 2.0。由 AID 框架生成的代码是 不受该许可证的限制.