* chore: upgrade maintenance scripts to robust PyYAML parsing - Replaces fragile regex frontmatter parsing with PyYAML/yaml library - Ensures multi-line descriptions and complex characters are handled safely - Normalizes quoting and field ordering across all maintenance scripts - Updates validator to strictly enforce description quality * fix: restore and refine truncated skill descriptions - Recovered 223+ truncated descriptions from git history (6.5.0 regression) - Refined long descriptions into concise, complete sentences (<200 chars) - Added missing descriptions for brainstorming and orchestration skills - Manually fixed imagen skill description - Resolved dangling links in competitor-alternatives skill * chore: sync generated registry files and document fixes - Regenerated skills index with normalized forward-slash paths - Updated README and CATALOG to reflect restored descriptions - Documented restoration and script improvements in CHANGELOG.md * fix: restore missing skill and align metadata for full 955 count - Renamed SKILL.MD to SKILL.md in andruia-skill-smith to ensure indexing - Fixed risk level and missing section in andruia-skill-smith - Synchronized all registry files for final 955 skill count * chore(scripts): add cross-platform runners and hermetic test orchestration * fix(scripts): harden utf-8 output and clone target writeability * fix(skills): add missing date metadata for strict validation * chore(index): sync generated metadata dates * fix(catalog): normalize skill paths to prevent CI drift * chore: sync generated registry files * fix: enforce LF line endings for generated registry files
325 lines
7.5 KiB
Markdown
325 lines
7.5 KiB
Markdown
---
|
|
name: azure-mgmt-botservice-py
|
|
description: Azure Bot Service Management SDK for Python. Use for creating, managing, and configuring Azure Bot Service resources.
|
|
risk: unknown
|
|
source: community
|
|
date_added: '2026-02-27'
|
|
---
|
|
|
|
# Azure Bot Service Management SDK for Python
|
|
|
|
Manage Azure Bot Service resources including bots, channels, and connections.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
pip install azure-mgmt-botservice
|
|
pip install azure-identity
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
```bash
|
|
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
|
|
AZURE_RESOURCE_GROUP=<your-resource-group>
|
|
```
|
|
|
|
## Authentication
|
|
|
|
```python
|
|
from azure.identity import DefaultAzureCredential
|
|
from azure.mgmt.botservice import AzureBotService
|
|
import os
|
|
|
|
credential = DefaultAzureCredential()
|
|
client = AzureBotService(
|
|
credential=credential,
|
|
subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
|
|
)
|
|
```
|
|
|
|
## Create a Bot
|
|
|
|
```python
|
|
from azure.mgmt.botservice import AzureBotService
|
|
from azure.mgmt.botservice.models import Bot, BotProperties, Sku
|
|
from azure.identity import DefaultAzureCredential
|
|
import os
|
|
|
|
credential = DefaultAzureCredential()
|
|
client = AzureBotService(
|
|
credential=credential,
|
|
subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
|
|
)
|
|
|
|
resource_group = os.environ["AZURE_RESOURCE_GROUP"]
|
|
bot_name = "my-chat-bot"
|
|
|
|
bot = client.bots.create(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
parameters=Bot(
|
|
location="global",
|
|
sku=Sku(name="F0"), # Free tier
|
|
kind="azurebot",
|
|
properties=BotProperties(
|
|
display_name="My Chat Bot",
|
|
description="A conversational AI bot",
|
|
endpoint="https://my-bot-app.azurewebsites.net/api/messages",
|
|
msa_app_id="<your-app-id>",
|
|
msa_app_type="MultiTenant"
|
|
)
|
|
)
|
|
)
|
|
|
|
print(f"Bot created: {bot.name}")
|
|
```
|
|
|
|
## Get Bot Details
|
|
|
|
```python
|
|
bot = client.bots.get(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name
|
|
)
|
|
|
|
print(f"Bot: {bot.properties.display_name}")
|
|
print(f"Endpoint: {bot.properties.endpoint}")
|
|
print(f"SKU: {bot.sku.name}")
|
|
```
|
|
|
|
## List Bots in Resource Group
|
|
|
|
```python
|
|
bots = client.bots.list_by_resource_group(resource_group_name=resource_group)
|
|
|
|
for bot in bots:
|
|
print(f"Bot: {bot.name} - {bot.properties.display_name}")
|
|
```
|
|
|
|
## List All Bots in Subscription
|
|
|
|
```python
|
|
all_bots = client.bots.list()
|
|
|
|
for bot in all_bots:
|
|
print(f"Bot: {bot.name} in {bot.id.split('/')[4]}")
|
|
```
|
|
|
|
## Update Bot
|
|
|
|
```python
|
|
bot = client.bots.update(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
properties=BotProperties(
|
|
display_name="Updated Bot Name",
|
|
description="Updated description"
|
|
)
|
|
)
|
|
```
|
|
|
|
## Delete Bot
|
|
|
|
```python
|
|
client.bots.delete(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name
|
|
)
|
|
```
|
|
|
|
## Configure Channels
|
|
|
|
### Add Teams Channel
|
|
|
|
```python
|
|
from azure.mgmt.botservice.models import (
|
|
BotChannel,
|
|
MsTeamsChannel,
|
|
MsTeamsChannelProperties
|
|
)
|
|
|
|
channel = client.channels.create(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
channel_name="MsTeamsChannel",
|
|
parameters=BotChannel(
|
|
location="global",
|
|
properties=MsTeamsChannel(
|
|
properties=MsTeamsChannelProperties(
|
|
is_enabled=True
|
|
)
|
|
)
|
|
)
|
|
)
|
|
```
|
|
|
|
### Add Direct Line Channel
|
|
|
|
```python
|
|
from azure.mgmt.botservice.models import (
|
|
BotChannel,
|
|
DirectLineChannel,
|
|
DirectLineChannelProperties,
|
|
DirectLineSite
|
|
)
|
|
|
|
channel = client.channels.create(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
channel_name="DirectLineChannel",
|
|
parameters=BotChannel(
|
|
location="global",
|
|
properties=DirectLineChannel(
|
|
properties=DirectLineChannelProperties(
|
|
sites=[
|
|
DirectLineSite(
|
|
site_name="Default Site",
|
|
is_enabled=True,
|
|
is_v1_enabled=False,
|
|
is_v3_enabled=True
|
|
)
|
|
]
|
|
)
|
|
)
|
|
)
|
|
)
|
|
```
|
|
|
|
### Add Web Chat Channel
|
|
|
|
```python
|
|
from azure.mgmt.botservice.models import (
|
|
BotChannel,
|
|
WebChatChannel,
|
|
WebChatChannelProperties,
|
|
WebChatSite
|
|
)
|
|
|
|
channel = client.channels.create(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
channel_name="WebChatChannel",
|
|
parameters=BotChannel(
|
|
location="global",
|
|
properties=WebChatChannel(
|
|
properties=WebChatChannelProperties(
|
|
sites=[
|
|
WebChatSite(
|
|
site_name="Default Site",
|
|
is_enabled=True
|
|
)
|
|
]
|
|
)
|
|
)
|
|
)
|
|
)
|
|
```
|
|
|
|
## Get Channel Details
|
|
|
|
```python
|
|
channel = client.channels.get(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
channel_name="DirectLineChannel"
|
|
)
|
|
```
|
|
|
|
## List Channel Keys
|
|
|
|
```python
|
|
keys = client.channels.list_with_keys(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
channel_name="DirectLineChannel"
|
|
)
|
|
|
|
# Access Direct Line keys
|
|
if hasattr(keys.properties, 'properties'):
|
|
for site in keys.properties.properties.sites:
|
|
print(f"Site: {site.site_name}")
|
|
print(f"Key: {site.key}")
|
|
```
|
|
|
|
## Bot Connections (OAuth)
|
|
|
|
### Create Connection Setting
|
|
|
|
```python
|
|
from azure.mgmt.botservice.models import (
|
|
ConnectionSetting,
|
|
ConnectionSettingProperties
|
|
)
|
|
|
|
connection = client.bot_connection.create(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name,
|
|
connection_name="graph-connection",
|
|
parameters=ConnectionSetting(
|
|
location="global",
|
|
properties=ConnectionSettingProperties(
|
|
client_id="<oauth-client-id>",
|
|
client_secret="<oauth-client-secret>",
|
|
scopes="User.Read",
|
|
service_provider_id="<service-provider-id>"
|
|
)
|
|
)
|
|
)
|
|
```
|
|
|
|
### List Connections
|
|
|
|
```python
|
|
connections = client.bot_connection.list_by_bot_service(
|
|
resource_group_name=resource_group,
|
|
resource_name=bot_name
|
|
)
|
|
|
|
for conn in connections:
|
|
print(f"Connection: {conn.name}")
|
|
```
|
|
|
|
## Client Operations
|
|
|
|
| Operation | Method |
|
|
|-----------|--------|
|
|
| `client.bots` | Bot CRUD operations |
|
|
| `client.channels` | Channel configuration |
|
|
| `client.bot_connection` | OAuth connection settings |
|
|
| `client.direct_line` | Direct Line channel operations |
|
|
| `client.email` | Email channel operations |
|
|
| `client.operations` | Available operations |
|
|
| `client.host_settings` | Host settings operations |
|
|
|
|
## SKU Options
|
|
|
|
| SKU | Description |
|
|
|-----|-------------|
|
|
| `F0` | Free tier (limited messages) |
|
|
| `S1` | Standard tier (unlimited messages) |
|
|
|
|
## Channel Types
|
|
|
|
| Channel | Class | Purpose |
|
|
|---------|-------|---------|
|
|
| `MsTeamsChannel` | Microsoft Teams | Teams integration |
|
|
| `DirectLineChannel` | Direct Line | Custom client integration |
|
|
| `WebChatChannel` | Web Chat | Embeddable web widget |
|
|
| `SlackChannel` | Slack | Slack workspace integration |
|
|
| `FacebookChannel` | Facebook | Messenger integration |
|
|
| `EmailChannel` | Email | Email communication |
|
|
|
|
## Best Practices
|
|
|
|
1. **Use DefaultAzureCredential** for authentication
|
|
2. **Start with F0 SKU** for development, upgrade to S1 for production
|
|
3. **Store MSA App ID/Secret securely** — use Key Vault
|
|
4. **Enable only needed channels** — reduces attack surface
|
|
5. **Rotate Direct Line keys** periodically
|
|
6. **Use managed identity** when possible for bot connections
|
|
7. **Configure proper CORS** for Web Chat channel
|
|
|
|
## When to Use
|
|
This skill is applicable to execute the workflow or actions described in the overview.
|