OpenClaw中間件請(qǐng)求攔截、轉(zhuǎn)換與增強(qiáng)的完整指南
摘要
中間件是 OpenClaw 處理鏈路中最靈活的一環(huán)。本文從中間件的設(shè)計(jì)哲學(xué)出發(fā),系統(tǒng)講解中間件的三種模式(前置、后置、環(huán)繞)、洋蔥模型執(zhí)行鏈、請(qǐng)求/響應(yīng)變換機(jī)制,以及流式消息處理的特殊考量。通過(guò)兩個(gè)完整實(shí)戰(zhàn)案例——“消息敏感詞過(guò)濾中間件"和"請(qǐng)求耗時(shí)統(tǒng)計(jì)儀表盤中間件”——你將掌握從零開(kāi)發(fā)生產(chǎn)級(jí)中間件的全部技能。讀完你會(huì)理解:為什么 AI Agent 框架需要中間件,以及如何用它優(yōu)雅地解決橫切關(guān)注點(diǎn)。
1. 引言:為什么 AI Agent 也需要中間件
1.1 場(chǎng)景還原
先說(shuō)一個(gè)真實(shí)遇到過(guò)的問(wèn)題。
你的 OpenClaw Agent 接入了企業(yè)微信和飛書(shū)兩個(gè)渠道,一切都運(yùn)行得很好。直到有一天,安全部門找上門來(lái):“你們 Agent 回復(fù)的消息里,有沒(méi)有可能泄露敏感信息?能不能在消息發(fā)出去之前做一次檢查?”
你第一反應(yīng)可能是——在每個(gè)處理邏輯里加判斷。但是 Agent 的回復(fù)路徑不止一條:直接回復(fù)、自動(dòng)摘要、子代理消息、心跳輸出……每條路徑都要改一遍?
更麻煩的是,一周后運(yùn)維團(tuán)隊(duì)又提了新需求:“能不能統(tǒng)計(jì)每個(gè)渠道的消息響應(yīng)耗時(shí)?我們想做性能監(jiān)控。” 兩周后產(chǎn)品說(shuō):“飛書(shū)渠道的消息需要自動(dòng)添加加粗格式,但微信渠道不需要。”
面對(duì)這些橫切關(guān)注點(diǎn)(cross-cutting concerns),逐個(gè)修改業(yè)務(wù)邏輯的代價(jià)越來(lái)越高。這正是中間件的用武之地。
1.2 中間件的本質(zhì)


| 方案 | 擴(kuò)展性 | 維護(hù)性 | 復(fù)用性 |
|---|---|---|---|
| 無(wú)中間件(修改核心) | ? 每次加需求改核心 | ? 核心代碼膨脹 | ? 無(wú)法復(fù)用 |
| 有中間件(攔截鏈) | ? 添加新中間件即可 | ? 核心保持干凈 | ? 中間件獨(dú)立復(fù)用 |
一句話總結(jié):中間件讓你在不修改 Agent 核心邏輯的前提下,插入任何需要的前置和后置處理邏輯。
2. 中間件架構(gòu)設(shè)計(jì)
2.1 三種中間件模式
OpenClaw 的中間件根據(jù)切入時(shí)機(jī)分為三種:
| 模式 | 切入時(shí)機(jī) | 典型用途 | 能否修改數(shù)據(jù) |
|---|---|---|---|
| Before(前置) | Agent 處理之前 | 鑒權(quán)、參數(shù)校驗(yàn)、輸入清洗 | ? 可修改請(qǐng)求 |
| After(后置) | Agent 處理之后 | 格式化、翻譯、脫敏 | ? 可修改響應(yīng) |
| Around(環(huán)繞) | 包裹整個(gè)處理過(guò)程 | 性能統(tǒng)計(jì)、異常捕獲、緩存 | ? 可控制全流程 |

2.2 洋蔥模型執(zhí)行鏈
多個(gè)中間件會(huì)形成一個(gè)洋蔥模型的執(zhí)行鏈——請(qǐng)求從外層穿過(guò)一層層中間件到達(dá)核心,響應(yīng)再?gòu)暮诵拇┻^(guò)一層層中間件回到外層:

洋蔥模型的執(zhí)行順序:
請(qǐng)求階段:Mid 1 → Mid 2 → Agent Core 響應(yīng)階段:Agent Core → Mid 2 → Mid 1
這個(gè)設(shè)計(jì)保證了:最先攔截請(qǐng)求的中間件,最后看到響應(yīng)。就像剝洋蔥——先接觸的外層,最后離開(kāi)。
2.3 中間件配置體系
# openclaw.yaml
middleware:
enabled: true
# 全局中間件(對(duì)所有渠道生效)
global:
- name: "auth-validator" # 身份驗(yàn)證
enabled: true
order: 10 # 執(zhí)行順序(數(shù)字越小越靠外)
- name: "rate-limiter" # 速率限制
enabled: true
order: 20
- name: "request-logger" # 請(qǐng)求日志
enabled: true
order: 30
# 按渠道配置中間件
channels:
feishu:
- name: "feishu-formatter" # 飛書(shū)格式轉(zhuǎn)換
enabled: true
order: 50
- name: "sensitive-filter" # 敏感信息過(guò)濾
enabled: true
order: 60
config:
keywords: ["密碼", "token", "密鑰"]
mask_char: "*"
wecom:
- name: "wecom-formatter" # 企微格式轉(zhuǎn)換
enabled: true
order: 50
discord:
- name: "discord-sanitizer" # Discord Markdown清洗
enabled: true
order: 50配置策略表:
| 配置項(xiàng) | 說(shuō)明 | 建議 |
|---|---|---|
global | 對(duì)所有渠道生效 | 放基礎(chǔ)中間件(鑒權(quán)、日志、限流) |
channels.<name> | 針對(duì)特定渠道 | 放渠道特有的中間件(格式化、清洗) |
order | 執(zhí)行順序 | 鑒權(quán)(order:10) → 限流(20) → 日志(30) → 格式化(50) → 過(guò)濾(60) |
config | 中間件特定配置 | 通過(guò) config 段傳遞自定義參數(shù) |
3. 中間件開(kāi)發(fā)實(shí)戰(zhàn):消息敏感詞過(guò)濾
3.1 需求分析
目標(biāo):開(kāi)發(fā)一個(gè)敏感信息過(guò)濾中間件,在 Agent 回復(fù)消息發(fā)送前自動(dòng)檢測(cè)并脫敏。不阻止消息發(fā)送(非阻塞模式),但標(biāo)記并記錄敏感信息。
3.2 完整實(shí)現(xiàn)
"""
middleware_sensitive_filter.py
消息敏感詞過(guò)濾中間件
功能:
1. 檢測(cè)消息中的敏感信息(手機(jī)號(hào)、身份證、銀行卡、API Key)
2. 自動(dòng)脫敏替換(如 138****1234)
3. 記錄脫敏日志供審計(jì)
4. 支持自定義規(guī)則和豁免名單
"""
import re
import json
import time
from typing import Dict, Any, Optional, List
from dataclasses import dataclass, field
# ============================================
# 1. 敏感信息檢測(cè)規(guī)則定義
# ============================================
@dataclass
class DetectionRule:
"""檢測(cè)規(guī)則定義"""
name: str
pattern: str
mask_fn: callable # 脫敏函數(shù)
severity: str = "medium" # low / medium / high
enabled: bool = True
# 預(yù)置檢測(cè)規(guī)則庫(kù)
BUILTIN_RULES: List[DetectionRule] = [
# 中國(guó)大陸手機(jī)號(hào)
DetectionRule(
name="phone_cn",
pattern=r'1[3-9]\d{9}',
mask_fn=lambda m: m.group()[:3] + "****" + m.group()[-4:],
severity="high"
),
# 身份證號(hào)碼
DetectionRule(
name="id_card_cn",
pattern=r'\d{17}[\dXx]',
mask_fn=lambda m: m.group()[:4] + "**********" + m.group()[-4:],
severity="high"
),
# 銀行卡號(hào)(16-19位)
DetectionRule(
name="bank_card",
pattern=r'\d{16,19}',
mask_fn=lambda m: m.group()[:4] + " **** **** " + m.group()[-4:],
severity="high"
),
# API Key(常見(jiàn)格式)
DetectionRule(
name="api_key",
pattern=r'(?:api[_-]?key|apikey|token|secret)[:=]\s*["\']?([\w-]{20,})["\']?',
mask_fn=lambda m: m.group(1)[:4] + "***..." + m.group(1)[-4:]
if len(m.group(1)) > 8 else "***",
severity="high"
),
# 郵箱地址
DetectionRule(
name="email",
pattern=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}',
mask_fn=lambda m: m.group()[:2] + "****@" + m.group().split("@")[1],
severity="medium"
),
]
# ============================================
# 2. 自定義關(guān)鍵詞匹配器
# ============================================
class KeywordMatcher:
"""基于關(guān)鍵詞列表的匹配器
支持:
- 精確匹配
- 正則模式匹配
- 自定義脫敏字符
"""
def __init__(self, keywords: List[str], mask_char: str = "*"):
self.keywords = set(keywords)
self.mask_char = mask_char
def check(self, text: str) -> Dict[str, Any]:
"""檢查文本是否包含關(guān)鍵詞"""
found = []
clean_text = text
for kw in self.keywords:
if kw.lower() in clean_text.lower():
found.append(kw)
# 替換為脫敏字符
masked = self.mask_char * len(kw)
clean_text = clean_text.replace(kw, masked)
return {
"has_sensitive": len(found) > 0,
"matched_keywords": found,
"count": len(found),
"masked_text": clean_text
}
# ============================================
# 3. 核心中間件邏輯
# ============================================
class SensitiveFilterMiddleware:
"""敏感信息過(guò)濾中間件
工作流程:
1. 接收消息 → 正則匹配敏感模式
2. 關(guān)鍵詞匹配
3. 脫敏替換
4. 記錄審計(jì)日志
5. 返回脫敏后的消息
"""
def __init__(self, config: Optional[Dict] = None):
cfg = config or {}
# 加載規(guī)則
self.rules = BUILTIN_RULES.copy()
# 關(guān)鍵詞過(guò)濾器
keywords = cfg.get("keywords", [])
mask_char = cfg.get("mask_char", "*")
self.keyword_matcher = KeywordMatcher(keywords, mask_char)
# 豁免名單(不對(duì)特定用戶做過(guò)濾)
self.whitelist = set(cfg.get("whitelist", []))
# 審計(jì)日志
self.audit_log = []
# 統(tǒng)計(jì)
self.stats = {
"total_checked": 0,
"total_masked": 0,
"by_rule": {}
}
def check(self, text: str, user_id: Optional[str] = None) -> Dict[str, Any]:
"""
檢查并脫敏一條消息
Args:
text: 待檢查的文本
user_id: 消息發(fā)送者ID(用于豁免檢查)
Returns:
包含脫敏文本和檢測(cè)報(bào)告的字典
"""
# 豁免檢查
if user_id and user_id in self.whitelist:
return {
"original": text,
"masked_text": text,
"masked": False,
"reason": "whitelist",
"details": []
}
clean_text = text
details = []
masked_count = 0
# 1. 正則規(guī)則檢測(cè)
for rule in self.rules:
if not rule.enabled:
continue
matches = list(re.finditer(rule.pattern, clean_text, re.IGNORECASE))
if matches:
# 應(yīng)用脫敏
for match in matches:
mask_result = rule.mask_fn(match)
clean_text = clean_text.replace(match.group(), mask_result)
details.append({
"rule": rule.name,
"severity": rule.severity,
"matches": len(matches),
"samples": [m.group()[:20] for m in matches[:3]]
})
masked_count += len(matches)
# 更新統(tǒng)計(jì)
self.stats["by_rule"][rule.name] = \
self.stats["by_rule"].get(rule.name, 0) + len(matches)
# 2. 關(guān)鍵詞檢測(cè)
kw_result = self.keyword_matcher.check(clean_text)
if kw_result["has_sensitive"]:
clean_text = kw_result["masked_text"]
details.append({
"rule": "keyword_match",
"severity": "low",
"matches": kw_result["count"],
"samples": kw_result["matched_keywords"][:3]
})
masked_count += kw_result["count"]
# 3. 更新統(tǒng)計(jì)
self.stats["total_checked"] += 1
if masked_count > 0:
self.stats["total_masked"] += 1
# 4. 審計(jì)日志(不記錄原文內(nèi)容,只記錄元數(shù)據(jù))
audit_entry = {
"timestamp": time.time(),
"user_id": user_id,
"text_length": len(text),
"masked": masked_count > 0,
"match_count": masked_count,
"rule_names": [d["rule"] for d in details]
}
self.audit_log.append(audit_entry)
return {
"original_length": len(text),
"masked_text": clean_text,
"masked": masked_count > 0,
"total_matched": masked_count,
"details": details,
"audit_id": len(self.audit_log)
}
# ============================================
# 4. 中間件鉤子函數(shù)(OpenClaw 接口)
# ============================================
middleware_instance = None
def on_load(config: Dict = None):
"""中間件加載初始化"""
global middleware_instance
middleware_instance = SensitiveFilterMiddleware(config)
print(f"? 敏感信息過(guò)濾中間件已加載 "
f"(規(guī)則: {len(middleware_instance.rules)}, "
f"關(guān)鍵詞: {len(middleware_instance.keyword_matcher.keywords)})")
return {"status": "loaded"}
def before_message(message: Dict) -> Dict:
"""消息發(fā)送前攔截"""
if not middleware_instance:
return message
text = message.get("content", "")
user_id = message.get("user_id")
result = middleware_instance.check(text, user_id)
# 替換為脫敏后的內(nèi)容
message["content"] = result["masked_text"]
# 附加元數(shù)據(jù)(不影響消息內(nèi)容,供下游使用)
message["_meta"] = message.get("_meta", {})
message["_meta"]["sensitive_filter"] = {
"masked": result["masked"],
"count": result["total_matched"]
}
return message
def on_unload():
"""卸載前清理"""
global middleware_instance
if middleware_instance:
print(f"?? 敏感信息過(guò)濾統(tǒng)計(jì): "
f"檢查 {middleware_instance.stats['total_checked']} 條, "
f"脫敏 {middleware_instance.stats['total_masked']} 條")
middleware_instance = None
print("?? 敏感信息過(guò)濾中間件已卸載")
return {"status": "unloaded"}3.3 效果演示
# 測(cè)試敏感詞過(guò)濾
from middleware_sensitive_filter import SensitiveFilterMiddleware
middleware = SensitiveFilterMiddleware({
"keywords": ["密碼", "密鑰", "secret"],
"mask_char": "*"
})
test_messages = [
"您的手機(jī)號(hào)是13812341234,請(qǐng)記錄",
"我的身份證號(hào)是310101199001011234",
"API密鑰是sk-abcdefghijklmnopqrstuvw",
"請(qǐng)幫我重置一下登錄密碼",
]
for msg in test_messages:
result = middleware.check(msg)
status = "??" if not result["masked"] else "??"
print(f"{status} 原文: {result['original_length']}字")
print(f" 脫敏后: {result['masked_text']}")
if result["details"]:
for d in result["details"]:
print(f" └─ {d['rule']}: {d['matches']}處匹配")
print()預(yù)期輸出:
?? 原文: 16字 脫敏后: 您的手機(jī)號(hào)是138****1234,請(qǐng)記錄 └─ phone_cn: 1處匹配 ?? 原文: 19字 脫敏后: 我的身份證號(hào)是3101**********1234 └─ id_card_cn: 1處匹配 ?? 原文: 18字 脫敏后: API密鑰是sk-a***...tuvw └─ api_key: 1處匹配 ?? 原文: 11字 脫敏后: 請(qǐng)幫我重置一下登錄** └─ keyword_match: 1處匹配
4. 實(shí)戰(zhàn)案例二:請(qǐng)求耗時(shí)統(tǒng)計(jì)儀表盤中間件
4.1 需求分析
目標(biāo):統(tǒng)計(jì)每個(gè)渠道的消息處理耗時(shí),按小時(shí)聚合,提供 API 查詢儀表盤數(shù)據(jù)。
4.2 環(huán)繞中間件實(shí)現(xiàn)
"""
middleware_latency_stats.py
請(qǐng)求耗時(shí)統(tǒng)計(jì)儀表盤中間件
采用環(huán)繞模式(Around)實(shí)現(xiàn)對(duì) Agent 處理全流程的耗時(shí)統(tǒng)計(jì),
并聚合為小時(shí)級(jí)數(shù)據(jù)供監(jiān)控面板查詢。
"""
import time
import json
from collections import defaultdict
from typing import Dict, Any, Optional
from datetime import datetime
class LatencyStatsMiddleware:
"""環(huán)繞中間件——包裹Agent處理過(guò)程并記錄耗時(shí)"""
def __init__(self, config: Optional[Dict] = None):
# 小時(shí)級(jí)聚合數(shù)據(jù) { "2026-06-21T12": { "feishu": {count, total, min, max} } }
self.hourly_stats = defaultdict(lambda: defaultdict(
lambda: {"count": 0, "total_ms": 0, "min": float("inf"), "max": 0, "p99": 0}
))
self.all_durations = [] # 用于計(jì)算P99
def get_hour_key(self) -> str:
"""獲取當(dāng)前小時(shí)標(biāo)識(shí)"""
return datetime.now().strftime("%Y-%m-%dT%H")
def update_stats(self, channel: str, duration_ms: float):
"""更新統(tǒng)計(jì)指標(biāo)"""
hour = self.get_hour_key()
stats = self.hourly_stats[hour][channel]
stats["count"] += 1
stats["total_ms"] += duration_ms
stats["min"] = min(stats["min"], duration_ms)
stats["max"] = max(stats["max"], duration_ms)
# 保留最近1000條用于P99計(jì)算
self.all_durations.append(duration_ms)
if len(self.all_durations) > 1000:
self.all_durations.pop(0)
def get_stats(self, hours: int = 24) -> Dict:
"""獲取最近 N 小時(shí)的統(tǒng)計(jì)數(shù)據(jù),供監(jiān)控面板 API 查詢"""
result = {}
now = datetime.now()
for h in range(hours):
key = (now.replace(hour=now.hour - h)).strftime("%Y-%m-%dT%H")
if key in self.hourly_stats:
hour_data = {}
for channel, stats in self.hourly_stats[key].items():
avg = stats["total_ms"] / stats["count"] if stats["count"] > 0 else 0
hour_data[channel] = {
**stats,
"avg_ms": round(avg, 2),
"min": round(stats["min"], 2) if stats["min"] != float("inf") else 0,
"max": round(stats["max"], 2)
}
result[key] = hour_data
return result
def calculate_p99(self) -> float:
"""計(jì)算P99延遲"""
if not self.all_durations:
return 0
sorted_durations = sorted(self.all_durations)
idx = int(len(sorted_durations) * 0.99)
return sorted_durations[idx]
# ============================================
# 環(huán)繞中間件——執(zhí)行包裹
# ============================================
stats_middleware = None
def on_load(config: Dict = None):
global stats_middleware
stats_middleware = LatencyStatsMiddleware(config)
print("? 請(qǐng)求耗時(shí)統(tǒng)計(jì)中間件已加載")
return {"status": "loaded"}
# 環(huán)繞中間件需要一個(gè)包裹函數(shù)來(lái)同時(shí)處理請(qǐng)求前和請(qǐng)求后
# 在OpenClaw中,通過(guò)yield語(yǔ)法實(shí)現(xiàn)環(huán)繞
def around_message(message: Dict, next_handler: callable):
"""
環(huán)繞中間件——包裹完整的消息處理流程
prev_handler: 返回生成器(yield前是前置,yield后是后置)
"""
channel = message.get("channel", "unknown")
start = time.time()
# ====== 前置:記錄開(kāi)始時(shí)間 ======
# 可以在這里做限流判斷
print(f"?? [{channel}] 開(kāi)始處理消息...")
# ====== 調(diào)用下一層(Agent處理) ======
result = next_handler(message)
# ====== 后置:計(jì)算耗時(shí)并更新統(tǒng)計(jì) ======
duration_ms = (time.time() - start) * 1000
stats_middleware.update_stats(channel, duration_ms)
print(f"?? [{channel}] 處理完成, 耗時(shí): {duration_ms:.2f}ms")
# 將耗時(shí)信息附加到響應(yīng)元數(shù)據(jù)
if isinstance(result, dict):
result["_meta"] = result.get("_meta", {})
result["_meta"]["latency_ms"] = round(duration_ms, 2)
return result
def get_dashboard_data():
"""查詢儀表盤數(shù)據(jù)的API"""
if not stats_middleware:
return {"error": "中間件未初始化"}
return {
"p99_ms": round(stats_middleware.calculate_p99(), 2),
"hourly": stats_middleware.get_stats(24)
}
EXPORTS = {
"middleware": {
"around_message": around_message
},
"api": {
"get_dashboard_data": get_dashboard_data
}
}4.3 模擬儀表盤數(shù)據(jù)查詢
# 查詢儀表盤數(shù)據(jù)
data = get_dashboard_data()
for hour_key, channels in sorted(data["hourly"].items()):
print(f"\n? {hour_key}")
for channel, stats in channels.items():
print(f" ?? {channel}: "
f"請(qǐng)求數(shù)={stats['count']}, "
f"平均={stats['avg_ms']}ms, "
f"P99={data['p99_ms']}ms")5. 中間件開(kāi)發(fā)最佳實(shí)踐
5.1 中間件設(shè)計(jì)原則
| 原則 | 說(shuō)明 | 反例 |
|---|---|---|
| 單一職責(zé) | 一個(gè)中間件只做一件事 | 既做鑒權(quán)又做統(tǒng)計(jì) |
| 無(wú)副作用 | 不改變業(yè)務(wù)邏輯的正確性 | 過(guò)濾中間件把正常內(nèi)容也刪了 |
| 可配置 | 行為由配置控制 | 硬編碼所有參數(shù) |
| 冪等 | 多次執(zhí)行不會(huì)出錯(cuò) | 重復(fù)脫敏導(dǎo)致信息丟失 |
| 快速失敗 | 檢查不通過(guò)快速拒絕 | 鏈路里卡30秒不返回 |
5.2 執(zhí)行順序的最佳實(shí)踐
最外層(先攔截、最后返回) ├── 安全類中間件(鑒權(quán)、限流、CORS) ├── 日志類中間件(請(qǐng)求日志) ├── 業(yè)務(wù)類中間件(格式化、脫敏) ├── 監(jiān)控類中間件(耗時(shí)、錯(cuò)誤率) └── 最內(nèi)層:Agent 核心處理
| 類型 | order 建議 | 必須最先/最后 |
|---|---|---|
| 鑒權(quán)/限流 | 10-19 | ? 必須最先(不通過(guò)則拒絕) |
| 請(qǐng)求日志 | 20-29 | 記錄原始請(qǐng)求 |
| 輸入清洗 | 30-39 | 在 Agent 處理前完成 |
| 輸出格式化 | 40-49 | 在 Agent 處理后立即執(zhí)行 |
| 輸出脫敏 | 50-59 | ? 必須最后(保證干凈輸出) |
| 性能統(tǒng)計(jì) | 60-69 | 包裹整個(gè)流程 |
6. 總結(jié)
本文從零構(gòu)建了兩個(gè)生產(chǎn)級(jí)中間件,覆蓋了 OpenClaw 中間件系統(tǒng)的完整知識(shí)點(diǎn):
核心要點(diǎn):
- 三種模式,一個(gè)入口:前置(before)做輸入校驗(yàn),后置(after)做輸出增強(qiáng),環(huán)繞(around)做全流程監(jiān)控
- 洋蔥模型:多個(gè)中間件形成層層嵌套的執(zhí)行鏈——請(qǐng)求從外向內(nèi)穿過(guò),響應(yīng)從內(nèi)向外返回
- 敏感詞過(guò)濾:正則匹配 → 關(guān)鍵詞篩 → 脫敏替換 → 審計(jì)日志,四步完成安全過(guò)濾
- 耗時(shí)統(tǒng)計(jì):環(huán)繞中間件記錄全流程耗時(shí),按小時(shí)+渠道聚合 P99 延遲
- 橫切關(guān)注點(diǎn)分離:中間件的核心價(jià)值——不改核心代碼,獨(dú)立添加任何橫向能力
思考題:
- 你有一個(gè)中間件需要耗時(shí)較長(zhǎng)(如調(diào)用外部 API 做內(nèi)容審核)。如何設(shè)計(jì)異步中間件,避免阻塞整個(gè)消息處理鏈路?
- 兩個(gè)中間件可能產(chǎn)生沖突——比如"格式化中間件"添加了 Markdown 樣式,但"脫敏中間件"把加粗語(yǔ)法也脫敏了。你會(huì)如何設(shè)計(jì)中間件的執(zhí)行順序避免這種沖突?
- 中間件本身也會(huì)出錯(cuò)(比如統(tǒng)計(jì)中間件的 Redis 掛了)。如何設(shè)計(jì)中間件的降級(jí)策略——是讓整個(gè)流程失敗,還是跳過(guò)出錯(cuò)的中間件繼續(xù)處理?
以上就是OpenClaw中間件請(qǐng)求攔截、轉(zhuǎn)換與增強(qiáng)的完整指南的詳細(xì)內(nèi)容,更多關(guān)于OpenClaw中間件請(qǐng)求攔截、轉(zhuǎn)換與增強(qiáng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章

Ubuntu從零部署OpenClaw全過(guò)程(本地模型+DeepSeek)
OpenClaw 給是一個(gè)開(kāi)源、可自托管的 AI 助手平臺(tái),原生支持 Ollama 本地模型和 DeepSeek 等云端 API,讓你在隱私與性能之間自由切換,本文記錄了我在 Ubuntu 上從零部署 Ope2026-06-26
OpenClaw Token節(jié)省指南:Token消耗如何直降 90%?
QMD(Quantum Memory Database) 的本地語(yǔ)義檢索引擎正在改變這個(gè)局面,它用“先檢索、后推理”的思路,把 Token 消耗砍掉了 90% 以上,這篇文章就來(lái)深入拆解 QMD 的技術(shù)原2026-06-23
很多人第一次聽(tīng)到 OpenClaw Skill,會(huì)把它理解成“插件”, 這個(gè)理解只對(duì)了一半, 插件通常給 Agent 增加新的能力,比如新的工具、新的消息渠道、新的模型 Provider,下面我2026-06-23
OpenClaw 的安裝命令并不復(fù)雜,真正容易卡住的是初始化之后的模型 provider、鑒權(quán) profile、workspace 路徑和 Gateway 驗(yàn)證,這篇文章按原始文檔把 OpenClaw 從 Node.js 準(zhǔn)2026-06-17
OpenClaw中Shell Tool使用教學(xué):命令執(zhí)行、輸出讀取和長(zhǎng)任務(wù)管理
Shell Tool 是 OpenClaw 從“會(huì)聊天”變成“能改項(xiàng)目、跑測(cè)試、查日志”的關(guān)鍵能力, 但 shell 也是最容易被誤用的工具, 下面小編就和大家詳細(xì)介紹一下如何使用Shell Tool2026-06-17
OpenClaw頁(yè)面無(wú)法訪問(wèn)的解決方法
這篇文章主要為大家介紹了如何解決OpenCLaw Gateway無(wú)法訪問(wèn)的問(wèn)題,需檢查WebSocket鑒權(quán)及端口監(jiān)聽(tīng)狀態(tài),通過(guò)命令行獲取并帶上token可解決訪問(wèn)問(wèn)題,需要的朋友可以參考下2026-06-15
Ubuntu系統(tǒng)上快速部署OpenClaw的完整教程
OpenClaw(社區(qū)俗稱“小龍蝦”)是一款本地優(yōu)先、開(kāi)源、跨平臺(tái)的 AI 智能體執(zhí)行框架,由奧地利開(kāi)發(fā)者 Peter Steinberger 于 2025 年發(fā)布,采用 MIT 開(kāi)源協(xié)議,下面小編就和2026-06-14
OpenClaw局域網(wǎng)訪問(wèn)配置的實(shí)現(xiàn)
OpenClaw 2026年新版局域網(wǎng)配置指南引入多項(xiàng)增強(qiáng)功能,包括智能本地配對(duì)、動(dòng)態(tài)令牌認(rèn)證和混合云支持,下面就來(lái)詳細(xì)的介紹一下OpenClaw局域網(wǎng)訪問(wèn)配置的實(shí)現(xiàn),感興趣的可以了2026-06-11
OpenClaw的Docker部署實(shí)現(xiàn)
本文詳細(xì)介紹使用Docker部署OpenClD智能體平臺(tái),涵蓋開(kāi)發(fā)和生產(chǎn)環(huán)境部署指南,通過(guò)合理配置Docker確保嚴(yán)格隔離和資源限制,感興趣的可以了解一下2026-06-11
OpenClaw安裝openclaw-dashboard監(jiān)控面板
本文介紹了OpenClaw Dashboard的安裝和使用方法,通過(guò)conda激活環(huán)境后,可通過(guò)一行命令快速安裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)2026-06-10











