@basenative /站
队列驱动的本地推理原语——驱动带有sqlite支持的作业队列、迭代循环运行时、自动Workers AI回退和预构建作业模板注册表的cloudflare隧道vLLM塔(或任何openai兼容的端点)。
部分 BaseNative 生态系统。指定的 DUGANLABS_ORCHESTRATOR_SPEC.md §9。
什么站
一种小型的、固执己见的用于运行的软件原语 循环模式 针对a的工作负载 本地7b级编码器模型 在openai兼容的HTTP端点后面(在我们的参考堆栈中:通过vLLM提供Qwen2.5-Coder-7B INT4的RTX 5070盒子,暴露在cloudflare隧道上)。
它是 不 塔的硬件。驱动这座塔的是软件。
它与前沿推断有何不同
规范 § 9中的成本模型,重述:
| 层 | 每代币边际成本 | 小说代码的质量 | 质量循环模式代码 |
|---|---|---|---|
| 边疆 (十四行诗4.6 /作品4.7) | 公布的人为率 | 优秀的 | 优秀-浪费了 |
| 工人人工智能 (gpt-oss-120b免费层) | 每天释放多达10K个神经元 | 好 | 良好的上限吞吐量 |
| 车站 (本地7B INT4) | 高于电费0美元 (约5-10美元/月) | 可怜的一次性 | 在狭窄的模板化迭代上可以接受 |
空塔:~20W × 24h × 0.30美元/kWh × 30d≈ 4.30美元/月. 突发推断:5-10美元/月。 十四行诗-相当于docstring覆盖范围的5k站迭代: ~ 15-25美元。
收支平衡大约是5万代币/天。 最重要的是,车站在成本上获胜。在它下面,只需使用十四行诗。
何时使用车站
将工作站用于以下任务:
- 每次迭代的赌注很低。
- 模板很窄,成功检查是确定性的。
- 您将经常这样做(≥数百次迭代)。
具体的适合:
- 为一个TODO写一个测试一下,标记完成,提前。
- 将一个JSDoc添加到一个未记录的导出。
- 修复一个绒毛警告。
- 在一个文件中应用一个mechanical重构步骤。
- 将一条入站短信分类为一个FSM过渡(Greenput摄入量)。
不要 将Station用于:计划器任务(Opus),新颖的实现代码(Sonnet), PR审查(Opus),或任何涉及基本公理的内容(仅限边界-漂移是不可恢复的)。
安装
pnpm add @basenative/station
# Optional, for production persistence:
pnpm add better-sqlite3
快速启动
import { defineStation } from '@basenative/station';
const station = defineStation({
tunnelUrl: 'https://tower.your-account.cloudflareaccess.com',
model: 'qwen2.5-coder-7b-instruct',
queueDb: '/var/lib/dugan/station.db',
fallback: {
url: 'https://api.cloudflare.com/client/v4/accounts/<id>/ai/run',
model: 'gpt-oss-120b',
},
});
// Enqueue a job
const id = station.queue.enqueue({
venture: 'basenative',
intent: 'docstring-coverage',
payload: {
filePath: 'packages/runtime/src/signal.js',
fileContents: '/* ... */',
exportName: 'createSignal',
exportKind: 'function',
},
});
// Drain the queue (runs all queued jobs to completion or escalation)
const counters = await station.runner.run({ maxJobs: 50 });
console.log(counters);
// { processed: 50, completed: 47, escalated: 2, failed: 1 }
API
defineStation(opts)
返回 { client, queue, runner, templates }。如果您想以不同的方式连接它们 (例如,从Worker排队,从节点守护进程运行),这四个部分也会单独导出。
Client / OpenAICompatClient
import { OpenAICompatClient } from '@basenative/station';
const client = new OpenAICompatClient({
baseUrl: 'https://tower.example.com',
model: 'qwen2.5-coder-7b-instruct',
fallbackUrl: 'https://api.cloudflare.com/.../ai/run',
});
const { text, latencyMs, source } = await client.chat({
messages: [{ role: 'user', content: 'Write one JSDoc for foo.' }],
temperature: 0.2,
maxTokens: 400,
});
// source === 'primary' | 'fallback'
回退行为: 每一个 chat() 调用首先到达主节点。对于任何失败(HTTP错误、格式错误的响应、超时),它都会在回退上重试。如果两者都失败,则抛出 StationUnavailable 附加了两个错误链。 30秒硬超时 每一个电话。
Queue
SQLite-schema-compatible(见 src/queue.js 对于DDL)。默认驱动程序在内存中; 通过 betterSqlite3 来 createQueue 对于持久性:
import Database from 'better-sqlite3';
import { createQueue } from '@basenative/station';
const queue = createQueue({ path: './station.db', betterSqlite3: Database });
API: enqueue, claim, recordIteration, complete, escalate, fail, list, iterationsFor, depth.
Runner
循环运行时。每次迭代它:
- 通过查找作业的模板
intent. - 通过创建提示符
template.buildPrompt(payload). - 调用模型。
- (消费者钩子) 在沙盒工作树中应用响应作为差异。
- 跑步
template.successCheck(diff, payload). - 记录迭代; 前进或停止。
失速阈值 maxIterations 每份工作; escalateTo 是编排器在作业停止时应将其路由到的上游层。
templates
预构建的冻结注册表。每个模板都有 name, description, buildPrompt, successCheck, maxIterations, escalateTo。包括的五个模板是:
tests-from-todosdocstring-coveragelint-bankruptcyrefactor-migrationfsm-classifier
你可以自己加一个 defineStation({ ..., templates: { ...templates, mine } }).
ops
由orchestrator的消耗的运行状况检查助手 station-ops 代理:
tunnelHealth(url)——得到/healthmodelHealth(client)- - - - - -GET /v1/models,验证了所提出的预期模型gpuHealth(url)-可选GET/gpu探头(有根的;塔侧端点待定)queueHealth(queue)-深度最老-排队年龄summary({ tunnelUrl, client, queue, gpuUrl })——复合
命令行界面
bn-station enqueue <intent> [--venture x] [--payload @file.json]
bn-station list [--status queued|running|done|escalated|failed]
bn-station run [--max-iterations N] [--max-jobs N]
bn-station ops
bn-station drain
从读取配置 STATION_TUNNEL_URL, STATION_MODEL, STATION_QUEUE_DB, STATION_FALLBACK_URL.
Ops环路
预期的部署形状,根据规范§5.5:
- 运行cron / systemd定时器
bn-station ops每60s在dispatcher主机上。 - 在
tunnel.ok === false,station-ops代理将队列的有效回退翻转到Workers AI,发布到TUI,并写入事件。 - 在
queue.oldestQueuedAgeMs > 1h,按其升级最旧的排队作业escalateTo政策。 - 在电源/ISP中断时,所有飞行中的作业都将升级并显示给用户。
Worker-runtime支持
Client 和 templates 是纯粹的 fetch 纯函数,并在Cloudflare Workers中未经修改地运行。默认的 Queue 驱动程序在内存中(Worker没有文件系统)-如果你需要在Worker中持久排队,在更高的层中持久化到D1/KV并调用 enqueue/claim 从那里。
Runner 是可移植的,并在节点或工作线程中运行。
许可证
apache - 2.0。