Gen AI - SMC AI Relationship Manager Workflow
AI-powered relationship management system for SMC's customer portfolio with cross-selling and retention capabilities
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
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
scriptGather client data from multiple SMC systems
analyze_client_profile
scriptAI-powered client profile analysis and segmentation
assess_client_risk
scriptComprehensive risk assessment for client relationship
risk_based_router
conditional_routerNo description
Conditional Router
Default Route: standard_path
generate_retention_strategy
scriptCreate personalized retention strategy for high-risk clients
create_engagement_campaign
scriptDesign engagement campaign for medium-risk clients
identify_upsell_opportunities
scriptAnalyze cross-selling and upselling opportunities for stable clients
consolidate_strategy_results
scriptGather and consolidate all strategy outputs from different paths
notify_sub_broker
scriptSend notifications to sub-broker based on risk assessment
prepare_client_communication
scriptPrepare personalized client communications based on strategy
update_client_profile
scriptUpdate client profile with new insights and recommendations
simulate_response_tracking
scriptTrack and analyze client responses to campaigns
generate_performance_metrics
ai_agentAI-powered comprehensive workflow performance metrics analysis
update_learning_model
scriptFeed 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