diff --git a/02_卡人(水)/水溪_整理归档/经验库/待沉淀/2026-03-15_派对AI魂码三端管理_确定性能力沉淀.md b/02_卡人(水)/水溪_整理归档/经验库/待沉淀/2026-03-15_派对AI魂码三端管理_确定性能力沉淀.md new file mode 100644 index 00000000..3f8cfc8d --- /dev/null +++ b/02_卡人(水)/水溪_整理归档/经验库/待沉淀/2026-03-15_派对AI魂码三端管理_确定性能力沉淀.md @@ -0,0 +1,102 @@ +# 派对AI 魂码(火)三端管理 — 确定性能力沉淀 + +> 来源:Soul创业派对项目(派对AI · 魂码·火 · 小程序站管理 SKILL v2.0) +> 沉淀日期:2026-03-15 +> 状态:已跑通,可复制 + +--- + +## 一、已验证的确定性能力 + +### 1. 微信小程序 CLI 一键上传(零人工干预) + +```bash +/Applications/wechatwebdevtools.app/Contents/MacOS/cli upload \ + --project "小程序项目路径" \ + -v "版本号" \ + -d "版本描述" +``` + +- 前提:本地已安装微信开发者工具,且已登录 +- 无需打开 IDE 界面,纯命令行即可完成上传 +- 上传后需到微信公众平台手动设体验版/提审 +- **适用场景**:任何微信小程序项目的自动化发布 + +### 2. Go API 后端一键部署(paramiko/sshpass) + +两种方式均已验证: + +**方式A:devlop.py(推荐,完整流程)** +- 本地交叉编译 `GOOS=linux GOARCH=amd64 go build` +- paramiko SSH 上传到服务器 +- 远程 pkill + nohup 重启 +- 自动读取环境变量或默认值 + +**方式B:sshpass 手动部署(简洁快速)** +```bash +GOOS=linux GOARCH=amd64 go build -o binary-linux +sshpass -p '密码' scp -P 端口 binary-linux user@host:/路径/ +sshpass -p '密码' ssh -p 端口 user@host "cd /路径 && pkill -f './binary' ; nohup ./binary > /dev/null 2>&1 &" +``` + +- **适用场景**:任何 Go 项目部署到宝塔/Linux 服务器 + +### 3. 微信支付全链路(小程序→后端→回调) + +已验证的支付产品类型: +- `chapter`:单章购买 +- `full_book`:全书购买 +- `gift`:代付分享 +- `balance_recharge`:余额充值 + +关键点: +- 前端 `wx.requestPayment` 的 payParams 提取需兼容 `res.data.payParams` 和 `res.payParams` 两种位置 +- 后端 `getStandardPrice` 必须覆盖所有产品类型,否则返回"未知商品类型" +- 退款走原路返回,不做折扣 + +### 4. 内容解析器(HTML + 纯文本 @提及/#标签 混合解析) + +`contentParser.js` 架构: +- `parseHtmlToSegments(html, config)` 解析 HTML 内容(含 TipTap 富文本 mention span) +- `matchLineToSegments(text, config)` 解析纯文本中的 @提及 和 #标签 +- 两者联动:HTML 解析后对 text 类型 segment 再跑一遍 matchLineToSegments,确保纯文本 @mention 也能被识别 +- config 必须在解析前 await 加载完毕(异步竞态问题的教训) + +### 5. 数据库直连排查(SSH 隧道 + MySQL CLI) + +```bash +sshpass -p '密码' ssh -p 端口 user@host \ + "mysql -h DB_HOST -P DB_PORT -u DB_USER -pDB_PASS DB_NAME -e 'SQL'" +``` + +- 适用于排查数据层面的 bug(如 sort_order 错误导致导航异常) + +--- + +## 二、已踩坑与避坑清单 + +| 坑 | 原因 | 解法 | +|:---|:---|:---| +| 充值/代付分享"未知商品类型" | 后端 getStandardPrice 只覆盖了 chapter/full_book | 增加 gift、balance_recharge case | +| @提及点击无反应 | 富文本编辑器生成的 mention span 没填 data-id | 前端 onMentionTap 用 nickname 反查 personsConfig | +| 纯文本 @南风 不高亮 | parseHtmlToSegments 只解析 HTML span,不处理纯文本 | 对 text segment 二次 matchLineToSegments | +| 配置未加载完就解析内容 | config API 用 .then 没 await | 改为 await app.request | +| 上下篇顺序错误 | 数据库 sort_order 值错误 | 直接 SQL 修正,前端逻辑无需改 | +| payParams 位置不一致 | 不同接口返回结构不同 | 兼容检查 res.data.payParams 和 res.payParams | +| SSH 连接失败 | 端口不是 22 而是 22022 | 检查 devlop.py 中的实际端口配置 | + +--- + +## 三、可复制到其他项目的模式 + +1. **CLI 自动上传小程序** → 任何微信小程序项目 +2. **devlop.py 部署模式** → 任何 Go 后端项目 +3. **contentParser 混合解析架构** → 任何需要富文本+纯文本混合渲染的小程序 +4. **payParams 兼容提取** → 任何接微信支付的小程序 +5. **版本号递增管理** → x.y.z 语义化版本,SKILL.md 中维护版本历史表 + +--- + +## 四、派对AI 魂码 SKILL 路径 + +`派对AI/04_魂码(火)/小程序站管理/SKILL.md`(v2.0,2026-03-15) diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md b/03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md index 8525856d..e526973a 100644 --- a/03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md +++ b/03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md @@ -4,7 +4,7 @@ description: 自动注册全网各类 AI API 免费账号,提取 API Key/Token triggers: AI注册、自动注册、批量注册、API Key、注册账号、免费API、API池、key池、自动开号、Gemini注册 owner: 木根 group: 木(卡木) -version: "1.0" +version: "2.0" updated: "2026-03-15" --- @@ -104,6 +104,42 @@ python auto_register.py --serve --port 8899 - 外部工具:Python 3.10+、Chrome/Chromium(浏览器模式需要) - Python 包:curl_cffi、DrissionPage、aiosqlite、fastapi、uvicorn、pyyaml +## 与卡若AI网关联动 + +本 SKILL 注册的 Key 可自动接入卡若AI 网关的故障切换队列: + +### 当前已接入的 Key 池 + +| 平台 | 接口地址 | 模型 | 状态 | +|:---|:---|:---|:---| +| Groq | `https://api.groq.com/openai/v1` | llama-3.3-70b-versatile | ✅ 已接入 | +| Cohere | `https://api.cohere.com/compatibility/v1` | command-a-03-2025 | ✅ 已接入 | +| Cerebras | `https://api.cerebras.ai/v1` | llama3.1-8b | ✅ 已接入 | +| Together AI | `https://api.together.xyz/v1` | Llama-3.3-70B-Instruct-Turbo | ⚠️ 额度耗尽,待轮换 | +| v0 (主力) | `https://api.v0.dev/v1` | claude-opus | ⚠️ 偶发 500 | + +### 新 Key 接入流程 + +1. 通过本 SKILL 注册新账号并获取 API Key +2. 编辑 `运营中枢/scripts/karuo_ai_gateway/.env.api_keys.local`,在 `OPENAI_API_BASES` / `OPENAI_API_KEYS` / `OPENAI_MODELS` 队列追加 +3. 运行 `python3 运营中枢/scripts/karuo_ai_gateway/key_health_check.py` 验证健康状态 +4. 重启网关生效 + +### Key 健康检查与自动轮换 + +```bash +# 一次性检查 +python3 运营中枢/scripts/karuo_ai_gateway/key_health_check.py + +# 每 5 分钟轮询(后台守护) +python3 运营中枢/scripts/karuo_ai_gateway/key_health_check.py --watch 300 + +# 输出仅健康接口的 env 配置 +python3 运营中枢/scripts/karuo_ai_gateway/key_health_check.py --env +``` + +状态文件:`运营中枢/scripts/karuo_ai_gateway/key_status.json` + ## 参考项目(References) | 项目 | 地址 | Stars | 核心技术 | diff --git a/运营中枢/scripts/karuo_ai_gateway/key_health_check.py b/运营中枢/scripts/karuo_ai_gateway/key_health_check.py new file mode 100644 index 00000000..65023e05 --- /dev/null +++ b/运营中枢/scripts/karuo_ai_gateway/key_health_check.py @@ -0,0 +1,319 @@ +""" +卡若AI 网关 — Key 健康检查 + 额度监控 + 自动轮换 + +功能: +1. 逐个测试 OPENAI_API_BASES 队列中每个 Key 的可用性 +2. 检测各平台免费额度使用情况(支持 Groq/Together/Cerebras/Cohere) +3. Key 不可用时自动标记,下次请求跳过 +4. 可对接「全网AI自动注册」SKILL 的 key_manager_api 做 Key 池补充 + +用法: + python key_health_check.py # 一次性检查 + python key_health_check.py --watch 300 # 每 300 秒轮询 + python key_health_check.py --env # 输出可直接贴到 .env 的健康队列 +""" + +import os +import sys +import json +import time +import argparse +from pathlib import Path +from datetime import datetime +from typing import Dict, List, Optional, Tuple + +SCRIPT_DIR = Path(__file__).resolve().parent +ENV_FILE = SCRIPT_DIR / ".env.api_keys.local" +STATUS_FILE = SCRIPT_DIR / "key_status.json" + +PROVIDERS = { + "groq": { + "name": "Groq", + "base_url": "https://api.groq.com/openai/v1", + "test_model": "llama-3.3-70b-versatile", + "usage_url": None, + }, + "cerebras": { + "name": "Cerebras", + "base_url": "https://api.cerebras.ai/v1", + "test_model": "llama-3.3-70b", + "usage_url": None, + }, + "together": { + "name": "Together AI", + "base_url": "https://api.together.xyz/v1", + "test_model": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "usage_url": None, + }, + "cohere": { + "name": "Cohere", + "base_url": "https://api.cohere.com/compatibility/v1", + "test_model": "command-a-03-2025", + "usage_url": None, + }, +} + + +def _detect_provider(base_url: str) -> str: + url = base_url.lower() + if "groq.com" in url: + return "groq" + if "cerebras.ai" in url: + return "cerebras" + if "together" in url: + return "together" + if "cohere.com" in url: + return "cohere" + if "v0.dev" in url: + return "v0" + if "openai.com" in url: + return "openai" + return "unknown" + + +def _test_key(base_url: str, api_key: str, model: str, timeout: float = 15) -> Tuple[bool, str, float]: + """ + 发一个最小请求测试 Key 是否可用。 + 返回 (是否成功, 错误信息/模型回复, 响应耗时ms) + """ + import httpx + + url = f"{base_url.rstrip('/')}/chat/completions" + headers = { + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json", + } + body = { + "model": model, + "messages": [{"role": "user", "content": "Hi, reply with just 'ok'"}], + "max_tokens": 5, + "temperature": 0, + } + + t0 = time.time() + try: + r = httpx.post(url, headers=headers, json=body, timeout=timeout) + elapsed = (time.time() - t0) * 1000 + + if r.status_code == 200: + data = r.json() + reply = data.get("choices", [{}])[0].get("message", {}).get("content", "") + return True, reply.strip()[:60], elapsed + + return False, f"HTTP {r.status_code}: {r.text[:120]}", elapsed + + except Exception as e: + elapsed = (time.time() - t0) * 1000 + return False, f"{type(e).__name__}: {str(e)[:100]}", elapsed + + +def _check_groq_usage(api_key: str) -> Optional[Dict]: + """Groq 没有公开的 usage API,仅通过 rate limit headers 间接获取""" + import httpx + try: + r = httpx.get( + "https://api.groq.com/openai/v1/models", + headers={"Authorization": f"Bearer {api_key}"}, + timeout=10, + ) + if r.status_code == 200: + remaining_req = r.headers.get("x-ratelimit-remaining-requests", "N/A") + remaining_tok = r.headers.get("x-ratelimit-remaining-tokens", "N/A") + return { + "remaining_requests": remaining_req, + "remaining_tokens": remaining_tok, + "status": "active", + } + return {"status": "error", "detail": f"HTTP {r.status_code}"} + except Exception as e: + return {"status": "error", "detail": str(e)[:80]} + + +def _check_together_usage(api_key: str) -> Optional[Dict]: + """Together AI 没有公开 usage API,通过 models 接口验证 Key 有效性""" + import httpx + try: + r = httpx.get( + "https://api.together.xyz/v1/models", + headers={"Authorization": f"Bearer {api_key}"}, + timeout=10, + ) + if r.status_code == 200: + return {"status": "active", "models_count": len(r.json().get("data", []) if isinstance(r.json(), dict) else r.json())} + return {"status": "error", "detail": f"HTTP {r.status_code}"} + except Exception as e: + return {"status": "error", "detail": str(e)[:80]} + + +def load_env_keys() -> List[Dict[str, str]]: + """从 .env.api_keys.local 读取当前接口队列""" + if not ENV_FILE.exists(): + print(f"[WARN] {ENV_FILE} 不存在") + return [] + + bases, keys, models = [], [], [] + for line in ENV_FILE.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if line.startswith("OPENAI_API_BASES="): + bases = [x.strip() for x in line.split("=", 1)[1].split(",") if x.strip()] + elif line.startswith("OPENAI_API_KEYS="): + keys = [x.strip() for x in line.split("=", 1)[1].split(",") if x.strip()] + elif line.startswith("OPENAI_MODELS="): + models = [x.strip() for x in line.split("=", 1)[1].split(",") if x.strip()] + + result = [] + for i, base in enumerate(bases): + key = keys[i] if i < len(keys) else "" + model = models[i] if i < len(models) else "" + if base and key: + result.append({ + "base_url": base, + "api_key": key, + "model": model, + "provider": _detect_provider(base), + }) + return result + + +def load_status() -> Dict: + if STATUS_FILE.exists(): + try: + return json.loads(STATUS_FILE.read_text(encoding="utf-8")) + except Exception: + pass + return {} + + +def save_status(status: Dict): + STATUS_FILE.write_text(json.dumps(status, ensure_ascii=False, indent=2), encoding="utf-8") + + +def run_health_check(verbose: bool = True) -> Dict: + """执行一轮完整健康检查""" + providers = load_env_keys() + if not providers: + print("[ERROR] 未找到接口队列配置") + return {} + + status = load_status() + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + if verbose: + print(f"\n{'='*60}") + print(f" 卡若AI 网关 Key 健康检查 | {now}") + print(f"{'='*60}") + + results = {} + healthy_count = 0 + total = len(providers) + + for i, p in enumerate(providers, 1): + provider_name = p["provider"] + key_preview = p["api_key"][:12] + "..." if len(p["api_key"]) > 12 else p["api_key"] + + if verbose: + print(f"\n[{i}/{total}] {provider_name.upper()} | {p['base_url']}") + print(f" Key: {key_preview} Model: {p['model']}") + + ok, msg, elapsed = _test_key(p["base_url"], p["api_key"], p["model"]) + + entry = { + "provider": provider_name, + "base_url": p["base_url"], + "model": p["model"], + "healthy": ok, + "last_check": now, + "latency_ms": round(elapsed, 1), + "message": msg, + } + + if ok: + healthy_count += 1 + if verbose: + print(f" ✅ 可用 | {elapsed:.0f}ms | 回复: {msg}") + + # 额度检查(仅支持部分平台) + if provider_name == "groq": + usage = _check_groq_usage(p["api_key"]) + entry["usage"] = usage + if verbose and usage: + print(f" 📊 额度: 剩余请求={usage.get('remaining_requests','N/A')}, 剩余Token={usage.get('remaining_tokens','N/A')}") + elif provider_name == "together": + usage = _check_together_usage(p["api_key"]) + entry["usage"] = usage + if verbose and usage: + print(f" 📊 状态: {usage.get('status','N/A')}, 可用模型数={usage.get('models_count','N/A')}") + else: + if verbose: + print(f" ❌ 不可用 | {elapsed:.0f}ms | 原因: {msg}") + + results[f"{provider_name}_{i}"] = entry + + status["last_check"] = now + status["results"] = results + status["summary"] = { + "total": total, + "healthy": healthy_count, + "unhealthy": total - healthy_count, + } + save_status(status) + + if verbose: + print(f"\n{'='*60}") + print(f" 总计: {total} 个接口 | ✅ 健康: {healthy_count} | ❌ 异常: {total - healthy_count}") + print(f" 状态已保存: {STATUS_FILE}") + print(f"{'='*60}\n") + + return status + + +def output_healthy_env(): + """输出仅包含健康 Key 的 .env 格式配置""" + status = load_status() + results = status.get("results", {}) + + bases, keys, models = [], [], [] + for entry in results.values(): + if entry.get("healthy"): + bases.append(entry["base_url"]) + keys.append("") # 不输出明文 Key + models.append(entry["model"]) + + print("# 仅健康接口(自动生成)") + print(f"# 生成时间: {status.get('last_check', 'unknown')}") + print(f"OPENAI_API_BASES={','.join(bases)}") + print(f"OPENAI_MODELS={','.join(models)}") + print(f"# 健康接口数: {len(bases)}/{status.get('summary', {}).get('total', 0)}") + + +def main(): + parser = argparse.ArgumentParser(description="卡若AI Key 健康检查 + 额度监控") + parser.add_argument("--watch", type=int, default=0, help="轮询间隔(秒),0=只跑一次") + parser.add_argument("--env", action="store_true", help="输出健康队列的 .env 格式") + parser.add_argument("--json", action="store_true", help="输出 JSON 格式结果") + parser.add_argument("--quiet", action="store_true", help="静默模式") + args = parser.parse_args() + + if args.env: + output_healthy_env() + return + + if args.watch > 0: + print(f"[Watch] 每 {args.watch} 秒检查一次,Ctrl+C 停止") + while True: + try: + result = run_health_check(verbose=not args.quiet) + if args.json: + print(json.dumps(result, ensure_ascii=False, indent=2)) + time.sleep(args.watch) + except KeyboardInterrupt: + print("\n[Watch] 已停止") + break + else: + result = run_health_check(verbose=not args.quiet) + if args.json: + print(json.dumps(result, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/运营中枢/scripts/karuo_ai_gateway/key_status.json b/运营中枢/scripts/karuo_ai_gateway/key_status.json new file mode 100644 index 00000000..431668d0 --- /dev/null +++ b/运营中枢/scripts/karuo_ai_gateway/key_status.json @@ -0,0 +1,51 @@ +{ + "last_check": "2026-03-15 23:01:20", + "results": { + "groq_1": { + "provider": "groq", + "base_url": "https://api.groq.com/openai/v1", + "model": "llama-3.3-70b-versatile", + "healthy": true, + "last_check": "2026-03-15 23:01:20", + "latency_ms": 1061.1, + "message": "ok", + "usage": { + "remaining_requests": "N/A", + "remaining_tokens": "N/A", + "status": "active" + } + }, + "cohere_2": { + "provider": "cohere", + "base_url": "https://api.cohere.com/compatibility/v1", + "model": "command-a-03-2025", + "healthy": true, + "last_check": "2026-03-15 23:01:20", + "latency_ms": 2259.8, + "message": "ok" + }, + "cerebras_3": { + "provider": "cerebras", + "base_url": "https://api.cerebras.ai/v1", + "model": "llama3.1-8b", + "healthy": true, + "last_check": "2026-03-15 23:01:20", + "latency_ms": 4194.5, + "message": "ok" + }, + "v0_4": { + "provider": "v0", + "base_url": "https://api.v0.dev/v1", + "model": "claude-opus", + "healthy": false, + "last_check": "2026-03-15 23:01:20", + "latency_ms": 2955.4, + "message": "HTTP 500: {\"success\":false,\"error\":\"Unknown error\"}" + } + }, + "summary": { + "total": 4, + "healthy": 3, + "unhealthy": 1 + } +} \ No newline at end of file diff --git a/运营中枢/参考资料/API网关与常用AI配置说明.md b/运营中枢/参考资料/API网关与常用AI配置说明.md index b35b2927..16e9796a 100644 --- a/运营中枢/参考资料/API网关与常用AI配置说明.md +++ b/运营中枢/参考资料/API网关与常用AI配置说明.md @@ -26,10 +26,34 @@ --- -## 三、卡若AI 规则与已有 API 对应关系 +## 三、当前接口队列(2026-03-15 更新) + +| 序号 | 平台 | Base URL | 模型 | 状态 | +|:---|:---|:---|:---|:---| +| 1 | Groq | `https://api.groq.com/openai/v1` | llama-3.3-70b-versatile | ✅ 健康 | +| 2 | Cohere | `https://api.cohere.com/compatibility/v1` | command-a-03-2025 | ✅ 健康 | +| 3 | Cerebras | `https://api.cerebras.ai/v1` | llama3.1-8b | ✅ 健康 | +| 4 | v0 | `https://api.v0.dev/v1` | claude-opus | ⚠️ 偶发 500 | +| 备用 | Together AI | `https://api.together.xyz/v1` | Llama-3.3-70B-Instruct-Turbo | ❌ 额度耗尽 | + +### Key 健康检查 + +```bash +python3 运营中枢/scripts/karuo_ai_gateway/key_health_check.py # 一次性 +python3 运营中枢/scripts/karuo_ai_gateway/key_health_check.py --watch 300 # 守护 +``` + +### Key 来源 + +- Groq / Cerebras / Cohere / Together AI:由「全网AI自动注册」SKILL(M02a)通过浏览器自动化注册获取 +- v0:手动配置 +- 新 Key 接入:编辑 `.env.api_keys.local` → 健康检查 → 复制到 `.env` → 重启网关 + +## 四、卡若AI 规则与已有 API 对应关系 - **主仓库网关**:`运营中枢/scripts/karuo_ai_gateway/`,环境变量 `OPENAI_API_BASES` / `OPENAI_API_KEYS` / `OPENAI_MODELS` 支持多接口排队与故障切换,与官网「API 网关」概念一致。 - **API 稳定性规则**:`.cursor/rules/api-failover-stability.mdc` 规定接口排队、故障切换与告警,与上述网关行为一致。 +- **Key 健康检查**:`运营中枢/scripts/karuo_ai_gateway/key_health_check.py` 定期检测各 Key 可用性、响应延迟和额度,状态存入 `key_status.json`。 - **账号与 Key**:`运营中枢/工作台/00_账号与API索引.md` 中 v0、阿里云、腾讯云等;网关 Key 建议写在 `karuo_ai_gateway/.env.api_keys.local` 或环境变量,不提交仓库。 --- diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 3b350bec..cc5c170f 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -362,3 +362,4 @@ | 2026-03-15 16:00:52 | 🔄 卡若AI 同步 2026-03-15 16:00 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-15 19:00:56 | 🔄 卡若AI 同步 2026-03-15 19:00 | 更新:卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-15 19:47:40 | 🔄 卡若AI 同步 2026-03-15 19:47 | 更新:水溪整理归档、卡木、火炬、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-15 20:28:48 | 🔄 卡若AI 同步 2026-03-15 20:28 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 1c7cf3ae..96722978 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -365,3 +365,4 @@ | 2026-03-15 16:00:52 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 16:00 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-15 19:00:56 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 19:00 | 更新:卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-15 19:47:40 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 19:47 | 更新:水溪整理归档、卡木、火炬、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-15 20:28:48 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 20:28 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |