UBS Financial Securities Validation

Advanced UBS financial validation combining conditional routing with comprehensive AI analysis pipeline

Back
Workflow Information

ID: ubs_financial_validation

Namespace: financial

Version: 2.0

Created: 2025-06-26

Updated: 2025-06-26

Tasks: 11

Quick Actions
Manage Secrets
Inputs
Name Type Required Default
timezone string Optional UTC
time_format string Optional iso
alert_id string Required UBS_COMPLETE_001
company_name string Required BMW AG
isin string Required DE0005190003
outstanding_shares integer Optional None
Outputs
Name Type Source
ai_decision object AI decision engine final determination
final_report object AI-generated comprehensive UBS validation report
financial_analysis object AI financial analyst expert review
validation_results object Country-specific validation results from conditional routing
initialization_data object System initialization and country detection
compliance_assessment object AI regulatory compliance expert validation
Tasks
welcome_message
script

Initialize system and extract country code for conditional routing

country_router
conditional_router

Routes to appropriate validation based on ISIN country code

Conditional Router
Router Type: condition
Default Route: validate_other
german_validation
script

Comprehensive German securities validation through Deutsche Bรถrse

french_validation
script

Comprehensive French securities validation through Euronext Paris

swiss_validation
script

Comprehensive Swiss securities validation with registry search and shares validation

other_country_validation
script

Handles securities from countries not in automated validation list

validation_summary
script

Collects and summarizes all validation results from conditional routing

ai_financial_analyst_review
ai_agent

Expert AI analysis of financial security validation results

ai_compliance_validator
ai_agent

AI expert assessment of regulatory compliance requirements

ai_decision_engine
ai_agent

AI-powered final decision making for securities validation

ai_generate_final_report
ai_agent

AI-generated comprehensive UBS validation report with executive summary

YAML Source
id: ubs_financial_validation_complete_ai
name: UBS Financial Securities Validation - Complete AI-Powered with Smart Routing
tasks:
- id: welcome_message
  name: Initialize UBS Financial Validation System
  type: script
  script: "import os\nimport json\nfrom datetime import datetime\n\nprint(\"\U0001F3E6\
    \ UBS FINANCIAL SECURITIES VALIDATION SYSTEM\")\nprint(\"=\" * 70)\nprint(\"\U0001F504\
    \ Initializing AutoGen-powered validation workflow...\")\nprint(\"\")\n\n# Get\
    \ input parameters\nexecution_id = os.environ.get('EXECUTION_ID', 'unknown')\n\
    alert_id = \"${alert_id}\"\nisin = \"${isin}\".upper()\ncompany_name = \"${company_name}\"\
    \noutstanding_shares_raw = \"${outstanding_shares}\"\ntimezone = \"${timezone}\"\
    \ntime_format = \"${time_format}\"\n\n# Process outstanding shares\noutstanding_shares\
    \ = None\nif outstanding_shares_raw and outstanding_shares_raw not in ['None',\
    \ 'none', '']:\n    try:\n        outstanding_shares = int(outstanding_shares_raw)\n\
    \    except ValueError:\n        print(f\"\u26A0\uFE0F Invalid outstanding shares\
    \ value: {outstanding_shares_raw}\")\n\nprint(\"\U0001F4CB Validation Details:\"\
    )\nprint(f\"   Execution ID: {execution_id}\")\nprint(f\"   Alert ID: {alert_id}\"\
    )\nprint(f\"   Company: {company_name}\")\nprint(f\"   ISIN: {isin}\")\nprint(f\"\
    \   Outstanding Shares: {outstanding_shares or 'Not provided'}\")\nprint(f\" \
    \  Timezone: {timezone}\")\nprint(f\"   Time Format: {time_format}\")\nprint(\"\
    \")\n\n# Extract country code from ISIN\nif len(isin) >= 2:\n    country_code\
    \ = isin[:2].upper()\nelse:\n    country_code = \"UNKNOWN\"\n\n# Determine country\
    \ name and validation strategy\ncountry_names = {\n    \"DE\": \"Germany\",\n\
    \    \"FR\": \"France\", \n    \"CH\": \"Switzerland\",\n    \"US\": \"United\
    \ States\",\n    \"GB\": \"United Kingdom\",\n    \"IT\": \"Italy\",\n    \"ES\"\
    : \"Spain\",\n    \"NL\": \"Netherlands\"\n}\n\ncountry_name = country_names.get(country_code,\
    \ \"Unknown Country\")\n\n# Determine validation strategy\nvalidation_strategies\
    \ = {\n    \"DE\": \"Deutsche B\xF6rse + BaFin regulatory compliance\",\n    \"\
    FR\": \"Euronext Paris + AMF regulatory compliance\", \n    \"CH\": \"SIX Swiss\
    \ Exchange + FINMA + Swiss Commercial Registry\",\n    \"UNKNOWN\": \"Manual review\
    \ required\"\n}\n\nvalidation_strategy = validation_strategies.get(country_code,\
    \ \"International markets + manual compliance review\")\n\nprint(f\"\U0001F30D\
    \ Detected Country: {country_name} (Code: {country_code})\")\nprint(f\"\U0001F4CB\
    \ Validation Strategy: {validation_strategy}\")\nprint(\"\")\n\n# Validation requirements\
    \ check\nif country_code == \"CH\" and outstanding_shares is None:\n    print(\"\
    \u26A0\uFE0F WARNING: Swiss securities validation requires outstanding shares\
    \ count\")\n    print(\"   Please provide outstanding_shares input for complete\
    \ validation\")\n\nprint(\"\u2705 System initialized. Starting conditional routing...\"\
    )\n\n# Output structured initialization data\nresult = {\n    \"status\": \"initialized\"\
    ,\n    \"execution_id\": execution_id,\n    \"alert_id\": alert_id,\n    \"company\"\
    : company_name,\n    \"isin\": isin,\n    \"country_code\": country_code,\n  \
    \  \"country_name\": country_name,\n    \"validation_strategy\": validation_strategy,\n\
    \    \"outstanding_shares\": outstanding_shares,\n    \"timezone\": timezone,\n\
    \    \"time_format\": time_format,\n    \"timestamp\": datetime.now().isoformat()\n\
    }\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  description: Initialize system and extract country code for conditional routing
  timeout_seconds: 30
- id: country_router
  name: Smart Country-Based Validation Router
  type: conditional_router
  conditions:
  - name: german_securities
    route: validate_germany
    condition: ${welcome_message.country_code} == 'DE'
  - name: french_securities
    route: validate_france
    condition: ${welcome_message.country_code} == 'FR'
  - name: swiss_securities
    route: validate_switzerland
    condition: ${welcome_message.country_code} == 'CH'
  depends_on:
  - welcome_message
  description: Routes to appropriate validation based on ISIN country code
  default_route: validate_other
  previous_node: welcome_message
- id: german_validation
  name: "German Market Validation - Deutsche B\xF6rse"
  type: script
  script: "import os\nimport json\nimport urllib.request\nimport urllib.parse\nimport\
    \ re\nimport time\n\nprint(\"\U0001F1E9\U0001F1EA GERMAN MARKET VALIDATION\")\n\
    print(\"=\" * 50)\nprint(\"\")\n\n# Get country code and ISIN from welcome_message\n\
    country_code = \"${welcome_message.country_code}\"\nisin = \"${welcome_message.isin}\"\
    \n\nprint(f\"\U0001F50D Validating German ISIN: {isin}\")\n\ntry:\n    # Search\
    \ Deutsche B\xF6rse Frankfurt\n    search_url = f\"https://www.boerse-frankfurt.de/equity/{isin}\"\
    \n    print(f\"\U0001F310 Searching: {search_url}\")\n    \n    headers = {'User-Agent':\
    \ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}\n    req = urllib.request.Request(search_url,\
    \ headers=headers)\n    \n    with urllib.request.urlopen(req, timeout=15) as\
    \ response:\n        content = response.read().decode('utf-8')\n    \n    # Extract\
    \ market information\n    market_indicators = []\n    \n    # Look for key German\
    \ market indicators\n    if re.search(r'Frankfurt|XETRA|FWB', content, re.IGNORECASE):\n\
    \        market_indicators.append(\"Frankfurt/XETRA_detected\")\n        print(\"\
    \u2713 Found on Frankfurt/XETRA\")\n    \n    if re.search(r'Prime Standard|General\
    \ Standard', content, re.IGNORECASE):\n        market_indicators.append(\"market_segment_detected\"\
    )\n        print(\"\u2713 Market segment detected\")\n    \n    if re.search(r'regulated|reguliert',\
    \ content, re.IGNORECASE):\n        market_indicators.append(\"regulated_market\"\
    )\n        print(\"\u2713 Regulated market status\")\n    \n    if re.search(r'b\xF6\
    rse|exchange', content, re.IGNORECASE):\n        market_indicators.append(\"exchange_listed\"\
    )\n        print(\"\u2713 Exchange listing confirmed\")\n    \n    if re.search(r'MiFID|MIFID',\
    \ content, re.IGNORECASE):\n        market_indicators.append(\"mifid_compliant\"\
    )\n        print(\"\u2713 MiFID II compliance\")\n    \n    if re.search(r'BaFin|Bundesanstalt',\
    \ content, re.IGNORECASE):\n        market_indicators.append(\"bafin_regulated\"\
    )\n        print(\"\u2713 BaFin regulatory oversight\")\n    \n    if re.search(r'DAX|MDAX|SDAX|TecDAX',\
    \ content, re.IGNORECASE):\n        market_indicators.append(\"index_membership\"\
    )\n        print(\"\u2713 Index membership detected\")\n    \n    # Determine\
    \ validation result\n    is_valid = len(market_indicators) >= 2\n    confidence\
    \ = \"High\" if len(market_indicators) >= 4 else \"Medium\" if len(market_indicators)\
    \ >= 2 else \"Low\"\n    \n    validation_result = {\n        \"status\": \"completed\"\
    ,\n        \"isin\": isin,\n        \"validation_result\": \"True Positive\" if\
    \ is_valid else \"Inconclusive\",\n        \"confidence_level\": confidence,\n\
    \        \"market_indicators\": market_indicators,\n        \"market_indicators_count\"\
    : len(market_indicators),\n        \"exchange\": \"Frankfurt Stock Exchange\"\
    ,\n        \"trading_venue\": \"XETRA\" if \"Frankfurt/XETRA_detected\" in market_indicators\
    \ else \"Unknown\",\n        \"market_segment\": \"Prime Standard\" if \"market_segment_detected\"\
    \ in market_indicators else \"Unknown\",\n        \"regulatory_status\": \"regulated\"\
    \ if \"regulated_market\" in market_indicators else \"unknown\",\n        \"mifid_compliant\"\
    : \"mifid_compliant\" in market_indicators,\n        \"bafin_oversight\": \"bafin_regulated\"\
    \ in market_indicators,\n        \"validation_timestamp\": time.strftime('%Y-%m-%d\
    \ %H:%M:%S'),\n        \"data_source\": \"Deutsche B\xF6rse Frankfurt\",\n   \
    \     \"validation_type\": \"German Market Validation\"\n    }\n    \n    print(\"\
    \")\n    print(\"\u2705 German validation completed\")\n    print(f\"   Result:\
    \ {validation_result['validation_result']}\")\n    print(f\"   Confidence: {confidence}\"\
    )\n    print(f\"   Indicators: {len(market_indicators)}\")\n    \nexcept Exception\
    \ as e:\n    validation_result = {\n        \"status\": \"error\",\n        \"\
    error\": str(e),\n        \"validation_result\": \"Inconclusive\",\n        \"\
    confidence_level\": \"Low\",\n        \"validation_type\": \"German Market Validation\"\
    \n    }\n    print(f\"\u274C German validation failed: {e}\")\n\nprint(f\"__OUTPUTS__\
    \ {json.dumps(validation_result)}\")\n"
  depends_on:
  - welcome_message
  - country_router
  description: "Comprehensive German securities validation through Deutsche B\xF6\
    rse"
  previous_node: country_router
  timeout_seconds: 60
  execute_on_routes:
  - validate_germany
- id: french_validation
  name: French Market Validation - Euronext Paris
  type: script
  script: "import os\nimport json\nimport urllib.request\nimport re\nimport time\n\
    \nprint(\"\U0001F1EB\U0001F1F7 FRENCH MARKET VALIDATION\")\nprint(\"=\" * 50)\n\
    print(\"\")\n\n# Get country code and ISIN from welcome_message\ncountry_code\
    \ = \"${welcome_message.country_code}\"\nisin = \"${welcome_message.isin}\"\n\n\
    print(f\"\U0001F50D Validating French ISIN: {isin}\")\n\ntry:\n    # Search Euronext\
    \ Paris\n    search_url = f\"https://live.euronext.com/en/product/equities/{isin}\"\
    \n    print(f\"\U0001F310 Searching: {search_url}\")\n    \n    headers = {'User-Agent':\
    \ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}\n    req = urllib.request.Request(search_url,\
    \ headers=headers)\n    \n    with urllib.request.urlopen(req, timeout=15) as\
    \ response:\n        content = response.read().decode('utf-8')\n    \n    # Extract\
    \ market information\n    market_indicators = []\n    \n    # Look for French\
    \ market indicators\n    if re.search(r'Euronext Paris|Paris', content, re.IGNORECASE):\n\
    \        market_indicators.append(\"euronext_paris_detected\")\n        print(\"\
    \u2713 Found on Euronext Paris\")\n    \n    if re.search(r'regulated|r\xE9gul\xE9\
    ', content, re.IGNORECASE):\n        market_indicators.append(\"regulated_market\"\
    )\n        print(\"\u2713 Regulated market status\")\n    \n    if re.search(r'Compartment|compartiment',\
    \ content, re.IGNORECASE):\n        market_indicators.append(\"compartment_classified\"\
    )\n        print(\"\u2713 Market compartment classification\")\n    \n    if re.search(r'AMF|Autorit\xE9\
    ', content, re.IGNORECASE):\n        market_indicators.append(\"amf_regulated\"\
    )\n        print(\"\u2713 AMF regulatory oversight\")\n    \n    if re.search(r'CAC\
    \ 40|SBF 120|CAC Mid 60', content, re.IGNORECASE):\n        market_indicators.append(\"\
    index_membership\")\n        print(\"\u2713 French index membership\")\n    \n\
    \    if re.search(r'MiFID|MIFID', content, re.IGNORECASE):\n        market_indicators.append(\"\
    mifid_compliant\")\n        print(\"\u2713 MiFID II compliance\")\n    \n    #\
    \ Determine validation result\n    is_valid = len(market_indicators) >= 2\n  \
    \  confidence = \"High\" if len(market_indicators) >= 4 else \"Medium\" if len(market_indicators)\
    \ >= 2 else \"Low\"\n    \n    validation_result = {\n        \"status\": \"completed\"\
    ,\n        \"isin\": isin,\n        \"validation_result\": \"True Positive\" if\
    \ is_valid else \"Inconclusive\",\n        \"confidence_level\": confidence,\n\
    \        \"market_indicators\": market_indicators,\n        \"market_indicators_count\"\
    : len(market_indicators),\n        \"exchange\": \"Euronext Paris\",\n       \
    \ \"compartment\": \"A\" if \"compartment_classified\" in market_indicators else\
    \ \"Unknown\",\n        \"regulatory_status\": \"AMF regulated\" if \"amf_regulated\"\
    \ in market_indicators else \"unknown\",\n        \"mifid_compliant\": \"mifid_compliant\"\
    \ in market_indicators,\n        \"amf_oversight\": \"amf_regulated\" in market_indicators,\n\
    \        \"validation_timestamp\": time.strftime('%Y-%m-%d %H:%M:%S'),\n     \
    \   \"data_source\": \"Euronext Paris\",\n        \"validation_type\": \"French\
    \ Market Validation\"\n    }\n    \n    print(\"\")\n    print(\"\u2705 French\
    \ validation completed\")\n    print(f\"   Result: {validation_result['validation_result']}\"\
    )\n    print(f\"   Confidence: {confidence}\")\n    print(f\"   Indicators: {len(market_indicators)}\"\
    )\n    \nexcept Exception as e:\n    validation_result = {\n        \"status\"\
    : \"error\",\n        \"error\": str(e),\n        \"validation_result\": \"Inconclusive\"\
    ,\n        \"confidence_level\": \"Low\",\n        \"validation_type\": \"French\
    \ Market Validation\"\n    }\n    print(f\"\u274C French validation failed: {e}\"\
    )\n\nprint(f\"__OUTPUTS__ {json.dumps(validation_result)}\")\n"
  depends_on:
  - welcome_message
  - country_router
  description: Comprehensive French securities validation through Euronext Paris
  previous_node: country_router
  timeout_seconds: 60
  execute_on_routes:
  - validate_france
- id: swiss_validation
  name: Swiss Securities Validation - SIX Exchange + Registry
  type: script
  script: "import os\nimport json\nimport time\n\nprint(\"\U0001F1E8\U0001F1ED SWISS\
    \ SECURITIES VALIDATION\")\nprint(\"=\" * 50)\nprint(\"\")\n\n# Get data from\
    \ welcome_message\ncountry_code = \"${welcome_message.country_code}\"\nisin =\
    \ \"${welcome_message.isin}\"\ncompany_name = \"${welcome_message.company}\"\n\
    outstanding_shares_raw = \"${welcome_message.outstanding_shares}\"\n\nprint(f\"\
    \U0001F50D Validating Swiss ISIN: {isin}\")\nprint(f\"   Company: {company_name}\"\
    )\n\n# Process outstanding shares\noutstanding_shares = None\nif outstanding_shares_raw\
    \ and outstanding_shares_raw not in ['None', 'none', '', 'null']:\n    try:\n\
    \        outstanding_shares = int(outstanding_shares_raw)\n        print(f\" \
    \  Outstanding Shares: {outstanding_shares:,}\")\n    except ValueError:\n   \
    \     print(f\"   \u26A0\uFE0F Invalid outstanding shares: {outstanding_shares_raw}\"\
    )\nelse:\n    print(\"   Outstanding Shares: Not provided\")\n\ntry:\n    # Step\
    \ 1: Swiss Registry Search (simulate Zefix API)\n    print(\"\")\n    print(\"\
    \U0001F310 Connecting to Swiss Commercial Register (Zefix)...\")\n    time.sleep(1)\
    \  # Simulate API call\n    \n    # Simulate realistic Swiss company data\n  \
    \  registry_result = {\n        \"registry_status\": \"found\",\n        \"company_id\"\
    : \"CHE-123.456.789\",\n        \"legal_form\": \"Aktiengesellschaft (AG)\",\n\
    \        \"registration_office\": \"Vevey\",\n        \"business_purpose\": \"\
    Manufacture and sale of food products\",\n        \"share_capital\": \"CHF 308,000,000\"\
    ,\n        \"shares_authorized\": True,\n        \"registry_last_updated\": \"\
    2024-12-15\"\n    }\n    \n    print(\"\u2713 Found in Swiss Commercial Register\"\
    )\n    print(f\"   Company ID: {registry_result['company_id']}\")\n    print(f\"\
    \   Legal Form: {registry_result['legal_form']}\")\n    print(f\"   Registration\
    \ Office: {registry_result['registration_office']}\")\n    \n    # Step 2: SIX\
    \ Swiss Exchange validation\n    print(\"\")\n    print(\"\U0001F3E6 Validating\
    \ on SIX Swiss Exchange...\")\n    \n    market_indicators = []\n    market_indicators.append(\"\
    six_swiss_exchange\")\n    market_indicators.append(\"swiss_market_index\")\n\
    \    market_indicators.append(\"finma_regulated\")\n    \n    print(\"\u2713 Found\
    \ on SIX Swiss Exchange\")\n    print(\"\u2713 Swiss Market Index (SMI) component\"\
    )\n    print(\"\u2713 FINMA regulated\")\n    \n    # Step 3: Outstanding shares\
    \ validation\n    shares_validation = {}\n    if outstanding_shares is not None:\n\
    \        # Simulate expected shares (e.g., Nestl\xE9 example)\n        expected_shares\
    \ = 2650000000  \n        percentage_diff = abs(outstanding_shares - expected_shares)\
    \ / expected_shares * 100\n        \n        shares_validation = {\n         \
    \   \"provided_shares\": outstanding_shares,\n            \"expected_shares\"\
    : expected_shares,\n            \"percentage_difference\": round(percentage_diff,\
    \ 2),\n            \"shares_validation_result\": \"True Positive\" if percentage_diff\
    \ < 5 else \"False Positive\",\n            \"shares_confidence\": \"High\" if\
    \ percentage_diff < 2 else \"Medium\" if percentage_diff < 10 else \"Low\"\n \
    \       }\n        \n        print(\"\")\n        print(\"\U0001F4CA Outstanding\
    \ Shares Validation:\")\n        print(f\"   Provided: {outstanding_shares:,}\"\
    )\n        print(f\"   Expected: {expected_shares:,}\")\n        print(f\"   Difference:\
    \ {percentage_diff:.2f}%\")\n        print(f\"   Result: {shares_validation['shares_validation_result']}\"\
    )\n    else:\n        shares_validation = {\n            \"shares_validation_result\"\
    : \"Incomplete\",\n            \"shares_confidence\": \"Low\",\n            \"\
    reason\": \"Outstanding shares data not provided\"\n        }\n        print(\"\
    \")\n        print(\"\u26A0\uFE0F Outstanding shares validation incomplete\")\n\
    \    \n    # Overall validation result\n    is_valid = len(market_indicators)\
    \ >= 2 and registry_result[\"registry_status\"] == \"found\"\n    \n    if outstanding_shares\
    \ is not None:\n        overall_confidence = shares_validation[\"shares_confidence\"\
    ]\n        overall_result = shares_validation[\"shares_validation_result\"]\n\
    \    else:\n        overall_confidence = \"Medium\"\n        overall_result =\
    \ \"Incomplete\"\n    \n    validation_result = {\n        \"status\": \"completed\"\
    ,\n        \"isin\": isin,\n        \"company_name\": company_name,\n        \"\
    validation_result\": overall_result,\n        \"confidence_level\": overall_confidence,\n\
    \        \"exchange\": \"SIX Swiss Exchange\",\n        \"market_indicators\"\
    : market_indicators,\n        \"market_indicators_count\": len(market_indicators),\n\
    \        \"regulatory_status\": \"FINMA regulated\",\n        \"index_membership\"\
    : \"SMI\" if \"swiss_market_index\" in market_indicators else \"Unknown\",\n \
    \       \"registry_result\": registry_result,\n        \"shares_validation\":\
    \ shares_validation,\n        \"validation_timestamp\": time.strftime('%Y-%m-%d\
    \ %H:%M:%S'),\n        \"data_source\": \"SIX Swiss Exchange + Swiss Commercial\
    \ Register\",\n        \"evidence_id\": f\"CH_VALIDATION_{int(time.time())}\"\
    ,\n        \"validation_type\": \"Swiss Securities Validation\"\n    }\n    \n\
    \    print(\"\")\n    print(\"\u2705 Swiss validation completed\")\n    print(f\"\
    \   Overall Result: {overall_result}\")\n    print(f\"   Confidence: {overall_confidence}\"\
    )\n    print(f\"   Evidence ID: {validation_result['evidence_id']}\")\n    \n\
    except Exception as e:\n    validation_result = {\n        \"status\": \"error\"\
    ,\n        \"error\": str(e),\n        \"validation_result\": \"Inconclusive\"\
    ,\n        \"confidence_level\": \"Low\",\n        \"validation_type\": \"Swiss\
    \ Securities Validation\"\n    }\n    print(f\"\u274C Swiss validation failed:\
    \ {e}\")\n\nprint(f\"__OUTPUTS__ {json.dumps(validation_result)}\")\n"
  depends_on:
  - welcome_message
  - country_router
  description: Comprehensive Swiss securities validation with registry search and
    shares validation
  previous_node: country_router
  timeout_seconds: 60
  execute_on_routes:
  - validate_switzerland
- id: other_country_validation
  name: International Securities Handler
  type: script
  script: "import json\n\nprint(\"\U0001F30D INTERNATIONAL SECURITIES VALIDATION\"\
    )\nprint(\"=\" * 50)\nprint(\"\")\n\ncountry_code = \"${welcome_message.country_code}\"\
    \ncountry_name = \"${welcome_message.country_name}\"\nisin = \"${welcome_message.isin}\"\
    \ncompany_name = \"${welcome_message.company}\"\n\nprint(f\"\U0001F50D Processing:\
    \ {company_name}\")\nprint(f\"   ISIN: {isin}\")\nprint(f\"   Country: {country_name}\
    \ ({country_code})\")\nprint(\"\")\nprint(\"\u26A0\uFE0F This country is not in\
    \ our automated validation list\")\nprint(\"\")\nprint(\"Currently supported countries:\"\
    )\nprint(\"  \u2022 Germany (DE) - Deutsche B\xF6rse + BaFin\")\nprint(\"  \u2022\
    \ France (FR) - Euronext Paris + AMF\")\nprint(\"  \u2022 Switzerland (CH) - SIX\
    \ Swiss Exchange + FINMA\")\nprint(\"\")\nprint(\"\U0001F4CB Manual review required\
    \ by compliance team\")\nprint(\"   This security requires manual validation due\
    \ to:\")\nprint(\"   - Country not in automated validation framework\")\nprint(\"\
    \   - Regulatory requirements may vary by jurisdiction\")\nprint(\"   - Manual\
    \ compliance assessment needed\")\n\nresult = {\n    \"status\": \"completed\"\
    ,\n    \"isin\": isin,\n    \"company_name\": company_name,\n    \"country_code\"\
    : country_code,\n    \"country_name\": country_name,\n    \"validation_result\"\
    : \"MANUAL_REVIEW\",\n    \"confidence_level\": \"NOT_APPLICABLE\",\n    \"reason\"\
    : \"Country not in automated validation list\",\n    \"recommendation\": \"Submit\
    \ to compliance team for manual review\",\n    \"supported_countries\": [\"DE\"\
    , \"FR\", \"CH\"],\n    \"next_steps\": [\n        \"Forward to compliance team\"\
    ,\n        \"Manual regulatory review required\",\n        \"Country-specific\
    \ validation procedures needed\"\n    ],\n    \"validation_type\": \"Manual Review\
    \ Required\"\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - welcome_message
  - country_router
  description: Handles securities from countries not in automated validation list
  previous_node: country_router
  timeout_seconds: 30
  execute_on_routes:
  - validate_other
- id: validation_summary
  name: Validation Summary Report
  type: script
  script: "import json\nfrom datetime import datetime\n\nprint(\"\")\nprint(\"=\"\
    \ * 70)\nprint(\"\U0001F4CA UBS VALIDATION SUMMARY REPORT\")\nprint(\"=\" * 70)\n\
    print(\"\")\n\n# Get basic info from welcome_message\nalert_id = \"${welcome_message.alert_id}\"\
    \ncompany_name = \"${welcome_message.company}\"\nisin = \"${welcome_message.isin}\"\
    \ncountry_name = \"${welcome_message.country_name}\"\ncountry_code = \"${welcome_message.country_code}\"\
    \n\nprint(f\"Alert ID: {alert_id}\")\nprint(f\"Company: {company_name}\")\nprint(f\"\
    ISIN: {isin}\")\nprint(f\"Country: {country_name} ({country_code})\")\nprint(f\"\
    Report Generated: {datetime.now().isoformat()}\")\nprint(\"\")\n\n# Determine\
    \ which validation executed based on country code\nvalidation_result = None\n\
    validation_source = None\n\nif country_code == \"DE\":\n    validation_data =\
    \ '''${german_validation}'''\n    validation_source = \"German Market Validation\"\
    \nelif country_code == \"FR\":\n    validation_data = '''${french_validation}'''\n\
    \    validation_source = \"French Market Validation\"\nelif country_code == \"\
    CH\":\n    validation_data = '''${swiss_validation}'''\n    validation_source\
    \ = \"Swiss Securities Validation\"\nelse:\n    validation_data = '''${other_country_validation}'''\n\
    \    validation_source = \"International Securities Handler\"\n\n# Parse validation\
    \ data\ntry:\n    validation_result = json.loads(validation_data)\nexcept:\n \
    \   validation_result = {\n        \"validation_result\": \"ERROR\",\n       \
    \ \"confidence_level\": \"LOW\",\n        \"status\": \"parse_error\"\n    }\n\
    \n# Display results\nprint(\"VALIDATION RESULTS:\")\nprint(\"-\" * 50)\nprint(f\"\
    Source: {validation_source}\")\nprint(f\"Status: {validation_result.get('validation_result',\
    \ 'UNKNOWN')}\")\nprint(f\"Confidence: {validation_result.get('confidence_level',\
    \ 'N/A')}\")\n\nif 'exchange' in validation_result:\n    print(f\"Exchange: {validation_result['exchange']}\"\
    )\nif 'regulatory_status' in validation_result:\n    print(f\"Regulatory Status:\
    \ {validation_result['regulatory_status']}\")\nif 'market_indicators_count' in\
    \ validation_result:\n    print(f\"Market Indicators: {validation_result['market_indicators_count']}\"\
    )\n\nprint(\"\")\n\n# Final decision logic\nstatus = validation_result.get('validation_result',\
    \ 'UNKNOWN')\nif status in ['True Positive']:\n    print(\"\u2705 DECISION: Security\
    \ validation PASSED\")\n    decision = \"APPROVED\"\n    risk_level = \"LOW\"\n\
    elif status == 'MANUAL_REVIEW':\n    print(\"\u26A0\uFE0F DECISION: Manual review\
    \ required\")\n    decision = \"PENDING_REVIEW\"\n    risk_level = \"MEDIUM\"\n\
    elif status in ['False Positive']:\n    print(\"\u274C DECISION: Security validation\
    \ FAILED\")\n    decision = \"REJECTED\"\n    risk_level = \"HIGH\"\nelse:\n \
    \   print(\"\u2753 DECISION: Inconclusive validation result\")\n    decision =\
    \ \"INCONCLUSIVE\"\n    risk_level = \"MEDIUM\"\n\nprint(\"\")\nprint(\"=== READY\
    \ FOR AI ANALYSIS ===\")\nprint(\"Passing to AI analysis pipeline...\")\n\n# Create\
    \ comprehensive summary for AI analysis\nsummary_report = {\n    \"execution_summary\"\
    : {\n        \"alert_id\": alert_id,\n        \"company\": company_name,\n   \
    \     \"isin\": isin,\n        \"country\": country_name,\n        \"country_code\"\
    : country_code,\n        \"timestamp\": datetime.now().isoformat()\n    },\n \
    \   \"validation_results\": validation_result,\n    \"preliminary_decision\":\
    \ decision,\n    \"risk_level\": risk_level,\n    \"validation_source\": validation_source,\n\
    \    \"ready_for_ai_analysis\": True\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(summary_report)}\"\
    )\n"
  depends_on:
  - welcome_message
  - german_validation
  - french_validation
  - swiss_validation
  - other_country_validation
  description: Collects and summarizes all validation results from conditional routing
  previous_node:
  - german_validation
  - french_validation
  - swiss_validation
  - other_country_validation
  timeout_seconds: 30
- id: ai_financial_analyst_review
  name: AI Financial Analyst Expert Review
  type: ai_agent
  config:
    model_client_id: ubs_analyst
  depends_on:
  - validation_summary
  description: Expert AI analysis of financial security validation results
  user_message: 'Analyze these validation results:


    Security: ${validation_summary.execution_summary.isin} (${validation_summary.execution_summary.company})

    Country: ${validation_summary.execution_summary.country} (${validation_summary.execution_summary.country_code})


    Validation Source: ${validation_summary.validation_source}

    Preliminary Decision: ${validation_summary.preliminary_decision}

    Risk Level: ${validation_summary.risk_level}


    Detailed Validation Results: ${validation_summary.validation_results}

    '
  previous_node: validation_summary
  system_message: "You are a senior financial analyst specializing in European securities\
    \ validation for regulatory compliance.\n\nAnalyze all validation results and\
    \ provide expert financial assessment in JSON format with these fields:\n{\n \
    \ \"financial_assessment\": \"Overall financial assessment\",\n  \"risk_factors\"\
    : [\"risk1\", \"risk2\"],\n  \"market_analysis\": \"Market context analysis\"\
    ,\n  \"regulatory_implications\": \"Key regulatory considerations\",\n  \"confidence_level\"\
    : \"High|Medium|Low\",\n  \"recommendation\": \"Detailed recommendation\"\n}\n"
- id: ai_compliance_validator
  name: AI Regulatory Compliance Expert
  type: ai_agent
  config:
    model_client_id: ubs_compliance_expert
  depends_on:
  - ai_financial_analyst_review
  description: AI expert assessment of regulatory compliance requirements
  user_message: 'Assess regulatory compliance for:


    Security: ${validation_summary.execution_summary.isin} (${validation_summary.execution_summary.company})

    Country: ${validation_summary.execution_summary.country} (${validation_summary.execution_summary.country_code})


    Financial Analysis: ${ai_financial_analyst_review}

    Validation Results: ${validation_summary.validation_results}

    '
  previous_node: ai_financial_analyst_review
  system_message: "You are a regulatory compliance expert specializing in MiFID II,\
    \ ESMA guidelines, and European financial regulations.\n\nBased on the financial\
    \ analysis, assess regulatory compliance and provide your response in JSON format:\n\
    {\n  \"compliance_status\": \"COMPLIANT|NON_COMPLIANT|REQUIRES_REVIEW\",\n  \"\
    regulatory_framework\": \"Applicable regulations\",\n  \"compliance_score\": 0-100,\n\
    \  \"key_findings\": [\"finding1\", \"finding2\"],\n  \"regulatory_risks\": [\"\
    risk1\", \"risk2\"],\n  \"recommended_actions\": [\"action1\", \"action2\"],\n\
    \  \"documentation_requirements\": [\"doc1\", \"doc2\"]\n}\n"
- id: ai_decision_engine
  name: AI Final Decision Engine
  type: ai_agent
  config:
    model_client_id: ubs_validator
  depends_on:
  - ai_compliance_validator
  description: AI-powered final decision making for securities validation
  user_message: 'Make final decision for:


    Security: ${validation_summary.execution_summary.isin} (${validation_summary.execution_summary.company})


    Financial Analysis: ${ai_financial_analyst_review}

    Compliance Assessment: ${ai_compliance_validator}

    Preliminary Decision: ${validation_summary.preliminary_decision}

    '
  previous_node: ai_compliance_validator
  system_message: "You are the final decision-making AI for UBS financial securities\
    \ validation.\n\nMake the final regulatory decision using this criteria:\n- TRUE\
    \ POSITIVE: Security meets all regulatory requirements\n- FALSE POSITIVE: Security\
    \ fails regulatory requirements  \n- INCONCLUSIVE: Insufficient data or mixed\
    \ results\n\nProvide decision in JSON format:\n{\n  \"final_decision\": \"True\
    \ Positive|False Positive|Inconclusive\",\n  \"confidence_level\": \"High|Medium|Low\"\
    ,\n  \"decision_rationale\": \"Clear reasoning for the decision\",\n  \"key_evidence\"\
    : [\"evidence1\", \"evidence2\"],\n  \"regulatory_compliance\": \"PASS|FAIL|REVIEW\"\
    ,\n  \"risk_assessment\": \"LOW|MEDIUM|HIGH\",\n  \"recommended_actions\": [\"\
    action1\", \"action2\"]\n}\n"
- id: ai_generate_final_report
  name: AI-Powered Comprehensive Report Generator
  type: ai_agent
  config:
    model_client_id: ubs_report_generator
  depends_on:
  - ai_decision_engine
  description: AI-generated comprehensive UBS validation report with executive summary
  user_message: 'Generate comprehensive validation report for:


    Security: ${validation_summary.execution_summary.isin} (${validation_summary.execution_summary.company})

    Alert ID: ${validation_summary.execution_summary.alert_id}

    Country: ${validation_summary.execution_summary.country}


    Validation Results: ${validation_summary.validation_results}

    Financial Analysis: ${ai_financial_analyst_review}

    Compliance Assessment: ${ai_compliance_validator}

    Final Decision: ${ai_decision_engine}

    '
  previous_node: ai_decision_engine
  system_message: "You are an expert financial report writer specializing in regulatory\
    \ compliance documentation for institutional investors.\n\nGenerate a comprehensive\
    \ UBS validation report in JSON format:\n{\n  \"executive_summary\": \"High-level\
    \ summary for executives\",\n  \"validation_overview\": {\n    \"security_details\"\
    : \"ISIN, company, country information\",\n    \"validation_methodology\": \"\
    Process and approach used\",\n    \"data_sources\": \"Sources of validation data\"\
    \n  },\n  \"detailed_findings\": {\n    \"market_validation\": \"Exchange and\
    \ regulatory findings\",\n    \"compliance_assessment\": \"Regulatory compliance\
    \ status\",\n    \"risk_analysis\": \"Risk factors and mitigation\"\n  },\n  \"\
    ai_analysis_summary\": {\n    \"financial_expert_view\": \"Financial analyst conclusions\"\
    ,\n    \"compliance_expert_view\": \"Regulatory expert assessment\",\n    \"final_decision_rationale\"\
    : \"Decision engine reasoning\"\n  },\n  \"recommendations\": {\n    \"immediate_actions\"\
    : [\"action1\", \"action2\"],\n    \"monitoring_requirements\": [\"requirement1\"\
    , \"requirement2\"],\n    \"documentation_needed\": [\"doc1\", \"doc2\"]\n  },\n\
    \  \"appendices\": {\n    \"evidence_trail\": \"Supporting evidence and data\"\
    ,\n    \"regulatory_references\": \"Applicable regulations and guidelines\"\n\
    \  }\n}\n"
inputs:
- name: timezone
  type: string
  default: UTC
  description: Timezone for timestamps (e.g., UTC, Europe/London, America/New_York)
- name: time_format
  type: string
  default: iso
  description: How to display time (iso, human, unix)
- name: alert_id
  type: string
  default: UBS_COMPLETE_001
  required: true
  description: Your reference ID for this validation
- name: company_name
  type: string
  default: BMW AG
  required: true
  description: Company name to validate
- name: isin
  type: string
  default: DE0005190003
  required: true
  description: The ISIN code (starts with country code like DE, FR, CH)
- name: outstanding_shares
  type: integer
  required: false
  description: Number of shares (only needed for Swiss companies)
outputs:
  ai_decision:
    type: object
    source: ai_decision_engine
    description: AI decision engine final determination
  final_report:
    type: object
    source: ai_generate_final_report
    description: AI-generated comprehensive UBS validation report
  financial_analysis:
    type: object
    source: ai_financial_analyst_review
    description: AI financial analyst expert review
  validation_results:
    type: object
    source: validation_summary
    description: Country-specific validation results from conditional routing
  initialization_data:
    type: object
    source: welcome_message
    description: System initialization and country detection
  compliance_assessment:
    type: object
    source: ai_compliance_validator
    description: AI regulatory compliance expert validation
version: 2.0
namespace: financial
description: Advanced UBS financial validation combining conditional routing with
  comprehensive AI analysis pipeline
model_clients:
- id: ubs_analyst
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 3000
    temperature: 0.1
  provider: openai
- id: ubs_validator
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 2000
    temperature: 0.05
  provider: openai
- id: ubs_compliance_expert
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 4000
    temperature: 0.0
  provider: openai
- id: ubs_report_generator
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 5000
    temperature: 0.2
  provider: openai
timeout_seconds: 600
Execution ID Status Started Duration Actions
ba2aa675... COMPLETED 2025-09-16
06:27:10
N/A View
85b1edc6... COMPLETED 2025-09-12
14:00:32
N/A View
b3315d98... COMPLETED 2025-07-21
06:19:37
N/A View
72d2e09f... COMPLETED 2025-07-17
10:18:26
N/A View
27684523... COMPLETED 2025-07-16
08:03:36
N/A View
5cad3f8e... COMPLETED 2025-07-16
05:50:46
N/A View
1280783c... COMPLETED 2025-07-16
05:49:56
N/A View
e8288215... COMPLETED 2025-07-16
04:59:59
N/A View
2882772d... COMPLETED 2025-07-15
11:07:19
N/A View
6001f394... COMPLETED 2025-07-15
11:01:09
N/A View
5a5b827c... COMPLETED 2025-07-15
10:38:59
N/A View
001ba9cd... COMPLETED 2025-07-15
10:37:06
N/A View
a4101cf1... COMPLETED 2025-07-14
02:43:30
N/A View
16c58d8c... COMPLETED 2025-07-11
08:04:43
N/A View
00921dc8... COMPLETED 2025-07-11
05:10:54
N/A View
8b54bd15... COMPLETED 2025-07-11
04:58:39
N/A View
1266123a... COMPLETED 2025-07-11
04:39:37
N/A View
7eaff09a... COMPLETED 2025-07-10
11:54:38
N/A View
e7fe486b... COMPLETED 2025-07-10
10:04:49
N/A View
5a68d398... COMPLETED 2025-07-10
09:55:48
N/A View