Skip to main content

Execution

Fully deterministic — no LLM involved. The same entity, concept version, condition version, and timestamp always produce the same Result (Rₜ) and Decision (Aₜ).


Execute Full Pipeline

POST /evaluate/full

Runs concept execution (ψ), condition evaluation (φ), and action triggering (α) in one atomic request. Returns a FullPipelineResult containing the Result (Rₜ) and Decision (Aₜ).

Determinism: Provide a timestamp for fully deterministic, reproducible execution. Omit for snapshot mode — current data, not guaranteed reproducible.

dry_run

Pass dry_run: true to simulate without firing actions. decision.actions_triggered[].status will be "would_trigger".

Request Body

ParameterTypeRequiredDescription
concept_id / concept_versionstringRequiredPinned concept reference.
condition_id / condition_versionstringRequiredPinned condition reference.
entitystringRequiredEntity to evaluate.
timestampdatetimeOptionalISO 8601 UTC. Provides deterministic execution.
explainbooleanOptionalDefault false. Include Explanation in Result (Rₜ).
dry_runbooleanOptionalDefault false. Simulate without firing actions.

Response — FullPipelineResult

ParameterTypeRequiredDescription
resultResult (Rₜ)AlwaysConcept execution output.
result.valuenumber|bool|stringAlwaysComputed output. Type matches declared output type.
result.deterministicbooleanAlwaystrue when timestamp was provided.
decisionDecision (Aₜ)AlwaysCondition evaluation output.
decision.valueboolean|stringAlwaystrue/false for boolean strategies; matched label for equals.
decision.actions_triggeredarrayAlwaysaction_id, status, payload_sent, error? per action.

Response Codes

StatusDescription
200Pipeline executed. Action failures return 200 with per-action status.
401Unauthorised.
404Concept, condition, or entity not found.
408Execution timed out (30s).
422Execution failed — missing data or null propagation.
429Rate limit.

TypeScript Example

const pipeline = await client.evaluateFull({
conceptId: "org.churn_risk",
conceptVersion: "1.2",
conditionId: "org.high_churn",
conditionVersion: "1.0",
entity: "user_abc123",
timestamp: new Date().toISOString(),
explain: true,
});

console.log(pipeline.result.value); // 0.87 (Result Rₜ)
console.log(pipeline.result.deterministic); // true
console.log(pipeline.decision.value); // true (Decision Aₜ)

pipeline.decision.actions_triggered.forEach(a =>
console.log(a.action_id, a.status)
);

Evaluate a Condition with Inline Data (Test Only)

POST /execute/static

Evaluates a registered condition using caller-supplied primitive values. No real data connectors or memintel_config.yaml entries needed. Use for local testing and smoke testing new conditions.

Test only

This endpoint bypasses the production data pipeline entirely. Do not use it in production workflows.

Request Body

ParameterTypeRequiredDescription
condition_idstringRequiredThe condition to evaluate.
condition_versionstringRequiredThe specific condition version.
entitystringRequiredEntity identifier.
dataobjectRequiredInline primitive values — { primitive_name: value }.

Response — DecisionValue

ParameterTypeDescription
valueboolean|stringThe decision outcome. true/false for boolean strategies; matched label for equals.
decision_typeenumboolean | categorical.
strategystringThe strategy that was applied.
threshold_appliednumber|nullThe parameter value used. null for equals and composite.
reasonstring|nullnull_input, insufficient_history, or history_unavailable — present when the strategy could not fully evaluate.
history_countinteger|nullNumber of historical results available when reason is insufficient_history.

Response Codes

StatusDescription
200DecisionValue returned.
404Condition not found.
422Execution failed — missing data or type mismatch.

TypeScript Example

const result = await client.execute.static({
conditionId: "cond_churn_risk",
conditionVersion: "v1",
entity: "account_xyz789",
data: {
"account.active_user_rate_30d": 0.29,
"account.days_to_renewal": 47,
},
});

console.log(result.value); // true
console.log(result.decision_type); // "boolean"
console.log(result.threshold_applied); // 0.35