π«π· Version franΓ§aise
Default behaviors (and how to replace them)
See also: Bootstrap and execution Β· Opt-in subsystems Β· Limits and constraints Β· Back to the index
Orkeon's DI defaults follow one principle: no implicit magic. Nothing calls an LLM you did not configure, nothing persists where you did not point it, and every deliberately-minimal default announces itself with a one-time Warning that names the remediation. This page is the inventory of those defaults β what each one does, how it tells you it is active, and the exact gesture to replace it.
Most registrations below use TryAdd: registering your own implementation before
AddOrkeonApplication() / AddOrkeonInfrastructure() wins, with no other change. The
exceptions are called out in their row β a service registered unconditionally
(AddScoped/AddSingleton) is replaced by registering yours after the Orkeon call.
The defaults that warn on first use
| Service | Default | What it actually does | Replace it with |
|---|---|---|---|
IAgentPlanner |
AgentPlannerService |
Emits the same fixed 4-step plan for every task (confidence 0.8). Refinement and validation are real; plan creation ignores the task content. | services.AddSingleton<IAgentPlanner, YourPlanner>(); β an LLM-backed planner is a study item for V1.x. |
ITaskDelegator |
NullTaskDelegator |
Denies every delegation request; FindBestAgentForTaskAsync returns the first available agent. Hierarchical/Autonomous delegation stays inert until replaced. |
services.AddSingleton<ITaskDelegator, YourDelegator>(); |
IKnowledgeStore |
InMemoryKnowledgeStore |
Working in-memory store (store/retrieve/delete are real, nothing persists) β but SearchAsync ignores the query and returns the first stored entries. |
Enable the RAG subsystem (AddOrkeonRag(configuration)) and use its ingestion/retrieval, or register your own store. |
ILlmCache |
NullLlmCache |
A cache that always misses β changes cost, not correctness. | services.AddSingleton<ILlmCache, YourCache>(); |
IYamlDiffService |
NullYamlDiffService |
Diffing is an optional observability nicety. | Register your own implementation. |
ITemplateInstantiator |
NullTemplateInstantiator |
Also throws NotSupportedException when actually used β louder than any log. |
Register your own implementation. |
IToolRegistry |
InMemoryToolRegistry |
Empty registry; the runner host replaces it with the DI-backed ServiceProviderToolRegistry. Crews that reference tools fail loudly under StrictTools. |
services.AddSingleton<IToolRegistry, ServiceProviderToolRegistry>(); |
IMemorySystem |
InMemoryMemorySystem |
Real in-memory implementation β correct, just not persistent. | Configure a persistent provider (Memory:Provider). |
IAgentSelectionService (FirstFit) |
SimpleAgentSelectionService |
Picks the first available agent β the explicit safe fallback. | Set OrkeonApplicationOptions.AgentSelectionStrategy to Skill (lexical) or Embedding (semantic β requires a real embedding provider), via AddOrkeonApplication(o => β¦) or services.Configure<OrkeonApplicationOptions>(β¦). |
IEmbeddingProvider |
resolution chain | Local BGE (when AddOrkeonLocalEmbeddings() is registered) β remote provider from Orkeon:Embeddings β fail-fast at first use with an actionable exception. Never a silent hash fallback. |
Register AddOrkeonLocalEmbeddings() or configure Orkeon:Embeddings. |
IAgentExecutionServiceis not on this list on purpose:AddOrkeonApplication()registers the realAgentExecutionServiceunconditionally (AddScoped). TheNullAgentExecutionServicestub only wins in a container wired withAddOrkeonInfrastructure()alone (its registration isTryAddScoped). To substitute your own in a standard bootstrap, register it afterAddOrkeonApplication().
The genuinely silent defaults
These are harmless by construction and stay at Debug or emit nothing:
| Service | Default | Why silence is fine |
|---|---|---|
| Step/task callbacks | Null*Callback |
No-op observability hooks; Debug by design. |
IMemoryScope |
NullMemoryScope |
Explicit "no memory in this context" marker β asked for, not fallen into. |
IMemoryProvider |
config-driven factory | Falls back to the in-memory provider when Memory:Provider is unset; an unrecognized type does warn. |
Fully-functional TryAdd defaults (e.g. IPathValidator β PathValidator) are not
listed here on purpose: they are the real implementation, not a stand-in β replace
them the same way (register yours before the Orkeon call), but nothing announces
them because nothing is missing.
Why it works this way
A framework that silently swaps in an LLM call, a network dependency, or a persistent store behind a default would be making decisions that belong to you. The trade-off is that a freshly-bootstrapped host does less than a fully configured one β and says so in the log, once per service, with the fix in the message. If you see one of these warnings in production, it is never noise: it means a capability you probably expect is running on its minimal stand-in.