CRM AI control plane: models, prompts, tools, usage, and governance
A reference architecture for operating CRM AI as a governed system: provider and model configuration, prompt versions, tool permissions, usage and cost logging, feature state, and failure handling.
On this page
- Separate the control plane from the runtime
- Configuration should be data, not scattered constants
- Tool availability and tool authorization are different
- Prompts need release discipline
- Provider abstraction should preserve the contract
- Usage logging is part of observability
- Give operators bounded controls
- Failure states should be explicit
- Operate the system as a product
A context layer explains the business. A control plane operates the AI system that consumes that context.
Once CRM AI moves beyond one prompt and one model, ordinary operating questions appear quickly: Which model is active? Which prompt version produced this result? Which tools can this workflow call? How much did it cost? Can an operator disable one capability without taking the entire application down?
Those questions should not require a code deployment to answer.
Separate the control plane from the runtime
Do not turn the control plane into a second prompt library. It owns operational configuration; the CRM AI context layer owns business meaning, and hard authorization still belongs at the tool boundary.
Configuration should be data, not scattered constants
A useful configuration record identifies at least:
| Concern | What to store |
|---|---|
| Capability | Stable workflow or feature identifier |
| Provider | Which model provider this capability uses |
| Model | Active model plus allowed alternatives |
| Prompt | Versioned system/instruction template |
| Tools | Tools this capability may request |
| Context profile | Which rule/context bundle it loads |
| Feature state | Enabled, disabled, limited, or test-only |
| Owner | Person/team accountable for the capability |
| Budget policy | Optional usage or cost boundary |
| Version | Configuration revision attached to every run |
The runtime resolves this configuration at execution time or from a controlled cache. A model change should therefore be an observable configuration change, not an invisible code edit.
Tool availability and tool authorization are different
A tool registry answers what the application knows how to call. Authorization answers whether this user and this request may call it now.
A Salesforce-update tool might be registered globally while a summarization capability remains read-only. A tool can also be available to one user but blocked for another because record, object, field, or feature permissions differ.
- 1Model requests a tool
- 2Resolve registered tool
- 3Check capability allowlist
- 4Check user + data permissions
- 5Check action-specific policy
- 6Execute or reject
- 7Log decision + result
Never encode this boundary only in prompt language. See CRM AI permissions.
Prompts need release discipline
Treat prompts like operating configuration with an identity and history. Store a stable prompt key separately from its versions so a workflow can point to an approved version and roll back without editing source code.
For each version, preserve the text or template, owner, status, effective time, model assumptions, context contract, test results, and replacement relationship. A production run should record the exact prompt/configuration version it resolved.
That makes a changed answer diagnosable. Without version history, operators are left comparing today's output with memory.
Provider abstraction should preserve the contract
Supporting multiple providers is useful only if the application contract stays stable. Keep provider-specific request formatting behind an adapter and normalize the result the rest of the application consumes.
The stable layer should describe things your application actually needs: generated text or structured output, usage, model identity, finish/error state, latency, and tool-call requests where supported. Do not pretend every provider exposes identical behavior; normalize the parts your product contract depends on and keep provider-specific capabilities explicit.
This also makes model migration safer. The question becomes “does this candidate satisfy our evaluation contract?” rather than “can we change one model-name string?”
Usage logging is part of observability
Every production invocation should leave enough evidence to explain cost and behavior without storing unnecessary sensitive payloads.
Useful run-level fields include:
- Capability and configuration version.
- Provider and model.
- Start/end time and latency.
- Input/output usage reported by the provider where available.
- Estimated or reconciled cost.
- Tool calls requested, allowed, rejected, and completed.
- Context/rule version.
- Result state and structured error category.
- User or system actor at the appropriate audit granularity.
Usage data becomes much more useful when it can be grouped by capability rather than only by model. “Model X cost $900” is an invoice fact. “Opportunity summaries cost $620 and are opened by three people” is an operating decision.
Give operators bounded controls
An admin surface should expose controls that are safe to change without engineering while keeping dangerous boundaries in code.
Good admin controls include selecting among approved models, activating an approved prompt version, enabling/disabling a capability, managing bounded context rules, viewing usage, and inspecting failed jobs.
Controls that expand data or action authority deserve a stronger change path. Adding a new writable object, bypassing permission enforcement, or granting a tool a new destructive action is not ordinary prompt administration.
Failure states should be explicit
A CRM AI request can fail in several materially different ways:
| Failure | Operator response |
|---|---|
| Provider unavailable/rate-limited | Retry or fail over according to policy |
| Invalid configuration | Disable capability or roll back configuration |
| Context unavailable/stale | Refuse, degrade, or mark result depending on the contract |
| Tool authorization rejected | Return a bounded refusal and log the rejected action |
| Tool execution failed | Preserve model result separately from action failure |
| Output invalid | Retry validation/repair only within a defined limit |
| Budget boundary reached | Defer, use an approved lower-cost path, or stop |
Do not flatten all of these into AI_ERROR. Error categories are how an operator distinguishes a provider outage from a permissions regression or a bad configuration release.
Operate the system as a product
A mature control plane should let an operator answer five questions quickly:
- What configuration is active right now?
- What changed since the last known-good version?
- Which capabilities, models, and tools are actually being used?
- What is failing, how often, and why?
- What can be disabled or rolled back without a deployment?
That is the difference between an AI feature and AI infrastructure.
Related: CRM AI context layer, Operating a CRM context layer, CRM AI permissions, Workflow states and job history, and Golden-question testing.