Skip to content

Commit 9759552

Browse files
whoniiiiCopilot
andauthored
Update azure-architecture-autopilot: 19 new service types (72 total) (#1175)
* Update azure-architecture-autopilot: 19 new service types (72 total) + advisor improvements - Added service types: apim, service_bus, logic_apps, event_grid, container_apps, postgresql, mysql, load_balancer, nat_gateway, expressroute, sentinel, data_explorer, signalr, notification_hub, spring_apps, static_web_app, digital_twins, backup - Updated phase1-advisor prompt with improved guidance - Synced icons.py updates Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: regenerate README docs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: whoniiii <whoniiii@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 50f87bd commit 9759552

3 files changed

Lines changed: 141 additions & 18 deletions

File tree

skills/azure-architecture-autopilot/references/phase1-advisor.md

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -432,20 +432,63 @@ Dynamically composed based on the user's confirmed service list. Below is the JS
432432
| `subscription` | | string | Subscription name (required when using hierarchy) |
433433
| `resourceGroup` | | string | Resource group name (required when using hierarchy) |
434434

435-
**Service Type List (by category):**
436-
437-
| Category | Types |
438-
|----------|-------|
439-
| **AI** | `ai_foundry`, `ai_hub`, `openai`, `ai_search` / `search`, `document_intelligence` / `form_recognizer`, `aml` |
440-
| **Data** | `storage` / `adls`, `cosmos_db`, `sql_database`, `sql_server`, `databricks`, `data_factory` / `adf`, `fabric`, `redis`, `stream_analytics`, `synapse` |
441-
| **Security** | `keyvault` / `kv` |
442-
| **Compute** | `app_service` / `appservice`, `function_app`, `vm`, `aks`, `acr` / `container_registry` |
443-
| **Network** | `firewall`, `bastion`, `vpn_gateway` / `vpn`, `app_gateway`, `front_door`, `cdn`, `nsg`, `pe` |
444-
| **IoT** | `iot_hub` |
445-
| **Integration** | `event_hub` |
446-
| **Monitoring** | `log_analytics`, `app_insights` / `appinsights`, `monitor` |
447-
| **DevOps** | `devops` |
448-
| **Other** | `jumpbox`, `user`, etc. (unrecognized types use fuzzy matching + default icon) |
435+
**Service Type — Canonical Reference:**
436+
437+
> ⚠️ **CRITICAL**: Always use the **canonical type** from the table below. Do NOT use Azure ARM resource names (e.g., `private_endpoints`, `storage_accounts`, `data_factories`). The generator normalizes common variants, but using canonical types ensures correct icon rendering, PE detection, and color coding.
438+
439+
| Category | Canonical Type | Azure Resource | Icon |
440+
|----------|---------------|----------------|------|
441+
| **AI** | `ai_foundry` | Microsoft.CognitiveServices/accounts (kind: AIServices) | AI Foundry |
442+
| | `openai` | Microsoft.CognitiveServices/accounts (kind: OpenAI) | Azure OpenAI |
443+
| | `ai_hub` | Foundry Project | AI Studio |
444+
| | `search` | Microsoft.Search/searchServices | Cognitive Search |
445+
| | `document_intelligence` | Microsoft.CognitiveServices/accounts (kind: FormRecognizer) | Form Recognizer |
446+
| | `aml` | Microsoft.MachineLearningServices/workspaces | Machine Learning |
447+
| **Data** | `fabric` | Microsoft.Fabric/capacities | Microsoft Fabric |
448+
| | `adf` | Microsoft.DataFactory/factories | Data Factory |
449+
| | `storage` | Microsoft.Storage/storageAccounts | Storage Account |
450+
| | `adls` | ADLS Gen2 (Storage with HNS) | Data Lake |
451+
| | `cosmos_db` | Microsoft.DocumentDB/databaseAccounts | Cosmos DB |
452+
| | `sql_database` | Microsoft.Sql/servers/databases | SQL Database |
453+
| | `sql_server` | Microsoft.Sql/servers | SQL Server |
454+
| | `databricks` | Microsoft.Databricks/workspaces | Databricks |
455+
| | `synapse` | Microsoft.Synapse/workspaces | Synapse Analytics |
456+
| | `redis` | Microsoft.Cache/redis | Redis Cache |
457+
| | `stream_analytics` | Microsoft.StreamAnalytics/streamingjobs | Stream Analytics |
458+
| | `postgresql` | Microsoft.DBforPostgreSQL/flexibleServers | PostgreSQL |
459+
| | `mysql` | Microsoft.DBforMySQL/flexibleServers | MySQL |
460+
| **Security** | `keyvault` | Microsoft.KeyVault/vaults | Key Vault |
461+
| | `sentinel` | Microsoft.SecurityInsights | Sentinel |
462+
| **Compute** | `appservice` | Microsoft.Web/sites | App Service |
463+
| | `function_app` | Microsoft.Web/sites (kind: functionapp) | Function App |
464+
| | `vm` | Microsoft.Compute/virtualMachines | Virtual Machine |
465+
| | `aks` | Microsoft.ContainerService/managedClusters | AKS |
466+
| | `acr` | Microsoft.ContainerRegistry/registries | Container Registry |
467+
| | `container_apps` | Microsoft.App/containerApps | Container Apps |
468+
| | `static_web_app` | Microsoft.Web/staticSites | Static Web App |
469+
| | `spring_apps` | Microsoft.AppPlatform/Spring | Spring Apps |
470+
| **Network** | `pe` | Microsoft.Network/privateEndpoints | Private Endpoint |
471+
| | `vnet` | Microsoft.Network/virtualNetworks | VNet |
472+
| | `nsg` | Microsoft.Network/networkSecurityGroups | NSG |
473+
| | `firewall` | Microsoft.Network/azureFirewalls | Firewall |
474+
| | `bastion` | Microsoft.Network/bastionHosts | Bastion |
475+
| | `app_gateway` | Microsoft.Network/applicationGateways | App Gateway |
476+
| | `front_door` | Microsoft.Cdn/profiles (Front Door) | Front Door |
477+
| | `vpn` | Microsoft.Network/virtualNetworkGateways | VPN Gateway |
478+
| | `load_balancer` | Microsoft.Network/loadBalancers | Load Balancer |
479+
| | `nat_gateway` | Microsoft.Network/natGateways | NAT Gateway |
480+
| | `cdn` | Microsoft.Cdn/profiles | CDN |
481+
| **IoT** | `iot_hub` | Microsoft.Devices/IotHubs | IoT Hub |
482+
| | `digital_twins` | Microsoft.DigitalTwins/digitalTwinsInstances | Digital Twins |
483+
| **Integration** | `event_hub` | Microsoft.EventHub/namespaces | Event Hub |
484+
| | `event_grid` | Microsoft.EventGrid/topics | Event Grid |
485+
| | `apim` | Microsoft.ApiManagement/service | API Management |
486+
| | `service_bus` | Microsoft.ServiceBus/namespaces | Service Bus |
487+
| | `logic_apps` | Microsoft.Logic/workflows | Logic Apps |
488+
| **Monitoring** | `log_analytics` | Microsoft.OperationalInsights/workspaces | Log Analytics |
489+
| | `appinsights` | Microsoft.Insights/components | App Insights |
490+
| | `monitor` | Azure Monitor | Monitor |
491+
| **Other** | `jumpbox`, `user`, `devops` || Special |
449492

450493
**When Using Private Endpoints — PE Node Addition Required:**
451494

skills/azure-architecture-autopilot/scripts/generator.py

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"ai_foundry": {
2323
"icon_svg": '<rect x="6" y="10" width="36" height="28" rx="4" fill="#0078D4"/><rect x="12" y="16" width="10" height="8" rx="2" fill="white" opacity="0.9"/><rect x="26" y="16" width="10" height="8" rx="2" fill="white" opacity="0.9"/><rect x="12" y="27" width="24" height="5" rx="2" fill="white" opacity="0.6"/>',
2424
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
25-
"azure_icon_key": "azure_openai"
25+
"azure_icon_key": "ai_foundry"
2626
},
2727
"ai_hub": {
2828
"icon_svg": '<rect x="6" y="10" width="36" height="28" rx="4" fill="#0078D4"/><circle cx="24" cy="24" r="8" fill="white" opacity="0.9"/><circle cx="24" cy="24" r="4" fill="#0078D4"/>',
@@ -57,7 +57,7 @@
5757
"fabric": {
5858
"icon_svg": '<polygon points="24,6 42,18 42,34 24,46 6,34 6,18" fill="#E8740C" opacity="0.9"/><text x="24" y="30" text-anchor="middle" font-size="14" fill="white" font-weight="700">F</text>',
5959
"color": "#E8740C", "bg": "#FEF3E8", "category": "Data",
60-
"azure_icon_key": "managed_service_fabric"
60+
"azure_icon_key": "microsoft_fabric"
6161
},
6262
"synapse": {
6363
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><path d="M15 24 L24 15 L33 24 L24 33 Z" fill="white" opacity="0.9"/>',
@@ -407,8 +407,74 @@
407407
}
408408

409409

410+
_TYPE_ALIASES = {
411+
# Azure ARM resource names → canonical diagram type
412+
# Network
413+
"private_endpoints": "pe", "private_endpoint": "pe",
414+
"virtual_networks": "vnet", "virtual_network": "vnet",
415+
"network_security_groups": "nsg", "network_security_group": "nsg",
416+
"bastion_hosts": "bastion", "bastion_host": "bastion",
417+
"application_gateways": "app_gateway", "application_gateway": "app_gateway",
418+
"front_doors": "front_door", "front_door_and_cdn_profiles": "front_door",
419+
"virtual_network_gateways": "vpn", "vpn_gateways": "vpn",
420+
"load_balancers": "load_balancer",
421+
"nat_gateways": "nat_gateway",
422+
"expressroute_circuits": "expressroute",
423+
"firewalls": "firewall",
424+
"cdn_profiles": "cdn",
425+
# Data
426+
"data_factories": "adf", "data_factory": "adf",
427+
"storage_accounts": "storage", "storage_account": "storage",
428+
"data_lake": "adls", "adls_gen2": "adls", "data_lake_storage": "adls",
429+
"fabric_capacities": "fabric", "fabric_capacity": "fabric", "microsoft_fabric": "fabric",
430+
"synapse_workspaces": "synapse", "synapse_workspace": "synapse", "synapse_analytics": "synapse",
431+
"cosmos": "cosmos_db", "cosmosdb": "cosmos_db", "documentdb": "cosmos_db",
432+
"sql_databases": "sql_database", "sql_db": "sql_database",
433+
"sql_servers": "sql_server",
434+
"redis_caches": "redis", "redis_cache": "redis", "cache_redis": "redis",
435+
"stream_analytics_jobs": "stream_analytics",
436+
"databricks_workspaces": "databricks",
437+
"data_explorer_clusters": "data_explorer", "azure_data_explorer": "data_explorer",
438+
"postgresql_server": "postgresql", "postgresql_servers": "postgresql",
439+
"mysql_server": "mysql", "mysql_servers": "mysql",
440+
# AI
441+
"cognitive_services": "ai_foundry", "ai_services": "ai_foundry", "foundry": "ai_foundry",
442+
"azure_openai": "openai",
443+
"cognitive_search": "search", "search_services": "search", "search_service": "search",
444+
"machine_learning": "aml", "ml": "aml", "machine_learning_workspaces": "aml",
445+
"form_recognizers": "document_intelligence",
446+
"ai_studio": "ai_hub", "foundry_project": "ai_hub",
447+
# Security
448+
"key_vault": "keyvault", "key_vaults": "keyvault",
449+
"sentinel": "sentinel", "azure_sentinel": "sentinel",
450+
# Compute
451+
"virtual_machines": "vm", "virtual_machine": "vm",
452+
"app_services": "appservice", "web_apps": "appservice", "web_app": "appservice",
453+
"function_apps": "function_app", "functions": "function_app",
454+
"kubernetes_services": "aks", "managed_clusters": "aks", "kubernetes": "aks",
455+
"container_registries": "acr",
456+
"container_apps_environments": "container_apps",
457+
"spring_apps": "spring_apps", "azure_spring_apps": "spring_apps",
458+
"static_apps": "static_web_app", "static_web_apps": "static_web_app",
459+
# Integration
460+
"event_hubs": "event_hub",
461+
"event_grid_topics": "event_grid", "event_grid_domains": "event_grid",
462+
"api_management_services": "apim",
463+
"service_bus_namespaces": "service_bus",
464+
"logic_app": "logic_apps",
465+
"notification_hubs": "notification_hub",
466+
# Monitoring
467+
"log_analytics_workspaces": "log_analytics",
468+
"application_insights": "appinsights", "app_insight": "appinsights",
469+
# IoT
470+
"iot_hubs": "iot_hub",
471+
# Management
472+
"backup_vaults": "backup", "backup_vault": "backup",
473+
}
474+
410475
def get_service_info(svc_type: str) -> dict:
411476
t = svc_type.lower().replace("-", "_").replace(" ", "_")
477+
t = _TYPE_ALIASES.get(t, t)
412478
info = SERVICE_ICONS.get(t, SERVICE_ICONS["default"]).copy()
413479
# Add official Azure icon data URI if available
414480
azure_key = info.get("azure_icon_key", t)
@@ -418,10 +484,14 @@ def get_service_info(svc_type: str) -> dict:
418484

419485

420486
def generate_html(services: list, connections: list, title: str, vnet_info: str = "", hierarchy: list = None) -> str:
487+
def _norm(t):
488+
t = t.lower().replace("-", "_").replace(" ", "_")
489+
return _TYPE_ALIASES.get(t, t)
490+
421491
nodes_js = json.dumps([{
422492
"id": svc["id"],
423493
"name": svc["name"],
424-
"type": svc.get("type", "default"),
494+
"type": _norm(svc.get("type", "default")),
425495
"sku": svc.get("sku", ""),
426496
"private": svc.get("private", False),
427497
"details": svc.get("details", []),
@@ -445,7 +515,7 @@ def generate_html(services: list, connections: list, title: str, vnet_info: str
445515
"dash": CONNECTION_STYLES.get(conn.get("type", "default"), CONNECTION_STYLES["default"])["dash"],
446516
} for conn in connections], ensure_ascii=False)
447517

448-
pe_count = sum(1 for s in services if s.get("type", "default") == "pe")
518+
pe_count = sum(1 for s in services if _norm(s.get("type", "default")) == "pe")
449519
svc_count = len(services) - pe_count
450520
generated_at = datetime.now().strftime("%Y-%m-%d %H:%M")
451521
vnet_info_js = json.dumps(vnet_info, ensure_ascii=False)

0 commit comments

Comments
 (0)