File editing, shell execution, context management, and sandboxing — any provider, any sandbox, one package.
import { Agent, AiSdkProvider } from "noumen";
import { createOpenAI } from "@ai-sdk/openai";
import { LocalSandbox } from "noumen/local";
const agent = new Agent({
provider: new AiSdkProvider({ model: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }).chat("gpt-5") }),
sandbox: LocalSandbox({ cwd: "/my/project" }),
});
const thread = agent.createThread();
for await (const event of thread.run("Fix the auth bug")) {
// ...
}
The agent loop is identical. Only the adapters change.
npx noumen starts an interactive agent in your terminal. No config, no signup.
Other SDKs lock you to one model or make you build the tools yourself. Noumen ships the full stack so you ship the agent.
Switch models by changing one string. Same streaming, same tool dispatch.
// swap the string — nothing else changes
const agent = LocalAgent({ provider: "anthropic", cwd: "." });
// or use any of the 7 providers:
// "openai" | "anthropic" | "gemini" | "openrouter"
// | "bedrock" | "vertex" | "ollama"Swap one line to change the isolation boundary — local to cloud to SSH.
import { Agent } from "noumen";
import { LocalSandbox } from "noumen/local";
import { SshSandbox } from "noumen/ssh";
// local development
const agent = new Agent({ provider, sandbox: LocalSandbox({ cwd: "." }) });
// production — same agent, remote sandbox over SSH
const agent = new Agent({ provider, sandbox: SshSandbox({ host: "dev.example.com", cwd: "/workspace" }) });The same tools inside production coding agents, wired up and ready to go.
$ npx noumen "Add input validation to signup"
[ReadFile] src/handlers/signup.ts
[EditFile] src/handlers/signup.ts +14 lines
[Bash] npm test -- signup
✓ All 9 tests passed
turn_complete tokens: 2,847 cost: $0.03Conversations save as JSONL. Resume any thread by ID.
const thread = agent.createThread({ threadId: "feature-auth" });
// picks up exactly where it left off
for await (const ev of thread.run("Continue from the last change")) {
// ...
}Spawn isolated subagents for focused subtasks with configurable concurrency.
const thread = agent.createThread();
for await (const ev of thread.run("Refactor auth and add tests")) {
if (ev.type === "subagent_start") {
console.log(` spawned: ${ev.name}`); // "test-writer"
}
}Connect external tools, query language servers, intercept everything.
const agent = LocalAgent({
provider: "anthropic",
options: {
mcpServers: {
filesystem: { command: "npx", args: ["-y", "@mcp/server-fs", "/tmp"] },
},
lsp: {
typescript: { command: "typescript-language-server", args: ["--stdio"] },
},
},
});From install to running agent in under a minute.
One package. No peer dependencies.
npm install noumenPick a provider and a sandbox.
import { Agent } from "noumen";
import { LocalSandbox } from "noumen/local";
const agent = new Agent({
provider: "anthropic",
sandbox: LocalSandbox({ cwd: "." }),
});Stream events from the agent loop.
const thread = agent.createThread();
for await (const event of thread.run("Fix the auth bug")) {
if (event.type === "text_delta") process.stdout.write(event.text);
}Embed in your app, or run the CLI.
# zero-config interactive agent
$ npx noumenRead the quickstart, browse the docs, or just run npx noumen and go.