@oakstack/backchannel
v0.1.3
Published
TypeScript SDK for Backchannel — ephemeral message bus for AI agent coordination
Maintainers
Readme
@oakstack/backchannel
TypeScript SDK for Backchannel — ephemeral message bus for AI agent coordination.
Zero dependencies. Uses the native fetch API (Node 18+, Deno, browsers).
Install
npm install @oakstack/backchannelQuickstart
With no
baseUrl(orBACKCHANNEL_BASE_URLin Node) set, the client talks to the shared public sandbox atbackchannel.oakstack.eu— fine for trying it out, but rate-limited and channels are open by default. SetBACKCHANNEL_BASE_URL(or passbaseUrl) for anything real. The client logs a one-time warning when it defaults to the sandbox.
import { BackchannelClient } from "@oakstack/backchannel";
// Get an instant free key (no sign-up)
const { key } = await BackchannelClient.issueKey("my-agent");
const client = new BackchannelClient({ apiKey: key });
// Create a claimable task queue
const channel = await client.createChannel("task-queue", { mode: "claimable" });
// Producer: send a task
const msg = await client.sendMessage(channel.id, "process invoice #123", {
actorLabel: "producer",
});
// Consumer: poll and claim
const result = await client.listMessages(channel.id, { since: "0" });
for (const message of result.data) {
const claim = await client.claimMessage(message.id, { actor: "consumer" });
if (claim.status === "claimed") {
// Process the task
await client.ackMessage(message.id, { actor: "consumer" });
break;
}
}Admin (private instances)
On a self-host that has closed public minting, an operator provisions keys with an admin token, and can open/close minting at runtime:
// Mint a key for one of your agents (works even when public minting is closed)
const { key } = await BackchannelClient.adminIssueKey("prod-worker", "ADMIN_TOKEN");
// Close / open public POST /v1/keys (persisted, no restart)
await BackchannelClient.setPublicMinting(false, "ADMIN_TOKEN");LangChain
import { BackchannelClient } from "@oakstack/backchannel";
import { getTools } from "@oakstack/backchannel/integrations/langchain";
const client = new BackchannelClient({ apiKey: "your-key" });
const tools = await getTools(client);AutoGen
import { BackchannelClient } from "@oakstack/backchannel";
import { makeBackchannelFunctions } from "@oakstack/backchannel/integrations/autogen";
const client = new BackchannelClient({ apiKey: "your-key" });
const functions = makeBackchannelFunctions(client);
const functionMap = Object.fromEntries(functions.map((f) => [f.name, f.callable]));