8.7 KiB
🔄 Deployment Scripts Update Mechanism
Core Answer
✅ Yes, re-deploying automatically updates the plugin!
The deployment script uses a smart two-stage strategy:
- 🔄 Try UPDATE First (if plugin exists)
- 📝 Auto CREATE (if update fails — plugin doesn't exist)
Workflow Diagram
Run deploy script
↓
Read local code and metadata
↓
Send UPDATE request to OpenWebUI
↓
├─ HTTP 200 ✅
│ └─ Plugin exists → Update successful!
│
└─ Other status codes (404, 400, etc.)
└─ Plugin doesn't exist or update failed
↓
Send CREATE request
↓
├─ HTTP 200 ✅
│ └─ Creation successful!
│
└─ Failed
└─ Display error message
Detailed Step-by-step
Step 1️⃣: Try UPDATE First
# Code location: deploy_filter.py line 220-230
update_url = "http://localhost:3000/api/v1/functions/id/{filter_id}/update"
response = requests.post(
update_url,
headers=headers,
data=json.dumps(payload),
timeout=10,
)
if response.status_code == 200:
print(f"✅ Successfully updated '{title}' filter!")
return True
What Happens:
- Send POST to
/api/v1/functions/id/{filter_id}/update - If returns HTTP 200, plugin exists and update succeeded
- Includes:
- Complete latest code
- Metadata (title, version, author, description, etc.)
- Manifest information
Step 2️⃣: If UPDATE Fails, Try CREATE
# Code location: deploy_filter.py line 231-245
if response.status_code != 200:
print(f"⚠️ Update failed with status {response.status_code}, "
"attempting to create instead...")
create_url = "http://localhost:3000/api/v1/functions/create"
res_create = requests.post(
create_url,
headers=headers,
data=json.dumps(payload),
timeout=10,
)
if res_create.status_code == 200:
print(f"✅ Successfully created '{title}' filter!")
return True
What Happens:
- If update fails (HTTP ≠ 200), auto-attempt create
- Send POST to
/api/v1/functions/create - Uses same payload (code, metadata identical)
- If creation succeeds, first deployment to OpenWebUI
Real-world Scenarios
Scenario A: First Deployment
$ python deploy_async_context_compression.py
📦 Deploying filter 'Async Context Compression' (version 1.3.0)...
File: .../async_context_compression.py
⚠️ Update failed with status 404, attempting to create instead... ← First time, plugin doesn't exist
✅ Successfully created 'Async Context Compression' filter! ← Creation succeeds
What Happens:
- Try UPDATE → fails (HTTP 404 — plugin doesn't exist)
- Auto-try CREATE → succeeds (HTTP 200)
- Plugin created in OpenWebUI
Scenario B: Re-deploy After Code Changes
# Made first code change, deploying again
$ python deploy_async_context_compression.py
📦 Deploying filter 'Async Context Compression' (version 1.3.1)...
File: .../async_context_compression.py
✅ Successfully updated 'Async Context Compression' filter! ← Direct update!
What Happens:
- Read modified code
- Try UPDATE → succeeds (HTTP 200 — plugin exists)
- Plugin in OpenWebUI updated to latest code
- No need to restart OpenWebUI, takes effect immediately!
Scenario C: Multiple Fast Iterations
# 1st change
$ python deploy_async_context_compression.py
✅ Successfully updated 'Async Context Compression' filter!
# 2nd change
$ python deploy_async_context_compression.py
✅ Successfully updated 'Async Context Compression' filter!
# 3rd change
$ python deploy_async_context_compression.py
✅ Successfully updated 'Async Context Compression' filter!
# ... repeat infinitely ...
Characteristics:
- 🚀 Each update takes only 5 seconds
- 📝 Each is an incremental update
- ✅ No need to restart OpenWebUI
- 🔄 Can repeat indefinitely
What Gets Updated
Each deployment updates the following:
✅ Code — All latest Python code
✅ Version — Auto-extracted from docstring
✅ Title — Plugin display name
✅ Author Info — author, author_url
✅ Description — Plugin description
✅ Metadata — funding_url, openwebui_id, etc.
❌ Configuration NOT Overwritten — User's Valves settings in OpenWebUI stay unchanged
Version Number Management
Does Version Change on Update?
✅ Yes!
# docstring in async_context_compression.py
"""
title: Async Context Compression
version: 1.3.0
"""
Each deployment:
- Script reads version from docstring
- Sends this version in manifest to OpenWebUI
- If you change version in code, deployment updates to new version
Best Practice:
# 1. Modify code
vim async_context_compression.py
# 2. Update version (in docstring)
# version: 1.3.0 → 1.3.1
# 3. Deploy
python deploy_async_context_compression.py
# Result: OpenWebUI shows version 1.3.1
Deployment Failure Cases
Case 1: Network Error
❌ Connection error: Could not reach OpenWebUI at localhost:3000
Make sure OpenWebUI is running and accessible.
Cause: OpenWebUI not running or wrong port
Solution: Check if OpenWebUI is running
Case 2: Invalid API Key
❌ Failed to update or create. Status: 401
Error: {"error": "Unauthorized"}
Cause: API key in .env is invalid or expired
Solution: Update api_key in .env file
Case 3: Server Error
❌ Failed to update or create. Status: 500
Error: Internal server error
Cause: OpenWebUI server internal error
Solution: Check OpenWebUI logs
Setting Version Numbers — Best Practices
Semantic Versioning
Follow MAJOR.MINOR.PATCH format:
"""
version: 1.3.0
│ │ │
│ │ └─ PATCH: Bug fixes (1.3.0 → 1.3.1)
│ └────── MINOR: New features (1.3.0 → 1.4.0)
└───────── MAJOR: Breaking changes (1.3.0 → 2.0.0)
"""
Examples:
# Bug fix (PATCH)
version: 1.3.0 → 1.3.1
# New feature (MINOR)
version: 1.3.0 → 1.4.0
# Major update (MAJOR)
version: 1.3.0 → 2.0.0
Complete Iteration Workflow
# 1. First deployment
cd scripts
python deploy_async_context_compression.py
# Result: Plugin created (first time)
# 2. Modify code
vim ../plugins/filters/async-context-compression/async_context_compression.py
# Edit code...
# 3. Deploy again (auto-update)
python deploy_async_context_compression.py
# Result: Plugin updated (takes effect immediately, no OpenWebUI restart)
# 4. Repeat steps 2-3 indefinitely
# Modify → Deploy → Test → Improve → Repeat
Benefits of Auto-update
| Benefit | Details |
|---|---|
| ⚡ Fast Iteration | Code change → Deploy (5s) → Test, no waiting |
| 🔄 Auto-detection | No manual decision between create/update |
| 📝 Version Management | Version auto-extracted from code |
| ✅ No Restart Needed | OpenWebUI runs continuously, config stays same |
| 🛡️ Safe Updates | User settings (Valves) never overwritten |
Disable Auto-update? ❌
Usually not needed because:
- ✅ Updates are idempotent (same code deployed multiple times = no change)
- ✅ User configuration not modified
- ✅ Version numbers auto-managed
- ✅ Failures auto-rollback
但如果真的需要控制,可以:
- 手动修改脚本 (修改
deploy_filter.py) - 或分别使用 UPDATE/CREATE 的具体 API 端点
常见问题
Q: 更新是否会丢失用户的配置?
❌ 不会!
用户在 OpenWebUI 中设置的 Valves (参数配置) 会被保留。
Q: 是否可以回到旧版本?
✅ 可以!
修改代码中的 version 号为旧版本,然后重新部署。
Q: 更新需要多长时间?
⚡ 约 5 秒
包括: 读文件 (1s) + 发送请求 (3s) + 响应 (1s)
Q: 可以同时部署多个插件吗?
✅ 可以!
python deploy_filter.py async-context-compression
python deploy_filter.py folder-memory
python deploy_filter.py context_enhancement_filter
Q: 部署失败了会怎样?
✅ OpenWebUI 中的插件保持不变
失败不会修改已部署的插件。
总结: 部署脚本的更新机制完全自动化,开发者只需修改代码,每次运行 deploy_async_context_compression.py 就会自动:
- ✅ 创建(第一次)或更新(后续)插件
- ✅ 从代码提取最新的元数据和版本号
- ✅ 立即生效,无需重启 OpenWebUI
- ✅ 保留用户的配置不变
这使得本地开发和快速迭代变得极其流畅!🚀