Webex Bot - AI Assistant
A conversational AI bot for Webex that:
- 🤖 Responds to user mentions with AI-generated answers
- 💬 Maintains conversation context within threads
- 🔧 Integrates with MCP (Model Context Protocol) servers for extended capabilities
- 🌐 Supports multiple LLM providers via LiteLLM (OpenAI, Google Gemini, Ollama, OpenRouter, Anthropic, etc.)
Features
- Thread-aware conversations: The bot remembers context within Webex threads, allowing natural follow-up questions
- Rolling thread summarization: Background tasks summarize older messages as threads grow, preserving context indefinitely without hitting context limits
- Room-wide history search: Uses SQLite FTS5 keyword search to look up past messages, solutions, and context across Webex space history
- Smart mention handling: The bot recognizes its own name and doesn't confuse it with questions
- Multiple LLM providers: Use OpenAI, Google Gemini, Ollama (local/cloud), OpenRouter, Anthropic, or any LiteLLM-supported provider
- MCP Integration: Connect to multiple MCP servers via HTTP for extended tool capabilities
- Access control: Restrict bot to approved users, domains, or rooms
- Clean code: Follows Python best practices with ruff linting and formatting
Quick Start
Prerequisites
- Python 3.11+
- UV package manager
- Webex bot token (create one here)
- API key for your LLM provider (e.g., OpenAI, Gemini)
Installation
Option 1: Install from PyPI
Run the package directly from PyPI using UVX:
uvx webex-bot-ai
Option 2: Local Development Setup
For development or running from source:
- Install dependencies:
git clone https://github.com/mhajder/webex-bot-ai.git
cd webex-bot-ai
uv sync
Option 3: Run with Docker (Persistent Storage)
Run in a container with database volume persistence:
docker run -d \
--name webex-bot-ai \
--env-file .env \
-v webex_bot_data:/app/data \
ghcr.io/mhajder/webex-bot-ai:latest
Configuration
- Configure environment:
cp .env.example .env
# Edit .env with your configuration
- Set required variables in
.env:
WEBEX_ACCESS_TOKEN=your_webex_bot_token
OPENAI_API_KEY=your_openai_api_key
- Run the bot:
webex-bot-ai
Configuration
Bot Settings
| Variable | Description | Default |
|---|---|---|
WEBEX_ACCESS_TOKEN |
Webex bot access token (required) | - |
BOT_NAME |
Bot name for mention handling | Assistant |
BOT_DISPLAY_NAME |
Display name in Webex | AI Assistant |
LLM Settings
| Variable | Description | Default |
|---|---|---|
LLM_MODEL |
LiteLLM model identifier | gpt-4o-mini |
LLM_TEMPERATURE |
Sampling temperature (0.0-2.0) | 0.7 |
LLM_MAX_TOKENS |
Maximum response tokens | 2048 |
LLM_API_BASE |
Custom API endpoint | - |
Conversation Settings & Rolling Summarization
| Variable | Description | Default |
|---|---|---|
CONVERSATION_ENABLE_PERSISTENCE |
Persist conversation threads to SQLite database | true |
CONVERSATION_ENABLE_SUMMARIZATION |
Enable rolling thread summarization for long threads | true |
CONVERSATION_SUMMARY_THRESHOLD |
Message count threshold to trigger rolling summarization | 50 |
CONVERSATION_KEEP_RECENT_MESSAGES |
Number of recent messages retained verbatim after summary | 20 |
CONVERSATION_SUMMARY_MODEL |
Optional distinct LLM model for thread summarization | Same as LLM_MODEL |
CONVERSATION_MAX_HISTORY_MESSAGES |
Maximum in-memory history messages | 50 |
CONVERSATION_TIMEOUT_HOURS |
Hours before a thread is considered stale | 24 |
CONVERSATION_DB_PATH |
SQLite database file path | conversations.db |
Model Examples
# OpenAI
LLM_MODEL=gpt-4o-mini
OPENAI_API_KEY=sk-...
# Google Gemini
LLM_MODEL=gemini/gemini-2.5-flash
GEMINI_API_KEY=AIzaSy...
# Ollama (local)
LLM_MODEL=ollama_chat/gpt-oss:120b
LLM_API_BASE=http://localhost:11434
# OpenRouter
LLM_MODEL=openrouter/meta-llama/llama-3.1-70b-instruct
OPENROUTER_API_KEY=sk-or-...
# Anthropic
LLM_MODEL=claude-3-sonnet-20240229
ANTHROPIC_API_KEY=sk-ant-...
Access Control
# Restrict to specific users
WEBEX_APPROVED_USERS=user1@example.com,user2@example.com
# Restrict to specific email domains
WEBEX_APPROVED_DOMAINS=example.com
# Restrict to specific rooms
WEBEX_APPROVED_ROOMS=room_id_1,room_id_2
MCP Integration
Connect to MCP HTTP transport servers for extended tool capabilities:
MCP_ENABLED=true
MCP_REQUEST_TIMEOUT=30
# Single server
MCP_SERVERS=[{"name": "my-server", "url": "http://localhost:8000/mcp", "enabled": true}]
# Multiple servers with auth
MCP_SERVERS=[
{"name": "tools-server", "url": "http://localhost:8000/mcp", "enabled": true},
{"name": "secure-server", "url": "https://api.example.com/mcp", "auth_token": "your-token", "enabled": true}
]
Sentry Error Tracking (Optional)
Enable error tracking and performance monitoring with Sentry:
# Install with Sentry support
uv sync --extra sentry
Configure Sentry via environment variables:
| Variable | Description | Default |
|---|---|---|
SENTRY_DSN |
Sentry DSN (enables Sentry when set) | - |
SENTRY_TRACES_SAMPLE_RATE |
Trace sampling rate (0.0-1.0) | 1.0 |
SENTRY_SEND_DEFAULT_PII |
Include PII in events | true |
SENTRY_ENVIRONMENT |
Environment name (e.g., production) |
- |
SENTRY_RELEASE |
Release/version identifier | Package version |
SENTRY_PROFILE_SESSION_SAMPLE_RATE |
Profile session sampling rate | 1.0 |
SENTRY_PROFILE_LIFECYCLE |
Profile lifecycle mode | trace |
SENTRY_ENABLE_LOGS |
Enable logging integration | true |
Example configuration:
# Enable Sentry error tracking
SENTRY_DSN=https://your-key@o12345.ingest.us.sentry.io/6789
SENTRY_ENVIRONMENT=production
Usage
-
Start a conversation: Mention the bot in a Webex space:
@BotName What is AI? -
Follow-up in thread: Reply in the same thread for context-aware responses:
@BotName Tell me more. -
The bot maintains context within the thread, so you can have natural conversations.
Development
Code Quality
# Lint code
uv run ruff check src/
# Format code
uv run ruff format src/
# Fix linting issues
uv run ruff check src/ --fix
Adding New Features
- Commands: Add new commands in
src/commands/ - MCP Tools: Connect to MCP servers via configuration
- LLM Providers: Configure via
LLM_MODELusing LiteLLM syntax
Dependencies
- webex_bot - Webex bot framework
- litellm - Universal LLM API
- fastmcp - MCP client/server framework
- pydantic-settings - Configuration management
- sentry-sdk - Error tracking (optional)
License
This project is licensed under the MIT License - see the LICENSE file for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file webex_bot_ai-0.3.0.tar.gz.
File metadata
- Download URL: webex_bot_ai-0.3.0.tar.gz
- Upload date:
- Size: 217.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d90863be9137953789146753495b48c511b2e1f5e10e0378b4a2550524e167b0
|
|
| MD5 |
1d63fe63483ebcf6d0c81e49385a0887
|
|
| BLAKE2b-256 |
727de63618901f62fc65f48759624e52efa04568e0ad9d857970380b4bc1ac47
|
Provenance
The following attestation bundles were made for webex_bot_ai-0.3.0.tar.gz:
Publisher:
publish.yml on mhajder/webex-bot-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webex_bot_ai-0.3.0.tar.gz -
Subject digest:
d90863be9137953789146753495b48c511b2e1f5e10e0378b4a2550524e167b0 - Sigstore transparency entry: 2255922753
- Sigstore integration time:
-
Permalink:
mhajder/webex-bot-ai@43e52aae81e0e291ead99f3ba6dcb4efece7f61d -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/mhajder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@43e52aae81e0e291ead99f3ba6dcb4efece7f61d -
Trigger Event:
push
-
Statement type:
File details
Details for the file webex_bot_ai-0.3.0-py3-none-any.whl.
File metadata
- Download URL: webex_bot_ai-0.3.0-py3-none-any.whl
- Upload date:
- Size: 39.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d88a2136d02a2c012d05cdcf1376af0c369b63ff299a352a7cfc938bb3b1a935
|
|
| MD5 |
b139d22d6064308599016f1d74b6ea26
|
|
| BLAKE2b-256 |
270eb8fbdcb177e7ab4a9dc4e8cd32a530cfeb051b3306b92a9508346cf61c0c
|
Provenance
The following attestation bundles were made for webex_bot_ai-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on mhajder/webex-bot-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webex_bot_ai-0.3.0-py3-none-any.whl -
Subject digest:
d88a2136d02a2c012d05cdcf1376af0c369b63ff299a352a7cfc938bb3b1a935 - Sigstore transparency entry: 2255922780
- Sigstore integration time:
-
Permalink:
mhajder/webex-bot-ai@43e52aae81e0e291ead99f3ba6dcb4efece7f61d -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/mhajder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@43e52aae81e0e291ead99f3ba6dcb4efece7f61d -
Trigger Event:
push
-
Statement type: