Consumer Configuration
This guide covers the current tunable properties available for ConvEngine consumers. Properties are managed via Spring Boot @ConfigurationProperties and can be set in your application.yml or application.properties.
It reflects the active v2 line through the later additions from 2.0.0 to 2.0.9, including scoped MCP planner behavior, richer audit controls, ce_verbose, and the current Semantic Query configuration surface.
Core namespaces
ConvEngine introduces several configuration namespaces:
convengine.flow.*(runtime behavior tuning)convengine.audit.*(event and tracking controls)convengine.transport.*(SSE/STOMP delivery settings)convengine.mcp.*(planner/tool behavior, guardrails, HTTP defaults, Semantic Query)convengine.tables.*(dynamic table mapping overrides)convengine.experimental.*(forward-looking toggles)
Complete application.yml Reference
Below is a complete reference of the default configuration options exposed by ConvEngine.
convengine:
# Dynamic table mapping for CE_* entities (same as V1)
tables:
AUDIT: CE_AUDIT
CONFIG: CE_CONFIG
CONTAINER_CONFIG: CE_CONTAINER_CONFIG
CONVERSATION: CE_CONVERSATION
INTENT: CE_INTENT
INTENT_CLASSIFIER: CE_INTENT_CLASSIFIER
LLM_CALL_LOG: CE_LLM_CALL_LOG
MCP_DB_TOOL: CE_MCP_DB_TOOL
MCP_PLANNER: CE_MCP_PLANNER
MCP_TOOL: CE_MCP_TOOL
PENDING_ACTION: CE_PENDING_ACTION
OUTPUT_SCHEMA: CE_OUTPUT_SCHEMA
POLICY: CE_POLICY
PROMPT_TEMPLATE: CE_PROMPT_TEMPLATE
RESPONSE: CE_RESPONSE
RULE: CE_RULE
VERBOSE: CE_VERBOSE
# Feature flags for experimental features
experimental:
enabled: false
# Flow tuning
flow:
query-rewrite:
enabled: true
conversation-history:
max-turns: 20
dialogue-act:
resolute: REGEX_THEN_LLM # REGEX_ONLY | REGEX_THEN_LLM | LLM_ONLY
llm-threshold: 0.90
interaction-policy:
execute-pending-on-affirm: true
reject-pending-on-negate: true
fill-pending-slot-on-non-new-request: true
require-resolved-intent-and-state: true
matrix:
"PENDING_ACTION:AFFIRM": EXECUTE_PENDING_ACTION
"PENDING_ACTION:NEGATE": REJECT_PENDING_ACTION
"PENDING_SLOT:EDIT": FILL_PENDING_SLOT
"PENDING_SLOT:QUESTION": FILL_PENDING_SLOT
"PENDING_SLOT:NEGATE": FILL_PENDING_SLOT
"PENDING_SLOT:AFFIRM": FILL_PENDING_SLOT
action-lifecycle:
enabled: true
ttl-turns: 3
ttl-minutes: 30
tool-orchestration:
enabled: true
guardrail:
enabled: true
sanitize-input: true
require-approval-for-sensitive-actions: false
approval-gate-fail-closed: false
sensitive-patterns: []
state-graph:
enabled: true
soft-block-on-violation: false
allowed-transitions: {}
disambiguation:
enabled: true
max-options: 5
memory:
enabled: true
summary-max-chars: 1200
recent-turns-for-summary: 3
mcp:
tool-max-loops: 5
tool-call-delay-ms: 0
tool-call-delay-after-calls: 4
tool-call-delay-after-ms: 2000
planner-max-observation-chars: 4000
guardrail:
enabled: false
fail-closed: false
allowed-next-by-current-tool: {}
http-api:
defaults:
connect-timeout-ms: 2000
read-timeout-ms: 5000
max-attempts: 2
initial-backoff-ms: 200
max-backoff-ms: 2000
backoff-multiplier: 2.0
circuit-breaker-enabled: true
circuit-failure-threshold: 5
circuit-open-ms: 30000
retry-status-codes: [429, 502, 503, 504]
retry-on-io-exception: true
db:
query:
mode: semantic
sql-guardrail-table: ""
introspect-tables: []
semantic:
enabled: false
tool-code: db.semantic.query
# DB-driven semantic model (no file-path model source)
default-limit: 100
max-limit: 500
sql-dialect: postgres
timezone: system timezone
max-join-hops: 6
max-tables: 10
retrieval:
max-entities: 3
max-tables: 6
min-entity-score: 0.35
min-table-score: 0.30
synonym-weight: 0.40
field-weight: 0.25
id-pattern-weight: 0.20
lexical-weight: 0.15
vector-blend-weight: 0.30
vector:
enabled: false
feedback-enabled: true
table: ce_semantic_concept_embedding
namespace-column: namespace
target-type-column: target_type
target-name-column: target_name
embedding-column: embedding
metadata-column: metadata_json
max-results: 20
clarification:
enabled: true
confidence-threshold: 0.80
retrieval-weight: 0.60
join-weight: 0.40
min-top-entity-gap: 0.12
max-entity-options: 2
# Transport mechanisms
transport:
sse:
enabled: true
emitter-timeout-ms: 1800000
stomp:
enabled: false
endpoint: /ws-convengine
app-destination-prefix: /app
topic-prefix: /topic
audit-destination-base: /topic/convengine/audit
allowed-origin-pattern: "*"
sock-js: true
broker:
mode: SIMPLE # SIMPLE | RELAY
relay-destination-prefixes: /topic,/queue
relay-host: localhost
relay-port: 61613
client-login: ""
client-passcode: ""
system-login: ""
system-passcode: ""
virtual-host: ""
system-heartbeat-send-interval-ms: 10000
system-heartbeat-receive-interval-ms: 10000
# Auditing controls
audit:
enabled: true
persist-meta: true
cache-inspector: false
level: ALL # ALL | STANDARD | ERROR_ONLY | NONE
include-stages: []
exclude-stages: []
include-intents: []
exclude-intents: []
persistence:
mode: IMMEDIATE # IMMEDIATE | DEFERRED_BULK
jdbc-batch-size: 200
max-buffered-events: 5000
flush-stages: [ENGINE_KNOWN_FAILURE, ENGINE_UNKNOWN_FAILURE]
final-step-names: [PipelineEndGuardStep]
flush-on-stop-outcome: true
dispatch:
async-enabled: false
worker-threads: 2
queue-capacity: 2000
rejection-policy: CALLER_RUNS # CALLER_RUNS | DROP_NEWEST | DROP_OLDEST | ABORT
keep-alive-seconds: 60
rate-limit:
enabled: false
max-events: 200
window-ms: 1000
per-conversation: true
per-stage: true
max-tracked-buckets: 20000
Breakdown: Flow Configuration
The convengine.flow.* properties control the nuanced routing behavior without requiring consumer-side hardcoded Java branching for common dialogue/action patterns.
convengine.flow.dialogue-act
| Property | Default | Description |
|---|---|---|
| resolute | REGEX_THEN_LLM | Intent resolution strategy (REGEX_ONLY, REGEX_THEN_LLM, LLM_ONLY) |
| llm-threshold | 0.90 | Confidence threshold for LLM intent classification via DialogueAct |
convengine.flow.query-rewrite
| Property | Default | Description |
|---|---|---|
| enabled | true | Automatically derives a standalone query from conversation history for contextual downstream RAG tool injection. |
convengine.flow.conversation-history
| Property | Default | Description |
|---|---|---|
| maxTurns | 10 | Maximum number of conversation turns to retain in history before summarization. |
convengine.flow.interaction-policy
| Property | Default | Description |
|---|---|---|
| execute-pending-on-affirm | true | Automatically run pending action if user says yes |
| reject-pending-on-negate | true | Cancel pending action if user says no |
| fill-pending-slot-on-non-new-request | true | Assign input to a waiting required parameter slot |
| require-resolved-intent-and-state | true | Enforce strict intent tracking |
| matrix | {...} | Configures the fallback resolution engine for dialogue act intent mapping to standard actions (e.g. PENDING_ACTION:AFFIRM -> EXECUTE_PENDING_ACTION) |
convengine.flow.action-lifecycle
| Property | Default | Description |
|---|---|---|
| enabled | true | Tracks how long pending actions remain valid |
| ttl-turns | 3 | Number of conversational turns a pending action survives before eviction |
| ttl-minutes | 30 | Wall-clock time bounds for pending action survival |
convengine.flow.guardrail
| Property | Default | Description |
|---|---|---|
| enabled | true | General guardrail functionality |
| sanitize-input | true | Basic textual sanitization |
| require-approval-for-sensitive-actions | false | If true, high-privilege tool execution demands explicit user affirmation |
| approval-gate-fail-closed | false | If true, guardrail rejections fail closed rather than degrading gracefully |
| sensitive-patterns | [] | Regex signatures for proactive redaction |
convengine.flow.state-graph
| Property | Default | Description |
|---|---|---|
| enabled | true | Turn state transition validation on/off |
| soft-block-on-violation | false | Allow transition but mark warning if violating strict pathing |
| allowed-transitions | {} | Map defining hard-coded allowed path trajectories |
convengine.flow.disambiguation
| Property | Default | Description |
|---|---|---|
| enabled | true | Allow engine to propose follow-ups when intent density intersects/collides |
| max-options | 5 | Clamp the number of disambiguation choices returned |
convengine.flow.memory
| Property | Default | Description |
|---|---|---|
| enabled | true | Enables LLM-driven session summarization for long dialogues |
| summary-max-chars | 1200 | Maximum characters allowed in token context injection for memory |
| recent-turns-for-summary | 3 | Sliding window of interaction chunks prior to memory compression |
ce_prompt_template.interaction_mode and interaction_contract are table-driven, but the surrounding convengine.flow.* settings determine whether the routing features around CorrectionStep, schema collection, and pending-action handling are active and how strict they behave.
Breakdown: Audit Configuration
convengine.audit.* dictates how the system records telemetry and metric payloads down to the individual pipeline stage logic.
convengine.audit
| Property | Default | Description |
|---|---|---|
| enabled | true | Root toggle for the audit framework |
| persist-meta | true | Attach engine metadata to the payload (intent, state, emittedAt) |
| cache-inspector | false | Takes full snapshots of the memory session tree on every cache step |
| level | ALL | Logging verbosity threshold (ALL, STANDARD, ERROR_ONLY, NONE) |
| include-stages | [] | Whitelist specific stages |
| exclude-stages | [] | Blacklist specific stages |
| include-intents | [] | Whitelist specific intents. If set, only matching intents emit audit events. |
| exclude-intents | [] | Blacklist specific intents. Matching intents emit no audit events at all. |
convengine.audit.dispatch
| Property | Default | Description |
|---|---|---|
| async-enabled | false | Moves transport fan-out off the main request thread when true |
| worker-threads | 2 | Number of async audit dispatcher threads |
| queue-capacity | 2000 | Maximum queued events |
| rejection-policy | CALLER_RUNS | Backpressure handling when capacity exceeded (CALLER_RUNS, DROP_NEWEST, DROP_OLDEST, ABORT) |
| keep-alive-seconds | 60 | Metrics keep-alive window |
convengine.audit.persistence
| Property | Default | Description |
|---|---|---|
| mode | IMMEDIATE | Write style. IMMEDIATE writes row by row. DEFERRED_BULK buffers events and writes batch inserts (safer under load). |
| jdbc-batch-size | 200 | Row chunking factor for DB connection drivers |
| max-buffered-events | 5000 | Maximum heap objects maintained for bulk emission |
| flush-stages | ENGINE_KNOWN_FAILURE, ENGINE_UNKNOWN_FAILURE | Immediate force-flush triggers |
| final-step-names | PipelineEndGuardStep | Trigger to signify request termination to commit remainder logs |
| flush-on-stop-outcome | true | Flush early if a stage explicitly terminates the pipeline |
convengine.audit.rate-limit
| Property | Default | Description |
|---|---|---|
| enabled | false | Protects DB from noisy event generation loop conditions |
| max-events | 200 | Cap on volume |
| window-ms | 1000 | Time interval (sliding) |
| per-conversation | true | Bucket per conversation UUID |
| per-stage | true | Bucket per discrete execution component logic |
| max-tracked-buckets | 20000 | Upper memory footprint limit for Token Bucket store |
Breakdown: MCP Configuration
convengine.mcp.* is much broader in the current v2 line than the older docs implied. It now covers next-tool guardrails, framework-managed HTTP behavior, and Semantic Query.
convengine.mcp.orchestration
| Property | Default | Description |
|---|---|---|
| tool-max-loops | 5 | Hard cap on iterative tool executions to prevent runaway LLM loops. |
| planner-max-observation-chars | 4000 | Truncates tool output observation characters. |
| tool-call-delay-after-calls | 4 | Triggers artificial delay after rapid successive tool invokes. |
| tool-call-delay-after-ms | 2000 | Duration of the artificial rate-limiting delay. |
convengine.mcp.guardrail
| Property | Default | Description |
|---|---|---|
| enabled | false | Turns the MCP next-tool guardrail on or off. |
| fail-closed | false | If true, missing allowed-next rules can block planner proposals. |
| allowed-next-by-current-tool | {} | Whitelists legal next tools by current tool code. |
convengine.mcp.http-api.defaults
| Property | Default | Description |
|---|---|---|
| connect-timeout-ms | 2000 | Connect timeout for framework-managed HTTP tools. |
| read-timeout-ms | 5000 | Read timeout for framework-managed HTTP tools. |
| max-attempts | 2 | Automatic retry attempts for HTTP tools. |
| initial-backoff-ms | 200 | Starting backoff duration. |
| max-backoff-ms | 2000 | Maximum backoff cap. |
| backoff-multiplier | 2.0 | Exponential backoff progression factor. |
| circuit-breaker-enabled | true | Enables the in-memory circuit-breaker path. |
| circuit-failure-threshold | 5 | Failure threshold before opening the breaker. |
| circuit-open-ms | 30000 | Window used for breaker evaluation. |
| retry-status-codes | [429, 502, 503, 504] | Specific HTTP status codes that trigger a retry attempt. |
| retry-on-io-exception | true | Triggers a retry on network drops or connection timeouts. |
convengine.mcp.db.semantic
| Property | Default | Description |
|---|---|---|
| enabled | false | Enables semantic tool chain (`db.semantic.interpret -> db.semantic.query -> postgres.query`). |
| tool-code | db.semantic.query | Primary tool code used by semantic query stage. |
| semantic model source | DB tables (`ce_semantic_*`) | Semantic model is assembled from DB tables; no YAML file path required. |
| default-limit / max-limit | 100 / 500 | Default and max row limits for semantic queries. |
| sql-dialect | postgres | Dialect hint used during SQL generation. |
| timezone | system timezone | Default timezone used for time parsing. |
| max-join-hops / max-tables | 6 / 10 | Safety limits for SQL generation breadth. |
postgres.query execution now supports consumer-overridable interceptor beans (PostgresQueryInterceptor) that run before SQL guardrail + execution.
Framework default interceptor (DefaultPostgresQueryInterceptor, lowest precedence) auto-corrects invalid epoch conversion on timestamp/date columns (for example to_timestamp(ts_col/1000.0) when ts_col is already timestamp/date).
There is no config key for this SPI; override by providing your own interceptor bean with higher @Order.
@Component
@Order(10) // higher priority than framework fallback
public class TenantSqlInterceptor implements PostgresQueryInterceptor {
@Override
public boolean supports(CeMcpTool tool, EngineSession session, Map<String, Object> args) {
return tool != null && "postgres.query".equalsIgnoreCase(tool.getToolCode());
}
@Override
public String intercept(String sql, CeMcpTool tool, EngineSession session, Map<String, Object> args) {
// Example: enforce fully-qualified schema or org SQL conventions
if (sql == null) return null;
return sql.replace(" FROM zp_", " FROM v2.zp_")
.replace(" JOIN zp_", " JOIN v2.zp_");
}
}
convengine.mcp.db.semantic.retrieval / vector / clarification
| Property | Default | Description |
|---|---|---|
| retrieval.max-entities / max-tables | 3 / 6 | Candidate cap for entity and table retrieval. |
| retrieval scoring weights | synonym/field/id-pattern/lexical/vector-blend | Controls retrieval ranking blend. |
| vector.enabled | false | Enable vector-assisted retrieval. |
| vector.feedback-enabled | true | Allow USER_QUERY feedback embeddings to boost retrieval. |
| vector.table / columns | ce_semantic_concept_embedding + overrides | Embedding source table and column mapping. |
| clarification.enabled | true | Enable clarification follow-up loop. |
| clarification.confidence-threshold | 0.80 | Threshold below which clarification is asked. |
| clarification.min-top-entity-gap | 0.12 | If top entity scores are too close, clarification is asked. |
| clarification.max-entity-options | 2 | Maximum options shown in clarification question. |
Breakdown: Transport Configuration
convengine.transport.* applies to interactive async communication paths like Server Sent Events (SSE) or WebSockets via STOMP.
convengine.transport.sse
| Property | Default | Description |
|---|---|---|
| enabled | true | Root toggle for Server Sent Events protocol |
| emitter-timeout-ms | 1800000 | Maximum lifespan of an SSE connection (30 minutes default) |
convengine.transport.stomp.broker
| Property | Default | Description |
|---|---|---|
| mode | SIMPLE | SIMPLE operates an in-memory broker. RELAY interfaces with external STOMP brokers (e.g., RabbitMQ). |
| relay-destination-prefixes | /topic, /queue | Path segments bound to external relay dispatch |
| relay-host | localhost | Address of standard STOMP capable broker |
| relay-port | 61613 | Network port |
| system-heartbeat-send-interval-ms | 10000 | Broker heartbeat outgoing frequency |
| system-heartbeat-receive-interval-ms | 10000 | Broker heartbeat tolerance incoming frequency |
Some transport handlers may also be gated by @EnableConvEngine(stream = true) in your main application class.
Runtime DB Behavior (Deep Dive Links)
ce_verbose: Verbose and Conversation Runtimece_conversation: Verbose and Conversation Runtime- session reset/continuity behavior: Session, Reset, Continuity