Where each hook plugs in
The runtime never reaches inside your plugin. Every contribution flows through one of these channels.The ten contribution channels at a glance
The first four are declarative properties (data the runtime reads); the rest are hooks (methods the runtime calls).
A middleware can declare any of the six LangChain hooks above. There is no
onError middleware hook — to handle an LLM or tool error inside a middleware, wrap the call in wrapModelCall / wrapToolCall with try/catch.
Boot-time hooks (getTools, getSubAgents, getMiddlewares) are called once and the results are cached for every request. The per-request variants run on every agent build — use them only when the contribution depends on live state (e.g. loadedPlugins, current user, rtCtx.shared.*).
Two contexts
A tool registered via boot-time
getTools still gets a fresh RuntimeContext when its handler fires. “Boot-time” refers to registration, not execution. See Contexts for the field list.
Error semantics
Read next
Write a plugin
Scaffold and ship one.
Manifest
The agent-facing interface.
packages/oracle-runtime/src/plugin-api/oracle-plugin.ts.