@absolutejs/艺术
人工智能制造的东西的输入生命周期.
AI生成的页面、报告、计划、电子邮件、甲板或图像不应消失 或者变成一个没有验证的blob。 应该有种, 结构化内容、所有权、出处、修订、能力、制作人、, 和明确的出版生命周期.
@absolutejs/artifacts 提供合同而不拥有你的数据库,
路线,授权,UI,或托管.
它拥有的
- 结构化的文物计划与运行时间验证
- 草案、公布和存档的生命周期状态
- 不可改变的修订历史、恢复和乐观的最新情况
- 结构化内容外加生成或源文件的不透明引用
- 艺术品、资产、渲染器和出版机存储界面
- 用于开发和测试的博物馆内文物和资产储存
- 与 AI 工具地图在结构上兼容的自有生命周期工具
- 模型、工具、跟踪和源实体的验证领域
- 文件、演示文稿、电子表格、, 数据集、代码、图像、音频、视频、电子邮件、档案和通用文件
- 可选桥到
@absolutejs/rag摄入量 - 带有原子多文件包的提供者中性生成登记册
- 分阶段、验证 -- -- 承诺前的多工艺批次,并附有完成收据
- 订正版或明确的实况出版物
- 为交易发包箱设计的持续生命周期事件
- 修订RAG索引状态和索引协调员
- 人工活性/源头分类和了解历史的资产垃圾收集
您的申请保留了授权, 持久的持久性, 公共标志, URL、通知、分析、提交和产品特定渲染.
定义类型一次
import { Type } from "@sinclair/typebox";
import {
createArtifactService,
createMemoryArtifactAssetStore,
createMemoryArtifactStore,
defineArtifactRegistry,
} from "@absolutejs/artifacts";
const registry = defineArtifactRegistry({
page: {
capabilities: ["archive", "edit", "preview", "publish"],
content: Type.Object({
blocks: Type.Array(
Type.Union([
Type.Object({ heading: Type.String(), type: Type.Literal("hero") }),
Type.Object({ body: Type.String(), type: Type.Literal("text") }),
]),
),
theme: Type.Union([Type.Literal("dark"), Type.Literal("light")]),
}),
label: "Page",
schemaVersion: 1,
},
});
const artifacts = createArtifactService({
assetStore: createMemoryArtifactAssetStore(),
registry,
store: createMemoryArtifactStore(),
});
const page = await artifacts.create("owner-123", {
content: {
blocks: [{ heading: "A real page", type: "hero" }],
theme: "light",
},
createdBy: "agent",
kind: "page",
provenance: { model: "your-model", tool: "create_page" },
title: "Launch page",
});
每一个成功的创建或生命周期突变都附加了不可改变的快照. 恢复历史创造了新的私人草案,而不是改写或 重写旧版本:
const history = await artifacts.listRevisions("owner-123", page.id);
const restored = await artifacts.restore("owner-123", page.id, 1);
生产持久性
在PostgreSQL上使用包拥有的Drizzle schema,包括Neon. 店铺 在解剖学上写下现在的文物,不可改变的修改和生命周期 发件箱事件。 它还坚持按修订指数编制州和栅栏 文物由所有者读取并变异.
import {
artifactDrizzleSchema,
createDrizzleArtifactStore,
} from "@absolutejs/artifacts/drizzle";
const store = createDrizzleArtifactStore({ db });
导出 artifactDrizzleSchema 你申请的Drizzle计划
普通迁移工作流程拥有四个表格。 插入并选择类型框
从这些表格直接生成的,从同一切入点出口;
主机应该重新使用它们,而不是重新定义数据库行计划.
当永久删除主机主机时, 请打电话 artifacts.purgeOwner(ownerId)。 。 。 .
制作店删除其目前的记录,修订,索引状态,
和一次交易中的发件箱事件; 孤儿资产字节仍受
包裹的历史感 垃圾收集.
文件备份的文物种类
直接使用捆绑的定义或用特定应用程序来组成定义 类型 :
import {
defineArtifactRegistry,
standardArtifactDefinitions,
} from "@absolutejs/artifacts";
const registry = defineArtifactRegistry({
...standardArtifactDefinitions,
page: myPageDefinition,
});
文件字节留在主机存储中 。 人工记录保留不透明的引用 名称、媒体类型、大小、校验和、角色和存储 URI。 URI没有治疗 作为公共 URL, 软件包只读取配置的资产 存储。 删除文件不会删除其字节, 因为旧的不可更改 订正案仍可参考.
const report = await artifacts.create("owner-123", {
content: { summary: "Quarterly results" },
createdBy: "agent",
kind: "document",
title: "Q3 report",
});
await artifacts.attach("owner-123", report.id, {
data: pdfBytes,
mediaType: "application/pdf",
name: "q3-report.pdf",
role: "primary",
});
多个生成的文件应使用一个分阶段交易,从而使用一个 文物修订:
const report = await artifacts.createBundle("owner-123", {
assets: [pdfOutput, docxOutput, thumbnailOutput],
content: { summary: "Quarterly results" },
createdBy: "agent",
kind: "document",
provenance: {
lineage: [{ relation: "generated_from", sourceId: "rag-document-123" }],
tool: "quarterly_report_generator",
},
title: "Q3 report",
});
当一件工作必须一起生产出几件文物时, 完成整批工作,
在永久存在前运行域验证器,并通过存储执行
执行 createBatch (Drizzle和内存商店的包装)
const staged = await artifacts.stageBatch(
"owner-123",
{
evidence: [{ sourceId: "research-run-123", sourceUrl: sourceUrl }],
items: [
{ artifact: worksheetInput, key: "worksheet" },
{ artifact: reportInput, key: "report" },
],
provenance: { tool: "prospecting_mission", traceId: mission.id },
},
{
validators: [
({ items }) =>
validateDomainEvidence(items).map((message) => ({
code: "evidence_invalid",
message,
})),
],
},
);
const receipt = await staged.commit();
if (receipt.status !== "committed") throw new Error(receipt.error);
每个文物都携带其批号、物品钥匙、证据和出处.
commit() 返回持久对账收据:,
修订,原子性,验证结果,以及任何存档赔偿. 这个
默认模式需要原子 ArtifactStore.createBatch失败的主机
提供交易可以明确选择 archive_on_failure; 已完成
先前的写作随后被存档并报告为 rolled_back 或者说
partial_failure调用 rollback() 承诺释放前的所有阶段
资产交易.
生成
发电机是中立的。 他们返回经过验证的结构化内容和 零或更多文件写入; 注册通过相同方式实现这些输出 文物捆绑生命周期:
const generators = createArtifactGeneratorRegistry([
{
kind: "presentation",
name: "company-deck",
generate: async ({ prompt }) => buildPresentation(prompt),
},
]);
const deck = await generators.generate(artifacts, {
createdBy: "agent",
kind: "presentation",
ownerId: member.id,
prompt: "Build the partner launch deck",
});
发电机可能暴露于 validate 函数。 捆绑起来
validateGeneratedArtifactFormats 验证器检查 CSV 行结构, RFC 822
头,ZIP可读性,以及PPTX包/XML完整性在持久性之前.
生成数件独立的文物,通过同样的原子接收
登记:
const receipt = await generators.generateBatch(artifacts, {
ownerId: member.id,
items: [
{ createdBy: "agent", key: "deck", kind: "presentation", title: "Deck" },
{ createdBy: "agent", key: "email", kind: "email", title: "Email" },
],
provenance: { tool: "campaign_generator" },
});
生成验证器运行于每个输出完成后, 在任何输出完成之前 承诺 验证失败返回一个按键回滚的完成收件到 无效输出.
RAG 摄入量
可选 @absolutejs/artifacts/rag 入口解决一个当前或
上传合同中的历史文物记录
@absolutejs/rag结构化内容列为JSON和每个附件
包含文件而不披露其存储 URI :
import { artifactToRAGUploads } from "@absolutejs/artifacts/rag";
import { buildRAGUpsertInputFromUploads } from "@absolutejs/rag";
const revision = await artifacts.getRevision("owner-123", report.id, 2);
const uploads = await artifactToRAGUploads(revision, assetStore);
const upsert = await buildRAGUpsertInputFromUploads({ uploads });
createArtifactRAGIndexCoordinator 将转换用耐用
pending, (中文(简体) ), indexed,以及 failed 状态。 它从文档中去除标识
替换成功后以前的索引修订。 设定 failureMode 改为
"isolate_uploads" 以独立索引结构化内容和资产。 一个坏
资产在保存成功时生成打入的部分收据
文档 id; 过期的 id 仅在修订完全成功后才删除.
事件和保留
每一个生命周期的变异都把活动 提供给同样的文物商店 调用它来写当前记录和不可更改的修改。 持久性适配器 应该把这些行 在一个数据库交易, 然后工人可以消费 未处理的RAG索引、预览、通知、扫描或 转换.
资产收集将存储候选软件与每个软件的参考文献进行比较
保留修订版. collectAssetGarbage({ dryRun: true }) 预览删除;
符合条件的只有比所配置的最低年龄长的未引用对象.
编写出版和制作
出版是一个适配器,因为公众访问是一个主机政策:
const artifacts = createArtifactService({
publisher: {
publish: async (artifact, { idempotencyKey }) =>
mintPublicTokenAndUrl(artifact, idempotencyKey),
unpublish: async (artifact, { idempotencyKey }) =>
revokePublicAccess(artifact, idempotencyKey),
},
registry,
store: postgresArtifactStore,
});
发布默认值为 pinned: 公共记录名称 确切的不可更改
修订. mode: "live" 是一个明确的备选方案,其修订工作取得了进展
,然后编辑.
制作人按文物种类和输出格式独立登记:
const renderers = createArtifactRendererRegistry([
{
format: "html",
kind: "page",
render: async (artifact) => ({
body: renderSafePage(artifact.content),
mediaType: "text/html; charset=utf-8",
}),
},
]);
软件包从未将生成的 HTML 或 JavaScript 视为可信任可执行文件 内容。 应用程序应界定结构化内容计划,并加以制作 通过控制适配器.
AI 工具
createArtifactTools 绑定创建、列表、获取、更新、发布和取消
操作到一个所有者。 返回的定义使用 TypeBox 输入和
不变 { description, input, handler } 使用的形状 @absolutejs/ai。 。 。 .
const tools = createArtifactTools({
createdBy: "agent",
ownerId: member.id,
service: artifacts,
});
只披露用户明确控制公众的出版工具 访问.
许可证
1.1商业来源许可证——免费发放给自己的产品、应用程序和 内部用途;你可能不会把它作为 互相竞争的人工智能的工艺品, 编辑、制作、出版或文物管理服务。 转换为 Apache 2.0于2030年7月14日发布. 见 自由主义。 。 。 .
浏览器文档预览
安装可选选项 docx-preview 端点和导入 renderDocxPreview 从
@absolutejs/artifacts/browser。通过 DOCX 矩阵和显示
返回的 HTML 为 srcDoc 在iframe 中输入 sandbox=""保留沙盒:
渲染器会禁用活动内容、外部资源、 HTML 块和链接.
通过您的应用程序认证的所有者扫描文件端点获取字节 .
浏览器预览大致为Word布局;总是保留原始文件.
过 { allowLinks: true } 以保存已验证的 HTTPS 和普通电子邮件链接.
使用 sandbox="allow-popups allow-popups-to-escape-sandbox" 对于此模式: 链接
在新标签中打开文档沙盒,没有打开者或参考者.
文档脚本和父页导航仍然禁用. 链接依然存在
默认禁用。 HTTP, 可执行的 URL, 证书和电子邮件参数
不接受.
格式化 Word 导出
renderFormattedDocx({ blocks, filename, pageSize: 'letter' }) 返回一个
ArtifactRenderResult 包含可编辑的 DOCX 字节。 块是段落,
标题,或项目符号;运行支持粗体、斜体和HTTPS/mailto超链接.
没有获取资源 。 默认体型为11.5分. 文件为:
限于2,000个块和1 MB的结构化输入.
对于简单的生成的草稿, documentBlocksFromText(text) 确认空白行
段落, #编号 :## 标题, -编号 :*编号 :• 子弹, **bold**,标记下链接和
赤色 HTTPS URL 。 这是一个有限的文本格式,不是一个完整的Markdown渲染器;
HTML 仍然为文字文本。 在Word相容的应用程序中,布局可以有所不同.