🔄 卡若AI 同步 2026-03-26 22:37 | 更新:金仓、水桥平台对接、水溪整理归档、卡木、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 12 个

This commit is contained in:
2026-03-26 22:37:10 +08:00
parent 9e1b916121
commit 593cc85058
11 changed files with 155 additions and 166 deletions

View File

@@ -1,13 +1,29 @@
{
"updated": "2026-03-26T14:28:27.578841+00:00",
"updated": "2026-03-26T14:34:27.060179+00:00",
"conversations": [
{
"对话ID": "e9f6cf76-3aa5-4f8f-a02c-0ce7de4cd82a",
"名称": "ai-升级",
"项目": "个人",
"首条消息": "在整个 Mango 数据库。被整个帮口数据。对整个那个。MongoDB 数据库进行那个优化迭代跟同样的内容的一个整理的整理跟合并整个 MongoDB 数据库的一个整理,它是个执行的话,就每天,只有每天只执行一次那个全部的一个整理,包括那个记忆功能的存到盘古数据库相关的一个功能。那个按照这个东西去做整理一下。整理办公室数据库的所有的那个对话内容,办公数据库里面这个卡路 AI 的所有的对话内容,相应的东西,数据库里面那个同质化内容的一个整理,还有空格的一些整理,空行的一些整理,嗯,包括整个优化一下",
"创建时间": "2026-03-26T14:24:11.877000+00:00",
"消息数量": 94
},
{
"对话ID": "a933c050-65d2-4608-a10d-60cac4b52b8c",
"名称": "Docker startup and website initialization",
"项目": "服务器",
"首条消息": "一次启动 doc 的时候,重启 doc 的时候把都把那个上面,现在已经启动了,那几个网站也随着这个 doc 启动都帮我启动起来。DOCKER",
"创建时间": "2026-03-26T14:25:24.700000+00:00",
"消息数量": 67
},
{
"对话ID": "0d919dcf-9e8e-4a4a-af6a-ed7a9442d5cc",
"名称": "Focus list control mechanism",
"项目": "卡若AI",
"首条消息": "一个专注清单的话,不要去弄这个专注清单,这里的话就不要有那个界面了,那卡罗亚那个 skill 控制专注清单的 control 这个东西,专注清单不要有,就不要弹出界面去操作,就直接通过 control 直接控制,然后那个实时的去帮我那个操作那个功能。那现在的话就直接帮我启动一个那个网站开发的那个工作,手机的一个工作登录,现在直接帮我操作。",
"创建时间": "2026-03-26T14:27:06.178000+00:00",
"消息数量": 7
"消息数量": 102
},
{
"对话ID": "d8bddee3-4c13-49a8-acbd-487c2c0fbc9b",

View File

@@ -13,6 +13,7 @@ karuo_site 每日一次全库整理(去重键 + 空白/空行规范化 + 记
5. 记忆条目:刷新 内容/摘要/内容哈希(与 memory_mongo 规则一致)
6. 子进程sync_memory_to_mongo.py记忆.md → Mongo
7. 刷新 项目分类 汇总(与 realtime_chat_sync 一致)
8. 官网相关大表:`scheduled_task_executions`taskName/result、`gateway_usage`(网关文案与 error、`heartbeat_learnings`(摘要/片段/insights 数组字符串)
用法:
python3 mongo_daily_consolidate.py # 今日未跑则执行
@@ -20,6 +21,7 @@ karuo_site 每日一次全库整理(去重键 + 空白/空行规范化 + 记
python3 mongo_daily_consolidate.py --dry-run # 只打印统计,不写库、不写戳
python3 mongo_daily_consolidate.py --skip-memory-sync # 不跑记忆.md 同步
python3 mongo_daily_consolidate.py --purge-empty-messages # 删「规范化后无正文」的消息(慎用)
python3 mongo_daily_consolidate.py --skip-extended-collections # 不扫 scheduled_task_executions 等大表
"""
from __future__ import annotations
@@ -33,7 +35,7 @@ import sys
from collections import defaultdict
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, Dict, List, Tuple
from typing import Any, Dict, List, Optional, Sequence, Tuple
try:
from pymongo import MongoClient, UpdateOne
@@ -96,6 +98,104 @@ def normalize_text(s: Any) -> str:
return "\n".join(out).strip()
def normalize_string_fields_in_collection(
db: Any,
collection_name: str,
fields: Sequence[str],
dry_run: bool,
array_string_fields: Optional[Sequence[str]] = None,
) -> Tuple[int, int]:
"""
对集合中指定顶层字符串字段做 normalize_text可选对字符串数组内每项规范化。
返回 (扫描条数, 更新文档数)。
"""
names = db.list_collection_names()
if collection_name not in names:
print(f" ⚠️ 集合不存在,跳过: {collection_name}")
return 0, 0
col = db[collection_name]
proj: Dict[str, int] = {"_id": 1}
for f in fields:
proj[f] = 1
if array_string_fields:
for f in array_string_fields:
proj[f] = 1
scanned = updated_docs = 0
bulk: List[Any] = []
arr_names = tuple(array_string_fields) if array_string_fields else ()
for doc in col.find({}, proj):
scanned += 1
sets: Dict[str, Any] = {}
for f in fields:
raw = doc.get(f)
if not isinstance(raw, str):
continue
if f in ("gatewayId", "taskId", "id", "apiKeyPrefix"):
new_v = raw.replace("\r\n", "\n").replace("\r", "\n").strip()
else:
new_v = normalize_text(raw)
if new_v != raw:
sets[f] = new_v
for af in arr_names:
arr = doc.get(af)
if not isinstance(arr, list):
continue
new_arr = []
changed = False
for item in arr:
if isinstance(item, str):
nv = normalize_text(item)
new_arr.append(nv)
if nv != item:
changed = True
else:
new_arr.append(item)
if changed:
sets[af] = new_arr
if sets:
bulk.append(UpdateOne({"_id": doc["_id"]}, {"$set": sets}))
updated_docs += 1
if len(bulk) >= BATCH:
if not dry_run and bulk:
col.bulk_write(bulk, ordered=False)
bulk = []
if bulk:
if not dry_run:
col.bulk_write(bulk, ordered=False)
return scanned, updated_docs
def run_extended_collection_cleanup(db: Any, dry_run: bool) -> None:
"""卡若网站写入的大表:清空白行、统一换行。"""
jobs: List[Tuple[str, Tuple[str, ...], Optional[Tuple[str, ...]]]] = [
("scheduled_task_executions", ("taskName", "result"), None),
(
"gateway_usage",
("gatewayId", "gatewayName", "model", "error", "apiKeyPrefix"),
None,
),
(
"heartbeat_learnings",
("sourceName", "sourceUrl", "rawSnippet", "summary", "model"),
("keyInsights",),
),
]
for coll, fields, arr_fields in jobs:
print(f"▶ 规范化字符串字段: {coll}")
s, u = normalize_string_fields_in_collection(
db, coll, fields, dry_run, array_string_fields=arr_fields
)
print(f" 扫描 {s}, 更新文档 {u}")
def load_memory_helpers():
mem_dir = (
KARUO_AI_ROOT
@@ -342,6 +442,11 @@ def main() -> None:
action="store_true",
help="删除规范化后正文为空的 消息内容(默认保留,仅不写入空字符串覆盖)",
)
ap.add_argument(
"--skip-extended-collections",
action="store_true",
help="不整理 scheduled_task_executions / gateway_usage / heartbeat_learnings",
)
args = ap.parse_args()
if not args.force and not args.dry_run and already_done_today():
@@ -380,6 +485,12 @@ def main() -> None:
except Exception as ex:
print(f"⚠️ 记忆条目整理失败(已跳过该段): {ex}")
if not args.skip_extended_collections:
try:
run_extended_collection_cleanup(db, args.dry_run)
except Exception as ex:
print(f"⚠️ 扩展集合(调度/网关/心跳学习)整理失败: {ex}")
client.close()
if not args.skip_memory_sync:

View File

@@ -1,6 +1,6 @@
{
"access_token": "u-egmupNnTR6RpRhCKTAPS3Flh3CH1ghWjXgGaUxg0260Z",
"refresh_token": "ur-ci124eMop5GEdp1_oleMtOlh1AHxghUNigGaEM0026lF",
"access_token": "u-dNXd_97Ctc5HNPpu6UnGCjlh1C91ghUXV0GaJRk023hJ",
"refresh_token": "ur-cDx15lPTV2q9HAw9mGHHkMlh3e3xghOpi0GaZw40234F",
"name": "飞书用户",
"auth_time": "2026-03-25T12:57:21.419027"
"auth_time": "2026-03-26T22:30:56.037570"
}

View File

@@ -1545,3 +1545,10 @@
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/切片/soul130_08_你想是多少好友来干嘛 我才知道 我要.mp4", "title": "你想是多少好友来干嘛 我才知道 我要", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=你想是多少好友来干嘛 我才知道 我要 | createTime=2026-03-26 09:28 | 无tips)", "screenshot": "/tmp/channels_ss/soul130_08_你想是多少好友来干嘛 我才知道 我要_5_before_close.png", "elapsed_sec": 47.47290658950806, "timestamp": "2026-03-26 09:28:21"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/切片/soul130_09_看直播的分论 啥意思呢 我们进入 进.mp4", "title": "看直播的分论 啥意思呢 我们进入 进", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=看直播的分论 啥意思呢 我们进入 进 | createTime=2026-03-26 09:28 | 无tips)", "screenshot": "/tmp/channels_ss/soul130_09_看直播的分论 啥意思呢 我们进入 进_5_before_close.png", "elapsed_sec": 46.84691596031189, "timestamp": "2026-03-26 09:29:08"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/切片/soul130_10_我带ID我是知道 当天的总销售 是随.mp4", "title": "我带ID我是知道 当天的总销售 是随", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=我带ID我是知道 当天的总销售 是随 | createTime=2026-03-26 09:29 | 无tips)", "screenshot": "/tmp/channels_ss/soul130_10_我带ID我是知道 当天的总销售 是随_5_before_close.png", "elapsed_sec": 47.1520562171936, "timestamp": "2026-03-26 09:29:55"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/你不太好 你不太好 你不太好 你不太.mp4", "title": "你不太好 你不太好 你不太好 你不太", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=你不太好 你不太好 你不太好 你不太 | createTime=2026-03-26 22:31 | 无tips)", "screenshot": "/tmp/channels_ss/你不太好 你不太好 你不太好 你不太_5_before_close.png", "elapsed_sec": 54.38908791542053, "timestamp": "2026-03-26 22:31:36"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/你想是多少好友来干嘛 我才知道 我要.mp4", "title": "你想是多少好友来干嘛 我才知道 我要", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=你想是多少好友来干嘛 我才知道 我要 | createTime=2026-03-26 22:32 | 无tips)", "screenshot": "/tmp/channels_ss/你想是多少好友来干嘛 我才知道 我要_5_before_close.png", "elapsed_sec": 48.17578482627869, "timestamp": "2026-03-26 22:32:24"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/你看关于这块 同步这块 我这里的话是.mp4", "title": "你看关于这块 同步这块 我这里的话是", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=你看关于这块 同步这块 我这里的话是 | createTime=2026-03-26 22:33 | 无tips)", "screenshot": "/tmp/channels_ss/你看关于这块 同步这块 我这里的话是_5_before_close.png", "elapsed_sec": 46.17940616607666, "timestamp": "2026-03-26 22:33:10"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/内容库是要干嘛的 前面后面 我跟你说.mp4", "title": "内容库是要干嘛的 前面后面 我跟你说", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=内容库是要干嘛的 前面后面 我跟你说 | createTime=2026-03-26 22:33 | 无tips)", "screenshot": "/tmp/channels_ss/内容库是要干嘛的 前面后面 我跟你说_5_before_close.png", "elapsed_sec": 49.7093722820282, "timestamp": "2026-03-26 22:34:00"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/我带ID我是知道 当天的总销售 是随.mp4", "title": "我带ID我是知道 当天的总销售 是随", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=我带ID我是知道 当天的总销售 是随 | createTime=2026-03-26 22:34 | 无tips)", "screenshot": "/tmp/channels_ss/我带ID我是知道 当天的总销售 是随_5_before_close.png", "elapsed_sec": 48.000049114227295, "timestamp": "2026-03-26 22:34:48"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/我看你不太好 你不太好 你不太好 你.mp4", "title": "我看你不太好 你不太好 你不太好 你", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=我看你不太好 你不太好 你不太好 你 | createTime=2026-03-26 22:35 | 无tips)", "screenshot": "/tmp/channels_ss/我看你不太好 你不太好 你不太好 你_5_before_close.png", "elapsed_sec": 46.88549304008484, "timestamp": "2026-03-26 22:35:35"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/看直播的分论 啥意思呢 我们进入 进.mp4", "title": "看直播的分论 啥意思呢 我们进入 进", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=看直播的分论 啥意思呢 我们进入 进 | createTime=2026-03-26 22:36 | 无tips)", "screenshot": "/tmp/channels_ss/看直播的分论 啥意思呢 我们进入 进_5_before_close.png", "elapsed_sec": 50.23806095123291, "timestamp": "2026-03-26 22:36:25"}

View File

@@ -35,3 +35,10 @@
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/赚钱没那么复杂,自信心才是核心问题.mp4", "video_signature": "赚钱没那么复杂,自信心才是核心问题.mp4|22996736", "status": "likely_published"}
{"timestamp": "2026-03-25 14:45:28", "platform": "视频号", "video_path": "/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "video_signature": "我之前抖音就这么做.mp4|5229367", "status": "published"}
{"timestamp": "2026-03-26 05:47:23", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "video_signature": "七千店复制拿投资月流水五十万.mp4|9583735", "status": "published"}
{"timestamp": "2026-03-26 22:31:36", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/你不太好 你不太好 你不太好 你不太.mp4", "video_signature": "你不太好 你不太好 你不太好 你不太.mp4|27822564", "status": "published"}
{"timestamp": "2026-03-26 22:32:24", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/你想是多少好友来干嘛 我才知道 我要.mp4", "video_signature": "你想是多少好友来干嘛 我才知道 我要.mp4|55610095", "status": "published"}
{"timestamp": "2026-03-26 22:33:10", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/你看关于这块 同步这块 我这里的话是.mp4", "video_signature": "你看关于这块 同步这块 我这里的话是.mp4|55902133", "status": "published"}
{"timestamp": "2026-03-26 22:34:00", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/内容库是要干嘛的 前面后面 我跟你说.mp4", "video_signature": "内容库是要干嘛的 前面后面 我跟你说.mp4|52283924", "status": "published"}
{"timestamp": "2026-03-26 22:34:48", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/我带ID我是知道 当天的总销售 是随.mp4", "video_signature": "我带ID我是知道 当天的总销售 是随.mp4|58913248", "status": "published"}
{"timestamp": "2026-03-26 22:35:35", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/我看你不太好 你不太好 你不太好 你.mp4", "video_signature": "我看你不太好 你不太好 你不太好 你.mp4|15807821", "status": "published"}
{"timestamp": "2026-03-26 22:36:25", "platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第130场_20260324_output/成片_横屏全幅/看直播的分论 啥意思呢 我们进入 进.mp4", "video_signature": "看直播的分论 啥意思呢 我们进入 进.mp4|50455787", "status": "published"}

File diff suppressed because one or more lines are too long

View File

@@ -61,7 +61,7 @@ python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储
## 六、每日全库整理(低频 · 同一天只跑一次)
对 **`karuo_site`** 做键去重、对话/消息文本空白与空行规范化、**记忆条目**同质化合并,并子进程执行 **记忆.md → `记忆条目`**`sync_memory_to_mongo.py`),最后刷新 **`项目分类`**。日期戳文件:`02_卡人/水溪_整理归档/记忆系统/structured/last_mongo_consolidate_date.txt`(与 `collect_chat_daily` 同目录)。
对 **`karuo_site`** 做键去重、对话/消息文本空白与空行规范化、**记忆条目**同质化合并,并子进程执行 **记忆.md → `记忆条目`**`sync_memory_to_mongo.py`),最后刷新 **`项目分类`**。另会扫描官网相关集合:**`scheduled_task_executions`**、**`gateway_usage`**、**`heartbeat_learnings`** 的字符串字段(清多余空行、统一换行)。日期戳文件:`02_卡人/水溪_整理归档/记忆系统/structured/last_mongo_consolidate_date.txt`(与 `collect_chat_daily` 同目录)。
```bash
python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储备份/聊天记录管理/脚本/mongo_daily_consolidate.py"
@@ -71,4 +71,5 @@ python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储
- 只看统计不写库:`--dry-run`
- 不跑记忆.md 同步:`--skip-memory-sync`
- 需物理删除「规范化后无正文」的占位消息时(量大、慎用):`--purge-empty-messages`;默认**不删**,只做空白/空行规范化
- 不扫调度/网关/心跳学习大表:`--skip-extended-collections`
- 连接串:`MONGO_URI` / `MONGO_DB`(与 `ensure_mongo_chat_indexes.py` 一致)

View File

@@ -443,3 +443,4 @@
| 2026-03-26 18:21:03 | 🔄 卡若AI 同步 2026-03-26 18:21 | 更新:运营中枢工作台 | 排除 >20MB: 12 个 |
| 2026-03-26 18:27:30 | 🔄 卡若AI 同步 2026-03-26 18:27 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 12 个 |
| 2026-03-26 22:28:40 | 🔄 卡若AI 同步 2026-03-26 22:28 | 更新Cursor规则、金仓Gitea脚本与配置、金仓、卡人、水溪整理归档、卡木、火炬、总索引与入口、运营中枢、运营中枢参考资料等 | 排除 >20MB: 12 个 |
| 2026-03-26 22:29:36 | 🔄 卡若AI 同步 2026-03-26 22:29 | 更新Cursor规则、金仓、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 12 个 |

View File

@@ -446,3 +446,4 @@
| 2026-03-26 18:21:03 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-26 18:21 | 更新:运营中枢工作台 | 排除 >20MB: 12 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-26 18:27:30 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-26 18:27 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 12 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-26 22:28:40 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-26 22:28 | 更新Cursor规则、金仓Gitea脚本与配置、金仓、卡人、水溪整理归档、卡木、火炬、总索引与入口、运营中枢、运营中枢参考资料等 | 排除 >20MB: 12 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-26 22:29:36 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-26 22:29 | 更新Cursor规则、金仓、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 12 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |

View File

@@ -36,6 +36,7 @@
| 触客宝 Web | 同上 | **3101** | **3101** | 同上 | 同上 |
| 玩值大屏 | `开发/3、自营项目/玩值大屏` | **3034** | **3034** | 项目目录 `docker compose up -d` | name: website |
| Soul 创业实验 | `开发/3、自营项目/一场soul的创业实验-react` | **3000** | **3002** | 开发:`pnpm dev -- -p 3002`(避免与其它占 3000 的冲突);部署:项目目录 `docker compose up -d` | 部署用 3000 时注意仅此项目;开发建议 3002 |
| **Soul 创业实验-永平(三端)** | `/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平` | 线上见 K03 SKILL | **8080**soul-api+ **5174**soul-admin | API`cd soul-api && go run ./cmd/server`;管理端:`cd soul-admin && npm run dev`Vite 代理 `/api`→8080 | 小程序目录 `miniprogram/`;本地联调用微信开发者工具导入;详 **K03** `卡若网站开发_永平三端/SKILL.md` |
| OpenClaw 网关 | 已并入 **website** 编排 | **18789** / **18790** | — | 神射手目录 `docker compose up -d`(镜像需在 OpenClaw 项目内先 build`openclaw:local` | 容器名 `website-openclaw-gateway`;配置见 `开发/8、小工具/Docker项目/OpenClaw/openclaw/.env` |
| n8n | 已并入 **website** 编排 | **5678** | — | 神射手目录 `docker compose up -d` | 容器名 `website-n8n`;工作流自动化,访问 http://localhost:5678 |
| 艾叶 IM Bridge | `卡若AI/运营中枢/scripts/aiye_im_bridge` | **18900** | **18900** | `bash start.sh``python main.py` | 多平台 IM 网关(微信/企业微信/飞书/WhatsApp/网页→卡若AI |
@@ -74,3 +75,4 @@
| 2026-03-19 | 玩值电竞合并为单点部署:仅神射手目录 website 编排运行玩值电竞App 目录 docker-compose 废弃,避免两处同起 |
| 2026-03-26 | 卡若ai网站 Docker 镜像 Node 22登记 OpenAI 兼容出口 `localhost:3102/api/v1``.env.docker.example` |
| 2026-03-26 | 万推 wantui登记路径/端口 8000 与 Gitea 仓库 `fnvtk/wantui` |
| 2026-03-26 | Soul 创业实验-永平:登记 soul-api **8080**、soul-admin **5174** 与启动命令 |