Schema-validated, reactive registry for named configuration entries — the runtime configuration surface used by engine and Compose workers.
日本語の概要は準備中です。原文の説明を表示しています。
Install the iii engine, set up your first worker, and get a working backend running. Use when a user wants to start a new iii project, install the SDK, or needs help with initial setup and configuration.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
iii replaces your API framework, task queue, cron scheduler, pub/sub, state store, and observability pipeline with a single engine and three primitives: Function, Trigger, Worker.
curl -fsSL https://install.iii.dev/iii/main/install.sh | sh
Verify it installed:
iii --version
iii project init my-app # barebones project
iii project init my-app -t harness # or: the harness template (agent + console UI)
cd my-app
iii project init --learn-iii scaffolds the harness template and starts it in one step; the
installer offers the same when you answer "y" at its prompt. iii project init --template quickstart
scaffolds the Quickstart with a Python and a TypeScript worker.
iii compose --namespace dev --up --file worker-compose.yaml
The file's engine: section starts the engine; containers: starts project workers. The engine
commonly listens on ws://localhost:49134. Keep this foreground supervisor running.
--namespace dev names the daemon and becomes III_NAMESPACE for every worker it starts, so your
workers register and call each other in dev; that is why the iii trigger commands below pass
-n dev. Engine-owned functions (engine::*, configuration::*) stay in default; when a worker
in dev calls one of those, pass namespace: "default" on the call (see iii-sdk-reference).
Pick your language:
# TypeScript / Node.js
pnpm add iii-sdk @iii-dev/helpers
# Python
pip install iii-sdk iii-helpers
# Rust
cargo add iii-sdk iii-helpers
import { registerWorker, TriggerAction } from "iii-sdk";
import { Logger } from "@iii-dev/helpers/observability";
const iii = registerWorker(process.env.III_URL ?? "ws://localhost:49134");
iii.registerFunction(
"hello::greet",
async (input) => {
const logger = new Logger();
const name = input?.name ?? "world";
logger.info("Greeting user", { name });
return { message: `Hello, ${name}!` };
},
{ description: "Greet a user by name" },
);
iii.registerTrigger({
type: "http",
function_id: "hello::greet",
config: { api_path: "/hello", http_method: "POST" },
});
from iii import register_worker, InitOptions
from iii_helpers.observability import Logger
iii = register_worker(address="ws://localhost:49134", options=InitOptions(worker_name="hello-worker"))
def greet(data):
logger = Logger()
name = data.get("name", "world") if isinstance(data, dict) else "world"
logger.info("Greeting user", {"name": name})
return {"message": f"Hello, {name}!"}
iii.register_function("hello::greet", greet, description="Greet a user by name")
iii.register_trigger({"type": "http", "function_id": "hello::greet", "config": {"api_path": "/hello", "http_method": "POST"}})
use iii_sdk::{register_worker, InitOptions, RegisterFunction};
use iii_sdk::protocol::RegisterTriggerInput;
use iii_helpers::observability::Logger;
use serde_json::json;
let iii = register_worker("ws://127.0.0.1:49134", InitOptions::default());
iii.register_function(
"hello::greet",
RegisterFunction::new(|input: serde_json::Value| -> Result<serde_json::Value, iii_sdk::Error> {
let logger = Logger::new();
let name = input["name"].as_str().unwrap_or("world");
logger.info("Greeting user", Some(json!({ "name": name })));
Ok(json!({ "message": format!("Hello, {}!", name) }))
}).description("Greet a user by name"),
);
iii.register_trigger(RegisterTriggerInput {
trigger_type: "http".into(),
function_id: "hello::greet".into(),
config: json!({ "api_path": "/hello", "http_method": "POST" }),
metadata: None,
})?;
The http trigger type comes from the http worker. Add it once through the running Compose
daemon, then call your endpoint:
iii trigger -n dev compose::add worker=http
curl -X POST http://localhost:3111/hello \
-H "Content-Type: application/json" \
-d '{"name": "iii"}'
Expected response:
{ "message": "Hello, iii!" }
To add a capability that already exists, browse https://workers.iii.dev/ and add it through the
running Compose daemon:
iii trigger -n dev compose::add worker=state
iii trigger -n dev compose::add worker=queue
iii trigger -n dev compose::add worker=image-resize@0.1.2
compose::add resolves dependencies, writes exact versions to worker-compose.yaml, and restarts
the affected project. A local worker can be declared as a path:// container or added by path.
Get all iii skills for your AI coding agent:
npx skills add iii-hq/iii/skills
Skills teach your agent the top-level iii model: functions, triggers, workers, registry access, SDKs, engine configuration, architecture patterns, and error handling. Worker-backed capabilities live with the worker docs and registry entries.
registerFunction + registerTrigger
calls:: separator for function IDs to namespace them: orders::create, orders::validate{ type: 'cron', config: { expression: '0 0 9 * * * *' } } (7-field: sec
min hour day month weekday year){ type: 'durable:subscriber', config: { topic: 'my-queue' } }iii.trigger() to invoke other functions from within a functionstate::get / state::set to persist data across function callsiii trigger -n <daemon> compose::add worker=<name> when the capability already exists in
the worker registryAfter getting your first worker running:
iii-core-primitivesiii-sdk-referenceiii-engine-configiii-architecture-patternsiii-error-handling.md suffix to its URL.iii-core-primitivesiii-sdk-referenceiii-engine-configiii-getting-started for installation, initial setup, and first-worker guidanceまだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Schema-validated, reactive registry for named configuration entries — the runtime configuration surface used by engine and Compose workers.
日本語の概要は準備中です。原文の説明を表示しています。
How iii works and the iii-sdk surface for authoring workers, triggers, and functions. Teaches the ordered way to gain a capability before writing code — (1) check functions already registered in the engine, (2) search the public registry via iii-directory, (3) build a worker. Single self-contained skill — meant for system-prompt injection; do not re-fetch.
日本語の概要は準備中です。原文の説明を表示しています。
Use when composing iii primitives into backend architectures: durable workflows, reactive backends, agentic pipelines, event-driven CQRS, effect pipelines, and trigger-transform-action automation.
日本語の概要は準備中です。原文の説明を表示しています。
Use when registering iii functions, binding triggers, selecting sync/void/enqueue invocation, creating workers, inspecting the live worker registry, installing registry workers, authoring custom triggers, moving channel data, or adapting external HTTP functions across TypeScript, Python, and Rust.
日本語の概要は準備中です。原文の説明を表示しています。
Configure a managed iii engine through worker-compose.yaml or a directly supervised engine through config.yaml. Use for engine ports, RBAC via the rbac-proxy worker, streams, sandboxes, and configuration storage.
日本語の概要は準備中です。原文の説明を表示しています。
Handle iii engine and SDK errors across Node, Python, Rust, and browser workers. Use when interpreting error codes, retryability, RBAC denial, timeouts, handler failures, or SDK-specific exception surfaces.
日本語の概要は準備中です。原文の説明を表示しています。