@entrinsik/vite-plugin-informer (英语)
Vite插件和部署Informer App开发工具:一个本地的dev服务器接通一个活的Informer,以及一个部署管道,将您的项目组装并运至App的库.
快开始
npm install -g @entrinsik/informer-cli
inf login <your-informer-url> # once: the sign-in dev and deploy use
npm create vite@latest my-app -- --template react
cd my-app
npm install -D @entrinsik/vite-plugin-informer
npx informer-init # wires vite config, informer.yaml, deploy scripts
npm run dev # local dev against the server you signed in to
npm run deploy # assemble + upload + deploy (or: inf deploy, which asks first)
没有 .env 需要:在环境中没有证书或 .env,插件询问 Informer CLI(inf auth tokendev 服务器在运行时更新它. INFORMER_URL 与 INFORMER_API_KEY (或 INFORMER_USER 财务报告和审定财务报表 INFORMER_PASS(单位:千美元) .env 仍能工作,并在定时获胜; INFORMER_URL 单挑哪一个牌子用.
informer-init 留下一个已有的 @entrinsik/vite-plugin-informer 条目,并且只在依赖缺失时写出一个——在这种情况下,它使用自己的版本(2.12.0后;在此之前它写) ^1.0.0) (中文(简体) ). 早些时候的脚手架还装着 ^1.0.0,它解决到1.0.5 并且比下面的一切要早:用手碰它.
什么部署舰艇
组装器上传您的已建前端加上这些源树, 匹配 App 库在 Informer 中的结构 :
| 文件夹 | 成为 |
|---|---|
server/ | API路线,在App下发送 /api 表面 |
webhooks/ | 可公开调用的网路 |
tools/ | AI工具,对App的代理保密 |
mcp/ | 在 App 的 MCP 端点上曝光的工具 |
channels/ | 现场频道处理器 : join 编号 : joined 编号 : leave 和事件名处理器 channel.send(),或频道演员(config.actor: 每个频道一个直播实例,并 start 编号 : tick 编号 : stop 编号 : snapshot(三); npm run dev 当地运行和 channels: 块中 informer.yaml 只声明中继( 每个条目需要) on(中文(简体) ) |
migrations/ | 工作空间数据库迁移,按部署顺序运行 |
embeddings/ | 声明嵌入用途案例(见下文) |
lib/, (中文(简体) ), shared/ | 上面树可导入的模块 |
informer.yaml 宣布依赖性,原始 API 访问,角色,和(可选)最小 Informer 版本.
服务器兼容性
部署开始于询问目标服务器是什么( P)GET /api/about,一个未经认证的请求)并适应答案,因此这个插件的一个版本可以在混合放行上驱动一个车队.
下方需要的东西 前2026.1.3 (英语): App频道(channels/,则 channels: 块, broadcast()),嵌入泵(embeddings/, (中文(简体) ), embed()),分级上传/下载(uploads编号 :downloads 在操作袋上, __INFORMER__.upload()页:1 platform 说明本身.
针对一个更老的服务器 CLI:
- 叶子
channels/财务报告和审定财务报表embeddings/在你的磁盘上. 这些版本不承认文件夹是服务器侧面,所以那里上传的任何东西都会提供给任何App查看器——包含您的工作空间SQL和频道授权逻辑. 其余的App正常部署; 警告名称被跳过和为什么. - 列出每个惰性特性因此绿色部署不能被误认为是工作部署.
- 强制执行
requires: { informer: … }自己来. 2026.1.3之前的发布忽略了这个块,所以没有这个App宣布一个楼层会部署干净的到无法运行的服务器上. 在App的图书馆被触摸之前,部署被拒绝.
版本不可比的服务器( a) dev 构造,或 /about 被当做是电流和警告的——将它分解用于从源头建造的建筑物.
App Channels 第2阶段(插值为- 2.11: channel.send(),则 joined 导出和事件名导出 channels/ 文件、通配符订阅、帧 seq 并重放, connected)需要搭载I5-13027的2026.1.3服务器. 版本探测器无法从早期的2026年分辨出这样的服务器. 1.3 建造,因此部署没有门:一个较早的建筑拒绝 channels/ 文件导出 joined 或事件名称,并接受 channels: 无条目 on 当前服务器拒绝。 dev服务器运行阶段2的合同不管如何;插件2.12.0将其频道语义与服务器的(wildcard gating,再播放过期,以及每个用户发送预算)相协调,因此在2.11.0上,dev镜像具有阶段2表面但并非其全部行为.
频道演员(插图 2.13.0: config.actor 文档, request.member, (中文(简体) ), __INFORMER__.serverNow())需要一个报告服务器 platform.capabilities.channelActors;在不这样做的情况下,同一文件与普通的频道处理器运行,每个消息有一个新鲜模块. 下 npm run dev 每个混凝土通道都有它自己的模块实例, 呼叫一次运行一次, tick() 在计时器上运行,演员停止 idleMs 在最后一页离开之后. snapshot() 保存在内存中,所以编辑一个文件 channels/, (中文(简体) ), shared/, (中文(简体) ), lib/ 或者说 server/ 重新启动新代码上运行的演员, 以相同的页面订阅快照: 正在运行的游戏在编辑中幸存下来 。 服务器的集群,租赁,计费和广播限制没有Dev对应.
具有可选链条的运行时间特征检测,因为 platform 在2026.1.3之前完全缺席:
if (platform?.capabilities?.channels) broadcast('tickets', { … });
一个市场出版不受影响: 存档总是携带每个源树, 因为安装它的服务器在出版时并不为人所知.
嵌入层
Apps可以在自己的工作空间数据上公开地保持向量嵌入. 你送一个 embeddings/ 文件夹为 每个使用案件一个文件;Informer平台作为 嵌入泵 询问您的 App 正在等待什么, 将内容块并嵌入到计费批次中, 然后将矢量交回您的 App 以存储在自己的工作空间表格中。 你从不自己叫一个嵌入式提供者,而平台也从不保存你本体的副本——你自己的表格是分类账.
每次使用大小写文件导出 GET 财务报告和审定财务报表 POST (缺失的处理器失败部署)和(可选)a config 字节; 省略键取下方的默认值, 配置中没有触发的用例仅在部署和手动运行时运行 :
// embeddings/tickets.js
export const config = { chunking: 'prose', on: ['ticket.created'], cron: '0 * * * *', revision: 1 };
// GET: the rows that still need embedding. The query IS the watermark:
// never embedded, stale, or written under an older revision.
export async function GET({ query, batch }) {
return await query(`
SELECT t.id, t.subject || ' ' || t.body AS content
FROM tickets t
LEFT JOIN ticket_embeddings e ON e.ticket_id = t.id AND e.seq = 0
WHERE e.ticket_id IS NULL OR e.embedded_at < t.updated_at OR e.revision <> $2
ORDER BY t.id
LIMIT $1
`, [batch.limit, batch.revision]);
}
// POST: store the finished vectors wherever your migrations put them.
export async function POST({ query, batch }) {
for (const doc of batch.docs) {
await query('DELETE FROM ticket_embeddings WHERE ticket_id = $1', [doc.id]);
for (const c of doc.chunks) {
await query(
'INSERT INTO ticket_embeddings (ticket_id, seq, embedding, content, revision) VALUES ($1, $2, $3::vector, $4, $5)',
[doc.id, c.seq, JSON.stringify(c.embedding), c.content, batch.revision]
);
}
}
return { stored: batch.docs.length };
}
如何运作,简而言之:
- 你的存储是分类账. 因为
GET反加入您自己的嵌入表, 泵具有一元能和相撞耐性: 中途死亡的跑会发现同样的行等待下一次. - 触发器会合. 部署插孔每个使用例(初始回填),
emit()匹配的事件on:插针,cron月台扫荡了所有被扫荡的东西 人工跑步直接声称是同一个单机租赁,因此没有双机套. - 失败是有限度的. 由于某种原因失败的跑步可能不会以翻倍的延迟击中(一个提供者的blip,一个处理器的超时),并在连续5次失败后停放;一个无法成功即位(一个被拒绝的密钥,一个耗尽的预算,一个违反合同)的跑跑跑会同时被停放. 每个 Park 保留在使用大小写状态行上的出错;下一个触发器会给它再一个尝试,成功的运行会重置计数.
revision是无效的. 抽水机的绳子 使你和你的配置相配(切入配置 预算 ),config.revision)到已解决的平台嵌入模型. 放在每个向量旁边,然后比较一下GET: 接通配置, 改变块, 或者一个管理员将嵌入模型的所有表面重新定位为待再嵌入的工作 .- 墓碑上刻有无法嵌入的文件 平台侧以内容散列并重新报告
skipped: true在每跑一跑的时候,请在自己的桌子上盖上盖章,并把他们排除在外GET。 。 。 . - 工作空间 pgvector. 具有嵌入能力的应用程序得到
vector在服务器可能创建扩展时提供扩展名( 否则部署日志会命名原因并使用vector类型失败,所以迁移可以声明真实vector(...)栏;ON DELETE CASCADE外国钥匙是清理的故事. - 腾讯时间. 每个处理器袋(
server/, (中文(简体) ),webhooks/, (中文(简体) ),tools/, (中文(简体) ),mcp/获得embed(name, text)返回时{ embedding, revision }。 。 。 .name必须是一个公开的使用案例。 在修改和按距离排序时进行过滤——在存储的行仍在旧行中时,重新指定嵌入模型的管理员会将您的查询向量放入一个新的空间,以及未过滤的ORDER BY然后无任何错误地返回近似随机的邻居:
const { embedding, revision } = await embed('tickets', q);
const hits = await query(
`SELECT ticket_id, content
FROM ticket_embeddings
WHERE revision = $2
ORDER BY embedding <=> $1::vector
LIMIT 10`,
[JSON.stringify(embedding), revision]
);
- 计费. 嵌入调用帐单到App,每批最多128个块的用法条目,无论提供商请求在下面运行多少;泵计算表与App的计算预算相比.
config读作文字. 部署升降机export const config = { … }出出源并评价其范围中没有文件的导入,因此必须自成一体:没有导入常数,没有导入对象的分布,没有export { config }再出口。 其他模块可能从使用大小写文件中导入文字;反向失败部署. 同一自足的文法规则适用于:export const config, (中文(简体) ),schema,以及description内server/, (中文(简体) ),webhooks/, (中文(简体) ),tools/,以及mcp/; 有一个config违反时失败部署schema或者说description违反是部署警告(该导出没有发布).
开发环路
npm run deploy 上传 embeddings/ 和任何其他源树一样——没有显示的块可以添加(plugin ^ 2.1.0;更早的版本从不上传文件夹,因此在服务器上没有静默的使用大小写). npm run dev 从来没有运行泵, 及其 embed() 扔出一个解释而不是嵌入( dev 镜像报告) platform.capabilities.embeddings: false),因此对已部署的 App.插件 ^ 2.1.20. 可以选择 : informer({ mock: { platform: { capabilities: { embeddings: true } } } }) 绑定 dev embed() 到部署的App's _embed 配置服务器上的路由(由 package.json 地址) informer.id; dev 证书需要写入该 App 的访问权限, 并且每个呼叫都向它计费), 因此查询向量下 npm run dev 是部署的一个——相同的型号,相同的 revision人身保护令不是: query() 仍然读取 Dev 工作空间数据源, 泵从不给它写, 因此一个搜索路径可以比较一个部署的向量相对于本地行. 特征检测 platform?.capabilities?.embeddings —— 说 typeof embed === 'function' 两者都一样,因为无论哪种方式都有约束力。 然后,在App 管理员面板中 嵌入层 选项卡列出每个使用大小写及其泵状态(排队、运行、更新、上次运行、上次出错、跳出文件)和 a 快点跑 动作; 与 API 路由存在相同的表面(GET /apps/{id}/embeddings, (中文(简体) ), POST /apps/{id}/embeddings/{name}/_run) (中文(简体) ). 部署 运行 读出错误 修复 重复.
升级已经拥有的 App embeddings/ 文件夹
embeddings/ 是一个来自 Informer 2026.1.3 的服务器侧文件夹, 例如 server/:其文件被上传到库中,从未为浏览器服务,并被扫描为泵处理器. 一个将其它东西(资产,数据文件)保存在那里的App,在使用插件 2.1.0 或稍后重新部署后会丢失浏览器中的文件. A 类 .js 文件中的导出 GET 或者说 POST 但并非两者都未能完成部署; 出口也从未被扫描过作为使用案例, 并成为对否则成功的部署的警告。 在升级前将此类内容移到别处; 将每个出错条目的名称作为警告 .
老年前释放
这个 embeddings/ 文件夹, embed(),而泵道仅存在于Informer上释放出该特性. 也必须在旧服务器上运行的具有可选链条功能的App(platform?.capabilities?.embeddings 在操作袋上, window.__INFORMER__.platform?.capabilities?.embeddings )——2026.1.3前放出"不" platform 完全没有描述,所以是赤裸的 platform.capabilities.embeddings 扔到那里而不是报告 false。它以 -- requires: embeddings 在页眉中跳过移出 pgvector 不在的地方,并显示一个地板 informer.yaml (单位:千美元)requires: { informer: '>=…' }),只有在没有特征的情况下无法工作.
全文参考: 嵌入层 条目.