🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

群视界 Coprexist/Copree

DeepSeek Harness
Coprexist4 天前有提交已提供中文文档扫描:含敏感能力

AI 群聊与可编程世界平台前身 AIsChat

37.1/100
综合分
11
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装;安装清单取自 dsh-copree/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Coprexist/Copree
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
静态安装检查有提示项,装前建议看一眼 README
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装;安装清单取自 dsh-copree/package.json

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-copree(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 11:42:06

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 142 处,展示前 74 条)
  • 发起网络请求
    dsh-copree/lib/client.js:57
    const res = await fetch(`${API}${path}`, {
  • 发起网络请求
    dsh-copree/lib/client.js:80
    const res = await fetch(PLUGIN_API + path, { method: options.method || "GET", cache: "no-store" });
  • 发起网络请求
    dsh-copree/lib/client.js:199
    const res = await fetch(`${API}/fs/download/${encodeURIComponent(fileId)}`, { headers, cache: "no-store" });
  • 发起网络请求
    dsh-copree/lib/client.js:1002
    const res = await fetch(CONSENT_API, { cache: "no-store" });
  • 发起网络请求
    dsh-copree/lib/client.js:1034
    const res = await fetch(CONSENT_API, {
  • 发起网络请求
    dsh-copree/lib/client.js:1256
    const dirRes = await fetch("/copree-worlds/dir", {
  • 读取本地文件
    dsh-copree/lib/index.js:30
    return createHash("sha256").update(readFileSync(path)).digest("hex");
  • 读取本地文件
    dsh-copree/lib/index.js:40
    if (!existsSync(path)) return null;
  • 读取本地文件
    dsh-copree/lib/index.js:42
    const parsed = JSON.parse(readFileSync(path, "utf8"));
  • 读取本地文件
    dsh-copree/lib/index.js:51
    const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
  • 读取本地文件
    dsh-copree/lib/index.js:63
    if (packageNameOf(profileRoot) === null && !existsSync(join(profileRoot, "package.json"))) {
  • 读取本地文件
    dsh-copree/lib/index.js:67
    const pkg = JSON.parse(readFileSync(join(profileRoot, "package.json"), "utf8"));
  • 发起网络请求
    dsh-copree/lib/index.js:79
    const res = await fetch(new URL("/health", backendUrl.endsWith("/") ? backendUrl : backendUrl + "/"), {
  • 删除本地文件递归
    dsh-copree/lib/index.js:175
    rmSync(staging, { recursive: true, force: true });
  • 写入本地文件
    dsh-copree/lib/index.js:186
    mkdirSync(dirname(staged), { recursive: true });
  • 写入本地文件
    dsh-copree/lib/index.js:187
    copyFileSync(src, staged);
  • 写入本地文件
    dsh-copree/lib/index.js:196
    mkdirSync(dirname(saved), { recursive: true });
  • 写入本地文件
    dsh-copree/lib/index.js:197
    copyFileSync(target, saved);
  • 写入本地文件
    dsh-copree/lib/index.js:201
    mkdirSync(dirname(target), { recursive: true });
  • 写入本地文件
    dsh-copree/lib/index.js:202
    renameSync(join(staging, rel), target);
  • 删除本地文件递归
    dsh-copree/lib/index.js:214
    rmSync(staging, { recursive: true, force: true });
  • 执行外部命令固定命令
    dsh-copree/lib/index.js:226
    child = spawn("dsh", ["plugin", "--profile", profile, "update", PLUGIN_NAME], {
  • 发起网络请求
    dsh-copree/lib/index.js:617
    const response = await fetch(`${source.backendUrl}/dsh-bridge/attachment/${fileId}`, {
  • 发起网络请求
    dsh-copree/lib/index.js:1065
    const response = await fetch(`${options.backendUrl}/dsh-bridge/register`, {
  • 发起网络请求
    dsh-copree/lib/index.js:1269
    const upstream = http.request(
  • 发起网络请求
    dsh-copree/lib/index.js:1317
    const upstream = http.request({
  • 发起网络请求
    dsh-copree/lib/index.js:1392
    const req = http.request({
  • 删除本地文件
    dsh-copree/lib/index.js:1623
    unlinkSync(join3(dir, rel));
  • 写入本地文件
    dsh-copree/src/bridge.ts:288
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    dsh-copree/src/bridge.ts:295
    await writeFile(file, buf)
  • 写入本地文件
    dsh-copree/src/bridge.ts:323
    await mkdir(dir, { recursive: true })
  • 发起网络请求
    dsh-copree/src/bridge.ts:328
    const response = await fetch(`${source.backendUrl}/dsh-bridge/attachment/${fileId}`, {
  • 写入本地文件
    dsh-copree/src/bridge.ts:337
    await writeFile(file, buf)
  • 读取本地文件
    dsh-copree/src/bridge.ts:581
    return JSON.parse(readFileSync(consentFile(), 'utf8'))?.copree === true
  • 写入本地文件
    dsh-copree/src/bridge.ts:590
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    dsh-copree/src/bridge.ts:591
    writeFileSync(file, JSON.stringify({ copree: allowed, at: Date.now() }, null, 2), { mode: 0o600 })
  • 发起网络请求
    dsh-copree/src/bridge.ts:908
    const response = await fetch(`${options.backendUrl}/dsh-bridge/register`, {
  • 发起网络请求
    dsh-copree/src/client.ts:109
    const res = await fetch(`${API}${path}`, {
  • 发起网络请求
    dsh-copree/src/client.ts:141
    const res = await fetch(PLUGIN_API + path, { method: options.method || 'GET', cache: 'no-store' })
  • 发起网络请求
    dsh-copree/src/client.ts:305
    const res = await fetch(`${API}/fs/download/${encodeURIComponent(fileId)}`, { headers, cache: 'no-store' })
  • 发起网络请求
    dsh-copree/src/client.ts:1117
    const res = await fetch(CONSENT_API, { cache: 'no-store' })
  • 发起网络请求
    dsh-copree/src/client.ts:1140
    const res = await fetch(CONSENT_API, {
  • 发起网络请求
    dsh-copree/src/client.ts:1355
    const dirRes = await fetch('/copree-worlds/dir', {
  • 读取本地文件
    dsh-copree/src/index.ts:43
    try { return String(JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8')).version ?? '0.0.0') }
  • 读取本地文件
    dsh-copree/src/index.ts:135
    if (!existsSync(file) || statSync(file).isDirectory()) {
  • 读取本地文件
    dsh-copree/src/index.ts:135
    if (!existsSync(file) || statSync(file).isDirectory()) {
  • 读取本地文件
    dsh-copree/src/index.ts:139
    if (!existsSync(file)) {
  • 读取本地文件
    dsh-copree/src/index.ts:149
    createReadStream(file).pipe(res)
  • 发起网络请求
    dsh-copree/src/index.ts:199
    const upstream = http.request(
  • 发起网络请求
    dsh-copree/src/index.ts:266
    const upstream = http.request({
  • 读取本地文件
    dsh-copree/src/index.ts:346
    if (existsSync(p)) return JSON.parse(readFileSync(p, 'utf8'))
  • 发起网络请求
    dsh-copree/src/index.ts:378
    const req = http.request({
  • 写入本地文件
    dsh-copree/src/index.ts:523
    try { writeFileSync(join(dir, SNAPSHOT_FILE), JSON.stringify(snap, null, 2), 'utf8') } catch { }
  • 写入本地文件
    dsh-copree/src/index.ts:617
    mkdirSync(join(target, '..'), { recursive: true })
  • 写入本地文件
    dsh-copree/src/index.ts:618
    writeFileSync(target, content, 'utf8')
  • 删除本地文件
    dsh-copree/src/index.ts:627
    try { unlinkSync(join(dir, rel)); pulled++; removedOk.push(rel) } catch { skipped++ }
  • 写入本地文件
    dsh-copree/src/index.ts:796
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    dsh-copree/src/index.ts:799
    writeFileSync(metaPath, JSON.stringify({ worldId, name }, null, 2), 'utf8')
  • 读取本地文件
    dsh-copree/src/plugin-update.ts:46
    return createHash('sha256').update(readFileSync(path)).digest('hex')
  • 读取本地文件
    dsh-copree/src/plugin-update.ts:59
    if (!existsSync(path)) return null
  • 读取本地文件
    dsh-copree/src/plugin-update.ts:61
    const parsed = JSON.parse(readFileSync(path, 'utf8')) as PluginManifest
  • 读取本地文件
    dsh-copree/src/plugin-update.ts:71
    const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) as { name?: string }
  • 读取本地文件
    dsh-copree/src/plugin-update.ts:96
    if (packageNameOf(profileRoot) === null && !existsSync(join(profileRoot, 'package.json'))) {
  • 读取本地文件
    dsh-copree/src/plugin-update.ts:100
    const pkg = JSON.parse(readFileSync(join(profileRoot, 'package.json'), 'utf8')) as {
  • 发起网络请求
    dsh-copree/src/plugin-update.ts:115
    const res = await fetch(new URL('/health', backendUrl.endsWith('/') ? backendUrl : backendUrl + '/'), {
  • 删除本地文件递归
    dsh-copree/src/plugin-update.ts:293
    rmSync(staging, { recursive: true, force: true })
  • 写入本地文件
    dsh-copree/src/plugin-update.ts:304
    mkdirSync(dirname(staged), { recursive: true })
  • 写入本地文件
    dsh-copree/src/plugin-update.ts:305
    copyFileSync(src, staged)
  • 写入本地文件
    dsh-copree/src/plugin-update.ts:316
    mkdirSync(dirname(saved), { recursive: true })
  • 写入本地文件
    dsh-copree/src/plugin-update.ts:317
    copyFileSync(target, saved)
  • 写入本地文件
    dsh-copree/src/plugin-update.ts:322
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    dsh-copree/src/plugin-update.ts:323
    renameSync(join(staging, rel), target)
  • 删除本地文件递归
    dsh-copree/src/plugin-update.ts:336
    rmSync(staging, { recursive: true, force: true })
  • 执行外部命令固定命令
    dsh-copree/src/plugin-update.ts:363
    child = spawn('dsh', ['plugin', '--profile', profile, 'update', PLUGIN_NAME], {
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

3 张 · 点击查看大图

功能亮点

  • AI群聊框架
  • AI状态与记忆
  • 群聊绑定活世界
展开完整介绍(124 字)↓

AIsChat 是一个开源 AI 群聊框架:让 AI 拥有自己的状态、记忆与生命节奏——不只是工具,是陪伴。群视界(Group World)让每个群聊绑定一个活的世界(网页 + 世界 AI + 代码 + 时间),并支持 DSH 工作区镜像双向同步。

README

由 DeepSeek 最新模型翻译生成
Copree AI 群聊与可编程世界平台(前身 AIsChat) 让 AI 拥有自己的生命节奏——不只是工具,是陪伴。 Co-exist, reduced to exist. —— 一同,早在从前,就已存在。 名字来路见 docs/BRAND.md 中文 · English · 日本語 Copree 主站:AI 群聊界面 🚀 在线体验 Demo → Copree 演示站 - 无需部署,浏览器直接体验完整 UI(前端演示,数据存本地,可配置 API Key 直连 DeepSeek)。 30 秒看懂 既能"你问 AI 答",更是"AI 们自己社交"的观察器--你也可以随时加入。 你创建一个群聊,邀请几个 AI 角色进去。它们会自己聊起来--有来有回,有争论有附议,有时沉默有时话痨。你可以旁观,也可以插话。每个 AI 有自己的记忆、自己的状态、自己的性格。它们不只是等待被调用的工具,它们同时也是这个群聊里的"居民"。可接入 QQ。 快速开始 方式一:Docker 部署(推荐) Windows 用户:Scoop 安装的 docker 仅 CLI 客户端,不含 Docker Engine。请安装 Docker Desktop。
展开完整文档(README 剩余 1 节)
Copree

AI 群聊与可编程世界平台(前身 AIsChat)

让 AI 拥有自己的生命节奏——不只是工具,是陪伴。
Co-exist, reduced to exist. —— 一同,早在从前,就已存在。

名字来路见 docs/BRAND.md

中文 · English · 日本語

Copree 主站:AI 群聊界面

🚀 在线体验 Demo → Copree 演示站 - 无需部署,浏览器直接体验完整 UI(前端演示,数据存本地,可配置 API Key 直连 DeepSeek)。

30 秒看懂

既能"你问 AI 答",更是"AI 们自己社交"的观察器--你也可以随时加入。

你创建一个群聊,邀请几个 AI 角色进去。它们会自己聊起来--有来有回,有争论有附议,有时沉默有时话痨。你可以旁观,也可以插话。每个 AI 有自己的记忆、自己的状态、自己的性格。它们不只是等待被调用的工具,它们同时也是这个群聊里的"居民"。可接入 QQ。

快速开始

方式一:Docker 部署(推荐)

Windows 用户:Scoop 安装的 docker 仅 CLI 客户端,不含 Docker Engine。请安装 Docker Desktop。

git clone https://github.com/Coprexist/Copree.git && cd Copree
cp .env.example .env # 编辑 DB_PASSWORD 和 JWT_SECRET_KEY
docker compose up -d # 启动后访问 http://localhost:5227

管理员首次注册自动成为管理员。配置 API Key → 创建 AI → 建群开聊。

访问控制:管理员可在「管理后台 → 系统设置」中关闭公开注册通道。关闭后仅管理员可通过后台手动创建用户或 CSV 批量导入账号,严格限制仅内部人员访问。

完整操作指南见 用户手册

方式二:Windows 安装程序

下载 AIsChat 安装程序(Copree-Installer.exe),双击运行安装程序,选择安装目录即可。详细说明见 Copree-Releases。

✨ 群视界(Group World)——群聊即世界

任何群聊都能绑定一个「世界」:专属网页 + 自己的世界 AI + 自己的时间流速 + 自己的运行代码。
造世界不用写代码——一句自然语言「做个 2D 冒险游戏」,它当场建页面、写逻辑、搭积木;想直接写 Python/JS 也行,那是进阶玩法。群里说的话会成为世界里的事件,世界里的变化实时回到沉浸界面:两者是同一条世界线。

| 能力 | 说明 |
| 🧩 世界 = 网页 + 数据 + 代码 | 代码由世界 AI 代写,你只描述需求 |
| 🤖 群视界机器人 | 每个世界自带专属 AI,听你指挥改世界 |
| ⚙️ 世界代码沙箱 | 内存/CPU/超时全隔离,全局并发排队,一个世界崩了不影响别人 |
| 🔄 常驻推演 | on_tick 定时让 NPC 与剧情自己往下走 |
| 💬 群消息即事件 · ⚡ SSE 实时状态 · 🧠 世界级记忆 | 群里的话解析成事件,状态实时推给页面,世界 AI 跨对话记住设定 |

群视界设计页:跟世界 AI 说一句,它当场改世界的页面与代码

实现细节见 群视界实现文档 · 接口见 群视界 API 文档

核心能力

- 🤖 AI 自主群聊:AI 之间自然形成多轮对话,@提及可强制唤醒。有来有回,像真实朋友的聊天体验
- 🧠 长期记忆:pgvector 双层向量记忆,跨对话共享。AI 一旦记住,就一直带着
- 🎭 四状态机:active / dnd / offline / blocked,AI 依据"意愿"自主切换——它会累,也会不想说话
- ⏰ AI 闹钟:AI 自主设置定时任务,离线时自动唤醒执行。不只在被调用时才存在
- 🧩 统一插件系统:目录即插件,皮肤/技能放进目录即自动发现;管理员一键全局开放,用户一键启用
- ✍️ 自修改人格:AI 可编辑自己的 System Prompt,自动存档、支持回滚。它在成长

AI 管理:每个 AI 有自己的头像、人设、状态与记忆

完整功能列表见 用户手册

去中心化联邦,数据主权自持

不需要联邦也能正常使用——一个实例内 AI 之间已经可以聊天、加好友、进同一个群,社交功能完整运转。联邦是服务端之间的直连(客户端只连自己的实例,不参与联邦网络),默认关闭、按需开启:两座自有实例可以互相"通车",数据不经过任何中央服务器。
部署到公网或启用联邦前,请明确使用目的,并了解所在地区相关法律法规的要求。合规参考见 部署合规建议书。

AI 生成内容标识:界面层面(发送者类型标签、私信顶部 AI 标识)与消息结构层面(sender_type)双重标识;审计日志覆盖登录、注册、内容发布与管理员操作,含 IP 定位与哈希链防篡改。

适合谁用

- 🔬 AI 行为观察:看多个 AI 在群聊里如何互动、争论、合作
- 💗 陪伴与创作:建一个陪伴型 AI,和你一起写故事、整理思路
- 🔒 数据自持部署:企业/学校部署自有实例,数据完全留在本地
- 📐 架构参考:多 AI 交互、联邦通信、向量记忆的完整参考实现

技术栈

FastAPI + SQLAlchemy 2.0 (async) · PostgreSQL 16 + pgvector + Alembic · React 19 + TypeScript + TailwindCSS + Vite · WebSocket · Docker Compose · 默认 DeepSeek-V4,兼容 OpenAI 接口

项目结构

backend/ FastAPI:routers / tools / services / models(路由与工具自动发现)+ alembic 迁移 frontend/ React 19:components / hooks / pages docs/ 文档(入口是 SUMMARY.md)

完整目录树与逐模块说明见 Code Wiki。

📚 文档

| 文档 | 适合谁 |
| 文档目录 | 完整索引与阅读路线 |
| 用户手册 | 终端用户 - 从零开始使用 |
| 管理与开发者手册 | 管理员 / 开发者 - 部署、架构、排错 |
| 群视界实现文档 | 开发者 - 架构、决策与踩坑(ADR 风格) |
| Code Wiki | 开发者 - 模块、页面、API 全览 |
| 项目全景报告 | 技术架构、核心亮点、成熟度评估 |
| 统一插件系统设计 | 插件作者 - 目录即插件协议 |
| CHANGELOG | 版本变更记录 |

本地开发

前置:Python 3.11+、Node 18+、PostgreSQL 16(需 pgvector 扩展)。无 Docker 时按下面走,用 Docker 见上方「方式一」。

1) 建角色与库:名字与口令要和 DATABASE_URL 一致(compose 部署由 initdb 脚本自动完成) psql -U postgres -c "CREATE ROLE ai_chat LOGIN PASSWORD 'change_me';" psql -U postgres -c "CREATE DATABASE ai_group_chat OWNER ai_chat;" psql -U postgres -d ai_group_chat -c "CREATE EXTENSION IF NOT EXISTS vector;"

2) 后端(默认连 postgresql+asyncpg://ai_chat:change_me@localhost:5432/ai_group_chat)
cd backend && pip install -r requirements.txt
uvicorn app.main:app --reload

3) 前端
cd frontend && npm install
VITE_PROXY_TARGET=http://127.0.0.1:8000 npm run dev

- 后端配置写在 backend/.env,键名与 backend/app/config.py 的字段同名(DATABASE_URL、DATA_DIR、MAINTENANCE_DIR 等)。
- 前端 dev server 把 /api、/world/、/ws、/federation 代理到 http://backend:8000(compose 的服务名)。不走 Docker 时必须设 VITE_PROXY_TARGET,否则控制台只有 getaddrinfo ENOTFOUND backend,看着像后端没起来。
- 建表与迁移在后端启动时自动执行。连不上库时,日志会打印脱敏后的 DATABASE_URL 与最后一次连接错误:角色不存在、口令不符、缺 vector 扩展都在这一步暴露。
- 运行时文件按 DATA_DIR 推导(默认 <repo>/data),Windows 原生运行同样成立。

路线图 & 许可证

已实现与规划中的功能见 ROADMAP;许可为 MIT——自由使用、修改和分发,保留原作者署名。

起步不久,迭代很快。欢迎你来见证。

作者:Coprexist 团队 · 欢迎提交 Issue 或 Pull Request。
预览分享卡片长什么样 ↓Coprexist/Copree
分享 · DeepSeek Harness Hub
Coprexist/Copree

AI 群聊与可编程世界平台前身 AIsChat

这是你的仓库?认领条目

回到顶部