NOTICE: All information contained herein is, and remains
the property of TechnoCore Automate.
Updated : 2026-03-17
ObjFeatureRender is a template rendering engine that merges data
from three sources into resolved messages:
Supports single-record rendering and bulk rendering to an output
table. Used after ObjFeatureStore.compute_features to turn
computed features into actionable messages (SMS, email, scripts).
ObjFeatureStore → computes features (the engine)
ObjFeatureRender → merges sources + resolves templates (the renderer)
The renderer does NOT compute features — call
ObjFeatureStore.compute_features first.
Call configure() before rendering:
renderer = ObjFeatureRender()
renderer.configure(
feature_code="creditscore_test",
source_table="data_test_credit_person",
constant_tables="data_test_credit_constants",
template_table="data_test_credit_template",
pk_column="PersonNo",
template_code_column="sms_template_code",
)
| Parameter | Default | Description |
|---|---|---|
feature_code |
— | Feature code (determines feature table) |
source_table |
— | Person/account data table |
constant_tables |
— | Comma-separated constant tables |
template_table |
— | Template definitions table |
pk_column |
PersonNo | Join column between tables |
template_code_column |
sms_template_code | Feature column with template code |
template_key_column |
TemplateCode | Template table PK column |
template_subject_column |
Subject | Template subject column |
template_body_column |
Body | Template body column |
template_channel_column |
Channel | Template channel column |
constant_key_column |
ConstantKey | Constants key column |
constant_value_column |
ConstantValue | Constants value column |
Templates use $xxx$ placeholders. The renderer builds a merged
context from all three sources, then resolves all placeholders in
one pass.
Later sources override earlier ones on key collision:
The context is normalized with lowercase and snake_case aliases:
NextInstallment → also available as nextinstallment and next_installment$next_installment$, $NextInstallment$, or $nextinstallment$Render a single record. If template_code is empty, reads it from
the feature row using the configured template_code_column.
Returns:
{
"pk": "1000000006",
"channel": "SMS",
"subject": "",
"body": "Hi Lerato, your account...",
"template_code": "SMS_COLLECTIONS_LEGAL",
}
Render all records to an output table. Creates the table if it
doesn't exist. Returns the number of rows rendered.
Output table schema:
| Column | Description |
|---|---|
| Guid | Render GUID |
| PkValue | Source primary key |
| TemplateCode | Template used |
| Channel | SMS/Email/WhatsApp/Script |
| Subject | Resolved subject |
| Body | Resolved body text |
| Package | Axion package |
| Module | ObjFeatureRender |
| CreateDate | Render timestamp |
Pass comma-separated table names. Later tables override earlier
ones on key collision:
renderer.configure(
constant_tables="data_global_constants,data_package_constants",
...
)
# Single record render
python ObjFeatureRender.py render-single \
--feature-code creditscore_test \
--source-table data_test_credit_person \
--pk-value 1000000006 \
--constant-tables data_test_credit_constants \
--template-table data_test_credit_template
# Bulk render to output table
python ObjFeatureRender.py render-bulk-cmd \
--feature-code creditscore_test \
--source-table data_test_credit_person \
--output-table data_creditscore_rendered \
--constant-tables data_test_credit_constants \
--template-table data_test_credit_template
Used via the FEATURERENDER workflow node (see
ObjWorkflowFeatureRender). Typically follows a FEATURESTORE
compute node:
FEATURESTORE (compute) → FEATURERENDER (render) → AI (summarise)
Updated : 2026-03-17