- In one line
- Six
service-*features. Each is driven by direct method calls or a client builder attachment, never by plugin hooks. - You need
- The service features you want, named explicitly. None is enabled by default.
- Read this if
- You need a service's feature flag, entry type, plugin dependency, configuration, caps or errors.
The six features
| Feature | Entry type | Required plugin feature |
|---|---|---|
service-entity-extraction | EntityExtractor | plugin-memory, hard |
service-speculative | ModelOrchestrator | plugin-session-log, documented-optional |
service-prompt-cache | PromptCache | none |
service-replay | SessionReplay | plugin-session-log, hard |
service-rate-limit | RateLimiter | none |
service-vector-store | InMemoryVectorStore | plugin-memory, hard |
Service tier rules
- A service is an explicit-call, client-level capability. The caller drives it with method calls, or attaches it to a client builder (
with_orchestrator,with_prompt_cache_config,with_prompt_cache_service). - A service never implements
CucaPlugin. Passing one toregister_pluginis a compile error, not an inert registration. - A service may depend on core and on the plugin features it declares in
Cargo.toml. A plugin never names a service: nouse, nocfg(feature = "service-..."), no feature edge, no runtime lookup. - Every code edge from a service to a plugin is declared as
service-<name> = ["plugin-<other>"]. - No service depends on another service.
- Plugins and services do not look each other up at runtime. Data crosses tiers through a caller-injected
Arc<dyn Trait>or an explicit hand-off by the application. - Each service feature builds alone on one provider. The
service_soloCI job checks it.
Plugins and services explains why the tiers are shaped this way.
Feature edges to the plugin tier
Cargo.toml declares three hard edges, all from a service to a plugin:
service-entity-extraction = ["plugin-memory"]
service-replay = ["plugin-session-log"]
service-vector-store = ["plugin-memory", "dep:wide"]
entity-extractiontomemory, hard: the extraction delta is aMemoryGraphthat the caller merges into the memory plugin's working graph.replaytosession-log, hard: replay reads a recorded trajectory through the session log'sSessionBackendseam.vector-storetomemory, hard: the store implements the memory plugin'sVectorStoreoffload seam, wired throughMemoryPlugin::with_extensions, and hands recalled turns back throughRetrievalReport::inject.speculativetosession-log, documented-optional: it declares no feature edge.ModelOrchestrator::with_session_storeexists only whenplugin-session-logis also enabled, and recordsSessionEvent::ModelSwap.prompt-cacheandrate-limitdeclare no plugin dependency.
Page layout
Every service page uses the same headings, in this order:
- Feature and entry type
- Entry points
- Configuration
- Caps and at-cap policy
- Errors
- Example
- Related pages
The consolidated view of every cap, across plugins and services, is Memory discipline.