This is the fastest route to understanding Resolve end to end. By the end you’ll
have a custom resolver registered with a running backend, and you’ll drive an
instance through it while watching its event stream — touching the four
contracts every other page assumes you know: the manifest.json schema, the
event vocabulary, the registration mechanism, and the instance lifecycle.
A running Resolve backend. Either a local stack or the hosted platform.
You’ll need its base URL and, if auth is enabled, a Bearer token.
An LLM provider credential in the environment (for example
ANTHROPIC_API_KEY or OPENAI_API_KEY), and GH_TOKEN for repo access.
A container runtime. Locally, Resolve uses Incus for worker
containers — incusd must be running. (Docker is only used for a future
remote-deploy path, not local development.)
A resolver is a separate process, not an in-process Python object. The
platform launches it per the command in your manifest.json and drives it over
JSON-RPC on stdio. You write your resolver against the
amplifier-resolver-sdk base class; the SDK speaks the protocol for you.
That means a resolver has exactly two things you must get right:
A manifest.json that tells the platform how to launch and register it.
A run() implementation that does the work and emits the required
events — ending with resolver:completed.
Resolvers are not discovered via Python entry points. You register them
explicitly with the CLI, which clones (or reads a local path), validates the
manifest, optionally fetches the viewport bundle, and writes the resolver into
the backend’s resolvers.json catalog. The backend live-reloads — no restart.