SMC AI Relationship Manager - SEBI Compliant
AI-powered relationship management system with compliance guardrails for portfolio analysis, retention, and upselling
Workflow Information
ID: smc_ai_relationship_manager_v2
Namespace: smc_wealth_management
Version: 2.0
Created: 2025-07-17
Updated: 2025-07-17
Tasks: 13
Quick Actions
Inputs
| Name | Type | Required | Default |
|---|---|---|---|
customer_id |
string | Required | None |
analysis_type |
string | Optional |
comprehensive
|
rm_employee_id |
string | Required | None |
enable_retention_analysis |
boolean | Optional |
True
|
enable_upsell_analysis |
boolean | Optional |
True
|
compliance_mode |
string | Optional |
strict
|
Outputs
| Name | Type | Source |
|---|---|---|
audit_trail |
object | Complete audit trail for compliance |
risk_assessment |
object | Relationship risk assessment |
execution_status |
object | Campaign execution status |
customer_analysis |
object | Complete customer analysis with compliance |
portfolio_analysis |
object | Portfolio analysis report (informational only) |
performance_metrics |
object | Workflow performance metrics |
campaign_recommendation |
string | Recommended campaign based on risk |
Tasks
connect_to_crm_database
scriptEstablish connection to custom CRM and discover schema
collect_customer_data
scriptGather customer data from CRM with compliance checks
compliance_check
scriptEnsure all actions comply with SEBI regulations
analyze_portfolio
scriptAnalyze portfolio without providing investment advice
assess_relationship_risk
scriptAnalyze customer behavior for retention risk
risk_based_router
conditional_routerNo description
Conditional Router
Default Route: standard_campaign
create_retention_campaign
scriptDesign retention campaign for high-risk customers
create_engagement_campaign
scriptDesign engagement campaign for medium-risk customers
identify_upsell_opportunities
scriptAnalyze service upselling opportunities
orchestrate_campaigns
scriptCoordinate all campaign executions
notify_rm
scriptSend notifications to RM with compliance-approved actions
create_audit_trail
scriptCreate comprehensive audit trail for compliance
track_performance
scriptTrack workflow performance and outcomes
YAML Source
id: smc_ai_relationship_manager_v2
name: SMC AI Relationship Manager - SEBI Compliant
retry:
retryOn:
- TEMPORARY_FAILURE
- TIMEOUT
- NETWORK_ERROR
maxDelay: 60s
maxAttempts: 3
initialDelay: 2s
backoffMultiplier: 2.0
tasks:
- id: connect_to_crm_database
name: Connect to CRM Database
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
\ timedelta\n\n# Simulate database connection\ntime.sleep(1)\n\ncustomer_id =\
\ \"${customer_id}\"\n\n# Simulate schema discovery\ndiscovered_tables = [\n \
\ \"customer_master\",\n \"account_details\",\n \"portfolio_holdings\"\
,\n \"transaction_history\",\n \"customer_behavior_metrics\",\n \"product_subscriptions\"\
,\n \"customer_interactions\",\n \"customer_goals\"\n]\n\n# Connection metadata\n\
connection_info = {\n \"status\": \"connected\",\n \"database_type\": \"\
MySQL\",\n \"connection_time\": datetime.now().isoformat(),\n \"schema_discovered\"\
: True,\n \"tables_found\": len(discovered_tables),\n \"tables\": discovered_tables,\n\
\ \"read_only_access\": True, # For compliance\n \"encryption_enabled\"\
: True,\n \"data_masking_active\": True\n}\n\n# Verify customer exists\ncustomer_exists\
\ = True # In real implementation, check database\n\nresult = {\n \"connection_established\"\
: True,\n \"connection_info\": connection_info,\n \"customer_exists\": customer_exists,\n\
\ \"customer_id\": customer_id,\n \"compliance_check\": \"PASSED\",\n \
\ \"data_residency\": \"India\",\n \"timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
description: Establish connection to custom CRM and discover schema
timeout_seconds: 120
- id: collect_customer_data
name: Collect Customer Data
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
\ timedelta\n\n# Simulate data collection\ntime.sleep(1)\n\ncustomer_id = \"${customer_id}\"\
\nrm_employee_id = \"${rm_employee_id}\"\n\n# Generate realistic customer data\
\ based on data model\ncustomer_profiles = {\n \"CUST001\": {\n \"name\"\
: \"Rajesh Kumar\",\n \"segment\": \"PLATINUM\",\n \"city\": \"\
Mumbai\",\n \"risk_profile\": \"MODERATE\",\n \"portfolio_value\"\
: 15000000,\n \"trade_frequency\": \"high\"\n },\n \"CUST002\": {\n\
\ \"name\": \"Priya Sharma\",\n \"segment\": \"GOLD\",\n \
\ \"city\": \"Delhi\",\n \"risk_profile\": \"AGGRESSIVE\",\n \"\
portfolio_value\": 7500000,\n \"trade_frequency\": \"medium\"\n },\n\
\ \"CUST003\": {\n \"name\": \"Amit Patel\",\n \"segment\": \"\
SILVER\",\n \"city\": \"Ahmedabad\",\n \"risk_profile\": \"CONSERVATIVE\"\
,\n \"portfolio_value\": 2500000,\n \"trade_frequency\": \"low\"\
\n }\n}\n\n# Default profile\ndefault_profile = {\n \"name\": f\"Customer\
\ {customer_id}\",\n \"segment\": \"SILVER\",\n \"city\": \"Bangalore\"\
,\n \"risk_profile\": \"MODERATE\",\n \"portfolio_value\": 3000000,\n \
\ \"trade_frequency\": \"medium\"\n}\n\nprofile = customer_profiles.get(customer_id,\
\ default_profile)\n\n# Customer master data\ncustomer_master = {\n \"customer_id\"\
: customer_id,\n \"pan_number\": \"XXXXX\" + str(random.randint(1000, 9999))\
\ + \"X\", # Masked\n \"first_name\": profile[\"name\"].split()[0],\n \"\
last_name\": profile[\"name\"].split()[-1],\n \"customer_segment\": profile[\"\
segment\"],\n \"customer_type\": \"HNI\" if profile[\"portfolio_value\"] >\
\ 10000000 else \"RETAIL\",\n \"acquisition_date\": \"2020-03-15\",\n \"\
rm_employee_id\": rm_employee_id,\n \"kyc_status\": \"VERIFIED\",\n \"risk_profile\"\
: profile[\"risk_profile\"],\n \"city\": profile[\"city\"],\n \"customer_status\"\
: \"ACTIVE\"\n}\n\n# Account details\naccount_details = {\n \"account_id\"\
: f\"ACC{customer_id}\",\n \"account_type\": \"TRADING\",\n \"account_subtype\"\
: \"PREMIUM\" if profile[\"segment\"] == \"PLATINUM\" else \"PRO\",\n \"margin_enabled\"\
: True,\n \"margin_limit\": profile[\"portfolio_value\"] * 0.5,\n \"margin_utilized\"\
: profile[\"portfolio_value\"] * 0.3,\n \"derivatives_enabled\": profile[\"\
risk_profile\"] == \"AGGRESSIVE\",\n \"last_activity_date\": (datetime.now()\
\ - timedelta(days=random.randint(1, 30))).strftime(\"%Y-%m-%d\")\n}\n\n# Portfolio\
\ holdings\nportfolio_holdings = {\n \"total_holdings\": random.randint(10,\
\ 30),\n \"portfolio_value\": profile[\"portfolio_value\"],\n \"top_holding_concentration\"\
: random.uniform(0.15, 0.85), # For concentration risk\n \"sector_concentration\"\
: {\n \"IT\": random.uniform(0.1, 0.4),\n \"Banking\": random.uniform(0.1,\
\ 0.3),\n \"Pharma\": random.uniform(0.05, 0.2),\n \"Auto\": random.uniform(0.05,\
\ 0.15),\n \"Others\": random.uniform(0.1, 0.3)\n },\n \"unrealized_pnl\"\
: random.randint(-500000, 2000000),\n \"holding_period_avg_days\": random.randint(30,\
\ 365)\n}\n\n# Behavioral metrics\ndays_since_last_trade = random.randint(1, 60)\n\
behavioral_metrics = {\n \"trades_count_30d\": random.randint(0, 50) if profile[\"\
trade_frequency\"] == \"high\" else random.randint(0, 20),\n \"trades_count_90d\"\
: random.randint(20, 150) if profile[\"trade_frequency\"] == \"high\" else random.randint(5,\
\ 60),\n \"login_count_7d\": random.randint(0, 14),\n \"login_count_30d\"\
: random.randint(5, 60),\n \"days_since_last_trade\": days_since_last_trade,\n\
\ \"trade_frequency_change_percent\": random.uniform(-50, 20),\n \"funds_withdrawn_30d\"\
: random.randint(0, 1000000) if days_since_last_trade > 30 else 0,\n \"research_reports_viewed_30d\"\
: random.randint(0, 20)\n}\n\n# Product subscriptions\nproduct_subscriptions =\
\ [\n {\n \"product_code\": \"EQUITY_TRADING\",\n \"product_name\"\
: \"Equity Trading\",\n \"subscription_status\": \"ACTIVE\"\n }\n]\n\
\nif profile[\"segment\"] in [\"PLATINUM\", \"GOLD\"]:\n product_subscriptions.append({\n\
\ \"product_code\": \"RESEARCH_ADVISORY\",\n \"product_name\": \"\
Premium Research\",\n \"subscription_status\": \"ACTIVE\"\n })\n\n#\
\ Compliance data\ncompliance_data = {\n \"data_access_logged\": True,\n \
\ \"pii_masked\": True,\n \"access_reason\": \"relationship_management\",\n\
\ \"access_timestamp\": datetime.now().isoformat(),\n \"authorized_by\"\
: rm_employee_id\n}\n\nresult = {\n \"status\": \"success\",\n \"customer_data\"\
: {\n \"customer_master\": customer_master,\n \"account_details\"\
: account_details,\n \"portfolio_holdings\": portfolio_holdings,\n \
\ \"behavioral_metrics\": behavioral_metrics,\n \"product_subscriptions\"\
: product_subscriptions\n },\n \"compliance_data\": compliance_data,\n \
\ \"data_quality_score\": 0.95,\n \"collection_timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- connect_to_crm_database
description: Gather customer data from CRM with compliance checks
previous_node: connect_to_crm_database
timeout_seconds: 180
- id: compliance_check
name: Compliance Check
type: script
script: "import json\nimport time\nfrom datetime import datetime\n\n# Simulate compliance\
\ check\ntime.sleep(0.5)\n\ncompliance_mode = \"${compliance_mode}\"\ncustomer_data\
\ = ${collect_customer_data.customer_data}\n\n# Compliance rules\ncompliance_rules\
\ = {\n \"no_investment_advice\": True,\n \"data_privacy_maintained\": True,\n\
\ \"audit_trail_enabled\": True,\n \"risk_disclosure_required\": True,\n\
\ \"cooling_period_respected\": True,\n \"unsolicited_communication_blocked\"\
: False\n}\n\n# Check for violations\nviolations = []\n\n# Check if customer is\
\ in DND list (Do Not Disturb)\ndnd_status = False # In real implementation,\
\ check DND registry\n\nif dnd_status:\n violations.append(\"Customer in DND\
\ list\")\n\n# Check cooling period for recent transactions\nlast_activity = customer_data[\"\
account_details\"][\"last_activity_date\"]\n\n# Generate compliance report\ncompliance_report\
\ = {\n \"check_timestamp\": datetime.now().isoformat(),\n \"compliance_mode\"\
: compliance_mode,\n \"rules_checked\": len(compliance_rules),\n \"rules_passed\"\
: sum(compliance_rules.values()),\n \"violations\": violations,\n \"compliance_status\"\
: \"PASSED\" if not violations else \"FAILED\",\n \"recommendations\": {\n\
\ \"allowed_actions\": [\n \"portfolio_analysis\",\n \
\ \"risk_assessment\",\n \"educational_content\",\n \
\ \"service_information\"\n ],\n \"prohibited_actions\": [\n \
\ \"stock_recommendations\",\n \"buy_sell_advice\",\n \
\ \"guaranteed_returns\",\n \"misleading_claims\"\n ]\n\
\ },\n \"regulatory_framework\": \"SEBI\",\n \"next_review_date\": \"\
2024-12-31\"\n}\n\nresult = {\n \"compliance_check_completed\": True,\n \
\ \"compliance_report\": compliance_report,\n \"proceed_with_analysis\": compliance_report[\"\
compliance_status\"] == \"PASSED\",\n \"timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- collect_customer_data
description: Ensure all actions comply with SEBI regulations
previous_node: collect_customer_data
timeout_seconds: 60
- id: analyze_portfolio
name: Analyze Portfolio
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
\n# Only proceed if compliance check passed\nif not ${compliance_check.proceed_with_analysis}:\n\
\ result = {\n \"analysis_blocked\": True,\n \"reason\": \"Compliance\
\ check failed\",\n \"timestamp\": datetime.now().isoformat()\n }\n\
\ print(f\"__OUTPUTS__ {json.dumps(result)}\")\n return\n\n# Simulate portfolio\
\ analysis\ntime.sleep(1)\n\ncustomer_data = ${collect_customer_data.customer_data}\n\
portfolio = customer_data[\"portfolio_holdings\"]\n\n# Calculate portfolio metrics\
\ (informational only)\nconcentration_risk = \"HIGH\" if portfolio[\"top_holding_concentration\"\
] > 0.5 else \"MEDIUM\" if portfolio[\"top_holding_concentration\"] > 0.3 else\
\ \"LOW\"\n\n# Sector analysis\nmax_sector = max(portfolio[\"sector_concentration\"\
].items(), key=lambda x: x[1])\nsector_concentration_risk = \"HIGH\" if max_sector[1]\
\ > 0.4 else \"MEDIUM\" if max_sector[1] > 0.25 else \"LOW\"\n\n# Portfolio health\
\ score (not investment advice)\nhealth_factors = {\n \"diversification\":\
\ 1 - portfolio[\"top_holding_concentration\"],\n \"sector_balance\": 1 - max_sector[1],\n\
\ \"profitability\": min(max(portfolio[\"unrealized_pnl\"] / portfolio[\"portfolio_value\"\
], -0.5), 0.5) + 0.5,\n \"holding_stability\": min(portfolio[\"holding_period_avg_days\"\
] / 365, 1.0)\n}\n\nportfolio_health_score = sum(health_factors.values()) / len(health_factors)\n\
\n# Educational insights (not recommendations)\neducational_insights = []\n\n\
if concentration_risk == \"HIGH\":\n educational_insights.append({\n \
\ \"type\": \"INFORMATION\",\n \"message\": \"Portfolio has high concentration\
\ in single holding\",\n \"education\": \"Diversification can help manage\
\ risk\"\n })\n\nif sector_concentration_risk == \"HIGH\":\n educational_insights.append({\n\
\ \"type\": \"INFORMATION\",\n \"message\": f\"High exposure to\
\ {max_sector[0]} sector\",\n \"education\": \"Sector diversification is\
\ a common risk management practice\"\n })\n\n# Generate analysis report\n\
analysis_report = {\n \"report_type\": \"INFORMATIONAL_ONLY\",\n \"disclaimer\"\
: \"This is for informational purposes only and not investment advice\",\n \
\ \"portfolio_metrics\": {\n \"total_value\": portfolio[\"portfolio_value\"\
],\n \"number_of_holdings\": portfolio[\"total_holdings\"],\n \"\
concentration_metrics\": {\n \"top_holding_percent\": round(portfolio[\"\
top_holding_concentration\"] * 100, 2),\n \"concentration_risk_level\"\
: concentration_risk\n },\n \"sector_distribution\": portfolio[\"\
sector_concentration\"],\n \"sector_concentration_risk\": sector_concentration_risk,\n\
\ \"unrealized_pnl_percent\": round((portfolio[\"unrealized_pnl\"] / portfolio[\"\
portfolio_value\"]) * 100, 2)\n },\n \"portfolio_health\": {\n \"\
overall_score\": round(portfolio_health_score, 2),\n \"factors\": health_factors,\n\
\ \"interpretation\": \"For educational purposes only\"\n },\n \"\
educational_insights\": educational_insights,\n \"available_services\": [\n\
\ \"Portfolio review consultation\",\n \"Risk assessment report\"\
,\n \"Educational webinars\",\n \"Market research access\"\n \
\ ]\n}\n\nresult = {\n \"analysis_completed\": True,\n \"analysis_report\"\
: analysis_report,\n \"compliance_maintained\": True,\n \"timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- compliance_check
- collect_customer_data
description: Analyze portfolio without providing investment advice
previous_node: compliance_check
timeout_seconds: 120
- id: assess_relationship_risk
name: Assess Relationship Risk
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
\ timedelta\n\n# Simulate risk assessment\ntime.sleep(1)\n\ncustomer_data = ${collect_customer_data.customer_data}\n\
behavioral_metrics = customer_data[\"behavioral_metrics\"]\naccount_details =\
\ customer_data[\"account_details\"]\n\n# Calculate retention risk factors\nrisk_factors\
\ = []\nrisk_scores = {}\n\n# Trading activity risk\nif behavioral_metrics[\"\
days_since_last_trade\"] > 30:\n risk_factors.append(\"No trading activity\
\ in 30+ days\")\n risk_scores[\"trading_inactivity\"] = min(behavioral_metrics[\"\
days_since_last_trade\"] / 60, 1.0)\nelse:\n risk_scores[\"trading_inactivity\"\
] = 0.2\n\n# Login frequency risk\nif behavioral_metrics[\"login_count_7d\"] ==\
\ 0:\n risk_factors.append(\"No login in past week\")\n risk_scores[\"login_inactivity\"\
] = 0.8\nelif behavioral_metrics[\"login_count_30d\"] < 5:\n risk_factors.append(\"\
Low platform engagement\")\n risk_scores[\"login_inactivity\"] = 0.5\nelse:\n\
\ risk_scores[\"login_inactivity\"] = 0.1\n\n# Trading pattern change\nif behavioral_metrics[\"\
trade_frequency_change_percent\"] < -30:\n risk_factors.append(\"Significant\
\ decrease in trading frequency\")\n risk_scores[\"pattern_change\"] = 0.7\n\
else:\n risk_scores[\"pattern_change\"] = 0.2\n\n# Fund withdrawal risk\nif\
\ behavioral_metrics[\"funds_withdrawn_30d\"] > 500000:\n risk_factors.append(\"\
Large fund withdrawal detected\")\n risk_scores[\"fund_movement\"] = 0.9\n\
elif behavioral_metrics[\"funds_withdrawn_30d\"] > 100000:\n risk_scores[\"\
fund_movement\"] = 0.5\nelse:\n risk_scores[\"fund_movement\"] = 0.1\n\n# Calculate\
\ overall risk score\noverall_risk_score = sum(risk_scores.values()) / len(risk_scores)\n\
\n# Determine risk level\nif overall_risk_score >= 0.7:\n risk_level = \"HIGH\"\
\n risk_description = \"Immediate attention required\"\nelif overall_risk_score\
\ >= 0.4:\n risk_level = \"MEDIUM\"\n risk_description = \"Monitor closely\"\
\nelse:\n risk_level = \"LOW\"\n risk_description = \"Stable relationship\"\
\n\n# Generate retention strategies (operational, not investment)\nretention_strategies\
\ = []\n\nif risk_level == \"HIGH\":\n retention_strategies = [\n \"\
Schedule immediate RM call\",\n \"Offer platform feature demonstration\"\
,\n \"Share educational content\",\n \"Review service satisfaction\"\
\n ]\nelif risk_level == \"MEDIUM\":\n retention_strategies = [\n \
\ \"Send personalized market insights\",\n \"Invite to webinar\",\n \
\ \"Share new platform features\",\n \"Quarterly review call\"\n \
\ ]\nelse:\n retention_strategies = [\n \"Regular newsletter\",\n\
\ \"Birthday/anniversary greetings\",\n \"Loyalty program benefits\"\
,\n \"Referral incentives\"\n ]\n\nresult = {\n \"assessment_completed\"\
: True,\n \"risk_assessment\": {\n \"overall_risk_score\": round(overall_risk_score,\
\ 2),\n \"risk_level\": risk_level,\n \"risk_description\": risk_description,\n\
\ \"risk_factors\": risk_factors,\n \"detailed_scores\": risk_scores\n\
\ },\n \"retention_strategies\": retention_strategies,\n \"next_review_date\"\
: (datetime.now() + timedelta(days=30 if risk_level == \"LOW\" else 14 if risk_level\
\ == \"MEDIUM\" else 7)).strftime(\"%Y-%m-%d\"),\n \"compliance_note\": \"\
All strategies are service-related, no investment advice\",\n \"timestamp\"\
: datetime.now().isoformat()\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
)\n"
depends_on:
- collect_customer_data
- analyze_portfolio
description: Analyze customer behavior for retention risk
previous_node: analyze_portfolio
timeout_seconds: 120
- id: risk_based_router
type: conditional_router
conditions:
- name: high_risk_path
route: retention_campaign
condition: ${assess_relationship_risk.risk_assessment.risk_level} == 'HIGH'
- name: medium_risk_path
route: engagement_campaign
condition: ${assess_relationship_risk.risk_assessment.risk_level} == 'MEDIUM'
- name: low_risk_path
route: upsell_analysis
condition: ${assess_relationship_risk.risk_assessment.risk_level} == 'LOW'
depends_on:
- assess_relationship_risk
default_route: standard_campaign
previous_node: assess_relationship_risk
- id: create_retention_campaign
name: Create Retention Campaign
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
\ timedelta\n\n# Simulate campaign creation\ntime.sleep(1)\n\ncustomer_data =\
\ ${collect_customer_data.customer_data}\nrisk_assessment = ${assess_relationship_risk.risk_assessment}\n\
\n# Service-based retention offers (no investment advice)\nretention_offers =\
\ {\n \"service_enhancements\": [\n \"Dedicated RM support upgrade\"\
,\n \"Priority customer service\",\n \"Free account maintenance\
\ for 6 months\",\n \"Exclusive market research access\"\n ],\n \"\
platform_benefits\": [\n \"Advanced charting tools access\",\n \"\
Real-time data feeds upgrade\",\n \"Mobile app premium features\",\n \
\ \"API access for algo trading\"\n ],\n \"educational_offerings\"\
: [\n \"One-on-one platform training\",\n \"Exclusive webinar invitations\"\
,\n \"Personalized market newsletters\",\n \"Quarterly portfolio\
\ review sessions\"\n ],\n \"fee_considerations\": [\n \"Brokerage\
\ rate review\",\n \"Annual fee waiver evaluation\",\n \"Transaction\
\ cost optimization\",\n \"Margin rate assessment\"\n ]\n}\n\n# Select\
\ appropriate offers\nselected_offers = {\n \"primary_offer\": random.choice(retention_offers[\"\
service_enhancements\"]),\n \"secondary_offers\": random.sample(retention_offers[\"\
platform_benefits\"], 2),\n \"educational_support\": random.sample(retention_offers[\"\
educational_offerings\"], 2)\n}\n\n# Communication plan\ncommunication_plan =\
\ {\n \"immediate_action\": {\n \"channel\": \"phone\",\n \"\
timing\": \"within_24_hours\",\n \"message_type\": \"service_review\",\n\
\ \"caller\": \"${rm_employee_id}\"\n },\n \"follow_up_sequence\"\
: [\n {\n \"day\": 3,\n \"channel\": \"email\",\n\
\ \"content\": \"platform_features_guide\"\n },\n {\n\
\ \"day\": 7,\n \"channel\": \"sms\",\n \"content\"\
: \"webinar_invitation\"\n },\n {\n \"day\": 14,\n \
\ \"channel\": \"phone\",\n \"content\": \"satisfaction_check\"\
\n }\n ]\n}\n\ncampaign = {\n \"campaign_id\": f\"RET_{customer_data['customer_master']['customer_id']}_{datetime.now().strftime('%Y%m%d')}\"\
,\n \"campaign_type\": \"RETENTION\",\n \"priority\": \"HIGH\",\n \"\
customer_segment\": customer_data[\"customer_master\"][\"customer_segment\"],\n\
\ \"risk_factors\": risk_assessment[\"risk_factors\"],\n \"offers\": selected_offers,\n\
\ \"communication_plan\": communication_plan,\n \"compliance_approved\"\
: True,\n \"approval_note\": \"All offers are service-based, no investment\
\ advice\",\n \"success_metrics\": {\n \"target_reactivation\": \"30_days\"\
,\n \"engagement_increase\": \"50%\",\n \"retention_probability\"\
: \"75%\"\n },\n \"budget_allocation\": {\n \"service_costs\": random.randint(5000,\
\ 15000),\n \"platform_upgrades\": random.randint(3000, 8000),\n \
\ \"total_investment\": random.randint(8000, 23000)\n }\n}\n\nresult = {\n\
\ \"campaign_created\": True,\n \"campaign_details\": campaign,\n \"\
execution_ready\": True,\n \"timestamp\": datetime.now().isoformat()\n}\n\n\
print(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- risk_based_router
- collect_customer_data
- assess_relationship_risk
description: Design retention campaign for high-risk customers
previous_node: risk_based_router
execute_on_routes:
- retention_campaign
- id: create_engagement_campaign
name: Create Engagement Campaign
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
\ timedelta\n\n# Simulate campaign creation\ntime.sleep(1)\n\ncustomer_data =\
\ ${collect_customer_data.customer_data}\n\n# Educational content library\neducational_content\
\ = {\n \"market_education\": [\n \"Understanding Market Volatility\"\
,\n \"Basics of Portfolio Diversification\",\n \"Risk Management\
\ Strategies\",\n \"Market Timing vs Time in Market\"\n ],\n \"platform_tutorials\"\
: [\n \"Advanced Order Types Explained\",\n \"Using Technical Indicators\"\
,\n \"Platform Shortcuts and Tips\",\n \"Mobile App Hidden Features\"\
\n ],\n \"regulatory_updates\": [\n \"Latest SEBI Guidelines\",\n\
\ \"Tax Implications Update\",\n \"Compliance Requirements\",\n\
\ \"Investor Protection Measures\"\n ]\n}\n\n# Select content based\
\ on customer profile\nrisk_profile = customer_data[\"customer_master\"][\"risk_profile\"\
]\n\nselected_content = {\n \"primary_content\": educational_content[\"market_education\"\
],\n \"platform_education\": random.sample(educational_content[\"platform_tutorials\"\
], 2),\n \"compliance_updates\": random.sample(educational_content[\"regulatory_updates\"\
], 1)\n}\n\n# Engagement activities\nactivities = [\n {\n \"type\":\
\ \"webinar\",\n \"topic\": random.choice(selected_content[\"primary_content\"\
]),\n \"date\": (datetime.now() + timedelta(days=7)).strftime(\"%Y-%m-%d\"\
),\n \"duration\": \"45 minutes\"\n },\n {\n \"type\": \"\
email_series\",\n \"topic\": \"Platform Feature Highlights\",\n \
\ \"frequency\": \"weekly\",\n \"duration\": \"4 weeks\"\n },\n {\n\
\ \"type\": \"market_insights\",\n \"topic\": \"Weekly Market Commentary\"\
,\n \"frequency\": \"weekly\",\n \"personalized\": True\n }\n\
]\n\ncampaign = {\n \"campaign_id\": f\"ENG_{customer_data['customer_master']['customer_id']}_{datetime.now().strftime('%Y%m%d')}\"\
,\n \"campaign_type\": \"ENGAGEMENT\",\n \"priority\": \"MEDIUM\",\n \
\ \"content_strategy\": selected_content,\n \"activities\": activities,\n \
\ \"personalization\": {\n \"risk_profile\": risk_profile,\n \"\
preferred_sectors\": [\"IT\", \"Banking\"], # From portfolio analysis\n \
\ \"communication_preference\": \"email\"\n },\n \"success_metrics\":\
\ {\n \"content_consumption_target\": \"60%\",\n \"webinar_attendance\"\
: \"2 sessions\",\n \"platform_login_increase\": \"40%\"\n },\n \"\
compliance_note\": \"All content is educational, no investment recommendations\"\
\n}\n\nresult = {\n \"campaign_created\": True,\n \"campaign_details\":\
\ campaign,\n \"execution_ready\": True,\n \"timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- risk_based_router
- collect_customer_data
description: Design engagement campaign for medium-risk customers
previous_node: risk_based_router
execute_on_routes:
- engagement_campaign
- id: identify_upsell_opportunities
name: Identify Upsell Opportunities
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
\n# Simulate upsell analysis\ntime.sleep(1)\n\ncustomer_data = ${collect_customer_data.customer_data}\n\
current_products = [p[\"product_code\"] for p in customer_data[\"product_subscriptions\"\
]]\n\n# Available SMC products/services\nall_products = {\n \"RESEARCH_ADVISORY\"\
: {\n \"name\": \"Premium Research Advisory\",\n \"benefit\": \"\
Expert market analysis and reports\",\n \"compliance\": \"Educational service\"\
\n },\n \"ALGO_TRADING\": {\n \"name\": \"Algorithmic Trading Platform\"\
,\n \"benefit\": \"Automated order execution\",\n \"compliance\"\
: \"Execution service only\"\n },\n \"MARGIN_PLUS\": {\n \"name\"\
: \"Enhanced Margin Facility\",\n \"benefit\": \"Higher margin limits\"\
,\n \"compliance\": \"Credit facility\"\n },\n \"PRIORITY_SUPPORT\"\
: {\n \"name\": \"Priority Customer Support\",\n \"benefit\": \"\
24/7 dedicated support\",\n \"compliance\": \"Service enhancement\"\n \
\ },\n \"TAX_PLANNING\": {\n \"name\": \"Tax Planning Services\",\n\
\ \"benefit\": \"Tax optimization guidance\",\n \"compliance\":\
\ \"Advisory service\"\n },\n \"PORTFOLIO_ANALYTICS\": {\n \"name\"\
: \"Advanced Portfolio Analytics\",\n \"benefit\": \"Detailed performance\
\ tracking\",\n \"compliance\": \"Analytical tool\"\n }\n}\n\n# Identify\
\ missing products\nmissing_products = []\nfor product_code, product_info in all_products.items():\n\
\ if product_code not in current_products:\n missing_products.append({\n\
\ \"product_code\": product_code,\n \"product_info\": product_info,\n\
\ \"relevance_score\": random.uniform(0.5, 0.9)\n })\n\n# Sort\
\ by relevance\nmissing_products.sort(key=lambda x: x[\"relevance_score\"], reverse=True)\n\
\n# Create upsell opportunities\nopportunities = []\nfor product in missing_products[:3]:\
\ # Top 3 opportunities\n opportunities.append({\n \"product\": product[\"\
product_info\"][\"name\"],\n \"value_proposition\": product[\"product_info\"\
][\"benefit\"],\n \"compliance_status\": product[\"product_info\"][\"compliance\"\
],\n \"estimated_revenue\": random.randint(5000, 25000),\n \"probability\"\
: f\"{int(product['relevance_score'] * 100)}%\"\n })\n\n# Upsell strategy\n\
upsell_strategy = {\n \"approach\": \"Consultative\",\n \"timing\": \"During\
\ quarterly review\",\n \"method\": \"Demonstrate value through trial\",\n\
\ \"compliance_approach\": \"Focus on service benefits, not returns\"\n}\n\n\
result = {\n \"analysis_completed\": True,\n \"current_products\": current_products,\n\
\ \"upsell_opportunities\": opportunities,\n \"total_revenue_potential\"\
: sum(opp[\"estimated_revenue\"] for opp in opportunities),\n \"upsell_strategy\"\
: upsell_strategy,\n \"compliance_approved\": True,\n \"timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- risk_based_router
- collect_customer_data
description: Analyze service upselling opportunities
previous_node: risk_based_router
execute_on_routes:
- upsell_analysis
- standard_campaign
- id: orchestrate_campaigns
name: Orchestrate Campaigns
type: script
script: "import json\nimport time\nfrom datetime import datetime\n\n# Simulate orchestration\n\
time.sleep(1)\n\nselected_route = \"${risk_based_router.selected_route}\"\n\n\
# Initialize orchestration data\norchestration = {\n \"orchestration_id\":\
\ f\"ORCH_{datetime.now().strftime('%Y%m%d%H%M%S')}\",\n \"selected_route\"\
: selected_route,\n \"campaigns_to_execute\": []\n}\n\n# Gather campaign data\
\ based on route\ntry:\n if selected_route == \"retention_campaign\":\n \
\ retention_campaign = ${create_retention_campaign.campaign_details}\n \
\ orchestration[\"campaigns_to_execute\"].append({\n \"type\":\
\ \"retention\",\n \"campaign\": retention_campaign,\n \"\
priority\": \"HIGH\"\n })\n elif selected_route == \"engagement_campaign\"\
:\n engagement_campaign = ${create_engagement_campaign.campaign_details}\n\
\ orchestration[\"campaigns_to_execute\"].append({\n \"type\"\
: \"engagement\",\n \"campaign\": engagement_campaign,\n \
\ \"priority\": \"MEDIUM\"\n })\n elif selected_route in [\"upsell_analysis\"\
, \"standard_campaign\"]:\n upsell_opportunities = ${identify_upsell_opportunities}\n\
\ orchestration[\"campaigns_to_execute\"].append({\n \"type\"\
: \"upsell\",\n \"opportunities\": upsell_opportunities,\n \
\ \"priority\": \"LOW\"\n })\nexcept:\n orchestration[\"error\"]\
\ = \"Failed to gather campaign data\"\n\n# Execution plan\nexecution_plan = {\n\
\ \"immediate_actions\": [],\n \"scheduled_actions\": [],\n \"monitoring_required\"\
: True\n}\n\nfor campaign in orchestration[\"campaigns_to_execute\"]:\n if\
\ campaign[\"priority\"] == \"HIGH\":\n execution_plan[\"immediate_actions\"\
].append({\n \"action\": \"notify_rm\",\n \"timeline\":\
\ \"within_4_hours\"\n })\n else:\n execution_plan[\"scheduled_actions\"\
].append({\n \"action\": \"execute_campaign\",\n \"timeline\"\
: \"as_per_schedule\"\n })\n\norchestration[\"execution_plan\"] = execution_plan\n\
\nresult = {\n \"orchestration_completed\": True,\n \"orchestration_details\"\
: orchestration,\n \"ready_for_execution\": True,\n \"timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- create_retention_campaign
- create_engagement_campaign
- identify_upsell_opportunities
- risk_based_router
description: Coordinate all campaign executions
previous_node:
- create_retention_campaign
- create_engagement_campaign
- identify_upsell_opportunities
timeout_seconds: 120
- id: notify_rm
name: Notify Relationship Manager
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
\n# Simulate notification\ntime.sleep(0.5)\n\nrm_employee_id = \"${rm_employee_id}\"\
\ncustomer_id = \"${customer_id}\"\norchestration = ${orchestrate_campaigns.orchestration_details}\n\
\n# Create RM notification\nnotification = {\n \"notification_id\": f\"NOTIF_{random.randint(10000,\
\ 99999)}\",\n \"rm_employee_id\": rm_employee_id,\n \"customer_id\": customer_id,\n\
\ \"priority\": orchestration[\"campaigns_to_execute\"][0][\"priority\"] if\
\ orchestration[\"campaigns_to_execute\"] else \"MEDIUM\",\n \"notification_type\"\
: \"ACTION_REQUIRED\",\n \"summary\": f\"Customer relationship action required\
\ for {customer_id}\",\n \"compliance_cleared\": True,\n \"allowed_actions\"\
: [\n \"Contact customer for service review\",\n \"Share educational\
\ content\",\n \"Discuss platform features\",\n \"Address service\
\ concerns\"\n ],\n \"prohibited_actions\": [\n \"Provide stock recommendations\"\
,\n \"Guarantee returns\",\n \"Pressure for investments\",\n \
\ \"Share other client information\"\n ],\n \"communication_scripts\"\
: {\n \"opening\": \"I'm calling to review your experience with our services\"\
,\n \"value_prop\": \"We have some new platform features that might interest\
\ you\",\n \"compliance_reminder\": \"This is a service call, not investment\
\ advice\"\n },\n \"channels\": [\"dashboard\", \"email\", \"sms\"],\n \
\ \"timestamp\": datetime.now().isoformat()\n}\n\nresult = {\n \"notification_sent\"\
: True,\n \"notification_details\": notification,\n \"delivery_status\"\
: \"SUCCESS\",\n \"rm_response_required\": True\n}\n\nprint(f\"__OUTPUTS__\
\ {json.dumps(result)}\")\n"
depends_on:
- orchestrate_campaigns
description: Send notifications to RM with compliance-approved actions
previous_node: orchestrate_campaigns
timeout_seconds: 60
- id: create_audit_trail
name: Create Audit Trail
type: script
script: "import json\nimport time\nfrom datetime import datetime\n\n# Simulate audit\
\ trail creation\ntime.sleep(0.5)\n\n# Gather all workflow data for audit\naudit_trail\
\ = {\n \"audit_id\": f\"AUDIT_{datetime.now().strftime('%Y%m%d%H%M%S')}\"\
,\n \"workflow_id\": \"${WORKFLOW_ID}\",\n \"execution_id\": \"${EXECUTION_ID}\"\
,\n \"customer_id\": \"${customer_id}\",\n \"rm_employee_id\": \"${rm_employee_id}\"\
,\n \"workflow_name\": \"smc_ai_relationship_manager_v2\",\n \"execution_start\"\
: \"${EXECUTION_START_TIME}\",\n \"execution_end\": datetime.now().isoformat(),\n\
\ \"compliance_status\": \"MAINTAINED\",\n \"data_access_log\": [\n \
\ {\n \"table\": \"customer_master\",\n \"access_time\"\
: \"${collect_customer_data.collection_timestamp}\",\n \"purpose\"\
: \"relationship_management\"\n },\n {\n \"table\": \"\
portfolio_holdings\",\n \"access_time\": \"${analyze_portfolio.timestamp}\"\
,\n \"purpose\": \"portfolio_analysis\"\n }\n ],\n \"\
decisions_made\": [\n {\n \"decision\": \"risk_classification\"\
,\n \"result\": \"${assess_relationship_risk.risk_assessment.risk_level}\"\
,\n \"basis\": \"behavioral_metrics\"\n },\n {\n \
\ \"decision\": \"campaign_selection\",\n \"result\": \"${risk_based_router.selected_route}\"\
,\n \"basis\": \"risk_level\"\n }\n ],\n \"compliance_checks\"\
: [\n {\n \"check\": \"sebi_compliance\",\n \"result\"\
: \"PASSED\",\n \"timestamp\": \"${compliance_check.timestamp}\"\n\
\ },\n {\n \"check\": \"no_investment_advice\",\n \
\ \"result\": \"MAINTAINED\",\n \"timestamp\": datetime.now().isoformat()\n\
\ }\n ],\n \"actions_taken\": [\n \"data_collection\",\n \
\ \"portfolio_analysis\",\n \"risk_assessment\",\n \"campaign_creation\"\
,\n \"rm_notification\"\n ],\n \"retention_period\": \"7_years\"\
,\n \"encryption_applied\": True\n}\n\nresult = {\n \"audit_trail_created\"\
: True,\n \"audit_details\": audit_trail,\n \"storage_location\": \"secure_audit_db\"\
,\n \"timestamp\": datetime.now().isoformat()\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
)\n"
depends_on:
- notify_rm
- orchestrate_campaigns
description: Create comprehensive audit trail for compliance
previous_node: notify_rm
timeout_seconds: 60
- id: track_performance
name: Track Performance
type: script
script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
\n# Simulate performance tracking\ntime.sleep(0.5)\n\n# Performance metrics\n\
performance_metrics = {\n \"workflow_metrics\": {\n \"total_execution_time\"\
: f\"{random.randint(20, 40)} seconds\",\n \"tasks_completed\": 12,\n \
\ \"tasks_successful\": 12,\n \"error_rate\": 0.0,\n \"compliance_maintained\"\
: True\n },\n \"business_metrics\": {\n \"customer_analyzed\": 1,\n\
\ \"risk_identified\": \"${assess_relationship_risk.risk_assessment.risk_level}\"\
,\n \"campaigns_created\": 1,\n \"potential_revenue_impact\": random.randint(10000,\
\ 50000),\n \"retention_probability\": f\"{random.randint(60, 85)}%\"\n\
\ },\n \"ai_metrics\": {\n \"model_confidence\": round(random.uniform(0.85,\
\ 0.95), 2),\n \"prediction_accuracy\": \"To be measured post-campaign\"\
,\n \"data_quality_score\": 0.95\n },\n \"compliance_metrics\": {\n\
\ \"sebi_compliant\": True,\n \"audit_trail_complete\": True,\n\
\ \"pii_protected\": True,\n \"consent_verified\": True\n }\n\
}\n\n# Recommendations for improvement\nimprovements = [\n \"Enhance behavioral\
\ prediction models\",\n \"Expand product recommendation matrix\",\n \"\
Improve campaign personalization\",\n \"Add more granular risk factors\"\n\
]\n\nresult = {\n \"tracking_completed\": True,\n \"performance_metrics\"\
: performance_metrics,\n \"improvement_recommendations\": random.sample(improvements,\
\ 2),\n \"next_execution_scheduled\": None,\n \"timestamp\": datetime.now().isoformat()\n\
}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
depends_on:
- create_audit_trail
description: Track workflow performance and outcomes
previous_node: create_audit_trail
timeout_seconds: 60
inputs:
- name: customer_id
type: string
required: true
description: Customer identifier for analysis
- name: analysis_type
type: string
default: comprehensive
required: false
description: 'Analysis type: quick, standard, comprehensive'
- name: rm_employee_id
type: string
required: true
description: Relationship Manager ID
- name: enable_retention_analysis
type: boolean
default: true
required: false
description: Enable retention risk analysis
- name: enable_upsell_analysis
type: boolean
default: true
required: false
description: Enable upsell opportunity analysis
- name: compliance_mode
type: string
default: strict
required: false
description: 'Compliance mode: strict, standard'
labels:
product: relationship_manager
version: '2.0'
priority: high
compliance: sebi_compliant
department: wealth_management
environment: production
outputs:
audit_trail:
type: object
source: create_audit_trail.audit_details
description: Complete audit trail for compliance
risk_assessment:
type: object
source: assess_relationship_risk
description: Relationship risk assessment
execution_status:
type: object
source: orchestrate_campaigns
description: Campaign execution status
customer_analysis:
type: object
source: collect_customer_data.customer_data
description: Complete customer analysis with compliance
portfolio_analysis:
type: object
source: analyze_portfolio.analysis_report
description: Portfolio analysis report (informational only)
performance_metrics:
type: object
source: track_performance.performance_metrics
description: Workflow performance metrics
campaign_recommendation:
type: string
source: risk_based_router.selected_route
description: Recommended campaign based on risk
version: '2.0'
metadata:
author: SMC AI Team
use_case: AI Relationship Manager - SEBI Compliant
created_date: '2024-01-17'
last_modified: '2024-01-17'
data_classification: CONFIDENTIAL
compliance_framework: SEBI
namespace: smc_wealth_management
description: AI-powered relationship management system with compliance guardrails
for portfolio analysis, retention, and upselling
timeout_seconds: 3600
| Execution ID | Status | Started | Duration | Actions |
|---|---|---|---|---|
a98713aa...
|
COMPLETED |
2025-07-17
09:35:48 |
N/A | View |