SMC AI Relationship Manager - SEBI Compliant

AI-powered relationship management system with compliance guardrails for portfolio analysis, retention, and upselling

Back
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
Manage Secrets
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
script

Establish connection to custom CRM and discover schema

collect_customer_data
script

Gather customer data from CRM with compliance checks

compliance_check
script

Ensure all actions comply with SEBI regulations

analyze_portfolio
script

Analyze portfolio without providing investment advice

assess_relationship_risk
script

Analyze customer behavior for retention risk

risk_based_router
conditional_router

No description

Conditional Router
Router Type: condition
Default Route: standard_campaign
create_retention_campaign
script

Design retention campaign for high-risk customers

create_engagement_campaign
script

Design engagement campaign for medium-risk customers

identify_upsell_opportunities
script

Analyze service upselling opportunities

orchestrate_campaigns
script

Coordinate all campaign executions

notify_rm
script

Send notifications to RM with compliance-approved actions

create_audit_trail
script

Create comprehensive audit trail for compliance

track_performance
script

Track 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