Compare commits

...

6 Commits

Author SHA1 Message Date
vincent 4b31322be3 fix(BIZ-26): 限流范围收窄到 NVIDIA 网关
- 新增网关识别逻辑:只识别 nvidia / nvidiavx18088980513 为限流目标
- volcengine-plan、siliconflow、deepseek 等非 NVIDIA 网关默认不进入令牌桶
- RequestScheduler 增加 gateway/model 参数与 _should_rate_limit 判断
- 未知网关默认不限流,避免误伤其他通道
- 补充网关范围测试与使用文档说明

Co-authored-by: multica-agent <github@multica.ai>
2026-06-23 16:12:02 +08:00
vincent 7f1edfb2fd feat(BIZ-26): 实现 API 请求优先级队列 + 令牌桶限流器
- 新增 scripts/rate_limiter.py 核心模块
  - TokenBucket: 令牌桶限流器(40 RPM 上限)
  - RequestScheduler: 四级优先级请求队列调度器
  - CacheManager: 查询结果缓存(分 TTL 策略)
  - retry_with_backoff: 指数退避重试装饰器
  - CoordinatedPoller: COO 统一轮询器

- 新增 scripts/test_rate_limiter.py 测试套件
  - 覆盖令牌桶、缓存、队列、重试、轮询、压力测试
  - 所有测试通过 

- 新增 docs/BIZ-26-限流器使用文档.md
  - API 参考、使用示例、集成指南
  - 缓存策略、降级策略、监控调试

实现参考:plans/BIZ-13_运行稳定性保障方案.md

Co-authored-by: multica-agent <github@multica.ai>
2026-06-23 07:09:39 +08:00
陆怀瑾 (COO) 80ef3c2796 feat(knowledge): BIZ-16 知识库目录结构初始化 - 7领域+10条目+模板 2026-06-22 22:08:54 +08:00
陆怀瑾 (COO) 8c93fee885 BIZ-14: 知识库体系建设规范 v1.0
纳入刘总反馈:QMD 全文检索为第三层检索路径。分层检索体系:memory_search → wiki_search → qmd → web。初始知识基础条目规划。知识 vs Memory 系统分工。人类审查机制与审核流程。
2026-06-22 22:08:54 +08:00
陆怀瑾 (COO) f793da91f0 BIZ-13: 运行稳定性保障规范 v1.0
涵盖:禁止请示规则、心跳监控超时恢复、429限流令牌桶、唤醒机制、Token溢出防护、监控告警矩阵
2026-06-22 22:08:54 +08:00
陆怀瑾 (COO) 74cfb3e0f6 BIZ-12: 文档存储、命名与索引规范 v1.0(实施版)
关键变更:
- 纳入刘总反馈:索引分离原则
- 纳入 QMD 作为知识库检索补充路径
- 新增 Token 预算控制章节
- 新增检索体系分层路径
- 新增文档生命周期管理流程
- 产出 specs/BIZ-12_文档存储规范_v1.0.md
2026-06-22 22:08:54 +08:00
25 changed files with 3384 additions and 0 deletions
+401
View File
@@ -0,0 +1,401 @@
# BIZ-26 限流器使用文档
> 模块:`scripts/rate_limiter.py`
> 测试:`scripts/test_rate_limiter.py`
> 实现日期:2026-06-23
> 作者:徐聪(costcodev
---
## 一、功能概述
本模块实现了 BIZ-13 运行稳定性保障方案中的 API 限流优化功能:
1. **NVIDIA 网关专用令牌桶限流器**40 RPM 上限,防止触发 NVIDIA 网关 API 429 错误
2. **四级优先级队列**:紧急 > 高 > 正常 > 低
3. **智能降级策略**:高优先级等待,低优先级切备用模型
4. **缓存管理器**:按数据类型设置不同 TTL
5. **COO 统一轮询**:减少重复请求
6. **指数退避重试**:自动处理临时失败
---
## 二、适用范围(已按要求收窄)
**令牌桶限流器只对 NVIDIA 网关 API 生效。**
识别规则:
- `nvidia``nvidia-gateway``nvidiavx18088980513/...` → 进入 40 RPM 令牌桶
- `volcengine-plan/...``siliconflow/...``deepseek/...` → 不进入令牌桶,不受该限流器影响
- 未知网关默认不限制,避免误伤非 NVIDIA 通道
调用方应显式传入 `gateway``model`,例如:
```python
# 走 NVIDIA 网关:限流
scheduler.submit(payload=data, gateway="nvidia", priority=Priority.NORMAL, callback=handler)
scheduler.submit(payload=data, model="nvidiavx18088980513/deepseek-ai/deepseek-v4-pro", callback=handler)
# 走其他网关:不限流
scheduler.submit(payload=data, model="volcengine-plan/ark-code-latest", callback=handler)
scheduler.submit(payload=data, model="siliconflow/Qwen/Qwen3", callback=handler)
scheduler.submit(payload=data, model="deepseek/deepseek-chat", callback=handler)
```
---
## 三、快速开始
### 2.1 基本用法
```python
from scripts.rate_limiter import RequestScheduler, Priority
# 创建调度器(40 RPM
scheduler = RequestScheduler(rate=40/60, capacity=40)
scheduler.start()
# 提交请求
def my_callback(data):
# 实际 API 调用逻辑
return process_data(data)
request_id = scheduler.submit(
payload={"task": "process_workboard"},
priority=Priority.NORMAL,
callback=my_callback
)
# 等待完成后关闭
time.sleep(5)
scheduler.stop()
```
### 2.2 优先级示例
```python
# 紧急任务(Vincent 直接下达)
scheduler.submit(payload=data, priority=Priority.URGENT, callback=handler)
# 阻塞性任务(依赖下游完成)
scheduler.submit(payload=data, priority=Priority.HIGH, callback=handler)
# 常规任务
scheduler.submit(payload=data, priority=Priority.NORMAL, callback=handler)
# 后台优化任务
scheduler.submit(payload=data, priority=Priority.LOW, callback=handler)
```
### 2.3 缓存使用
```python
from scripts.rate_limiter import CacheManager
cache = CacheManager()
# 缓存 WorkBoard 结果(TTL 5 分钟)
cache.set("workboard", "todo_list", result_data)
# 读取缓存
cached = cache.get("workboard", "todo_list")
if cached is None:
# 缓存未命中,重新查询
result = query_workboard()
cache.set("workboard", "todo_list", result)
# 查看缓存统计
stats = cache.get_stats()
print(f"缓存条目:{stats['total_entries']}")
```
---
## 四、API 参考
### 3.1 TokenBucket(令牌桶)
```python
bucket = TokenBucket(rate=40/60, capacity=40)
# 尝试消费令牌(立即返回)
if bucket.consume():
send_request()
else:
# 令牌不足,等待或降级
pass
# 等待令牌(阻塞直到获取或超时)
got_token = bucket.wait_for_token(timeout=5.0)
# 查看状态
status = bucket.get_status()
# 返回:{"tokens": 35.5, "capacity": 40, "rate_per_minute": 40.0, ...}
```
### 3.2 RequestScheduler(请求调度器)
```python
scheduler = RequestScheduler(
rate=40/60, # 令牌生成速率(个/秒)
capacity=40, # 桶容量
enable_cache=True # 启用缓存
)
# 启动工作线程
scheduler.start()
# 提交异步请求
request_id = scheduler.submit(
payload={"task": "data"},
priority=Priority.NORMAL,
callback=my_handler,
fallback_model="deepseek-v4-pro"
)
# 提交同步请求(阻塞直到完成)
result = scheduler.submit_sync(
payload={"task": "data"},
priority=Priority.URGENT,
timeout=10.0
)
# 查看状态
status = scheduler.get_status()
# 停止调度器
scheduler.stop()
```
### 3.3 CacheManager(缓存管理器)
```python
cache = CacheManager()
# 设置缓存(自动 TTL
cache.set("workboard", query_key, value) # 5 分钟
cache.set("config", "agent_list", agents) # 1 小时
cache.set("knowledge", "api_docs", docs) # 1 天
# 自定义 TTL
cache.set("custom", key, value, ttl=600) # 10 分钟
# 读取缓存
value = cache.get("workboard", query_key)
# 删除缓存
cache.delete("workboard", query_key)
# 清理过期缓存
cleaned = cache.clear_expired()
# 查看统计
stats = cache.get_stats()
```
### 3.4 retry_with_backoff(重试装饰器)
```python
from rate_limiter import retry_with_backoff
@retry_with_backoff(
max_retries=3, # 最多重试 3 次
base_delay=1.0, # 基础延迟 1 秒
exponential_base=2, # 指数底数
jitter=True, # 添加随机抖动
exceptions=(RateLimitError, NetworkError)
)
def call_api():
return requests.get(url)
```
### 3.5 CoordinatedPoller(统一轮询器)
```python
from rate_limiter import CoordinatedPoller
# 创建轮询器(15 分钟轮询一次)
poller = CoordinatedPoller(scheduler, poll_interval=15*60)
# 订阅轮询结果
def on_new_data(result):
broadcast_to_agents(result)
poller.subscribe(on_new_data)
# 启动轮询
poller.start()
# 停止轮询
poller.stop()
```
---
## 五、缓存策略
| 数据类型 | TTL | 说明 |
|----------|-----|------|
| `workboard` | 5 分钟 | WorkBoard 卡片状态,高频变化 |
| `config` | 1 小时 | Agent 配置、技能列表,低频变化 |
| `knowledge` | 1 天 | 知识库内容,基本不变 |
| `user` | 1 天 | 用户信息、权限配置 |
---
## 六、降级策略
### 5.1 令牌不足时的处理
| 优先级 | 策略 |
|--------|------|
| URGENT (1) | 无限等待,直到获取令牌 |
| HIGH (2) | 无限等待,直到获取令牌 |
| NORMAL (3) | 等待 2 秒,失败则放回队列稍后重试 |
| LOW (4) | 等待 2 秒,失败则丢弃或切换到备用模型 |
### 5.2 模型降级链
```
主模型 (qwen3.5-397b)
↓ RPM 不足
备用模型 (deepseek-v4-pro)
↓ RPM 不足
本地模型 或 等待
```
---
## 七、监控与调试
### 6.1 查看调度器状态
```python
status = scheduler.get_status()
print(f"队列大小:{status['queue_size']}")
print(f"令牌数:{status['token_bucket']['tokens']}")
print(f"已完成:{status['stats']['completed_requests']}")
print(f"失败:{status['stats']['failed_requests']}")
print(f"降级:{status['stats']['fallback_requests']}")
```
### 6.2 查看缓存统计
```python
stats = cache.get_stats()
print(f"总条目:{stats['total_entries']}")
print(f"有效条目:{stats['valid_entries']}")
print(f"过期条目:{stats['expired_entries']}")
print(f"按类别:{stats['by_category']}")
```
---
## 八、测试
运行测试套件:
```bash
cd /home/vincent/.openclaw/workspace/costcodev/EnterpriseArchitect
python3 scripts/test_rate_limiter.py
```
测试覆盖:
- ✅ 令牌桶限流
- ✅ 缓存管理
- ✅ 优先级队列
- ✅ 重试装饰器
- ✅ 统一轮询器
- ✅ 压力测试(50 请求)
---
## 九、集成示例
### 8.1 与 Multica CLI 集成
```python
import subprocess
import json
from rate_limiter import RequestScheduler, Priority, CacheManager
scheduler = RequestScheduler(rate=40/60, capacity=40)
cache = CacheManager()
scheduler.start()
def query_workboard():
"""查询 WorkBoard(带缓存)"""
# 先查缓存
cached = cache.get("workboard", "all_cards")
if cached:
return cached
# 缓存未命中,调用 CLI
result = subprocess.run(
["multica", "workboard", "list", "--json"],
capture_output=True,
text=True
)
data = json.loads(result.stdout)
# 更新缓存
cache.set("workboard", "all_cards", data)
return data
# 提交查询请求
request_id = scheduler.submit(
payload="query_workboard",
priority=Priority.NORMAL,
callback=lambda _: query_workboard()
)
```
### 8.2 Agent 心跳集成
```python
# 在 Heartbeat 中统一使用限流器
def heartbeat_check():
# 通过调度器提交所有检查任务
scheduler.submit(
payload="check_workboard",
priority=Priority.HIGH,
callback=check_workboard
)
scheduler.submit(
payload="check_multica",
priority=Priority.HIGH,
callback=check_multica_issues
)
scheduler.submit(
payload="update_memory",
priority=Priority.LOW,
callback=update_memory_log
)
```
---
## 十、注意事项
1. **令牌速率配置**:根据实际 API 限制调整 `rate` 参数
2. **缓存 TTL**:根据数据变化频率调整,避免过期数据
3. **工作线程**:记得调用 `start()``stop()` 管理生命周期
4. **异常处理**:回调函数中的异常会被捕获并记录,不会中断工作线程
5. **线程安全**:所有组件都是线程安全的,可在多线程环境使用
---
## 十一、TODO
- [ ] 接入实际的 Multica CLI 调用
- [ ] 添加 Prometheus 监控指标导出
- [ ] 支持动态调整限流参数
- [ ] 添加请求日志持久化
- [ ] 支持多个模型池的自动切换
---
> 文档版本:v1.0
> 最后更新:2026-06-23
> 维护者:徐聪(costcodev
+39
View File
@@ -0,0 +1,39 @@
# 知识库索引
> 本知识库与 Agent 配置文件解耦,由 COO 主导维护,各领域负责人协作贡献。
> 通过 `wiki_search` / `memory_search` / `qmd` 等工具检索,人类可通过 Web UI 审查优化。
## 目录结构
| 目录 | 领域 | 责任人 | 条目数 |
|------|------|--------|--------|
| [电商/](电商/) | 淘宝、抖店、微信小店运营 | 陆云帆 (taobaospecialist) | — |
| [内容/](内容/) | 小红书、短视频、文案 | 文墨言 (contentspecialist) | — |
| [产品/](产品/) | PRD、需求分析 | 沈路明 (productmanager) | — |
| [技术/](技术/) | 开发规范、代码审查 | 徐聪 (costcodev) | — |
| [设计/](设计/) | UI设计、品牌规范 | 苏绘锦 (designer) | — |
| [运营/](运营/) | 活动策划、数据分析 | 陆怀瑾 (coo) | — |
| [行政/](行政/) | 合同、报销流程 | 刘诗妮 (secretary) | — |
## 知识条目格式
每个知识条目遵循 [模板](../templates/知识条目模板.md)。
## 检索方式
- **Agent 主动查询**`wiki_search` / `memory_search` / `qmd`
- **人类审查**:通过 Web UI 浏览、编辑、优化
- **质量检查**`wiki_lint` 定期运行
## 贡献流程
1. 领域负责人撰写条目
2. COO 审核内容质量
3. 提交到 EnterpriseArchitect 仓库
4. 通过 `wiki_lint` 检查
5. 通知相关 Agent 更新索引
---
**维护者**:陆怀瑾(COO
**最后更新**2026-06-22
+111
View File
@@ -0,0 +1,111 @@
# PRD 模板
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 产品 |
| **责任人** | 沈路明 (productmanager) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | PRD, 产品需求, 模板 |
## 概述
产品需求文档(PRD)标准模板。适用于所有产品功能需求、系统改进需求的规范化描述,确保开发团队、设计团队、业务团队对需求理解一致。
## 正文
### 一、文档头部
```
# [产品名称] - [功能名称] PRD
| 属性 | 值 |
|------|-----|
| **版本** | v1.0 |
| **作者** | [姓名] |
| **创建日期** | YYYY-MM-DD |
| **状态** | 草稿 / 评审中 / 已批准 / 已上线 |
| **关联文档** | [链接] |
```
### 二、需求概述
**2.1 背景与问题**
[描述为什么需要这个功能,解决了什么用户痛点或业务问题]
**2.2 目标用户**
- 用户画像 1[描述]
- 用户画像 2[描述]
**2.3 核心目标**
- 业务目标:[可量化指标,如转化率提升 X%]
- 用户目标:[用户获得什么价值]
- 技术目标:[如响应时间、并发量]
### 三、功能描述
**3.1 功能范围**
- P0(必须):[最小可用功能]
- P1(应该):[重要但可后续]
- P2(锦上添花):[可后续迭代]
**3.2 用户故事**
```
作为 [用户角色]
我希望 [功能/行为]
以便 [获得的价值/目标]。
```
**3.3 详细交互说明**
1. [步骤1]:[描述 + 原型图链接]
2. [步骤2]:[描述 + 原型图链接]
**3.4 边界与异常**
- 正常流程:[描述]
- 异常情况1:[触发条件 + 处理方式]
- 异常情况2:[触发条件 + 处理方式]
### 四、非功能需求
| 项目 | 要求 |
|------|------|
| 页面加载 | ≤ 2 秒 |
| 接口响应 | ≤ 500ms |
| 并发支持 | 1000 QPS |
| 兼容性 | iOS 13+, Android 9+, Chrome 90+ |
### 五、数据埋点
| 事件名 | 触发条件 | 属性 |
|--------|----------|------|
| [event_name] | [触发条件] | [上报字段] |
### 六、验收标准
- [ ] 功能1 验收条件
- [ ] 功能2 验收条件
- [ ] 非功能需求满足
### 七、排期与里程碑
| 里程碑 | 日期 | 交付物 |
|--------|------|--------|
| 设计评审 | YYYY-MM-DD | 交互/视觉稿 |
| 技术评审 | YYYY-MM-DD | 技术方案 |
| 开发完成 | YYYY-MM-DD | 可测试版本 |
| 上线 | YYYY-MM-DD | 生产环境 |
## 相关条目
- [需求分析方法.md](需求分析方法.md)
- [开发规范.md](../技术/开发规范.md)
- [UI设计规范.md](../设计/UI设计规范.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+21
View File
@@ -0,0 +1,21 @@
# 产品领域知识
**责任人**:沈路明(productmanager
**审核人**:陆怀瑾(coo
## 知识范围
涵盖产品需求文档、用户研究、竞品分析、需求管理、版本规划等产品管理知识。
## 条目清单
| 文件名 | 说明 | 状态 |
|--------|------|------|
| [PRD模板.md](PRD模板.md) | 产品需求文档标准模板 | ✅ |
| [需求分析方法.md](需求分析方法.md) | 用户需求调研与分析方法 | ✅ |
## 待建设
- 竞品分析框架
- 产品路线图模板
- 用户故事编写指南
+84
View File
@@ -0,0 +1,84 @@
# 需求分析方法
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 产品 |
| **责任人** | 沈路明 (productmanager) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 需求分析, 用户调研, 产品管理 |
## 概述
需求分析是从用户/业务痛点出发,将模糊的需求描述转化为可落地的产品功能规格的系统化方法。核心原则:先理解问题,再设计方案。
## 正文
### 一、需求收集方法
1. **用户访谈**(定性)
- 每轮访谈 5-8 个目标用户
- 半结构化访谈:准备提纲 + 灵活追问
- 核心问题:「你最想解决什么问题?」「现在怎么解决的?」
2. **问卷调查**(定量)
- 覆盖 100+ 目标用户
- 包含选择题(量化)+ 开放题(发掘)
- 关键指标:问题频率、痛点程度、替代方案满意度
3. **数据分析**
- 页面点击热力图
- 用户行为漏斗(转化率断点)
- 客服工单高频关键词
### 二、需求优先级评估 — ICE 模型
| 因子 | 说明 | 评分 (1-10) |
|------|------|------------|
| **I**mpact(影响面) | 影响多少用户?对核心指标影响多大? | |
| **C**onfidence(信心度) | 我们有多少证据这个方案有效? | |
| **E**ase(实现难度) | 开发成本多高?时间多长? | |
总分 = I × C × E(E 分数越高越容易,越大越好)
### 三、需求文档化
1. **用户故事标准格式**
> 作为 **[用户角色]**
> 我希望 **[功能/行为]**
> 以便 **[获得的价值]**。
2. **验收条件(Acceptance Criteria**
- 必须可测试、可验证
- 正面条件 + 边缘情况
3. **原型验证**
- 低保真原型验证交互流程(1-2 天)
- 用户测试 3-5 人,观察操作行为
- 根据反馈迭代后进入高保真设计
### 四、需求评审流程
```
需求方提出 → PM 分析评估 → 交互设计 → 技术评审
→ 排期评估 → 最终评审 → 进入开发
```
每一步评审需至少以下人员参与:
- PM(负责人)
- 1 名开发(评估技术可行性)
- 1 名设计师(评估交互可行性)
- 需求方(确认需求理解正确)
## 相关条目
- [PRD模板.md](PRD模板.md)
- [开发规范.md](../技术/开发规范.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+21
View File
@@ -0,0 +1,21 @@
# 内容领域知识
**责任人**:文墨言(contentspecialist
**审核人**:陆怀瑾(coo
## 知识范围
涵盖小红书、短视频平台、公众号等内容平台运营知识,包括内容创作、选题策划、标题优化、发布策略、数据分析等。
## 条目清单
| 文件名 | 说明 | 状态 |
|--------|------|------|
| [小红书运营指南.md](小红书运营指南.md) | 小红书内容运营全流程指南 | ✅ |
| [标题写作技巧.md](标题写作技巧.md) | 爆款标题创作方法论 | ✅ |
## 待建设
- 短视频脚本模板
- 公众号排版规范
- 内容日历模板
+82
View File
@@ -0,0 +1,82 @@
# 小红书运营指南
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 内容 |
| **责任人** | 文墨言 (contentspecialist) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 小红书, 内容运营, 种草, 涨粉 |
## 概述
小红书是以"真实分享+种草"为核心的内容社区,运营不同于其他平台。核心逻辑:真诚分享 > 硬广推广,封面/标题决定点击率,内容质量决定涨粉转化。
## 正文
### 一、内容定位与选题
1. **账号定位**(上线前必做)
- 明确赛道:美妆/穿搭/家居/母婴/美食/知识
- 确定人设:专家型/体验型/教程型
- 对标 3-5 个同赛道 Top 博主
2. **选题策略**
- 热点追踪:小红书热搜 + 抖音热点宝
- 实用内容:教程/清单/测评/避坑
- 情感共鸣:个人经历/观点分享/生活记录
### 二、内容制作标准
1. **封面设计**(点击率核心)
- 高饱和度配色,对比度强
- 简洁文字 3-7 字,避免遮挡主体
- 尺寸 3:4,首图即为封面
2. **标题公式**
- 数字型:「3 步搞定...」
- 痛点型:「为什么你...还是不行?」
- 对比型:「A vs B,差距到底在哪」
- 清单型:「2026 必入的 10 款...」
3. **正文结构**
- 开头(3 句):抛痛点/抛结论
- 主体:分点说明,配图对应
- 结尾:互动引导(提问/投票/求关注)
### 三、发布与推广
1. **发布时间**
- 工作日:12:00-14:00, 18:00-21:00
- 周末:10:00-12:00, 15:00-18:00
2. **话题标签策略**
- 1-2 个大流量话题(#穿搭 #美妆 #家居
- 2-3 个精准话题(#小个子穿搭 #通勤穿搭
- 1 个自创话题(#XX的日常搭配
3. **初期冷启动**
- 发布后 1 小时内互动(评论/点赞)对推荐权重影响最大
- 在同类笔记下真诚评论(非硬广引流)
### 四、数据指标
| 指标 | 新手目标 | 进阶目标 |
|------|----------|----------|
| 单篇阅读量 | 1000+ | 5000+ |
| 点赞率 | 3%+ | 5%+ |
| 收藏率 | 2%+ | 4%+ |
| 涨粉率 | 1%/篇 | 3%/篇 |
## 相关条目
- [标题写作技巧.md](标题写作技巧.md)
- [活动策划模板.md](../运营/活动策划模板.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+21
View File
@@ -0,0 +1,21 @@
# 技术领域知识
**责任人**:徐聪(costcodev
**审核人**:陆怀瑾(coo
## 知识范围
涵盖开发规范、代码审查、架构设计、部署运维、技术选型等技术团队知识。
## 条目清单
| 文件名 | 说明 | 状态 |
|--------|------|------|
| [开发规范.md](开发规范.md) | 代码编写与项目管理规范 | ✅ |
| [代码审查清单.md](代码审查清单.md) | Pull Request 审查标准 | ✅ |
## 待建设
- API 设计规范
- 数据库设计指南
- 技术选型决策框架
+104
View File
@@ -0,0 +1,104 @@
# 开发规范
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 技术 |
| **责任人** | 徐聪 (costcodev) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 开发规范, 代码风格, Git, 项目管理 |
## 概述
定义团队统一的代码编写、项目管理、协作流程规范。目的是确保代码可维护、可交接,降低协作摩擦。
## 正文
### 一、代码规范
1. **Python**
- 遵循 PEP 8 代码风格
- 使用 `black` 自动格式化,行宽 100
- 类型注解必须(`mypy --strict` 通过)
- 文档字符串用 Google 风格
2. **TypeScript/JavaScript**
- 使用 `prettier` 格式化
- ESLint 严格模式
- 禁止 `any` 类型(除非显式标注 `// eslint-disable-next-line`
- 所有公共 API 必须有 JSDoc
3. **通用规则**
- 函数单一职责,不超过 50 行
- 命名:camelCase(变量/函数)、PascalCase(类/组件)、UPPER_SNAKE(常量)
- 禁止 `print` / `console.log` 残留(用日志库)
- 禁止注释掉的代码(相信 Git
### 二、Git 规范
1. **分支策略**
```
main ─── 生产环境
develop ─── 开发主线
feature/<task-id>-<desc> ─── 功能分支
fix/<task-id>-<desc> ─── 修复分支
```
2. **Commit 格式**
```
<type>(<scope>): <subject>
<body>
<footer>
```
- type: feat / fix / docs / style / refactor / test / chore
- scope: 模块名(如 api, ui, db
- subject: 不超过 72 字符,中文或英文
3. **PR 流程**
- 所有代码变更必须通过 PR
- 至少 1 人 Review 并 Approve
- CI 全部通过后才能合并
- 合并前 rebase develop 消除冲突
### 三、项目结构规范
```
project/
├── src/ # 源代码
├── tests/ # 测试代码
├── docs/ # 项目文档
├── scripts/ # 运维脚本
├── config/ # 配置文件
├── README.md # 项目说明
├── CHANGELOG.md # 变更日志
└── .env.example # 环境变量模板
```
### 四、文档规范
- **README.md**:项目概述、快速启动、技术栈、目录说明
- **API 文档**:后端接口必须有 OpenAPI/Swagger 文档
- **开发文档**:架构设计、数据流图、部署说明
- **代码即文档**:优先清晰的命名和结构,减少注释
### 五、测试规范
- 单元测试覆盖率 ≥ 70%
- 关键业务逻辑覆盖率 ≥ 90%
- 每个 PR 附带新增/修改的测试
- 使用 `pytest` (Python) / `vitest` (TS)
## 相关条目
- [代码审查清单.md](代码审查清单.md)
- [PRD模板.md](../产品/PRD模板.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+21
View File
@@ -0,0 +1,21 @@
# 电商领域知识
**责任人**:陆云帆(taobaospecialist
**审核人**:陆怀瑾(coo
## 知识范围
涵盖淘宝、抖店、微信小店等多平台电商运营知识,包括店铺搭建、商品上架、营销推广、客户服务、数据分析等。
## 条目清单
| 文件名 | 说明 | 状态 |
|--------|------|------|
| [淘宝运营SOP.md](淘宝运营SOP.md) | 淘宝店铺日常运营标准流程 | ✅ |
| [抖店运营SOP.md](抖店运营SOP.md) | 抖音小店运营流程 | ✅ |
## 待建设
- 微信小店运营指南
- 电商数据分析方法
- 客服话术模板
+74
View File
@@ -0,0 +1,74 @@
# 抖店运营 SOP
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 电商 |
| **责任人** | 陆云帆 (taobaospecialist) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 抖音, 抖店, 电商, SOP |
## 概述
本 SOP 定义抖音小店运营标准流程。抖店运营区别于传统电商的核心在于"内容驱动交易"——通过短视频和直播引流到店铺成交。
## 正文
### 一、每日运营
1. **店铺健康检查**
- 登录抖店后台,检查体验分(≥ 4.6)
- 查看违规记录和扣分情况
- 检查商品状态(在售/审核中/下架)
2. **内容运营**
- 发布 1-2 条挂车短视频
- 检查昨日短视频/直播数据
- 回复评论区用户问题
3. **订单与客服**
- 处理待发货订单(48 小时发货)
- 处理售后申请(退货/退款)
- 3 分钟内回复客服消息
### 二、每周运营
1. **商品策略**
- 分析本周爆款商品,优化标题/主图/详情
- 根据热点趋势选品上新
- 设置限时秒杀/优惠券活动
2. **内容策略**
- 复盘本周短视频/直播数据
- 策划下周内容选题(蹭热点/产品展示/教程)
- 测试新视频形式(口播/开箱/场景化)
3. **投放优化**
- 查看千川投放数据
- 优化投放计划(人群/出价/素材)
- 调整 ROI 目标和预算分配
### 三、每月运营
1. **月度分析**
- 统计月度 GMV、订单量、退款率
- 分析流量来源占比(推荐/搜索/直播/短视频/付费)
- 输出《抖店月度运营报告》
2. **供应链检查**
- 盘点库存,补货预警
- 检查发货时效和物流评分
- 供应商评估和优化
## 相关条目
- [淘宝运营SOP.md](淘宝运营SOP.md)
- [数据分析方法.md](../运营/数据分析方法.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+83
View File
@@ -0,0 +1,83 @@
# 淘宝运营 SOP
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 电商 |
| **责任人** | 陆云帆 (taobaospecialist) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 淘宝, 电商, SOP, 日常运营 |
## 概述
本 SOP 定义淘宝店铺日常运营的标准流程,涵盖店铺维护、商品管理、营销推广、客服处理和数据分析五大模块。适用于每日/每周/每月周期性执行。
## 正文
### 一、每日运营检查(每日 9:00)
1. **店铺状态检查**
- 登录千牛工作台,检查店铺处罚/违规通知
- 确认所有商品在售状态,无异常下架
- 检查店铺评分(DSR),低于 4.7 需立即分析原因
2. **订单处理**
- 查看待发货订单,确保 48 小时内发货
- 处理售后订单(退货/换货/退款),24 小时内响应
- 检查差评/中评,及时联系客户处理
3. **客服响应**
- 检查未读消息,回复时限 5 分钟内
- 查看客服数据:响应时长、满意度
### 二、每周运营任务(每周一)
1. **商品优化**
- 检查 Top 10 商品标题、主图、详情页
- 根据搜索词报告优化标题关键词
- 更新库存不足的商品
2. **营销活动**
- 查看本周淘宝官方活动日历
- 设置店铺优惠券/满减活动
- 更新直通车/引力魔方推广计划
3. **数据分析**
- 查看流量来源(搜索/推荐/付费/其他)
- 分析转化率、客单价变化趋势
- 输出《店铺周报》
### 三、每月运营任务(每月 1 日)
1. **月度复盘**
- 统计月度 GMV、订单量、利润率
- 对比上月数据,分析增长/下滑原因
- 制定下月运营目标和策略
2. **竞品分析**
- 监控 Top 3 竞品店铺动态
- 分析竞品爆款商品和新品
- 调整自身商品/价格策略
### 四、关键指标
| 指标 | 目标值 | 监控频率 |
|------|--------|----------|
| DSR 评分 | ≥ 4.8 | 每日 |
| 48h 发货率 | ≥ 98% | 每日 |
| 客服响应时长 | ≤ 3 分钟 | 每日 |
| 转化率 | ≥ 行业均值 +10% | 每周 |
| GMV 增长 | 月环比 ≥ 10% | 每月 |
## 相关条目
- [抖店运营SOP.md](抖店运营SOP.md)
- [数据分析方法.md](../运营/数据分析方法.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+21
View File
@@ -0,0 +1,21 @@
# 行政领域知识
**责任人**:刘诗妮(secretary
**审核人**:陆怀瑾(coo
## 知识范围
涵盖合同管理、报销流程、行政事务、供应商管理等行政支持知识。
## 条目清单
| 文件名 | 说明 | 状态 |
|--------|------|------|
| [合同模板.md](合同模板.md) | 常用合同标准模板 | ✅ |
| [报销流程.md](报销流程.md) | 费用报销申请与审批流程 | ✅ |
## 待建设
- 供应商管理指南
- 会议纪要模板
- 入职/离职流程
+83
View File
@@ -0,0 +1,83 @@
# 报销流程
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 行政 |
| **责任人** | 刘诗妮 (secretary) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 行政, 报销, 财务, 流程 |
## 概述
定义公司费用报销的标准流程,涵盖申请、审批、核销三大阶段,确保财务合规性和报销效率。
## 正文
### 一、报销范围
| 类别 | 说明 | 限额 |
|------|------|------|
| 差旅费 | 交通、住宿、餐饮 | 按出差地标准 |
| 办公用品 | 设备、耗材、文具 | 单次 ≤ ¥2000 |
| 招待费 | 客户/合作伙伴接待 | 需提前申请 |
| 培训费 | 课程、考试、认证 | 需审批 |
| 软件服务 | SaaS 订阅、API 费用 | 按需审批 |
### 二、报销流程
```
提交申请 → 直属审批 → COO 审批(> ¥5000
→ 刘总审批(> ¥20000) → 刘诗妮核销 → 归档
```
**各环节时限**
- 员工提交:消费后 7 个工作日内
- 直属审批:2 个工作日内
- 核销:审批通过后 5 个工作日内
### 三、报销材料
1. **发票**
- 必须增值税普通/专用发票
- 发票抬头:公司全称 + 税号
- 电子发票可,纸质发票需原件
2. **报销单**
- 事由:清晰说明消费目的
- 明细:逐项列出费用+金额
- 附件上传:发票图片/电子凭证
3. **特殊说明**
- 差旅:附行程单
- 招待:附参与人员名单
- 大额采购:附比价记录
### 四、常见退回原因
| 原因 | 处理 |
|------|------|
| 发票信息错误(抬头/税号) | 退回重新开票 |
| 超额未提前审批 | 补充说明或自付超额部分 |
| 缺少明细说明 | 补充报销单信息 |
| 超过报销时效 | 特殊说明后处理 |
### 五、审批人
| 金额区间 | 审批人 |
|----------|--------|
| ≤ ¥5000 | 直属负责人 |
| ¥5001 ~ ¥20000 | + COO(陆怀瑾) |
| > ¥20000 | + 刘总(Vincent |
## 相关条目
- [合同模板.md](合同模板.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+21
View File
@@ -0,0 +1,21 @@
# 设计领域知识
**责任人**:苏绘锦(designer
**审核人**:陆怀瑾(coo
## 知识范围
涵盖 UI/UX 设计规范、品牌元素、商详页设计、首图制作等设计知识。
## 条目清单
| 文件名 | 说明 | 状态 |
|--------|------|------|
| [UI设计规范.md](UI设计规范.md) | 界面设计标准与组件规范 | ✅ |
| [品牌元素指南.md](品牌元素指南.md) | 品牌色/字体/Logo 使用规范 | ✅ |
## 待建设
- 商详页设计模板
- 首图设计规范
- 移动端适配指南
+87
View File
@@ -0,0 +1,87 @@
# UI 设计规范
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 设计 |
| **责任人** | 苏绘锦 (designer) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | UI, 设计规范, 组件, 视觉 |
## 概述
定义统一的 UI 设计标准,涵盖色彩、字体、间距、组件等基础规范,确保产品视觉一致性,降低设计-开发沟通成本。
## 正文
### 一、色彩系统
| 用途 | 色值 | 说明 |
|------|------|------|
| 主色 Primary | `#1677FF` | 按钮、链接、选中态 |
| 成功 Success | `#52C41A` | 成功提示、通过状态 |
| 警告 Warning | `#FAAD14` | 警告提示 |
| 错误 Error | `#FF4D4F` | 错误提示、删除操作 |
| 文字主色 | `#1F1F1F` | 标题、正文 |
| 文字次色 | `#666666` | 辅助说明 |
| 文字禁用 | `#BFBFBF` | 禁用/占位符 |
| 边框 | `#D9D9D9` | 分割线、输入框边框 |
| 背景 | `#F5F5F5` | 页面底色 |
### 二、字体规范
| 层级 | 字号 | 行高 | 字重 | 用途 |
|------|------|------|------|------|
| H1 | 24px | 32px | 600 | 页面主标题 |
| H2 | 20px | 28px | 600 | 区块标题 |
| H3 | 16px | 24px | 500 | 小标题 |
| Body | 14px | 22px | 400 | 正文 |
| Caption | 12px | 18px | 400 | 辅助/说明文字 |
默认字体:`-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif`
### 三、间距体系
采用 4px 为基础单位的 8 点栅格:
| Token | 值 | 用途 |
|-------|-----|------|
| xs | 4px | 紧凑间距 |
| sm | 8px | 元素内间距 |
| md | 16px | 组件间距 |
| lg | 24px | 区块间距 |
| xl | 32px | 大区块分隔 |
| xxl | 48px | 页面级分隔 |
### 四、圆角与阴影
| 组件 | 圆角 | 阴影 |
|------|------|------|
| 卡片 | 8px | `0 2px 8px rgba(0,0,0,0.08)` |
| 弹窗 | 12px | `0 6px 16px rgba(0,0,0,0.12)` |
| 按钮 | 6px | 无(默认)/ hover 时微阴影 |
| 输入框 | 6px | 无(默认)/ focus 时外发光 |
### 五、响应式断点
| 断点 | 最小宽度 | 适用设备 |
|------|----------|----------|
| xs | < 576px | 手机竖屏 |
| sm | ≥ 576px | 手机横屏 |
| md | ≥ 768px | 平板 |
| lg | ≥ 992px | 小桌面 |
| xl | ≥ 1200px | 大桌面 |
| xxl | ≥ 1600px | 超大屏 |
## 相关条目
- [品牌元素指南.md](品牌元素指南.md)
- [PRD模板.md](../产品/PRD模板.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+21
View File
@@ -0,0 +1,21 @@
# 运营领域知识
**责任人**:陆怀瑾(coo
**审核人**:刘炜承(Vincent
## 知识范围
涵盖活动策划、数据分析、SOP 管理、流程优化、团队协作等运营管理知识。
## 条目清单
| 文件名 | 说明 | 状态 |
|--------|------|------|
| [活动策划模板.md](活动策划模板.md) | 营销活动策划标准模板 | ✅ |
| [数据分析方法.md](数据分析方法.md) | 运营数据分析框架与方法 | ✅ |
## 待建设
- 周报模板
- KPI 管理框架
- 风险评估矩阵
+92
View File
@@ -0,0 +1,92 @@
# 数据分析方法
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 运营 |
| **责任人** | 陆怀瑾 (coo) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 数据分析, 运营, KPI, 看板 |
## 概述
建立全业务流程的数据分析框架,确保各业务线有统一的指标定义和分析方法,支撑数据驱动决策。
## 正文
### 一、核心指标体系
#### 1. 电商业务
| 层级 | 指标 | 定义 | 频率 |
|------|------|------|------|
| 北极星 | GMV | 总成交额 | 日/周/月 |
| 过程 | 转化率 | 下单数/访客数 | 日 |
| 过程 | 客单价 | GMV/订单数 | 周 |
| 过程 | 退货率 | 退货数/订单数 | 周 |
| 健康 | DSR | 描述/服务/物流评分 | 日 |
| 健康 | 获客成本 CAC | 营销花费/新客数 | 月 |
#### 2. 内容业务
| 层级 | 指标 | 定义 | 频率 |
|------|------|------|------|
| 北极星 | 粉丝增长 | 净增粉丝数 | 周/月 |
| 过程 | 互动率 | (点赞+收藏+评论)/曝光 | 篇 |
| 过程 | 发布频率 | 每周发布篇数 | 周 |
#### 3. 公司整体
| 层级 | 指标 | 定义 | 频率 |
|------|------|------|------|
| 北极星 | 月营收 | 各业务线收入合计 | 月 |
| 效率 | 人效 | 营收/团队人数 | 季 |
| 效率 | Agent 利用率 | Agent 任务完成数/总分配数 | 周 |
### 二、分析框架
**AARRR 海盗模型**
```
Acquisition(获取)→ Activation(激活)→ Retention(留存)
→ Revenue(收入)→ Referral(推荐)
```
**电商应用示例**
1. Acquisition:各渠道流量来源占比
2. Activation:首次下单转化率
3. Retention30 天复购率
4. Revenue:LTV(用户生命周期价值)
5. Referral:分享率、裂变系数
### 三、数据看板要求
每个业务线需维护以下看板:
| 看板 | 内容 | 更新频率 |
|------|------|----------|
| 日报 | 昨日核心指标 + 异常波动标注 | 每日 10:00 |
| 周报 | 趋势图 + 同比/环比 + 分析洞察 | 每周一 |
| 月报 | 完整指标矩阵 + 目标达成率 + 下月预测 | 每月 3 日 |
### 四、异常预警规则
| 条件 | 级别 | 响应 |
|------|------|------|
| GMV 日环比下降 > 20% | 🔴 | COO 立即介入 |
| 转化率连续 3 天下降 | 🟡 | 业务负责人分析 |
| 退货率 > 10% | 🟡 | 商品/客服联合排查 |
| DSR < 4.6 | 🔴 | 立即优化 |
## 相关条目
- [淘宝运营SOP.md](../电商/淘宝运营SOP.md)
- [活动策划模板.md](活动策划模板.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+80
View File
@@ -0,0 +1,80 @@
# 活动策划模板
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 运营 |
| **责任人** | 陆怀瑾 (coo) |
| **版本** | v1.0 |
| **创建日期** | 2026-06-22 |
| **标签** | 运营, 活动策划, 营销, 模板 |
## 概述
标准化营销活动策划流程。适用于电商大促(618/双11/年货节)、店铺周年庆、新品发布、会员日活动等。
## 正文
### 一、活动策划文档结构
```
# [活动名称] 策划方案
## 1. 活动背景与目标
- 背景:[为什么做这次活动]
- 核心目标:[可量化,如 GMV X万 / 新增粉丝 Y人]
- 次要目标:[如品牌曝光、老客复购]
## 2. 目标用户
- 主要人群:[画像描述]
- 需求动机:[为什么他们会参与]
## 3. 活动机制
- 玩法规则:[满减/秒杀/抽奖/打卡]
- 用户路径:[从看到到参与的完整链路]
- 激励机制:[优惠力度、稀缺性、社交裂变]
## 4. 资源与预算
| 项目 | 预算 | 负责人 |
|------|------|--------|
| 流量投放 | ¥XX | [姓名] |
| 商品补贴 | ¥XX | [姓名] |
| 内容物料 | ¥XX | [姓名] |
## 5. 时间线
| 阶段 | 时间 | 关键事项 |
|------|------|----------|
| 预热期 | D-7 ~ D-1 | 预告内容、优惠券发放 |
| 爆发期 | D-Day | 主活动上线 |
| 返场期 | D+1 ~ D+3 | 余热运营 |
## 6. 风险预案
| 风险 | 概率 | 影响 | 应对 |
|------|------|------|------|
| 服务器崩溃 | 中 | 高 | 提前压测 + 降级方案 |
| 库存不足 | 低 | 中 | 预售 + 安全库存预警 |
## 7. 复盘框架
- 活动数据回顾(GMV/ROI/客单价/转化率)
- 亮点与不足
- 优化建议
```
### 二、关键审批节点
1. **策划方案评审** → COO + 业务负责人
2. **预算审批** → Vincent
3. **法务合规审查** → 苏慎(如涉及抽奖/满赠)
4. **上线前 Checklist** → 所有执行人确认
## 相关条目
- [数据分析方法.md](数据分析方法.md)
- [淘宝运营SOP.md](../电商/淘宝运营SOP.md)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| 2026-06-22 | v1.0 | 初始创建 | 陆怀瑾 |
+772
View File
@@ -0,0 +1,772 @@
"""
BIZ-26: API 请求优先级队列 + 令牌桶限流器
实现方案参考:plans/BIZ-13_运行稳定性保障方案.md
功能清单:
1. 四级优先级请求队列(紧急 > 高 > 正常 > 低)
2. 令牌桶限流器(40 RPM 上限)
3. 超限自动降级和等待策略
4. 请求合并(COO 统一轮询)
5. 查询结果缓存(WorkBoard 5 分钟、配置 1 小时、知识库 1 天)
作者:徐聪(costcodev
日期:2026-06-23
"""
import time
import threading
import queue
import hashlib
import json
from typing import Any, Callable, Dict, List, Optional, Tuple
from dataclasses import dataclass, field
from enum import IntEnum
from datetime import datetime, timedelta
# ============================================================================
# 网关识别:只对 NVIDIA 网关限流
# ============================================================================
NVIDIA_GATEWAY_ALIASES = {
"nvidia",
"nvidia-gateway",
"nvidia_gateway",
"nvidiavx18088980513",
}
UNLIMITED_GATEWAY_ALIASES = {
"volcengine",
"volcengine-plan",
"siliconflow",
"deepseek",
"deepseek-api",
}
def normalize_gateway_name(value: Optional[str]) -> Optional[str]:
"""
归一化网关/模型名称。
输入可以是:
- provider: nvidia / volcengine-plan / siliconflow / deepseek
- model: nvidiavx18088980513/deepseek-ai/deepseek-v4-pro
- model: volcengine-plan/ark-code-latest
返回 provider 前缀的小写形式。未知则返回 None。
"""
if not value:
return None
text = str(value).strip().lower()
if not text:
return None
return text.split("/", 1)[0]
def is_nvidia_gateway(value: Optional[str]) -> bool:
"""判断请求是否走 NVIDIA 网关。未知网关默认不限流。"""
provider = normalize_gateway_name(value)
if provider is None:
return False
if provider in NVIDIA_GATEWAY_ALIASES:
return True
if provider in UNLIMITED_GATEWAY_ALIASES:
return False
return provider.startswith("nvidia")
# ============================================================================
# 优先级枚举
# ============================================================================
class Priority(IntEnum):
"""请求优先级:数值越小优先级越高"""
URGENT = 1 # 紧急:Vincent 直接任务
HIGH = 2 # 高:阻塞性任务
NORMAL = 3 # 正常:常规任务
LOW = 4 # 低:后台优化任务
# ============================================================================
# 请求数据类
# ============================================================================
@dataclass(order=True)
class Request:
"""优先级队列中的请求项"""
priority: int
timestamp: float = field(compare=False)
request_id: str = field(compare=False)
payload: Any = field(compare=False)
callback: Optional[Callable] = field(compare=False, default=None)
fallback_model: Optional[str] = field(compare=False, default=None)
gateway: Optional[str] = field(compare=False, default=None)
model: Optional[str] = field(compare=False, default=None)
def __post_init__(self):
if self.timestamp is None:
self.timestamp = time.time()
if self.request_id is None:
self.request_id = self._generate_id()
@staticmethod
def _generate_id() -> str:
"""生成请求 ID"""
return hashlib.md5(f"{time.time()}-{threading.current_thread().ident}".encode()).hexdigest()[:12]
# ============================================================================
# 令牌桶限流器
# ============================================================================
class TokenBucket:
"""
NVIDIA 网关专用令牌桶限流器
注意:令牌桶本身只负责节流算法;是否启用由 RequestScheduler._should_rate_limit()
按 gateway/model 判断。volcengine-plan、siliconflow、DeepSeek 等非 NVIDIA 网关不会进入此桶。
参数:
rate: 令牌生成速率(个/秒),默认 40 RPM = 0.67 个/秒
capacity: 桶容量(最大令牌数),默认 40
"""
def __init__(self, rate: float = 40/60, capacity: int = 40):
self.rate = rate # 令牌/秒
self.capacity = capacity
self.tokens = capacity
self.last_update = time.time()
self._lock = threading.Lock()
def _refill(self) -> None:
"""补充令牌(内部调用,需要持有锁)"""
now = time.time()
elapsed = now - self.last_update
new_tokens = elapsed * self.rate
self.tokens = min(self.capacity, self.tokens + new_tokens)
self.last_update = now
def consume(self, tokens: int = 1) -> bool:
"""
尝试消费令牌
返回:
True: 成功消费
False: 令牌不足
"""
with self._lock:
self._refill()
if self.tokens >= tokens:
self.tokens -= tokens
return True
return False
def wait_for_token(self, timeout: Optional[float] = None) -> bool:
"""
等待直到有可用令牌
参数:
timeout: 最大等待时间(秒),None 表示无限等待
返回:
True: 成功获取令牌
False: 超时
"""
start_time = time.time()
while True:
if self.consume():
return True
if timeout is not None:
elapsed = time.time() - start_time
if elapsed >= timeout:
return False
# 计算等待时间(直到下一个令牌生成)
with self._lock:
self._refill()
if self.tokens < 1:
wait_time = (1 - self.tokens) / self.rate
else:
wait_time = 0.01
# 等待后重试
time_to_wait = min(wait_time, 0.1) # 最多等待 100ms
if timeout is not None:
remaining = timeout - (time.time() - start_time)
if remaining <= 0:
return False
time_to_wait = min(time_to_wait, remaining)
time.sleep(time_to_wait)
def get_status(self) -> Dict[str, Any]:
"""获取限流器状态"""
with self._lock:
self._refill()
return {
"tokens": round(self.tokens, 2),
"capacity": self.capacity,
"rate_per_second": round(self.rate, 3),
"rate_per_minute": round(self.rate * 60, 1),
"utilization": round(1 - self.tokens / self.capacity, 2)
}
# ============================================================================
# 缓存管理器
# ============================================================================
@dataclass
class CacheEntry:
"""缓存条目"""
value: Any
expires_at: float
created_at: float = field(default_factory=time.time)
access_count: int = field(default=0)
class CacheManager:
"""
查询结果缓存管理器
缓存策略:
- WorkBoard 状态:5 分钟
- Agent 配置:1 小时
- 知识库内容:1 天
- 用户信息:1 天
"""
# 默认 TTL 配置(秒)
DEFAULT_TTL = {
"workboard": 5 * 60, # 5 分钟
"config": 1 * 60 * 60, # 1 小时
"knowledge": 24 * 60 * 60, # 1 天
"user": 24 * 60 * 60, # 1 天
}
def __init__(self):
self._cache: Dict[str, CacheEntry] = {}
self._lock = threading.Lock()
def _generate_key(self, category: str, query: Any) -> str:
"""生成缓存键"""
query_str = json.dumps(query, sort_keys=True) if not isinstance(query, str) else query
return hashlib.md5(f"{category}:{query_str}".encode()).hexdigest()
def get(self, category: str, query: Any) -> Optional[Any]:
"""
获取缓存
参数:
category: 缓存类别(workboard/config/knowledge/user
query: 查询条件(用于生成缓存键)
返回:
缓存值,如果不存在或已过期则返回 None
"""
key = self._generate_key(category, query)
with self._lock:
entry = self._cache.get(key)
if entry is None:
return None
# 检查是否过期
if time.time() > entry.expires_at:
del self._cache[key]
return None
# 更新访问计数
entry.access_count += 1
return entry.value
def set(self, category: str, query: Any, value: Any, ttl: Optional[int] = None) -> None:
"""
设置缓存
参数:
category: 缓存类别
query: 查询条件
value: 缓存值
ttl: 存活时间(秒),None 表示使用默认值
"""
key = self._generate_key(category, query)
if ttl is None:
ttl = self.DEFAULT_TTL.get(category, 300) # 默认 5 分钟
with self._lock:
self._cache[key] = CacheEntry(
value=value,
expires_at=time.time() + ttl
)
def delete(self, category: str, query: Any) -> bool:
"""删除缓存"""
key = self._generate_key(category, query)
with self._lock:
if key in self._cache:
del self._cache[key]
return True
return False
def clear_expired(self) -> int:
"""清理所有过期缓存,返回清理数量"""
now = time.time()
with self._lock:
expired_keys = [k for k, v in self._cache.items() if now > v.expires_at]
for key in expired_keys:
del self._cache[key]
return len(expired_keys)
def get_stats(self) -> Dict[str, Any]:
"""获取缓存统计"""
now = time.time()
with self._lock:
total = len(self._cache)
expired = sum(1 for v in self._cache.values() if now > v.expires_at)
# 按类别统计
by_category: Dict[str, int] = {}
for key, entry in self._cache.items():
# 从 key 中提取 category(格式:category:hash
category = key.split(":")[0] if ":" in key else "unknown"
by_category[category] = by_category.get(category, 0) + 1
return {
"total_entries": total,
"expired_entries": expired,
"valid_entries": total - expired,
"by_category": by_category
}
def clear(self) -> None:
"""清空所有缓存"""
with self._lock:
self._cache.clear()
# ============================================================================
# 请求调度器
# ============================================================================
class RequestScheduler:
"""
请求调度器:结合优先级队列和令牌桶限流
功能:
1. 接收不同优先级的请求
2. 按优先级和 FIF0 顺序调度
3. 通过令牌桶控制发送速率
4. 支持降级策略(低优先级切备用模型)
"""
def __init__(
self,
rate: float = 40/60,
capacity: int = 40,
enable_cache: bool = True
):
self.token_bucket = TokenBucket(rate=rate, capacity=capacity)
self.cache = CacheManager() if enable_cache else None
# 优先级队列(使用 heap 实现)
self.request_queue: queue.PriorityQueue[Request] = queue.PriorityQueue()
# 工作线程
self._worker_thread: Optional[threading.Thread] = None
self._running = False
self._lock = threading.Lock()
# 统计信息
self.stats = {
"total_requests": 0,
"completed_requests": 0,
"failed_requests": 0,
"fallback_requests": 0,
"cache_hits": 0,
"cache_misses": 0,
}
def start(self) -> None:
"""启动调度器工作线程"""
if self._running:
return
self._running = True
self._worker_thread = threading.Thread(target=self._worker_loop, daemon=True)
self._worker_thread.start()
def stop(self) -> None:
"""停止调度器"""
self._running = False
if self._worker_thread:
self._worker_thread.join(timeout=5.0)
def _worker_loop(self) -> None:
"""工作线程主循环"""
while self._running:
try:
# 从队列获取请求(带超时)
request = self.request_queue.get(timeout=1.0)
self._process_request(request)
except queue.Empty:
continue
except Exception as e:
# 记录错误但不中断工作线程
print(f"[RequestScheduler] Worker error: {e}")
def _extract_gateway_hint(self, request: Request) -> Optional[str]:
"""从 request.gateway / request.model / payload 中提取网关提示。"""
if request.gateway:
return request.gateway
if request.model:
return request.model
if isinstance(request.payload, dict):
for key in ("gateway", "provider", "model", "model_id"):
value = request.payload.get(key)
if value:
return str(value)
return None
def _should_rate_limit(self, request: Request) -> bool:
"""
只对 NVIDIA 网关请求启用令牌桶。
设计原则:未知网关默认不限制,避免误伤 volcengine-plan / siliconflow / DeepSeek
等其他 API 网关。要被限流,调用方必须显式传 gateway/model,且能识别为 NVIDIA。
"""
return is_nvidia_gateway(self._extract_gateway_hint(request))
def _process_request(self, request: Request) -> None:
"""
处理单个请求
策略:
1. 高优先级(URGENT/HIGH):等待令牌
2. 低优先级(NORMAL/LOW):尝试获取令牌,失败则降级或丢弃
"""
self.stats["total_requests"] += 1
# 只对 NVIDIA 网关请求启用令牌桶;其他网关直接执行
if not self._should_rate_limit(request):
self._execute_request(request)
return
# NVIDIA 网关请求:尝试获取令牌
if request.priority <= Priority.HIGH:
# 高优先级:无限等待
got_token = self.token_bucket.wait_for_token(timeout=None)
else:
# 低优先级:最多等待 2 秒
got_token = self.token_bucket.wait_for_token(timeout=2.0)
if got_token:
# 成功获取令牌,执行请求
self._execute_request(request)
else:
# 未能获取令牌,执行降级策略
self._handle_fallback(request)
def _execute_request(self, request: Request) -> None:
"""执行请求"""
try:
if request.callback:
result = request.callback(request.payload)
self.stats["completed_requests"] += 1
return result
else:
self.stats["completed_requests"] += 1
except Exception as e:
self.stats["failed_requests"] += 1
print(f"[RequestScheduler] Request {request.request_id} failed: {e}")
raise
def _handle_fallback(self, request: Request) -> None:
"""处理降级(令牌不足)"""
self.stats["fallback_requests"] += 1
if request.priority == Priority.LOW:
# 低优先级:直接丢弃或切换到备用模型
print(f"[RequestScheduler] Low priority request {request.request_id} dropped due to rate limit")
else:
# 正常优先级:放回队列稍后重试
request.timestamp = time.time()
self.request_queue.put(request)
def submit(
self,
payload: Any,
priority: Priority = Priority.NORMAL,
callback: Optional[Callable] = None,
fallback_model: Optional[str] = None,
request_id: Optional[str] = None,
gateway: Optional[str] = None,
model: Optional[str] = None
) -> str:
"""
提交请求到调度队列
参数:
payload: 请求数据
priority: 优先级
callback: 回调函数
fallback_model: 备用模型名称
request_id: 请求 ID(可选,默认自动生成)
返回:
请求 ID
"""
req = Request(
priority=priority,
timestamp=time.time(),
request_id=request_id,
payload=payload,
callback=callback,
fallback_model=fallback_model,
gateway=gateway,
model=model
)
self.request_queue.put(req)
return req.request_id
def submit_sync(
self,
payload: Any,
priority: Priority = Priority.NORMAL,
timeout: Optional[float] = None
) -> Any:
"""
同步提交并等待结果
参数:
payload: 请求数据
priority: 优先级
timeout: 超时时间(秒)
返回:
请求结果
"""
result_holder = {"result": None, "error": None, "done": False}
condition = threading.Condition()
def callback(data):
with condition:
try:
# 实际执行逻辑(这里只是一个占位符)
result_holder["result"] = data
except Exception as e:
result_holder["error"] = e
finally:
result_holder["done"] = True
condition.notify_all()
# 提交请求
self.submit(payload=payload, priority=priority, callback=lambda _: callback(payload))
# 等待结果
with condition:
if not result_holder["done"]:
condition.wait(timeout=timeout)
if result_holder["error"]:
raise result_holder["error"]
return result_holder["result"]
def get_queue_size(self) -> int:
"""获取当前队列大小"""
return self.request_queue.qsize()
def get_status(self) -> Dict[str, Any]:
"""获取调度器状态"""
return {
"running": self._running,
"queue_size": self.get_queue_size(),
"token_bucket": self.token_bucket.get_status(),
"cache": self.cache.get_stats() if self.cache else None,
"stats": self.stats.copy()
}
# ============================================================================
# 重试装饰器
# ============================================================================
def retry_with_backoff(
max_retries: int = 3,
base_delay: float = 1.0,
exponential_base: int = 2,
jitter: bool = True,
exceptions: Tuple = (Exception,)
):
"""
指数退避重试装饰器
参数:
max_retries: 最大重试次数
base_delay: 基础延迟(秒)
exponential_base: 指数底数
jitter: 是否添加随机抖动
exceptions: 需要重试的异常类型
"""
import random
def decorator(func: Callable) -> Callable:
def wrapper(*args, **kwargs):
last_exception = None
for attempt in range(max_retries + 1):
try:
return func(*args, **kwargs)
except exceptions as e:
last_exception = e
if attempt == max_retries:
break
# 计算延迟时间
delay = base_delay * (exponential_base ** attempt)
if jitter:
delay += random.uniform(0, base_delay)
print(f"[retry_with_backoff] Attempt {attempt + 1} failed: {e}. Retrying in {delay:.2f}s...")
time.sleep(delay)
raise last_exception
return wrapper
return decorator
# ============================================================================
# COO 统一轮询器(请求合并)
# ============================================================================
class CoordinatedPoller:
"""
COO 统一轮询器:替代各 Agent 独立轮询
功能:
1. 定期轮询 WorkBoard
2. 广播结果给所有订阅者
3. 减少总请求数(40 RPM × N → 40 RPM
"""
def __init__(self, scheduler: RequestScheduler, poll_interval: int = 15*60):
self.scheduler = scheduler
self.poll_interval = poll_interval # 轮询间隔(秒)
self._subscribers: List[Callable] = []
self._running = False
self._worker: Optional[threading.Thread] = None
def subscribe(self, callback: Callable) -> None:
"""订阅轮询结果"""
self._subscribers.append(callback)
def unsubscribe(self, callback: Callable) -> None:
"""取消订阅"""
if callback in self._subscribers:
self._subscribers.remove(callback)
def start(self) -> None:
"""启动轮询器"""
if self._running:
return
self._running = True
self._worker = threading.Thread(target=self._poll_loop, daemon=True)
self._worker.start()
def stop(self) -> None:
"""停止轮询器"""
self._running = False
if self._worker:
self._worker.join(timeout=5.0)
def _poll_loop(self) -> None:
"""轮询主循环"""
while self._running:
try:
# 执行轮询(这里只是一个框架,实际逻辑需要接入 multica CLI
result = self._perform_poll()
# 广播给所有订阅者
for subscriber in self._subscribers:
try:
subscriber(result)
except Exception as e:
print(f"[CoordinatedPoller] Subscriber callback error: {e}")
except Exception as e:
print(f"[CoordinatedPoller] Poll error: {e}")
# 等待下一个轮询周期
time.sleep(self.poll_interval)
def _perform_poll(self) -> Dict[str, Any]:
"""
执行实际轮询
TODO: 接入 multica CLI:
- multica issue list --status in_progress
- multica workboard list
"""
# 这里应该调用 multica CLI
# 当前只是返回一个示例结果
return {
"timestamp": datetime.now().isoformat(),
"issues": [],
"workboard_cards": []
}
# ============================================================================
# 使用示例
# ============================================================================
if __name__ == "__main__":
# 创建调度器(40 RPM
scheduler = RequestScheduler(rate=40/60, capacity=40)
scheduler.start()
# 示例:提交不同优先级的请求
def sample_callback(data):
print(f"Processing: {data}")
time.sleep(0.5) # 模拟处理时间
return "OK"
# 紧急请求
scheduler.submit(
payload={"task": "urgent_task"},
priority=Priority.URGENT,
callback=sample_callback
)
# 正常请求
scheduler.submit(
payload={"task": "normal_task"},
priority=Priority.NORMAL,
callback=sample_callback
)
# 低优先级请求
scheduler.submit(
payload={"task": "low_priority_task"},
priority=Priority.LOW,
callback=sample_callback
)
# 等待处理完成
time.sleep(2)
# 查看状态
print("\n=== Scheduler Status ===")
print(json.dumps(scheduler.get_status(), indent=2))
# 停止调度器
scheduler.stop()
print("\n示例运行完成")
+332
View File
@@ -0,0 +1,332 @@
#!/usr/bin/env python3
"""
BIZ-26 限流器测试脚本
测试场景:
1. 令牌桶限流功能
2. 优先级队列调度
3. 缓存管理器
4. 重试机制
5. 429 错误模拟
运行方式:
python3 scripts/test_rate_limiter.py
"""
import sys
import time
import threading
from datetime import datetime
# 添加脚本目录到路径
sys.path.insert(0, "/home/vincent/.openclaw/workspace/costcodev/EnterpriseArchitect/scripts")
from rate_limiter import (
TokenBucket,
CacheManager,
RequestScheduler,
Priority,
retry_with_backoff,
CoordinatedPoller,
is_nvidia_gateway,
)
def test_token_bucket():
"""测试令牌桶限流器"""
print("=" * 60)
print("测试 1: 令牌桶限流器")
print("=" * 60)
# 创建限流器:40 RPM = 0.67 令牌/秒
bucket = TokenBucket(rate=40/60, capacity=40)
print(f"\n初始状态:{bucket.get_status()}")
# 快速消费 10 个令牌
print("\n快速消费 10 个令牌...")
success_count = 0
for i in range(10):
if bucket.consume():
success_count += 1
print(f"成功消费:{success_count}/10")
print(f"消费后状态:{bucket.get_status()}")
# 测试等待获取令牌
print("\n测试等待获取令牌...")
start = time.time()
got_token = bucket.wait_for_token(timeout=2.0)
elapsed = time.time() - start
print(f"等待耗时:{elapsed:.3f}s, 获取成功:{got_token}")
print(f"等待后状态:{bucket.get_status()}")
print("\n✅ 令牌桶测试完成\n")
def test_cache_manager():
"""测试缓存管理器"""
print("=" * 60)
print("测试 2: 缓存管理器")
print("=" * 60)
cache = CacheManager()
# 测试 WorkBoard 缓存(TTL 5 分钟)
print("\n1. 设置 WorkBoard 缓存(TTL 5 分钟)")
cache.set("workboard", {"query": "status=todo"}, [{"id": "card1", "title": "Test"}])
# 立即读取
result = cache.get("workboard", {"query": "status=todo"})
print(f" 立即读取:{result is not None}")
# 测试配置缓存(TTL 1 小时)
print("\n2. 设置配置缓存(TTL 1 小时)")
cache.set("config", "agent_list", ["costcodev", "secretary", "coo"])
result = cache.get("config", "agent_list")
print(f" 读取配置:{result}")
# 测试缓存统计
print("\n3. 缓存统计")
stats = cache.get_stats()
print(f" 总条目数:{stats['total_entries']}")
print(f" 按类别:{stats['by_category']}")
# 测试缓存删除
print("\n4. 删除缓存")
deleted = cache.delete("workboard", {"query": "status=todo"})
print(f" 删除成功:{deleted}")
result = cache.get("workboard", {"query": "status=todo"})
print(f" 删除后读取:{result is None}")
print("\n✅ 缓存管理器测试完成\n")
def test_priority_queue():
"""测试优先级队列调度"""
print("=" * 60)
print("测试 3: 优先级队列调度(简化版,不启动工作线程)")
print("=" * 60)
scheduler = RequestScheduler(rate=40/60, capacity=40, enable_cache=True)
# 模拟请求处理结果
results = []
def record_result(data):
results.append((time.time(), data))
return data
# 提交不同优先级的请求(不启动工作线程,只测试队列)
print("\n提交请求(按顺序):")
scheduler.submit(
payload={"task": "normal_1"},
priority=Priority.NORMAL,
callback=record_result
)
print(" 1. 正常优先级:normal_1")
scheduler.submit(
payload={"task": "urgent_1"},
priority=Priority.URGENT,
callback=record_result
)
print(" 2. 紧急优先级:urgent_1")
scheduler.submit(
payload={"task": "low_1"},
priority=Priority.LOW,
callback=record_result
)
print(" 3. 低优先级:low_1")
scheduler.submit(
payload={"task": "high_1"},
priority=Priority.HIGH,
callback=record_result
)
print(" 4. 高优先级:high_1")
# 查看队列大小
print(f"\n队列大小:{scheduler.get_queue_size()}")
# 查看状态
status = scheduler.get_status()
print(f"初始令牌数:{status['token_bucket']['tokens']}")
print("\n✅ 优先级队列测试完成(仅提交,未处理)\n")
def test_retry_decorator():
"""测试重试装饰器"""
print("=" * 60)
print("测试 4: 重试装饰器")
print("=" * 60)
attempt_count = [0]
@retry_with_backoff(max_retries=3, base_delay=0.1, jitter=False)
def flaky_function():
attempt_count[0] += 1
if attempt_count[0] < 3:
raise Exception(f"模拟失败 (尝试 {attempt_count[0]})")
return f"成功 (尝试 {attempt_count[0]})"
print("\n调用易失败函数(前 2 次失败,第 3 次成功)...")
start = time.time()
result = flaky_function()
elapsed = time.time() - start
print(f"结果:{result}")
print(f"总尝试次数:{attempt_count[0]}")
print(f"总耗时:{elapsed:.3f}s")
print("\n✅ 重试装饰器测试完成\n")
def test_coordinated_poller():
"""测试统一轮询器"""
print("=" * 60)
print("测试 5: COO 统一轮询器(简化版,短间隔测试)")
print("=" * 60)
scheduler = RequestScheduler(rate=40/60, capacity=40)
poller = CoordinatedPoller(scheduler, poll_interval=2) # 2 秒轮询一次(测试用)
received_results = []
def on_poll_result(result):
received_results.append((datetime.now().strftime("%H:%M:%S"), result))
print(f" [{datetime.now().strftime('%H:%M:%S')}] 收到轮询结果")
poller.subscribe(on_poll_result)
print("\n启动轮询器(轮询间隔 2 秒,运行 5 秒后停止)...")
poller.start()
# 等待 5 秒
time.sleep(5)
poller.stop()
print(f"\n收到结果次数:{len(received_results)}")
for ts, result in received_results:
print(f" {ts}: {result['timestamp'][:19]}")
print("\n✅ 统一轮询器测试完成\n")
def test_rate_limit_stress():
"""压力测试:快速提交大量请求"""
print("=" * 60)
print("测试 6: 压力测试(40 RPM 限制下提交 50 个请求)")
print("=" * 60)
scheduler = RequestScheduler(rate=40/60, capacity=40, enable_cache=True)
scheduler.start()
completed = []
failed = []
lock = threading.Lock()
def callback(data):
with lock:
completed.append(data)
return data
print("\n快速提交 50 个请求...")
start_time = time.time()
for i in range(50):
priority = Priority.NORMAL if i % 10 != 0 else Priority.URGENT
scheduler.submit(
payload={"index": i, "provider": "nvidia"},
priority=priority,
callback=callback,
gateway="nvidia"
)
print("提交完成,等待处理...")
# 等待 10 秒
time.sleep(10)
elapsed = time.time() - start_time
# 查看统计
status = scheduler.get_status()
print(f"\n耗时:{elapsed:.2f}s")
print(f"队列大小:{status['queue_size']}")
print(f"已完成:{status['stats']['completed_requests']}")
print(f"失败:{status['stats']['failed_requests']}")
print(f"降级:{status['stats']['fallback_requests']}")
print(f"令牌桶状态:{status['token_bucket']}")
scheduler.stop()
print("\n✅ 压力测试完成\n")
def test_gateway_scope():
"""测试限流范围:只对 NVIDIA 网关生效"""
print("=" * 60)
print("测试 7: 网关范围识别(只限 NVIDIA)")
print("=" * 60)
assert is_nvidia_gateway("nvidia") is True
assert is_nvidia_gateway("nvidiavx18088980513/deepseek-ai/deepseek-v4-pro") is True
assert is_nvidia_gateway("volcengine-plan/ark-code-latest") is False
assert is_nvidia_gateway("siliconflow/Qwen/Qwen3") is False
assert is_nvidia_gateway("deepseek/deepseek-chat") is False
assert is_nvidia_gateway(None) is False
scheduler = RequestScheduler(rate=1/60, capacity=1, enable_cache=True)
# 先耗尽 NVIDIA 桶
scheduler.submit(payload={"provider": "nvidia", "i": 1}, priority=Priority.NORMAL, callback=lambda x: x, gateway="nvidia")
# 非 NVIDIA 请求应直接执行,不受桶状态影响
non_nv = {"provider": "volcengine-plan", "i": 2}
assert scheduler._should_rate_limit(type("R", (), {"gateway": "volcengine-plan", "model": None, "payload": non_nv})()) is False
print("✅ 网关范围识别测试完成:volcengine-plan/siliconflow/DeepSeek 不限流,NVIDIA 限流\n")
def main():
"""运行所有测试"""
print("\n")
print("" + "=" * 58 + "")
print("" + " " * 58 + "")
print("" + " BIZ-26 限流器测试套件".center(58) + "")
print("" + " API 请求优先级队列 + 令牌桶限流".center(58) + "")
print("" + " " * 58 + "")
print("" + "=" * 58 + "")
print()
try:
test_token_bucket()
test_cache_manager()
test_priority_queue()
test_retry_decorator()
test_coordinated_poller()
test_rate_limit_stress()
test_gateway_scope()
print("\n")
print("" + "=" * 58 + "")
print("" + " " * 58 + "")
print("" + " ✅ 所有测试完成".center(58) + "")
print("" + " " * 58 + "")
print("" + "=" * 58 + "")
print()
except KeyboardInterrupt:
print("\n\n⚠️ 测试被用户中断\n")
except Exception as e:
print(f"\n\n❌ 测试出错:{e}\n")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()
+279
View File
@@ -0,0 +1,279 @@
# 多智能体文档存储、命名与索引规范 v1.0
> 版本:v1.0(实施版)
> 编制:陆怀瑾(COO
> 日期:2026-06-22
> 状态:已批准,执行中
> 适用范围:所有 Agent 的 workspace 目录
---
## 一、统一目录结构
每个 Agent 的 workspace 必须采用以下标准目录结构:
```
workspace/
├── AGENTS.md # Agent 协作协议
├── MEMORY.md # 长期记忆 → 含文档索引表(核心)
├── SOUL.md # 角色定义 → 引用外部内容,不填塞
├── IDENTITY.md # 身份信息
├── USER.md # 用户画像
├── TOOLS.md # 工具清单 → 仅保留索引,详情外挂
├── HEARTBEAT.md # 心跳配置
├── memory/ # 记忆归档目录(按日期)
│ └── YYYY-MM-DD.md
├── docs/ # 项目文档目录(按项目分)
│ └── {project}/
│ ├── README.md
│ └── ...
├── plans/ # 方案文档目录
│ └── YYYY-MM-DD_{topic}.md
├── specs/ # 规范/标准文档目录
│ └── BIZ-XX_{name}_v{M}.{N}.md
├── reports/ # 运营报告目录
│ └── YYYY-Q{N}_{type}_v{M}.{N}.md
├── knowledge/ # 知识库目录(按领域分)
│ └── {domain}/
│ └── {topic}.md
├── tasks/ # 任务文件目录(可选)
│ └── ...
└── assets/ # 资源文件目录
├── images/
├── files/
└── templates/
```
### 目录用途速查
| 目录 | 用途 | Token 影响 |
|------|------|-----------|
| 根目录 .md | Agent 核心配置 | **直接影响 Token**,必须精简 |
| memory/ | 按日归档记忆 | 通过 memory_search 检索,不占用上下文 |
| docs/ | 项目文档 | 按需加载 |
| plans/ | 方案文档 | 仅 COO 维护 |
| specs/ | 规范标准 | 按需加载 |
| reports/ | 运营报告 | 仅 COO 维护 |
| knowledge/ | 知识库 | 知识库检索,不占用上下文 |
| assets/ | 二进制资源 | 不占用上下文 |
---
## 二、文件命名规则
### 2.1 强制命名格式
```
{日期/编号}_{中文主题}_{版本}.md
```
### 2.2 各目录命名约定
| 目录 | 命名模式 | 示例 |
|------|----------|------|
| memory/ | `YYYY-MM-DD.md` | `2026-06-22.md` |
| plans/ | `YYYY-MM-DD_{主题}.md` | `2026-06-22_多智能体协作体系总体方案.md` |
| specs/ | `BIZ-{编号}_{主题}_v{M}.{N}.md` | `BIZ-12_文档存储规范_v1.0.md` |
| reports/ | `YYYY-Q{N}_{类型}_v{M}.{N}.md` | `2026-Q2_运营效率报告_v1.0.md` |
| knowledge/ | `{主题}_v{M}.{N}.md` | `淘宝运营_SOP_v1.0.md` |
| docs/{project}/ | `{功能}_{版本}.md` | `requirements_v1.0.md` |
| memory/ day file | `YYYY-MM-DD.md` | `2026-06-22.md` |
### 2.3 禁止事项
- ❌ 使用特殊字符:`/ \ : * ? " < > |` 空格
- ❌ 超过 80 字符的文件名
- ❌ 不含日期/编号的裸文件名
- ❌ 中文和英文混排无分隔符
- ✅ 统一使用下划线 `_` 作为分隔符
---
## 三、索引机制(核心)
### 3.1 索引分离原则(刘总反馈已纳入)
> **配置文件只保留索引指针,详细内容外挂存储。**
此原则适用场景:
- **TOOLS.md**:只列工具名称 + 引用路径,不列完整参数
- **待办列表**:只记录 ID + 主题 + 状态,详情在独立文件中
- **Agent 协作表**:只列 Agent 名 + 职能 + Session Key,详情在各自文件
- **知识索引**:MEMORY.md 只保留索引表,知识条目在 knowledge/ 中
### 3.2 MEMORY.md 索引表模板
```markdown
# MEMORY.md - {Agent Name} 长期记忆
## 📑 文档索引
### 方案文档
| 日期 | 主题 | 路径 | 状态 |
|------|------|------|------|
| 2026-06-22 | 多智能体协作体系 | plans/2026-06-22_多智能体协作体系总体方案.md | 已批准 |
### 规范标准
| 编号 | 主题 | 路径 | 版本 |
|------|------|------|------|
| BIZ-12 | 文档存储规范 | specs/BIZ-12_文档存储规范_v1.0.md | v1.0 |
### 项目文档
| 项目 | 文档 | 路径 | 状态 |
|------|------|------|------|
### 运营报告
| 周期 | 类型 | 路径 | 状态 |
|------|------|------|------|
### 知识库条目
| 领域 | 主题 | 路径 | 更新时间 |
|------|------|------|----------|
---
(以下是实际记忆内容...
```
### 3.3 各目录 README.md 模板
每个目录应有一个 `README.md`
```markdown
# {目录名称}
> 最后更新:{YYYY-MM-DD}
> 维护者:{Agent Name}
## 目录说明
{简短描述本目录的用途和使用规范}
## 文件列表
| 文件名 | 描述 | 最后更新 |
|--------|------|----------|
| ... | ... | ... |
```
---
## 四、检索体系
### 4.1 分层检索路径
```
第一层:memory_search(语义检索,跨 memory/*.md + MEMORY.md
↓ 未命中
第二层:wiki_search / wiki_get(编译型知识库检索)
↓ 未命中
第三层:qmd(QMD 全文检索,已安装 —— 刘总反馈已纳入)
↓ 未命中
第四层:web_fetch / web_search(外部知识)
```
### 4.2 检索优先级
1. **memory_search**corpus=all):首选,零 token 消耗
2. **qmd**:本地全文检索,补充 memory_search 未覆盖的长文档
3. **wiki_search/wiki_get**:编译型结构化知识库
4. **web_search/web_fetch**:外部补充,仅在以上均未命中时使用
---
## 五、Token 预算控制
### 5.1 配置文件大小限制
| 文件 | 最大行数 | 说明 |
|------|----------|------|
| AGENTS.md | 200 行 | Agent 协议 + 协作表(精简) |
| MEMORY.md | 150 行 | 长期记忆 + 索引表 |
| SOUL.md | 80 行 | 角色定义 |
| IDENTITY.md | 30 行 | 身份信息 |
| USER.md | 30 行 | 用户画像 |
| TOOLS.md | 100 行 | 工具索引(不填塞完整参数) |
| HEARTBEAT.md | 60 行 | 心跳配置 |
### 5.2 引用代替填塞
**反例(填塞模式)**
```markdown
# TOOLS.md - 全部填入
- memory_search: 参数 query, maxResults, minScore, corpus=[memory|wiki|all|sessions]...
(占用大量 token
```
**正例(引用模式)**
```markdown
# TOOLS.md - 索引模式
## 已安装 Skills
- plantuml-skill → 详见 skills/plantuml-skill/SKILL.md
- qmd → 详见 skills/qmd/SKILL.md
- ...
## 核心工具(已内置于运行时,无需列出参数)
- memory_search / wiki_search / web_fetch
```
---
## 六、文档生命周期管理
### 6.1 状态流转
```
创建 → 草稿(draft) → 审阅中(in_review) → 已批准(approved) → 归档(archived)
废弃(deprecated)
```
### 6.2 操作规范
| 操作 | 规则 |
|------|------|
| 创建 | 在正确目录,按命名规则创建 |
| 更新 | 小改动直接覆盖;大改动新建版本 |
| 审阅 | 状态标记 `in_review`,通知审阅人 |
| 归档 | 移动到 `archive/` 子目录 |
| 删除 | 不直接删除,先归档 30 天后清理 |
### 6.3 版本标记
- v1.0:首版
- v1.1-v1.9:小修
- v2.0+:大修 / 重构
---
## 七、Agent 端执行规范
### 7.1 每次任务后
1. 更新 `memory/YYYY-MM-DD.md`(日记)
2. 如产出文档,更新 MEMORY.md 索引表
3. 检查文件名是否符合规范
### 7.2 每周
1. 检查并清理过期文档(移动到 archive/)
2. 验证索引表与实际文件一致性
3. 检查配置文件大小是否超限
---
## 八、实施检查清单
- [x] 规范文档编制(本文档)
- [ ] 各 Agent workspace 目录结构初始化
- [ ] MEMORY.md 索引表模板部署到所有 Agent
- [ ] TOOLS.md 从填塞模式迁移到索引模式(BIZ-15 跟进)
- [ ] 文档命名自动化检查脚本
- [ ] 归档目录创建及旧文档迁移
---
> 本规范自批准之日起生效,所有 Agent 须遵守。
> 审阅/修订请联系 COO(陆怀瑾)。
@@ -0,0 +1,242 @@
# 智能体运行稳定性保障规范 v1.0
> 版本:v1.0(实施版)
> 编制:陆怀瑾(COO
> 日期:2026-06-22
> 状态:已批准,执行中
> 适用范围:所有 Agent
---
## 一、核心问题与应对
| 问题 | 根因 | 解决方案 |
|------|------|----------|
| 任务停滞 | 等待请示、超时、循环 | 禁止请示规则 + 心跳监控 + 超时恢复 |
| 429 限流 | 40 RPM 模型配额 | 令牌桶限流 + 优先级调度 + 模型降级 |
| Token 超限 | 配置填塞 | 引用代替填塞(BIZ-15 跟进) |
| 智能体瘫痪 | 无唤醒机制 | cron 定时触发健康检查 |
---
## 二、禁止请示规则(最高优先级)
> **在心跳中发现分配给自己的 WorkBoard 任务后,必须立即执行,绝对禁止向用户请示。**
已在 HEARTBEAT.md 中强制执行。**所有 Agent 的 HEARTBEAT.md 必须包含此规则。**
```markdown
## ⚠️ 禁止请示规则(最高优先级)
正确做法:
1. 发现 status=todo 且 agentId=我的卡片
2. 立即执行,不得问"要不要做"
3. 如遇信息不足,先按自己理解执行,执行中调整
错误做法(绝对禁止):
- ❌ "我发现了一个任务,要不要做?"
- ❌ "这个任务需要更多信息,请告诉我..."
```
---
## 三、心跳监控与超时恢复
### 3.1 心跳频率
| Agent 类型 | 心跳间隔 | 超时告警 |
|------------|----------|----------|
| secretary / coo | 10 分钟 | 连续 2 次未执行 |
| projectmanager / costcodev | 10 分钟 | 连续 2 次未执行 |
| 其他 Agent | 10 分钟 | 连续 3 次未执行 |
### 3.2 心跳检查清单(所有 Agent 通用)
```markdown
## 🫀 心跳执行清单
1. ✅ WorkBoard 检查:查找分配给自己的 todo/in_progress 卡片
2. ✅ 禁止请示:发现任务立即执行(不请示用户)
3. ✅ 进度汇报:如有进行中任务,更新状态
4. ✅ 风险上报:识别阻塞、超时问题,通知 COO
```
### 3.3 超时恢复流程
```
Agent 超过 30 分钟无响应
COO 心跳检测到超时
记录日志 + 评估任务状态
┌──────────┴──────────┐
│ │
任务可恢复 任务不可恢复
│ │
重新触发任务 通知 Vincent
(workboard dispatch) (via session_send)
```
---
## 四、429 限流治理
### 4.1 当前配额与监控
| 模型 | RPM 限制 | 建议预留 |
|------|----------|----------|
| 主模型 | 40 | 保留 10 RPM 给紧急任务 |
| 备用模型 | 40 | 满 35 RPM 时切换 |
### 4.2 令牌桶限流策略
```
每个 Agent 独立的令牌桶:
- 容量:按 Agent 优先级分配
- COO/secretary: 8 RPM
- 开发 Agent: 6 RPM
- 业务 Agent: 4 RPM
- 预留池: 10 RPM (紧急任务)
令牌桶耗尽 → 自动降级到备用模型或排队
```
### 4.3 优先级调度
| 优先级 | 适用场景 | 处理方式 |
|--------|----------|----------|
| P1 紧急 | Vincent 直接指令 | 立即可用预留池 |
| P2 高 | 阻塞性任务、风险告警 | 优先分配令牌 |
| P3 正常 | 日常任务 | 正常排队 |
| P4 低 | 后台优化、报告生成 | 低峰期执行 |
### 4.4 模型降级链
```
主模型 (qwen3.5-397b) RPM 不足
备用模型 (deepseek-v4-pro)
等待 + 指数退避重试 (1s → 2s → 4s → 8s)
3 次重试后仍失败 → 记录日志,通知 COO
```
### 4.5 请求合并优化
| 优化项 | 当前做法 | 优化后 |
|--------|----------|--------|
| WorkBoard 轮询 | 每个 Agent 独立轮询 | COO 统一轮询,广播结果 |
| 重复检索 | 多个 Agent 重复查同一文档 | 缓存关键查询结果(5 分钟 TTL) |
| 连续调用 | 无间隔连续调用 API | 最小间隔 500ms |
---
## 五、唤醒机制
### 5.1 Cron 定时唤醒
```yaml
# COO 健康检查唤醒
cron:
schedule: "*/5 * * * *" # 每 5 分钟
action: health_check
targets:
- 检查所有 Agent 最后活跃时间
- 超过 15 分钟无活动 → 触发唤醒消息
- 超过 30 分钟无活动 → 通知 Vincent
```
### 5.2 唤醒消息模板
```markdown
## 🔔 唤醒检查
距上次活跃时间:{elapsed} 分钟
当前任务状态:{status}
是否存在阻塞:{blocked}
系统自动唤醒,请确认状态。
```
### 5.3 自唤醒规则
每个 Agent 在 HEARTBEAT.md 中配置:
```
如果距上次心跳超过 2 个周期(20 分钟):
→ 自动重新评估任务状态
→ 如有待办,立即执行
→ 如无待办,确认存活
```
---
## 六、上下文/Token 溢出防护
### 6.1 配置文件大小限制
| 文件 | 最大行数 | 超标处理 |
|------|----------|----------|
| AGENTS.md | 200 | 移到 docs/agent-roster.md |
| SOUL.md | 80 | 提取模块化引用 |
| TOOLS.md | 100 | 索引化(不填塞参数) |
| HEARTBEAT.md | 60 | 精简检查清单 |
| MEMORY.md | 150 | 定期归档旧条目 |
### 6.2 运行时监控
```
Token 使用量达到 80%
自动清理上下文
仍超 90%
重启会话
```
---
## 七、监控告警矩阵
| 指标 | 警告阈值 | 严重阈值 | 通知对象 |
|------|----------|----------|----------|
| Agent 无响应 | > 15 min | > 30 min | 警告 → COO,严重 → Vincent |
| 429 错误率 | > 5% | > 20% | COO |
| Token 使用量 | > 80% | > 95% | 该 Agent |
| 任务积压 | > 5 pending | > 10 pending | COO |
| 任务超时 | > 24h in_progress | > 48h | 警告 → Agent,严重 → Vincent |
---
## 八、实施步骤
### 阶段 1:即刻生效(今日)
- [x] 禁止请示规则 → 已在各 Agent HEARTBEAT.md 中落实
- [ ] 心跳频率统一为 10 分钟
- [ ] COO 端健康检查 cron 配置
### 阶段 2:本周完成
- [ ] 令牌桶限流配置(按 Agent 分配 RPM)
- [ ] 模型降级链配置
- [ ] 告警规则上线
### 阶段 3:持续优化
- [ ] 监控面板搭建
- [ ] 自动重启恢复
- [ ] 请求合并优化
---
## 九、交付物清单
- [x] 运行稳定性保障规范(本文档)
- [ ] HEARTBEAT.md 模板更新(含禁止请示 + 自唤醒规则)
- [ ] COO 端 cron 健康检查任务
- [ ] 令牌桶限流配置
- [ ] 告警规则配置
---
> 本规范自批准之日起生效。执行中如遇问题,联系 COO(陆怀瑾)。
@@ -0,0 +1,261 @@
# 智能体知识库体系建设规范 v1.0
> 版本:v1.0(实施版)
> 编制:陆怀瑾(COO
> 日期:2026-06-22
> 状态:已批准,执行中
> 适用范围:所有 Agent
---
## 一、核心目标
| 目标 | 实现方式 |
|------|----------|
| 知识与配置解耦 | 知识库独立于 Agent 配置文件,不计入 Token |
| Agent 可主动查询 | 通过多层检索体系按需获取知识 |
| 人类可审查优化 | Web UI / 飞书文档支持人工审阅 |
| 零 Token 增长 | 知识条目独立存储,仅在使用时加载 |
---
## 二、分层检索体系(刘总反馈已纳入)
### 2.1 检索优先级
```
Agent 需要知识
第一层: memory_search (corpus=all)
→ 搜索 memory/*.md + MEMORY.md + wiki 条目
→ 零 Token 消耗,语义检索
↓ 未命中
第二层: wiki_search / wiki_get
→ 编译型结构化知识库
→ 支持精确检索和页面读取
↓ 未命中
第三层: qmd (QMD 全文检索,已安装 ← 刘总反馈)
→ 本地全文检索 markdown 知识库
→ 补充 memory_search 未覆盖的长文档
↓ 未命中
第四层: web_search / web_fetch
→ 外部互联网补充
→ 仅在内部均未命中时使用
```
### 2.2 工具速查
| 工具 | 适用场景 | Token 消耗 |
|------|----------|-----------|
| memory_search | 通用语义检索(跨 memory + wiki | 0 |
| wiki_search / wiki_get | 结构化知识库精确查询 | 0 |
| qmd | 本地全文检索长文档 | 0 |
| web_search | 外部互联网信息 | 0 |
| web_fetch | 网页/文档详情获取 | 按内容量 |
---
## 三、知识库目录结构
```
knowledge/
├── 电商/ # 电商运营知识
│ └── {主题}_v{M}.{N}.md
├── 内容/ # 内容运营知识
│ └── {主题}_v{M}.{N}.md
├── 产品/ # 产品管理知识
│ └── {主题}_v{M}.{N}.md
├── 技术/ # 技术开发知识
│ └── {主题}_v{M}.{N}.md
├── 设计/ # UI/UX 设计知识
│ └── {主题}_v{M}.{N}.md
├── 运营/ # 通用运营知识
│ └── {主题}_v{M}.{N}.md
└── 规范/ # 流程规范知识
└── {主题}_v{M}.{N}.md
```
### 知识条目模板
```markdown
# {知识标题}
> 领域: {所属领域} | 版本: v{M}.{N}
> 维护者: {责任人} | 最后更新: {YYYY-MM-DD}
## 概述
{知识的用途和价值,1-2 句话}
## 适用范围
{在什么场景下使用}
## 核心内容
{知识主体}
## 操作步骤 / SOP
1. ...
2. ...
## 质量检查
- [ ] ...
## 常见问题
**Q**: ... **A**: ...
## 相关条目
- knowledge/{领域}/{关联主题}.md
## 版本历史
| 版本 | 日期 | 变更 | 作者 |
|------|------|------|------|
| v1.0 | 2026-06-22 | 初稿 | 陆怀瑾 |
```
---
## 四、与 Memory 系统的分工
| 维度 | Memory 系统 | Knowledge 系统 |
|------|------------|---------------|
| 内容类型 | 决策记录、经验教训、个性化记忆 | SOP、模板、规范、最佳实践 |
| 所有者 | 单个 Agent 专属 | 跨 Agent 共享 |
| 更新频率 | 每日/每周 | 按需/按版本 |
| 查询方式 | memory_search(语义检索) | wiki_search/wiki_get/qmd |
| 存储位置 | MEMORY.md + memory/*.md | knowledge/ 目录 |
---
## 五、Agent 查询指南
### 5.1 何时查询知识库
| 场景 | 查询示例 |
|------|----------|
| 执行 SOP 任务 | "淘宝 活动报名 SOP" |
| 撰写文档 | "PRD 模板" |
| 遇到问题 | "部署 故障排查" |
| 制定规范 | "开发规范" |
| 不熟悉领域 | "小红书 运营指南" |
### 5.2 查询标准流程
```
1. 先用 memory_search(corpus=all, query="...") 搜索
2. 如有结果,用 memory_get 或 wiki_get 读取详情
3. 如无结果,用 qmd 全文检索 knowledge/ 目录
4. 仍无结果,记录知识缺口,通知 COO
5. 使用获取的知识指导工作
```
### 5.3 知识缺口上报
```
Agent 发现知识缺口
在 memory/YYYY-MM-DD.md 中记录:
- 查询内容
- 使用场景
- 建议优先级
通知 COO 创建知识条目
```
---
## 六、人类审查机制
### 6.1 审查方式
| 方式 | 适用场景 | 工具 |
|------|----------|------|
| Obsidian Web UI | 日常浏览、编辑 | wiki_status 确认可用性 |
| 飞书文档同步 | 多人协作、审批 | 飞书 Wiki API |
| CLI 直接编辑 | 技术人员修改 | write/edit 工具 |
### 6.2 审核流程
```
Agent 发现缺口 → 记录 → 通知 COO
COO 评估优先级
高优先级 → 立即创建/指派
低优先级 → 记入 backlog
创建草稿 → wiki_apply(op="create_synthesis")
人类审查 → 通过/修改/拒绝
发布 → 通知相关 Agent
```
### 6.3 定期质量检查
```bash
# 每周运行一次
wiki_lint # 检查链接断裂、矛盾信息、过时内容
```
---
## 七、知识条目管理
### 7.1 创建
```
wiki_apply(op="create_synthesis", title="...", body="...", sourceIds=[])
```
### 7.2 更新
```
wiki_apply(op="synthesis", lookup="...", body="...")
```
### 7.3 版本管理
| 变更类型 | 版本变化 | 操作 |
|----------|----------|------|
| 内容微调 | v1.0 → v1.1 | 直接覆盖,更新版本历史 |
| 结构性变更 | v1.x → v2.0 | 保留旧版本,新建条目 |
| 废弃 | 添加 [deprecated] 标记 | 归档到 archive/ |
---
## 八、初始知识基础
以下条目作为知识库初始基础,需尽快创建:
| 领域 | 条目 | 优先级 | 负责 Agent |
|------|------|--------|-----------|
| 电商 | 淘宝运营 SOP | 高 | 陆云帆 |
| 电商 | 客服话术模板 | 中 | 陆云帆 |
| 内容 | 小红书运营指南 | 高 | 文墨言 |
| 内容 | 标题写作技巧 | 中 | 文墨言 |
| 产品 | PRD 模板 | 高 | 沈路明 |
| 技术 | 开发规范 | 高 | 梁思筑 |
| 技术 | 部署流程 | 中 | 严维序 |
| 设计 | UI 设计规范 | 中 | 苏锦绘 |
| 运营 | KPI 指标定义 | 中 | 陆怀瑾 |
| 规范 | 文档存储规范 | 已完成 | 陆怀瑾 |
---
## 九、交付物清单
- [x] 知识库体系建设规范(本文档)
- [ ] knowledge/ 目录结构创建
- [ ] 初始知识条目(至少 5 个优先)
- [ ] Agent 查询指南(已嵌入本文档)
- [ ] 知识审核流程(已嵌入本文档)
- [ ] wiki_lint 定期检查 cron 任务
---
> 本规范自批准之日起生效。知识条目创建请联系 COO 协调。
+31
View File
@@ -0,0 +1,31 @@
# [知识条目标题]
## 元数据
| 属性 | 值 |
|------|-----|
| **领域** | 电商 / 内容 / 产品 / 技术 / 设计 / 运营 / 行政 |
| **责任人** | [Agent 名称] |
| **版本** | v1.0 |
| **创建日期** | YYYY-MM-DD |
| **最后更新** | YYYY-MM-DD |
| **标签** | [标签1, 标签2, ...] |
## 概述
[用 2-3 句话描述本条目的核心内容和使用场景]
## 正文
[详细的知识内容,包括步骤、规则、示例等]
## 相关条目
- [相关知识条目1](链接)
- [相关知识条目2](链接)
## 变更记录
| 日期 | 版本 | 变更说明 | 变更人 |
|------|------|----------|--------|
| YYYY-MM-DD | v1.0 | 初始创建 | [姓名] |