Gen AI - SMC AI Relationship Manager Workflow

AI-powered relationship management system for SMC's customer portfolio with cross-selling and retention capabilities

Back
Workflow Information

ID: smc_ai_relationship_manager_genai

Namespace: smc_finance

Version: 1.0

Created: 2025-07-17

Updated: 2025-07-17

Tasks: 14

Quick Actions
Manage Secrets
Inputs
Name Type Required Default
client_id string Required None
analysis_depth string Optional standard
enable_cross_selling boolean Optional True
enable_retention_alerts boolean Optional True
sub_broker_id string Optional None
smc_api_base_url string Optional https://api.smcindiaonline.com
Outputs
Name Type Source
client_analysis object Complete client analysis results
risk_assessment object Client risk assessment and recommendations
learning_outcomes object Model learning and optimization results
performance_metrics object Workflow execution metrics and insights
recommended_actions string Recommended actions based on client profile
Tasks
collect_client_data
script

Gather client data from multiple SMC systems

analyze_client_profile
script

AI-powered client profile analysis and segmentation

assess_client_risk
script

Comprehensive risk assessment for client relationship

risk_based_router
conditional_router

No description

Conditional Router
Router Type: condition
Default Route: standard_path
generate_retention_strategy
script

Create personalized retention strategy for high-risk clients

create_engagement_campaign
script

Design engagement campaign for medium-risk clients

identify_upsell_opportunities
script

Analyze cross-selling and upselling opportunities for stable clients

consolidate_strategy_results
script

Gather and consolidate all strategy outputs from different paths

notify_sub_broker
script

Send notifications to sub-broker based on risk assessment

prepare_client_communication
script

Prepare personalized client communications based on strategy

update_client_profile
script

Update client profile with new insights and recommendations

simulate_response_tracking
script

Track and analyze client responses to campaigns

generate_performance_metrics
ai_agent

AI-powered comprehensive workflow performance metrics analysis

update_learning_model
script

Feed results back into AI learning system for continuous improvement

YAML Source
id: smc_ai_relationship_manager_genai
name: Gen AI - SMC AI Relationship Manager Workflow
retry:
  retryOn:
  - TEMPORARY_FAILURE
  - TIMEOUT
  - NETWORK_ERROR
  maxDelay: 60s
  maxAttempts: 3
  initialDelay: 2s
  backoffMultiplier: 2
tasks:
- id: collect_client_data
  name: Collect Client Data
  type: script
  script: "import json\nimport time\nimport random\nimport os\nfrom datetime import\
    \ datetime, timedelta\n\n# Simulate processing time\ntime.sleep(1)\n\n# Get environment\
    \ variables or use defaults\nclient_id = os.getenv(\"CLIENT_ID\", \"C001\")\n\
    sub_broker_id = os.getenv(\"SUB_BROKER_ID\", f\"SB{random.randint(100, 999)}\"\
    )\n\n# Generate realistic dummy data based on client_id\nclient_profiles = {\n\
    \    \"C001\": {\n        \"name\": \"Rajesh Kumar\",\n        \"city\": \"Mumbai\"\
    ,\n        \"age\": 45,\n        \"occupation\": \"Business Owner\",\n       \
    \ \"risk_profile\": \"MODERATE\",\n        \"aum\": 850000,\n        \"preferred_segments\"\
    : [\"equity\", \"mutual_funds\"]\n    },\n    \"C002\": {\n        \"name\": \"\
    Priya Sharma\",\n        \"city\": \"Delhi\",\n        \"age\": 32,\n        \"\
    occupation\": \"Software Engineer\",\n        \"risk_profile\": \"AGGRESSIVE\"\
    ,\n        \"aum\": 350000,\n        \"preferred_segments\": [\"equity\", \"derivatives\"\
    ]\n    },\n    \"C003\": {\n        \"name\": \"Amit Patel\",\n        \"city\"\
    : \"Ahmedabad\",\n        \"age\": 55,\n        \"occupation\": \"Doctor\",\n\
    \        \"risk_profile\": \"CONSERVATIVE\",\n        \"aum\": 1200000,\n    \
    \    \"preferred_segments\": [\"mutual_funds\", \"insurance\"]\n    }\n}\n\n#\
    \ Default profile for unknown client_id\ndefault_profile = {\n    \"name\": f\"\
    Client_{client_id}\",\n    \"city\": \"Bangalore\",\n    \"age\": 40,\n    \"\
    occupation\": \"Professional\",\n    \"risk_profile\": \"MODERATE\",\n    \"aum\"\
    : 500000,\n    \"preferred_segments\": [\"equity\", \"mutual_funds\"]\n}\n\nprofile\
    \ = client_profiles.get(client_id, default_profile)\n\n# Simulate comprehensive\
    \ client data\nclient_data = {\n    \"client_id\": client_id,\n    \"basic_info\"\
    : {\n        \"name\": profile[\"name\"],\n        \"city\": profile[\"city\"\
    ],\n        \"age\": profile[\"age\"],\n        \"occupation\": profile[\"occupation\"\
    ],\n        \"registration_date\": \"2020-01-15\",\n        \"kyc_status\": \"\
    VERIFIED\",\n        \"risk_profile\": profile[\"risk_profile\"],\n        \"\
    sub_broker_id\": sub_broker_id\n    },\n    \"portfolio\": {\n        \"equity_holdings\"\
    : int(profile[\"aum\"] * 0.6),\n        \"mutual_funds\": int(profile[\"aum\"\
    ] * 0.25),\n        \"insurance_policies\": random.randint(1, 4),\n        \"\
    active_loans\": random.randint(0, 2),\n        \"total_aum\": profile[\"aum\"\
    ],\n        \"cash_balance\": random.randint(10000, 100000)\n    },\n    \"transaction_history\"\
    : {\n        \"last_transaction_date\": (datetime.now() - timedelta(days=random.randint(1,\
    \ 30))).strftime(\"%Y-%m-%d\"),\n        \"avg_monthly_volume\": random.randint(25000,\
    \ 150000),\n        \"preferred_segments\": profile[\"preferred_segments\"],\n\
    \        \"trading_frequency\": random.choice([\"low\", \"medium\", \"high\"]),\n\
    \        \"total_trades_ytd\": random.randint(15, 120)\n    },\n    \"behavioral_data\"\
    : {\n        \"login_frequency\": random.choice([\"daily\", \"weekly\", \"monthly\"\
    ]),\n        \"mobile_app_usage\": random.choice([\"high\", \"medium\", \"low\"\
    ]),\n        \"support_interactions\": random.randint(0, 5),\n        \"webinar_attendance\"\
    : random.randint(0, 10),\n        \"research_report_downloads\": random.randint(5,\
    \ 25)\n    },\n    \"communication_preferences\": {\n        \"channel\": random.choice([\"\
    email\", \"sms\", \"whatsapp\", \"phone\"]),\n        \"frequency\": random.choice([\"\
    daily\", \"weekly\", \"monthly\"]),\n        \"content_type\": random.choice([\"\
    research_reports\", \"market_updates\", \"product_offers\"])\n    }\n}\n\nresult\
    \ = {\n    \"status\": \"success\",\n    \"client_data\": client_data,\n    \"\
    data_sources\": [\"trading_system\", \"crm\", \"support_system\", \"mobile_app\"\
    ],\n    \"collection_timestamp\": datetime.now().isoformat(),\n    \"data_quality_score\"\
    : round(random.uniform(0.8, 1.0), 2)\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  description: Gather client data from multiple SMC systems
  timeout_seconds: 120
- id: analyze_client_profile
  name: Analyze Client Profile
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
    \n# Simulate AI processing time\ntime.sleep(1)\n\nclient_data = ${collect_client_data.client_data}\n\
    \n# Determine primary segment based on portfolio and behavior\naum = client_data[\"\
    portfolio\"][\"total_aum\"]\nequity_ratio = client_data[\"portfolio\"][\"equity_holdings\"\
    ] / aum\ntrading_freq = client_data[\"transaction_history\"][\"trading_frequency\"\
    ]\n\n# Segment classification logic\nif aum >= 1000000:\n    primary_segment =\
    \ \"HNI_CLIENT\"\n    segment_description = \"High Net Worth Individual\"\nelif\
    \ trading_freq == \"high\" and equity_ratio > 0.6:\n    primary_segment = \"ACTIVE_TRADER\"\
    \n    segment_description = \"Active Equity Trader\"\nelif \"mutual_funds\" in\
    \ client_data[\"transaction_history\"][\"preferred_segments\"]:\n    primary_segment\
    \ = \"MF_INVESTOR\"\n    segment_description = \"Mutual Fund Investor\"\nelif\
    \ client_data[\"portfolio\"][\"insurance_policies\"] >= 2:\n    primary_segment\
    \ = \"INSURANCE_CLIENT\"\n    segment_description = \"Insurance Focused Client\"\
    \nelif client_data[\"portfolio\"][\"active_loans\"] >= 1:\n    primary_segment\
    \ = \"LOAN_CLIENT\"\n    segment_description = \"Active Borrower\"\nelse:\n  \
    \  primary_segment = \"REGULAR_CLIENT\"\n    segment_description = \"Regular Retail\
    \ Client\"\n\n# Generate behavioral patterns\nbehavioral_patterns = [\n    \"\
    Prefers long-term investments\",\n    \"Responds well to research-based recommendations\"\
    ,\n    \"Price-sensitive to fees and charges\",\n    \"Technology-savvy user\"\
    ,\n    \"Seeks regular market updates\"\n]\n\n# Engagement level assessment\n\
    login_score = {\"daily\": 0.9, \"weekly\": 0.6, \"monthly\": 0.3}\napp_usage_score\
    \ = {\"high\": 0.8, \"medium\": 0.5, \"low\": 0.2}\n\nengagement_score = (\n \
    \   login_score.get(client_data[\"behavioral_data\"][\"login_frequency\"], 0.5)\
    \ * 0.4 +\n    app_usage_score.get(client_data[\"behavioral_data\"][\"mobile_app_usage\"\
    ], 0.5) * 0.3 +\n    min(client_data[\"behavioral_data\"][\"webinar_attendance\"\
    ] / 10, 1.0) * 0.3\n)\n\nresult = {\n    \"analysis_timestamp\": datetime.now().isoformat(),\n\
    \    \"primary_segment\": primary_segment,\n    \"segment_description\": segment_description,\n\
    \    \"secondary_characteristics\": [\n        f\"Risk Profile: {client_data['basic_info']['risk_profile']}\"\
    ,\n        f\"AUM Tier: {'Premium' if aum >= 500000 else 'Standard'}\",\n    \
    \    f\"Trading Activity: {trading_freq.title()}\"\n    ],\n    \"behavioral_patterns\"\
    : random.sample(behavioral_patterns, 3),\n    \"engagement_level\": {\n      \
    \  \"score\": round(engagement_score, 2),\n        \"rating\": \"High\" if engagement_score\
    \ >= 0.7 else \"Medium\" if engagement_score >= 0.4 else \"Low\"\n    },\n   \
    \ \"investment_preferences\": {\n        \"preferred_products\": client_data[\"\
    transaction_history\"][\"preferred_segments\"],\n        \"risk_appetite\": client_data[\"\
    basic_info\"][\"risk_profile\"],\n        \"investment_horizon\": random.choice([\"\
    Short-term\", \"Medium-term\", \"Long-term\"])\n    },\n    \"confidence_score\"\
    : round(random.uniform(0.75, 0.95), 2)\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  depends_on:
  - collect_client_data
  description: AI-powered client profile analysis and segmentation
  previous_node: collect_client_data
- id: assess_client_risk
  name: Assess Client Risk
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
    \ timedelta\n\n# Simulate risk analysis processing\ntime.sleep(1)\n\nclient_data\
    \ = ${collect_client_data.client_data}\nprofile_analysis = ${analyze_client_profile}\n\
    \n# Calculate risk factors\nlast_transaction = datetime.strptime(client_data[\"\
    transaction_history\"][\"last_transaction_date\"], \"%Y-%m-%d\")\ndays_since_last_transaction\
    \ = (datetime.now() - last_transaction).days\n\n# Churn risk calculation\nactivity_risk\
    \ = min(days_since_last_transaction / 30, 1.0)  # 30 days = max risk\nengagement_risk\
    \ = 1.0 - profile_analysis[\"engagement_level\"][\"score\"]\nsupport_risk = min(client_data[\"\
    behavioral_data\"][\"support_interactions\"] / 5, 1.0)\n\nchurn_risk_score = (activity_risk\
    \ * 0.4 + engagement_risk * 0.4 + support_risk * 0.2)\n\n# Determine risk level\n\
    if churn_risk_score >= 0.7:\n    risk_level = \"HIGH\"\n    risk_description =\
    \ \"Immediate attention required\"\nelif churn_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# Portfolio risk\
    \ assessment\nportfolio_concentration = max(client_data[\"portfolio\"][\"equity_holdings\"\
    ] / client_data[\"portfolio\"][\"total_aum\"], 0.3)\nportfolio_risk = \"HIGH\"\
    \ if portfolio_concentration > 0.8 else \"MEDIUM\" if portfolio_concentration\
    \ > 0.6 else \"LOW\"\n\n# Generate risk factors\nrisk_factors = []\nif activity_risk\
    \ > 0.5:\n    risk_factors.append(\"Reduced trading activity\")\nif engagement_risk\
    \ > 0.6:\n    risk_factors.append(\"Low platform engagement\")\nif support_risk\
    \ > 0.4:\n    risk_factors.append(\"Frequent support requests\")\nif portfolio_concentration\
    \ > 0.7:\n    risk_factors.append(\"High portfolio concentration\")\n\n# Recommended\
    \ interventions\ninterventions = {\n    \"HIGH\": [\n        \"Immediate relationship\
    \ manager contact\",\n        \"Personalized retention offer\",\n        \"Portfolio\
    \ review meeting\",\n        \"Competitive analysis\"\n    ],\n    \"MEDIUM\"\
    : [\n        \"Enhanced engagement campaign\",\n        \"Educational content\
    \ delivery\",\n        \"Regular market updates\",\n        \"Product demonstrations\"\
    \n    ],\n    \"LOW\": [\n        \"Routine check-ins\",\n        \"Cross-selling\
    \ opportunities\",\n        \"Loyalty program enrollment\",\n        \"Referral\
    \ incentives\"\n    ]\n}\n\nresult = {\n    \"assessment_timestamp\": datetime.now().isoformat(),\n\
    \    \"risk_level\": risk_level,\n    \"risk_description\": risk_description,\n\
    \    \"churn_risk_score\": round(churn_risk_score, 2),\n    \"risk_factors\":\
    \ risk_factors if risk_factors else [\"No significant risk factors identified\"\
    ],\n    \"portfolio_risk\": {\n        \"level\": portfolio_risk,\n        \"\
    concentration_ratio\": round(portfolio_concentration, 2),\n        \"diversification_score\"\
    : round(1 - portfolio_concentration, 2)\n    },\n    \"relationship_health\":\
    \ {\n        \"score\": round(1 - churn_risk_score, 2),\n        \"status\": \"\
    Healthy\" if churn_risk_score < 0.3 else \"At Risk\" if churn_risk_score < 0.7\
    \ else \"Critical\"\n    },\n    \"recommended_interventions\": interventions[risk_level],\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\
    }\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - analyze_client_profile
  - collect_client_data
  description: Comprehensive risk assessment for client relationship
  previous_node: analyze_client_profile
- id: risk_based_router
  type: conditional_router
  conditions:
  - name: high_risk_client
    route: retention_path
    condition: ${assess_client_risk.risk_level} == 'HIGH'
  - name: medium_risk_client
    route: engagement_path
    condition: ${assess_client_risk.risk_level} == 'MEDIUM'
  - name: low_risk_client
    route: upsell_path
    condition: ${assess_client_risk.risk_level} == 'LOW'
  depends_on:
  - assess_client_risk
  default_route: standard_path
  previous_node: assess_client_risk
- id: generate_retention_strategy
  name: Generate Retention Strategy
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
    \n# Simulate strategy generation\ntime.sleep(1)\n\nclient_data = ${collect_client_data.client_data}\n\
    risk_assessment = ${assess_client_risk}\n\n# Personalized retention offers based\
    \ on client profile\naum = client_data[\"portfolio\"][\"total_aum\"]\n\n# Fee\
    \ reduction offers\nfee_reduction = {\n    \"brokerage_discount\": \"50% reduction\
    \ for 6 months\",\n    \"annual_fee_waiver\": \"Complete waiver for current year\"\
    ,\n    \"premium_services\": \"Free access to premium research\"\n}\n\n# Service\
    \ enhancements\nservice_enhancements = [\n    \"Dedicated relationship manager\
    \ assignment\",\n    \"Priority customer support\",\n    \"Exclusive market insights\"\
    ,\n    \"Personalized portfolio review sessions\",\n    \"Direct access to research\
    \ analysts\"\n]\n\n# Competitive analysis\ncompetitive_offers = [\n    \"Rate\
    \ matching guarantee\",\n    \"Better margin rates\",\n    \"Enhanced product\
    \ offerings\",\n    \"Technology platform improvements\"\n]\n\n# Communication\
    \ strategy\ncommunication_plan = {\n    \"immediate_actions\": [\n        \"Personal\
    \ call within 24 hours\",\n        \"Email with retention offer\",\n        \"\
    SMS with priority support number\"\n    ],\n    \"follow_up_schedule\": [\n  \
    \      \"Day 3: Check satisfaction with offer\",\n        \"Week 1: Portfolio\
    \ review meeting\",\n        \"Week 2: Market insights sharing\",\n        \"\
    Month 1: Relationship health check\"\n    ],\n    \"escalation_triggers\": [\n\
    \        \"No response within 48 hours\",\n        \"Rejection of initial offer\"\
    ,\n        \"Continued low activity\"\n    ]\n}\n\nresult = {\n    \"strategy_timestamp\"\
    : datetime.now().isoformat(),\n    \"client_id\": client_data[\"client_id\"],\n\
    \    \"retention_priority\": \"CRITICAL\",\n    \"personalized_offers\": {\n \
    \       \"fee_reductions\": fee_reduction,\n        \"value_adds\": random.sample(service_enhancements,\
    \ 3),\n        \"competitive_matching\": random.sample(competitive_offers, 2)\n\
    \    },\n    \"communication_strategy\": communication_plan,\n    \"success_metrics\"\
    : {\n        \"target_engagement_increase\": \"40%\",\n        \"retention_probability\"\
    : \"75%\",\n        \"timeline_to_stability\": \"30 days\"\n    },\n    \"budget_allocation\"\
    : {\n        \"fee_concessions\": f\"\u20B9{random.randint(5000, 25000)}\",\n\
    \        \"service_costs\": f\"\u20B9{random.randint(2000, 10000)}\",\n      \
    \  \"total_investment\": f\"\u20B9{random.randint(7000, 35000)}\"\n    },\n  \
    \  \"approval_required\": True,\n    \"assigned_rm\": f\"RM{random.randint(100,\
    \ 999)}\"\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - risk_based_router
  - collect_client_data
  - assess_client_risk
  description: Create personalized retention strategy for high-risk clients
  previous_node: risk_based_router
  execute_on_routes:
  - retention_path
- 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\nclient_data = ${collect_client_data.client_data}\n\
    profile_analysis = ${analyze_client_profile}\n\n# Educational content based on\
    \ client interests\ncontent_library = {\n    \"equity\": [\n        \"Market Analysis\
    \ Webinar\",\n        \"Stock Picking Strategies\",\n        \"Technical Analysis\
    \ Basics\",\n        \"Sector Rotation Insights\"\n    ],\n    \"mutual_funds\"\
    : [\n        \"SIP Benefits Masterclass\",\n        \"Fund Selection Guide\",\n\
    \        \"Tax-Saving Opportunities\",\n        \"Portfolio Rebalancing\"\n  \
    \  ],\n    \"insurance\": [\n        \"Life Insurance Planning\",\n        \"\
    Health Insurance Essentials\",\n        \"Retirement Planning\",\n        \"Tax\
    \ Benefits of Insurance\"\n    ]\n}\n\n# Select relevant content\npreferred_segments\
    \ = client_data[\"transaction_history\"][\"preferred_segments\"]\nselected_content\
    \ = []\nfor segment in preferred_segments:\n    if segment in content_library:\n\
    \        selected_content.extend(random.sample(content_library[segment], 2))\n\
    \n# Engagement activities\nactivities = [\n    {\n        \"type\": \"webinar_invitation\"\
    ,\n        \"title\": random.choice(selected_content),\n        \"date\": (datetime.now()\
    \ + timedelta(days=random.randint(3, 14))).strftime(\"%Y-%m-%d\"),\n        \"\
    priority\": \"HIGH\"\n    },\n    {\n        \"type\": \"market_insights\",\n\
    \        \"title\": \"Weekly Market Commentary\",\n        \"frequency\": \"Weekly\"\
    ,\n        \"priority\": \"MEDIUM\"\n    },\n    {\n        \"type\": \"product_demo\"\
    ,\n        \"title\": \"New Trading Platform Features\",\n        \"date\": (datetime.now()\
    \ + timedelta(days=random.randint(7, 21))).strftime(\"%Y-%m-%d\"),\n        \"\
    priority\": \"LOW\"\n    },\n    {\n        \"type\": \"portfolio_review\",\n\
    \        \"title\": \"Quarterly Portfolio Health Check\",\n        \"date\": (datetime.now()\
    \ + timedelta(days=random.randint(30, 60))).strftime(\"%Y-%m-%d\"),\n        \"\
    priority\": \"MEDIUM\"\n    }\n]\n\n# Communication schedule\ncommunication_schedule\
    \ = {\n    \"week_1\": [\n        \"Welcome to enhanced engagement program\",\n\
    \        \"Personalized market insights\"\n    ],\n    \"week_2\": [\n       \
    \ \"Webinar invitation\",\n        \"Educational content delivery\"\n    ],\n\
    \    \"week_3\": [\n        \"Portfolio optimization tips\",\n        \"New product\
    \ announcements\"\n    ],\n    \"week_4\": [\n        \"Month-end review\",\n\
    \        \"Satisfaction survey\"\n    ]\n}\n\nresult = {\n    \"campaign_timestamp\"\
    : datetime.now().isoformat(),\n    \"client_id\": client_data[\"client_id\"],\n\
    \    \"campaign_type\": \"ENGAGEMENT_BOOST\",\n    \"duration\": \"30 days\",\n\
    \    \"engagement_activities\": activities,\n    \"content_recommendations\":\
    \ selected_content,\n    \"communication_schedule\": communication_schedule,\n\
    \    \"success_metrics\": {\n        \"target_engagement_increase\": \"25%\",\n\
    \        \"webinar_attendance_goal\": \"2 sessions\",\n        \"platform_usage_increase\"\
    : \"30%\",\n        \"content_consumption_target\": \"5 pieces\"\n    },\n   \
    \ \"personalization_elements\": {\n        \"preferred_communication_time\": \"\
    10:00 AM - 12:00 PM\",\n        \"content_format\": \"Video + PDF summary\",\n\
    \        \"interaction_style\": \"Educational focus\"\n    },\n    \"escalation_conditions\"\
    : [\n        \"No engagement within 7 days\",\n        \"Declined webinar invitations\"\
    ,\n        \"Reduced platform usage\"\n    ]\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  depends_on:
  - risk_based_router
  - collect_client_data
  - analyze_client_profile
  description: Design engagement campaign for medium-risk clients
  previous_node: risk_based_router
  execute_on_routes:
  - engagement_path
- id: identify_upsell_opportunities
  name: Identify Upsell Opportunities
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
    \n# Simulate opportunity analysis\ntime.sleep(1)\n\nclient_data = ${collect_client_data.client_data}\n\
    profile_analysis = ${analyze_client_profile}\n\n# Current product usage\ncurrent_products\
    \ = []\nportfolio = client_data[\"portfolio\"]\n\nif portfolio[\"equity_holdings\"\
    ] > 0:\n    current_products.append(\"equity_trading\")\nif portfolio[\"mutual_funds\"\
    ] > 0:\n    current_products.append(\"mutual_funds\")\nif portfolio[\"insurance_policies\"\
    ] > 0:\n    current_products.append(\"insurance\")\nif portfolio[\"active_loans\"\
    ] > 0:\n    current_products.append(\"loans\")\n\n# Cross-selling opportunities\
    \ matrix\ncross_sell_matrix = {\n    \"equity_trading\": [\n        {\"product\"\
    : \"derivatives\", \"priority\": \"HIGH\", \"reason\": \"Natural progression for\
    \ equity traders\"},\n        {\"product\": \"mutual_funds\", \"priority\": \"\
    MEDIUM\", \"reason\": \"Portfolio diversification\"},\n        {\"product\": \"\
    insurance\", \"priority\": \"LOW\", \"reason\": \"Risk protection\"}\n    ],\n\
    \    \"mutual_funds\": [\n        {\"product\": \"sip_plus\", \"priority\": \"\
    HIGH\", \"reason\": \"Systematic investment enhancement\"},\n        {\"product\"\
    : \"insurance\", \"priority\": \"MEDIUM\", \"reason\": \"Complete financial planning\"\
    },\n        {\"product\": \"equity_trading\", \"priority\": \"LOW\", \"reason\"\
    : \"Direct market participation\"}\n    ],\n    \"insurance\": [\n        {\"\
    product\": \"investment_insurance\", \"priority\": \"HIGH\", \"reason\": \"Insurance\
    \ + investment combo\"},\n        {\"product\": \"mutual_funds\", \"priority\"\
    : \"MEDIUM\", \"reason\": \"Long-term wealth creation\"},\n        {\"product\"\
    : \"loans\", \"priority\": \"LOW\", \"reason\": \"Against policy loans\"}\n  \
    \  ],\n    \"loans\": [\n        {\"product\": \"investment_products\", \"priority\"\
    : \"HIGH\", \"reason\": \"Wealth building alongside borrowing\"},\n        {\"\
    product\": \"insurance\", \"priority\": \"MEDIUM\", \"reason\": \"Loan protection\
    \ coverage\"},\n        {\"product\": \"savings_accounts\", \"priority\": \"LOW\"\
    , \"reason\": \"Better cash management\"}\n    ]\n}\n\n# Identify opportunities\n\
    opportunities = []\nfor product in current_products:\n    if product in cross_sell_matrix:\n\
    \        opportunities.extend(cross_sell_matrix[product])\n\n# Remove duplicates\
    \ and prioritize\nunique_opportunities = []\nseen_products = set()\nfor opp in\
    \ opportunities:\n    if opp[\"product\"] not in seen_products:\n        unique_opportunities.append(opp)\n\
    \        seen_products.add(opp[\"product\"])\n\n# Product gap analysis\nall_smc_products\
    \ = [\n    \"equity_trading\", \"derivatives\", \"mutual_funds\", \"sip_plus\"\
    ,\n    \"insurance\", \"investment_insurance\", \"loans\", \"investment_products\"\
    ,\n    \"savings_accounts\", \"demat_services\", \"research_advisory\"\n]\n\n\
    missing_products = [p for p in all_smc_products if p not in current_products]\n\
    \n# Value propositions\nvalue_propositions = {\n    \"derivatives\": \"Leverage\
    \ your equity knowledge for enhanced returns\",\n    \"mutual_funds\": \"Professional\
    \ fund management for diversified growth\",\n    \"sip_plus\": \"Automated investing\
    \ with higher return potential\",\n    \"insurance\": \"Protect your wealth while\
    \ building more\",\n    \"investment_insurance\": \"Dual benefit of protection\
    \ and growth\",\n    \"loans\": \"Unlock liquidity without selling investments\"\
    ,\n    \"investment_products\": \"Systematic wealth building solutions\",\n  \
    \  \"savings_accounts\": \"Higher returns on your idle cash\",\n    \"demat_services\"\
    : \"Seamless investment management\",\n    \"research_advisory\": \"Expert guidance\
    \ for better decisions\"\n}\n\n# Timing strategies\ntiming_recommendations = {\n\
    \    \"immediate\": [opp for opp in unique_opportunities if opp[\"priority\"]\
    \ == \"HIGH\"],\n    \"next_quarter\": [opp for opp in unique_opportunities if\
    \ opp[\"priority\"] == \"MEDIUM\"],\n    \"future\": [opp for opp in unique_opportunities\
    \ if opp[\"priority\"] == \"LOW\"]\n}\n\nresult = {\n    \"analysis_timestamp\"\
    : datetime.now().isoformat(),\n    \"client_id\": client_data[\"client_id\"],\n\
    \    \"current_products\": current_products,\n    \"primary_opportunities\": unique_opportunities[:3],\n\
    \    \"product_gap_analysis\": {\n        \"missing_products\": missing_products,\n\
    \        \"penetration_score\": round(len(current_products) / len(all_smc_products),\
    \ 2),\n        \"expansion_potential\": \"HIGH\" if len(missing_products) >= 5\
    \ else \"MEDIUM\"\n    },\n    \"value_propositions\": {\n        opp[\"product\"\
    ]: value_propositions.get(opp[\"product\"], \"Enhanced financial services\")\n\
    \        for opp in unique_opportunities[:3]\n    },\n    \"timing_strategy\"\
    : timing_recommendations,\n    \"revenue_potential\": {\n        \"estimated_additional_aum\"\
    : f\"\u20B9{random.randint(100000, 500000)}\",\n        \"fee_income_potential\"\
    : f\"\u20B9{random.randint(5000, 25000)} annually\",\n        \"cross_sell_probability\"\
    : f\"{random.randint(35, 75)}%\"\n    },\n    \"recommended_approach\": {\n  \
    \      \"method\": \"Consultative selling with needs analysis\",\n        \"timeline\"\
    : \"3-6 months phased approach\",\n        \"success_factors\": [\n          \
    \  \"Demonstrate clear value proposition\",\n            \"Address specific client\
    \ needs\",\n            \"Provide trial periods where applicable\"\n        ]\n\
    \    }\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - risk_based_router
  - collect_client_data
  - analyze_client_profile
  description: Analyze cross-selling and upselling opportunities for stable clients
  previous_node: risk_based_router
  execute_on_routes:
  - upsell_path
  - standard_path
- id: consolidate_strategy_results
  name: Consolidate Strategy Results
  type: script
  script: "import json\nimport time\nfrom datetime import datetime\n\n# Simulate consolidation\
    \ processing\ntime.sleep(1)\n\n# Get the selected route\nselected_route = \"${risk_based_router.selected_route}\"\
    \n\n# Initialize consolidated data structure\nconsolidated_data = {\n    \"consolidation_timestamp\"\
    : datetime.now().isoformat(),\n    \"selected_route\": selected_route,\n    \"\
    all_strategies_generated\": True,\n    \"consolidation_summary\": {\n        \"\
    total_strategies\": 3,\n        \"active_strategy\": selected_route,\n       \
    \ \"processing_status\": \"completed\"\n    }\n}\n\n# Conditionally include strategy\
    \ data based on availability\ntry:\n    # Always try to include all strategy results\
    \ for comprehensive analysis\n    retention_strategy = ${generate_retention_strategy}\n\
    \    consolidated_data[\"retention_strategy\"] = retention_strategy\n    consolidated_data[\"\
    retention_available\"] = True\nexcept:\n    consolidated_data[\"retention_strategy\"\
    ] = None\n    consolidated_data[\"retention_available\"] = False\n\ntry:\n   \
    \ engagement_campaign = ${create_engagement_campaign}\n    consolidated_data[\"\
    engagement_campaign\"] = engagement_campaign  \n    consolidated_data[\"engagement_available\"\
    ] = True\nexcept:\n    consolidated_data[\"engagement_campaign\"] = None\n   \
    \ consolidated_data[\"engagement_available\"] = False\n\ntry:\n    upsell_opportunities\
    \ = ${identify_upsell_opportunities}\n    consolidated_data[\"upsell_opportunities\"\
    ] = upsell_opportunities\n    consolidated_data[\"upsell_available\"] = True\n\
    except:\n    consolidated_data[\"upsell_opportunities\"] = None\n    consolidated_data[\"\
    upsell_available\"] = False\n\n# Determine primary strategy based on route\nif\
    \ selected_route == \"retention_path\":\n    consolidated_data[\"primary_strategy\"\
    ] = consolidated_data.get(\"retention_strategy\", {})\n    consolidated_data[\"\
    strategy_type\"] = \"retention\"\n    consolidated_data[\"priority_level\"] =\
    \ \"CRITICAL\"\nelif selected_route == \"engagement_path\":\n    consolidated_data[\"\
    primary_strategy\"] = consolidated_data.get(\"engagement_campaign\", {})\n   \
    \ consolidated_data[\"strategy_type\"] = \"engagement\"\n    consolidated_data[\"\
    priority_level\"] = \"HIGH\"\nelif selected_route in [\"upsell_path\", \"standard_path\"\
    ]:\n    consolidated_data[\"primary_strategy\"] = consolidated_data.get(\"upsell_opportunities\"\
    , {})\n    consolidated_data[\"strategy_type\"] = \"upsell\"\n    consolidated_data[\"\
    priority_level\"] = \"MEDIUM\"\nelse:\n    consolidated_data[\"primary_strategy\"\
    ] = {}\n    consolidated_data[\"strategy_type\"] = \"unknown\"\n    consolidated_data[\"\
    priority_level\"] = \"LOW\"\n\n# Generate execution readiness assessment\nexecution_readiness\
    \ = {\n    \"ready_for_execution\": True,\n    \"primary_strategy_available\"\
    : consolidated_data[\"primary_strategy\"] is not None,\n    \"route_determined\"\
    : selected_route != \"unknown\",\n    \"data_quality_score\": 95.0,\n    \"next_steps\"\
    : [\n        \"Execute campaign notifications\",\n        \"Prepare client communications\"\
    , \n        \"Update client profiles\",\n        \"Monitor response tracking\"\
    \n    ]\n}\n\nconsolidated_data[\"execution_readiness\"] = execution_readiness\n\
    \n# Summary metrics\nconsolidated_data[\"metrics\"] = {\n    \"strategies_processed\"\
    : 3,\n    \"successful_generations\": sum([\n        consolidated_data[\"retention_available\"\
    ],\n        consolidated_data[\"engagement_available\"], \n        consolidated_data[\"\
    upsell_available\"]\n    ]),\n    \"consolidation_success_rate\": \"100%\",\n\
    \    \"processing_time_seconds\": 1\n}\n\nresult = {\n    \"consolidation_completed\"\
    : True,\n    \"consolidated_strategies\": consolidated_data,\n    \"selected_route\"\
    : selected_route,\n    \"primary_strategy_type\": consolidated_data[\"strategy_type\"\
    ],\n    \"execution_ready\": execution_readiness[\"ready_for_execution\"],\n \
    \   \"consolidation_timestamp\": datetime.now().isoformat()\n}\n\nprint(f\"__OUTPUTS__\
    \ {json.dumps(result)}\")\n"
  depends_on:
  - generate_retention_strategy
  - create_engagement_campaign
  - identify_upsell_opportunities
  - risk_based_router
  description: Gather and consolidate all strategy outputs from different paths
  previous_node:
  - generate_retention_strategy
  - create_engagement_campaign
  - identify_upsell_opportunities
  timeout_seconds: 60
- id: notify_sub_broker
  name: Notify Sub-Broker
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
    \n# Simulate notification processing\ntime.sleep(1)\n\nsub_broker_id = \"${sub_broker_id}\"\
    \ if \"${sub_broker_id}\" else \"DEFAULT_BROKER\"\nclient_id = \"${client_id}\"\
    \ if \"${client_id}\" else \"DEFAULT_CLIENT\"\n\n# Get consolidated strategy results\n\
    consolidated_data = ${consolidate_strategy_results.consolidated_strategies}\n\
    route = consolidated_data[\"selected_route\"]\nprimary_strategy = consolidated_data[\"\
    primary_strategy\"]\nstrategy_type = consolidated_data[\"strategy_type\"]\npriority_level\
    \ = consolidated_data[\"priority_level\"]\n\n# Generate notification based on\
    \ route\nif route == \"retention_path\":\n    notification_type = \"RETENTION_ALERT\"\
    \n    priority = \"CRITICAL\"\n    message = \"Immediate client retention action\
    \ required\"\n    recommendations = consolidated_data.get(\"retention_strategy\"\
    , {})\n    expected_response_time = \"4 hours\"\nelif route == \"engagement_path\"\
    :\n    notification_type = \"ENGAGEMENT_OPPORTUNITY\"\n    priority = \"HIGH\"\
    \n    message = \"Client engagement campaign ready for execution\"\n    recommendations\
    \ = consolidated_data.get(\"engagement_campaign\", {})\n    expected_response_time\
    \ = \"24 hours\"\nelse:\n    notification_type = \"UPSELL_OPPORTUNITY\"\n    priority\
    \ = \"MEDIUM\"\n    message = \"Cross-selling opportunities identified\"\n   \
    \ recommendations = consolidated_data.get(\"upsell_opportunities\", {})\n    expected_response_time\
    \ = \"3 days\"\n\nnotification = {\n    \"notification_id\": f\"N{random.randint(10000,\
    \ 99999)}\",\n    \"sub_broker_id\": sub_broker_id,\n    \"client_id\": client_id,\n\
    \    \"notification_type\": notification_type,\n    \"priority\": priority,\n\
    \    \"message\": message,\n    \"recommendations\": recommendations,\n    \"\
    expected_response_time\": expected_response_time,\n    \"notification_channels\"\
    : [\"email\", \"sms\", \"dashboard\"],\n    \"timestamp\": datetime.now().isoformat(),\n\
    \    \"status\": \"SENT\",\n    \"tracking_id\": f\"TRK{random.randint(100000,\
    \ 999999)}\"\n}\n\nresult = {\n    \"notification_sent\": True,\n    \"notification_details\"\
    : notification,\n    \"delivery_status\": \"SUCCESS\",\n    \"estimated_reach_time\"\
    : \"2 minutes\"\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - consolidate_strategy_results
  description: Send notifications to sub-broker based on risk assessment
  previous_node: consolidate_strategy_results
  timeout_seconds: 60
- id: prepare_client_communication
  name: Prepare Client Communication
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
    \ timedelta\n\n# Simulate communication preparation\ntime.sleep(1)\n\nclient_data\
    \ = ${collect_client_data.client_data}\n\n# Get consolidated strategy results\n\
    consolidated_data = ${consolidate_strategy_results.consolidated_strategies}\n\
    route = consolidated_data[\"selected_route\"]\n\n# Prepare communication based\
    \ on route and client preferences\nclient_name = client_data[\"basic_info\"][\"\
    name\"]\npreferred_channel = client_data[\"communication_preferences\"][\"channel\"\
    ]\n\nif route == \"retention_path\":\n    message_type = \"RETENTION_OFFER\"\n\
    \    subject = f\"Exclusive benefits for you, {client_name}\"\n    content = f\"\
    Dear {client_name}, We value your relationship and have special offers designed\
    \ just for you.\"\n    urgency = \"HIGH\"\n    call_to_action = \"Call us at 1800-XXX-XXXX\
    \ for immediate assistance\"\nelif route == \"engagement_path\":\n    message_type\
    \ = \"ENGAGEMENT_INVITE\"\n    subject = f\"Exciting opportunities await, {client_name}\"\
    \n    content = f\"Hi {client_name}, Discover new investment insights and exclusive\
    \ content tailored for you.\"\n    urgency = \"MEDIUM\"\n    call_to_action =\
    \ \"Login to your account to explore\"\nelse:\n    message_type = \"PRODUCT_RECOMMENDATION\"\
    \n    subject = f\"New ways to grow your wealth, {client_name}\"\n    content\
    \ = f\"Hello {client_name}, Based on your portfolio, we have identified opportunities\
    \ for growth.\"\n    urgency = \"LOW\"\n    call_to_action = \"Schedule a consultation\
    \ with your advisor\"\n\ncommunication = {\n    \"communication_id\": f\"COM{random.randint(10000,\
    \ 99999)}\",\n    \"client_id\": client_data[\"client_id\"],\n    \"message_type\"\
    : message_type,\n    \"channel\": preferred_channel,\n    \"subject\": subject,\n\
    \    \"content\": content,\n    \"urgency\": urgency,\n    \"call_to_action\"\
    : call_to_action,\n    \"scheduled_time\": (datetime.now() + timedelta(minutes=random.randint(30,\
    \ 180))).isoformat(),\n    \"personalization_data\": {\n        \"client_name\"\
    : client_name,\n        \"preferred_products\": client_data[\"transaction_history\"\
    ][\"preferred_segments\"],\n        \"risk_profile\": client_data[\"basic_info\"\
    ][\"risk_profile\"],\n        \"city\": client_data[\"basic_info\"][\"city\"]\n\
    \    },\n    \"tracking_enabled\": True,\n    \"delivery_confirmation\": True\n\
    }\n\nresult = {\n    \"communication_prepared\": True,\n    \"communication_details\"\
    : communication,\n    \"estimated_delivery_time\": \"15 minutes\",\n    \"personalization_score\"\
    : round(random.uniform(0.8, 1.0), 2)\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  depends_on:
  - consolidate_strategy_results
  - collect_client_data
  description: Prepare personalized client communications based on strategy
  previous_node: consolidate_strategy_results
  timeout_seconds: 60
- id: update_client_profile
  name: Update Client Profile
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
    \ timedelta\n\n# Simulate profile update processing\ntime.sleep(1)\n\nclient_id\
    \ = \"${client_id}\" if \"${client_id}\" else \"DEFAULT_CLIENT\"\n\n# Get consolidated\
    \ strategy results\nconsolidated_data = ${consolidate_strategy_results.consolidated_strategies}\n\
    route = consolidated_data[\"selected_route\"]\n\nrisk_assessment = ${assess_client_risk}\n\
    profile_analysis = ${analyze_client_profile}\n\n# Update client profile with new\
    \ insights\nprofile_updates = {\n    \"client_id\": client_id,\n    \"last_analysis_date\"\
    : datetime.now().isoformat(),\n    \"risk_level\": risk_assessment[\"risk_level\"\
    ],\n    \"risk_score\": risk_assessment[\"churn_risk_score\"],\n    \"segment\"\
    : profile_analysis[\"primary_segment\"],\n    \"engagement_score\": profile_analysis[\"\
    engagement_level\"][\"score\"],\n    \"recommended_actions\": route,\n    \"analysis_version\"\
    : \"1.0\",\n    \"next_review_date\": (datetime.now() + timedelta(days=30)).isoformat(),\n\
    \    \"tags\": [\n        f\"risk_{risk_assessment['risk_level'].lower()}\",\n\
    \        f\"segment_{profile_analysis['primary_segment'].lower()}\",\n       \
    \ f\"engagement_{profile_analysis['engagement_level']['rating'].lower()}\"\n \
    \   ],\n    \"ai_insights\": {\n        \"confidence_score\": profile_analysis[\"\
    confidence_score\"],\n        \"behavioral_patterns\": profile_analysis[\"behavioral_patterns\"\
    ],\n        \"investment_preferences\": profile_analysis[\"investment_preferences\"\
    ]\n    },\n    \"action_history\": {\n        \"last_action\": route,\n      \
    \  \"action_timestamp\": datetime.now().isoformat(),\n        \"success_probability\"\
    : f\"{random.randint(60, 90)}%\"\n    }\n}\n\nresult = {\n    \"profile_updated\"\
    : True,\n    \"update_details\": profile_updates,\n    \"update_timestamp\": datetime.now().isoformat(),\n\
    \    \"fields_updated\": 12,\n    \"data_quality_improvement\": \"+5%\"\n}\n\n\
    print(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - consolidate_strategy_results
  - assess_client_risk
  - analyze_client_profile
  description: Update client profile with new insights and recommendations
  previous_node: consolidate_strategy_results
  timeout_seconds: 60
- id: simulate_response_tracking
  name: Simulate Response Tracking
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
    \ timedelta\n\n# Simulate response tracking\ntime.sleep(1)\n\n# Get consolidated\
    \ strategy results\nconsolidated_data = ${consolidate_strategy_results.consolidated_strategies}\n\
    route = consolidated_data[\"selected_route\"]\nclient_id = \"${client_id}\" if\
    \ \"${client_id}\" else \"DEFAULT_CLIENT\"\n\n# Response probabilities based on\
    \ strategy type\nresponse_probabilities = {\n    \"retention_path\": {\"response_rate\"\
    : 0.75, \"positive_rate\": 0.65},\n    \"engagement_path\": {\"response_rate\"\
    : 0.55, \"positive_rate\": 0.80},\n    \"upsell_path\": {\"response_rate\": 0.35,\
    \ \"positive_rate\": 0.45},\n    \"standard_path\": {\"response_rate\": 0.40,\
    \ \"positive_rate\": 0.50}\n}\n\nprobs = response_probabilities.get(route, response_probabilities[\"\
    standard_path\"])\n\n# Simulate response\nhas_response = random.random() < probs[\"\
    response_rate\"]\nis_positive = random.random() < probs[\"positive_rate\"] if\
    \ has_response else False\n\n# Response details\nresponse_channels = [\"email\"\
    , \"phone\", \"sms\", \"mobile_app\", \"web_portal\"]\nresponse_types = [\"inquiry\"\
    , \"acceptance\", \"rejection\", \"deferral\", \"request_more_info\"]\n\nresponse_data\
    \ = {\n    \"client_id\": client_id,\n    \"campaign_route\": route,\n    \"has_response\"\
    : has_response,\n    \"is_positive\": is_positive,\n    \"response_timestamp\"\
    : datetime.now().isoformat(),\n    \"response_channel\": random.choice(response_channels)\
    \ if has_response else None,\n    \"response_type\": random.choice(response_types)\
    \ if has_response else None,\n    \"response_time_minutes\": random.randint(30,\
    \ 1440) if has_response else None,\n    \"engagement_score\": round(random.uniform(0.3,\
    \ 0.9), 2) if has_response else 0,\n    \"follow_up_required\": has_response and\
    \ not is_positive,\n    \"next_action\": \"schedule_call\" if has_response and\
    \ is_positive else \"send_reminder\" if has_response else \"escalate\"\n}\n\n\
    # Additional metrics\ntracking_metrics = {\n    \"email_open_rate\": round(random.uniform(0.4,\
    \ 0.8), 2),\n    \"click_through_rate\": round(random.uniform(0.1, 0.3), 2),\n\
    \    \"time_to_response\": f\"{random.randint(1, 48)} hours\" if has_response\
    \ else \"No response\",\n    \"interaction_depth\": random.choice([\"surface\"\
    , \"moderate\", \"deep\"]) if has_response else \"none\",\n    \"sentiment_score\"\
    : round(random.uniform(0.2, 0.9), 2) if has_response else 0.5\n}\n\nresult = {\n\
    \    \"response_tracked\": True,\n    \"response_data\": response_data,\n    \"\
    tracking_metrics\": tracking_metrics,\n    \"analysis_timestamp\": datetime.now().isoformat(),\n\
    \    \"recommendation\": \"Continue monitoring\" if is_positive else \"Escalate\
    \ to manager\" if has_response else \"Retry with different approach\"\n}\n\nprint(f\"\
    __OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - notify_sub_broker
  - prepare_client_communication
  - update_client_profile
  - consolidate_strategy_results
  description: Track and analyze client responses to campaigns
  previous_node:
  - notify_sub_broker
  - prepare_client_communication
  - update_client_profile
- id: generate_performance_metrics
  name: Generate Performance Metrics
  type: ai_agent
  config:
    agent_type: analyst
    input_format: json
    output_format: json
    model_client_id: gpt4_analytics
  depends_on:
  - simulate_response_tracking
  description: AI-powered comprehensive workflow performance metrics analysis
  user_message: "Analyze the workflow performance data and generate comprehensive\
    \ metrics:\n\n**Workflow Context:**\n- Route taken: ${risk_based_router.selected_route}\n\
    - Client response data: ${simulate_response_tracking.response_data}\n- Tracking\
    \ metrics: ${simulate_response_tracking.tracking_metrics}\n- Execution ID: ${EXECUTION_ID}\n\
    - Workflow ID: ${WORKFLOW_ID}\n- Client ID: ${client_id}\n\n**Analysis Requirements:**\n\
    1. Calculate execution performance metrics (completion rate, timing, success indicators)\n\
    2. Analyze route-specific performance against historical benchmarks\n3. Assess\
    \ business impact (revenue, retention, engagement improvements)\n4. Evaluate response\
    \ quality and tracking effectiveness\n5. Generate actionable improvement recommendations\n\
    6. Provide confidence scores for all metrics\n\n**CRITICAL OUTPUT REQUIREMENTS:**\n\
    \nYou MUST return a JSON object with the exact structure shown below. The downstream\
    \ task `update_learning_model` specifically accesses `performance_metrics` field,\
    \ so this structure is mandatory:\n\n```json\n{\n  \"metrics_generated\": true,\n\
    \  \"performance_metrics\": {\n    \"execution_id\": \"${EXECUTION_ID}\",\n  \
    \  \"workflow_id\": \"${WORKFLOW_ID}\",\n    \"client_id\": \"${client_id}\",\n\
    \    \"processing_timestamp\": \"2025-01-15T10:30:00.000Z\",\n    \"execution_metrics\"\
    : {\n      \"total_execution_time\": \"25 seconds\",\n      \"tasks_completed\"\
    : 12,\n      \"tasks_successful\": 12,\n      \"success_rate\": 100.0,\n     \
    \ \"data_quality_score\": 0.92,\n      \"ai_confidence_average\": 0.88\n    },\n\
    \    \"route_taken\": \"retention_path\",\n    \"route_performance\": {\n    \
    \  \"avg_success_rate\": 0.68,\n      \"avg_response_time\": \"4.2 hours\"\n \
    \   },\n    \"response_metrics\": {\n      \"response_received\": true,\n    \
    \  \"response_positive\": false,\n      \"engagement_score\": 0.65,\n      \"\
    tracking_quality\": {\n        \"email_open_rate\": 0.72,\n        \"click_through_rate\"\
    : 0.23,\n        \"time_to_response\": \"6 hours\",\n        \"interaction_depth\"\
    : \"moderate\",\n        \"sentiment_score\": 0.45\n      }\n    },\n    \"business_impact\"\
    : {\n      \"estimated_revenue_impact\": \"\u20B945000\",\n      \"retention_probability_improvement\"\
    : \"+25%\",\n      \"engagement_score_improvement\": \"+35%\",\n      \"cross_sell_opportunities_identified\"\
    : 3,\n      \"client_satisfaction_impact\": \"+18%\"\n    },\n    \"success_indicators\"\
    : {\n      \"data_collection\": \"SUCCESS\",\n      \"risk_assessment\": \"SUCCESS\"\
    ,\n      \"recommendations\": \"SUCCESS\",\n      \"notifications\": \"SUCCESS\"\
    ,\n      \"communication\": \"SUCCESS\",\n      \"tracking\": \"SUCCESS\"\n  \
    \  },\n    \"next_actions\": {\n      \"follow_up_required\": true,\n      \"\
    escalation_needed\": false,\n      \"next_review_date\": \"2025-02-15\",\n   \
    \   \"recommended_action\": \"schedule_call\"\n    },\n    \"improvement_recommendations\"\
    : [\n      \"Enhance data collection frequency for better insights\",\n      \"\
    Implement A/B testing for communication strategies\",\n      \"Develop more personalized\
    \ offer generation\"\n    ]\n  },\n  \"analytics_timestamp\": \"2025-01-15T10:30:00.000Z\"\
    ,\n  \"report_confidence\": 0.91\n}\n```\n\n**IMPORTANT NOTES:**\n- Use current\
    \ ISO timestamps for `processing_timestamp` and `analytics_timestamp`\n- Generate\
    \ realistic values based on the provided workflow data\n- Ensure all numeric values\
    \ are appropriate for the business context\n- The `tracking_quality` should match\
    \ the structure from `tracking_metrics`\n- Route-specific performance should align\
    \ with the `route_taken` value\n- Return ONLY the JSON object, no additional text\
    \ or formatting\n"
  previous_node: simulate_response_tracking
  system_message: "You are an expert business intelligence analyst specializing in\
    \ workflow performance metrics and KPI analysis. \nYour role is to analyze workflow\
    \ execution data and generate comprehensive performance reports with actionable\
    \ insights.\n\nFocus on:\n1. Calculate meaningful performance metrics from execution\
    \ data\n2. Analyze route-specific performance patterns\n3. Assess business impact\
    \ and ROI\n4. Identify improvement opportunities\n5. Generate data-driven recommendations\n\
    \nAlways provide structured, quantitative analysis with clear metrics and confidence\
    \ scores.\n"
- id: update_learning_model
  name: Update Learning Model
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime,\
    \ timedelta\n\n# Simulate model learning process\ntime.sleep(1)\n\n# Get AI response\
    \ and clean it to extract JSON\nai_response = \"\"\"${generate_performance_metrics.ai_response}\"\
    \"\"\n# Remove markdown formatting\nclean_response = ai_response.replace('```json',\
    \ '').replace('```', '')\n# Parse the JSON\ntry:\n    ai_data = json.loads(clean_response.strip())\n\
    \    performance_metrics = ai_data.get('performance_metrics', {})\nexcept:\n \
    \   performance_metrics = {}\n\nclient_data = ${collect_client_data.client_data}\n\
    \n# Prepare learning data\nlearning_data = {\n    \"client_segment\": \"${analyze_client_profile.primary_segment}\"\
    ,\n    \"risk_level\": \"${assess_client_risk.risk_level}\",\n    \"actions_taken\"\
    : \"${risk_based_router.selected_route}\",\n    \"response_outcome\": ${simulate_response_tracking.response_data},\n\
    \    \"success_metrics\": performance_metrics,\n    \"client_characteristics\"\
    : {\n        \"aum\": client_data[\"portfolio\"][\"total_aum\"],\n        \"age\"\
    : client_data[\"basic_info\"][\"age\"],\n        \"risk_profile\": client_data[\"\
    basic_info\"][\"risk_profile\"],\n        \"engagement_level\": \"${analyze_client_profile.engagement_level}\"\
    \n    },\n    \"learning_timestamp\": datetime.now().isoformat()\n}\n\n# Model\
    \ improvement insights\nmodel_insights = {\n    \"patterns_identified\": [\n \
    \       f\"High AUM clients ({client_data['portfolio']['total_aum']}+) show {random.randint(15,\
    \ 25)}% better response to retention offers\",\n        f\"Clients in {client_data['basic_info']['city']}\
    \ prefer {client_data['communication_preferences']['channel']} communication\"\
    ,\n        f\"{client_data['basic_info']['risk_profile']} risk profile clients\
    \ respond best to {random.choice(['educational', 'promotional', 'advisory'])}\
    \ content\"\n    ],\n    \"accuracy_improvements\": {\n        \"risk_assessment_model\"\
    : f\"+{round(random.uniform(1.5, 4.2), 1)}%\",\n        \"segmentation_model\"\
    : f\"+{round(random.uniform(0.8, 2.9), 1)}%\",\n        \"recommendation_engine\"\
    : f\"+{round(random.uniform(2.1, 5.3), 1)}%\",\n        \"response_prediction\"\
    : f\"+{round(random.uniform(1.2, 3.7), 1)}%\"\n    },\n    \"recommendations_refined\"\
    : [\n        \"Adjust risk thresholds for better sensitivity\",\n        \"Enhance\
    \ personalization algorithms\",\n        \"Improve timing prediction models\"\
    ,\n        \"Optimize communication channel selection\"\n    ]\n}\n\n# Algorithm\
    \ updates\nalgorithm_updates = {\n    \"updated_algorithms\": [\n        \"risk_assessment_model_v2.1\"\
    ,\n        \"client_segmentation_v1.8\",\n        \"recommendation_engine_v3.2\"\
    ,\n        \"response_prediction_v1.5\"\n    ],\n    \"new_features\": [\n   \
    \     \"Dynamic risk scoring\",\n        \"Behavioral pattern recognition\",\n\
    \        \"Predictive engagement scoring\",\n        \"Optimal timing recommendations\"\
    \n    ],\n    \"model_performance\": {\n        \"overall_accuracy\": f\"{round(random.uniform(87.5,\
    \ 94.2), 1)}%\",\n        \"precision\": f\"{round(random.uniform(82.3, 89.7),\
    \ 1)}%\",\n        \"recall\": f\"{round(random.uniform(78.9, 86.4), 1)}%\",\n\
    \        \"f1_score\": f\"{round(random.uniform(80.1, 87.8), 1)}%\"\n    }\n}\n\
    \n# Future optimization plans\noptimization_plans = {\n    \"next_optimization_cycle\"\
    : (datetime.now() + timedelta(days=7)).isoformat(),\n    \"focus_areas\": [\n\
    \        \"Improve low-engagement client predictions\",\n        \"Enhance cross-selling\
    \ opportunity identification\",\n        \"Optimize communication timing\",\n\
    \        \"Refine retention strategy effectiveness\"\n    ],\n    \"data_requirements\"\
    : [\n        \"More historical response data\",\n        \"Enhanced behavioral\
    \ tracking\",\n        \"Market condition correlations\",\n        \"Competitor\
    \ analysis integration\"\n    ]\n}\n\nresult = {\n    \"learning_completed\":\
    \ True,\n    \"learning_data\": learning_data,\n    \"model_insights\": model_insights,\n\
    \    \"algorithm_updates\": algorithm_updates,\n    \"optimization_plans\": optimization_plans,\n\
    \    \"learning_timestamp\": datetime.now().isoformat(),\n    \"learning_confidence\"\
    : round(random.uniform(0.85, 0.95), 2)\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )"
  depends_on:
  - generate_performance_metrics
  - collect_client_data
  - analyze_client_profile
  - assess_client_risk
  - risk_based_router
  - simulate_response_tracking
  description: Feed results back into AI learning system for continuous improvement
  previous_node: generate_performance_metrics
inputs:
- name: client_id
  type: string
  required: true
  description: Client identifier for analysis
- name: analysis_depth
  type: string
  default: standard
  required: false
  description: 'Analysis depth: basic, standard, or comprehensive'
- name: enable_cross_selling
  type: boolean
  default: true
  required: false
  description: Enable cross-selling recommendations
- name: enable_retention_alerts
  type: boolean
  default: true
  required: false
  description: Enable retention risk alerts
- name: sub_broker_id
  type: string
  required: false
  description: Associated sub-broker ID
- name: smc_api_base_url
  type: string
  default: https://api.smcindiaonline.com
  required: false
  description: SMC API base URL
labels:
  version: '1.0'
  priority: high
  department: wealth_management
  environment: production
outputs:
  client_analysis:
    type: object
    source: analyze_client_profile
    description: Complete client analysis results
  risk_assessment:
    type: object
    source: assess_client_risk
    description: Client risk assessment and recommendations
  learning_outcomes:
    type: object
    source: update_learning_model
    description: Model learning and optimization results
  performance_metrics:
    type: object
    source: generate_performance_metrics.ai_response.performance_metrics
    description: Workflow execution metrics and insights
  recommended_actions:
    type: string
    source: risk_based_router.selected_route
    description: Recommended actions based on client profile
version: '1.0'
metadata:
  author: SMC Development Team
  use_case: AI Relationship Manager
  created_date: '2024-07-17'
  business_unit: SMC Global Securities
  compliance_level: SEBI_COMPLIANT
namespace: smc_finance
description: AI-powered relationship management system for SMC's customer portfolio
  with cross-selling and retention capabilities
model_clients:
- id: gpt4_analytics
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 4000
    temperature: 0.1
  provider: openai
timeout_seconds: 3600
Execution ID Status Started Duration Actions
87514feb... COMPLETED 2025-07-17
10:38:28
N/A View
c32e1342... COMPLETED 2025-07-17
10:35:32
N/A View
82dcb8af... COMPLETED 2025-07-17
10:11:31
N/A View
44515fc4... COMPLETED 2025-07-17
09:53:35
N/A View
a42bc814... COMPLETED 2025-07-17
09:51:01
N/A View