iii-hq/iii

iii-getting-started

Install the iii engine, set up your first worker, and get a working backend running.

소스 보기

사용 방법

  1. 설치 명령을 복사하고 자신의 에이전트 환경에 설치하기 전에 소스 패키지를 확인하세요.
  2. 필요한 도구, 인증 정보, 지원 환경은 원본 문서에서 확인하세요.
  3. 입력과 원하는 산출물을 설명하고 출처와 결과를 대조하세요.
npx skills add https://github.com/iii-hq/iii --skill iii-getting-started

시작 전 확인

  • 설치에는 모델 구독, API 한도, 파일 접근 권한이 포함되지 않습니다.
  • 별점 수와 설치 수는 활동 지표이며 독립적인 품질·보안 검증이 아닙니다.
원본 Skill 문서

원본 저장소의 제목, 예시, 코드, 표, 링크, 이미지를 유지해 표시합니다.

Getting Started with iii

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.

Step 1: Install the Engine

bash
curl -fsSL https://install.iii.dev/iii/main/install.sh | sh

Verify it installed:

bash
iii --version

Step 2: Create a Project

bash
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.

Step 3: Start the Project

bash
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, and SDK calls to them resolve there without a namespace (see iii-sdk-reference).

Step 4: Install the SDK

Pick your language:

bash
# TypeScript / Node.js
pnpm add iii-sdk @iii-dev/helpers

# Python
pip install iii-sdk iii-helpers

# Rust
cargo add iii-sdk iii-helpers

Step 5: Write Your First Worker

TypeScript

typescript
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" },
});

Python

python
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"}})

Rust

rust
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"),
);

// Deprecated since 0.25, still how you bind to the http worker: compiles with a warning.
#[allow(deprecated)]
iii.register_trigger(RegisterTriggerInput::new(
    "http",
    "hello::greet",
    json!({ "api_path": "/hello", "http_method": "POST" }),
))?;

registerTrigger logs a one-time deprecation warning in iii 0.25. It keeps working, and it is still the way to bind to the http, cron, queue, state, stream, and pub/sub workers, which have not moved to source functions yet. To run a function after another one, use iii.observe (see iii-observe).

Step 6: Test It

The http trigger type comes from the http worker. Add it once through the running Compose daemon, then call your endpoint:

bash
iii trigger -n dev compose::add worker=http
bash
curl -X POST http://localhost:3111/hello \
  -H "Content-Type: application/json" \
  -d '{"name": "iii"}'

Expected response:

json
{ "message": "Hello, iii!" }

Add Existing Workers

To add a capability that already exists, browse https://workers.iii.dev/ and add it through the running Compose daemon:

bash
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.

Install Agent Skills

Get all iii skills for your AI coding agent:

bash
npx skills add iii-hq/iii/skills

Skills teach your agent the top-level iii model: functions, triggers, workers, observers, registry access, SDKs, engine configuration, architecture patterns, and error handling. Worker-backed capabilities live with the worker docs and registry entries.

Adapting This Pattern

  • Add more functions to the same worker: each gets its own registerFunction + registerTrigger

calls

  • Use :: separator for function IDs to namespace them: orders::create, orders::validate
  • Add cron triggers with { type: 'cron', config: { expression: '0 0 9 * * * *' } } (7-field: sec

min hour day month weekday year)

  • Add queue triggers with { type: 'durable:subscriber', config: { topic: 'my-queue' } }
  • Use iii.trigger() to invoke other functions from within a function
  • Use iii.observe({ function_id: "hello::greet" }, "audit::record") to run a registered function

after every successful call of another one (see iii-observe)

  • Use state::get / state::set to persist data across function calls
  • Use iii trigger -n <daemon> compose::add worker=<name> when the capability already exists in

the worker registry

Recommended Next Steps

After getting your first worker running:

  1. Register functions, triggers, and workers: see iii-core-primitives
  2. Observe functions and engine events: see iii-observe
  3. Choose the right SDK APIs: see iii-sdk-reference
  4. Configure the engine: see iii-engine-config
  5. Explore backend patterns: see iii-architecture-patterns
  6. Handle failures well: see iii-error-handling

Key Resources

Pattern Boundaries

  • For function and trigger registration patterns, worker creation, worker registry access, trigger

payload schemas, invocation modes, channels, custom triggers, and HTTP-invoked functions, prefer iii-core-primitives

  • For observing functions and engine events, and for migrating off registerTrigger, prefer

iii-observe

  • For language-specific SDK APIs, prefer iii-sdk-reference
  • For engine configuration, prefer iii-engine-config
  • For worker-backed HTTP, cron, queue, pubsub, state, stream, and observability behavior, use the matching worker page on https://workers.iii.dev/
  • Stay with iii-getting-started for installation, initial setup, and first-worker guidance

When to Use

  • Use this skill when the task is about installing iii, creating a new project, or writing a first

worker.

  • Triggers when the request asks for setup help, quickstart guidance, or getting started with iii.

Boundaries

  • Never use this skill as a generic fallback for unrelated tasks.
  • You must not apply this skill when a more specific iii skill is a better fit.
  • Always verify environment and safety constraints before applying examples from this skill.
같은 저장소의 Skills

더 많은 Skills

모든 Skills