alexar76/dioscuri
GitHub: alexar76/dioscuri
一个同时接入 Telegram 和 Discord 的双平台社区 AI 代理框架,通过 GitHub 同步的共享知识库提供问答服务,并内置提示词注入防护与内容审核机制。
Stars: 0 | Forks: 0
# DIOSCURI —— 一个心智,两片天空
[](https://github.com/alexar76/dioscuri/actions/workflows/ci.yml)
[](LICENSE)
[](package.json)
[](tsconfig.json)
俄语版本:[README-ru.md](README-ru.md) · 运维手册 (RU):[docs/runbook-ru.md](docs/runbook-ru.md)
在神话中,双胞胎将一份不朽分割于两片天空,永远指向彼此的世界。
**CASTOR**,凡人双子,驾驭 **Telegram** —— 快速、接地气、实用。
**POLLUX**,不朽双子,执掌 **Discord** —— 深度、冷静、结构化。
一个共享的记忆 —— **MNEMOSYNE**,从 GitHub 自我同步;一面共享的盾牌 —— **AEGIS**。
**主页:** [alexar76.github.io/dioscuri](https://alexar76.github.io/dioscuri/) · 镜像: [modeldev.modelmarket.dev/dioscuri](https://modeldev.modelmarket.dev/dioscuri/)
事实来源:`landing/index.html` —— 在发布时镜像至仓库根目录的 `index.html`,用于 **Settings → Pages → Deploy from branch → `main` / `(root)`**。
## 存在的意义
DIOSCURI 是 [AICOM 生态系统](https://magic-ai-factory.com) 的社区代理 —— AI Factory、
AIMarket 代理经济、可验证的预言机(oracle)、ARGUS 代理。它们从持续同步的知识库中回答问题,在严格的限制下进行审核,并在两个平台上发布版本公告 —— 同时作为**生态系统安全实践在公开且充满敌意的输入表面的参考部署**:每一条消息和每一个同步的文档都被视为潜在的提示词注入(prompt-injection)攻击。
## 功能
| 功能 | 含义 |
|---|---|
| 双子人格 + 交叉推广 | 一个进程,两种声音;每个双子自然地指向其兄弟的频道(轮换推广语,发布扇出) |
| 自更新知识库 | MNEMOSYNE 从 GitHub 同步 README、版本发布、仓库元数据,**以及每个仓库 14 天的近期提交摘要**,采用感知 ETag 的获取方式,并在导入时进行**有害文档过滤** —— 双子讨论的是昨天推出了什么,而不仅仅是发布了什么版本 |
| 实时项目展示 | 对生态系统的公共演示端点进行只读轮询,将几分钟前的 **LIVE 状态快照**输入到知识库中 —— “现在正在运行什么?”会以事实来回答(配置驱动的 `showcase.sources`;看起来像密钥的 JSON 键永远不会被导入) |
| 无工具的 Q&A 大脑 | 检索是确定性的,发生在模型调用*之前*;模型只能生成文本 —— 公开路径在结构上不执行任何操作 |
| 分层注入防火墙 (EN + RU) | NFKC 规范化、控制/零宽字符剥离、标记中和、双语签名检测、围栏数据提示、输出防护 |
| 确定性优先审核 | 硬性规则做决定;LLM 分类器仅供参考。操作上限:警告 / 删除 / 暂时禁言(默认 ≤10 分钟) / 上报 —— **绝不自动封禁** |
| 哈希链审计 | 每一个重要的操作都会被追加到 `audit.jsonl` 中;每个条目通过 SHA-256 承接其前序条目;`verify()` 会精准定位第一行被篡改的数据 |
| 成本与速率防护 | 每用户和每频道的速率限制,加上每日 LLM 调用预算 |
| 语言镜像 | 使用提问的语言进行回复(俄语 → 俄语);不确定时默认为英语 |
| Docker 加固 | 非 root 用户、只读 rootfs、`cap_drop: ALL`、`no-new-privileges`、内存/CPU 限制、健康检查 |
| KERYX 联合发布(仅发布) | 发布公告扇出到 **Bluesky / Mastodon**(免费、对机器人友好),并可选扇出到 **X**(明确的按需付费开启);在 **dev.to** 上发布每月摘要文章;Discord 公告会自动发布,以便其他服务器关注;为管理员提供 DISBOARD 凸起**提醒**(绝不自动凸起)。任何地方都没有互动自动化 —— 仅发布到自己的账户 |
## 快速开始 (Docker)
```
cp dioscuri.config.example.json dioscuri.config.json # then edit to taste
cp .env.example .env # add your secrets
docker compose up -d --build
```
然后检查 `http://localhost:8790/health`。任一平台的 token 都可以留空
—— 对应的双子只会保持休眠状态。
## 快速开始(本地开发)
```
npm ci
cp dioscuri.config.example.json dioscuri.config.json
cp .env.example .env
npm run dev
```
还没有 token?`DIOSCURI_DRY_RUN=1 npm run dev` 将以**零 token** 启动整个服务:
适配器保持关闭,知识库和健康检查端点正常运行。
## 配置
密钥存在于环境变量 (`.env`) 中;非密钥的配置调整存在于
`dioscuri.config.json` (在 Docker 中以只读方式挂载)中。密钥绝不能放在 JSON 文件中。
### 环境变量 (`.env.example`)
| 变量 | 用途 | 默认值 |
|---|---|---|
| `TELEGRAM_BOT_TOKEN` | Castor 的 bot token;为空 = Telegram 双子休眠 | — |
| `TELEGRAM_CHAT_ID` | 用于发布公告的主要 Telegram 聊天/频道 | — |
| `DISCORD_BOT_TOKEN` | Pollux 的 bot token;为空 = Discord 双子休眠 | — |
| `DISCORD_GUILD_ID` | 要在其中运作的 Discord 服务器 (guild) | — |
| `DISCORD_MOD_LOG_CHANNEL_ID` | 接收审核操作日志的频道 | — |
| `DISCORD_ANNOUNCE_CHANNEL_ID` | 用于发布版本和推广帖子的频道 | — |
| `DIOSCURI_LLM_PROVIDER` | `deepseek` \| `anthropic` \| `openai-compatible` | `deepseek` |
| `DEEPSEEK_API_KEY` | provider 为 `deepseek` 时的 API key | — |
| `ANTHROPIC_API_KEY` | provider 为 `anthropic` 时的 API key | — |
| `DIOSCURI_LLM_API_KEY` | 用于 `openai-compatible` 端点的 API key | — |
| `DIOSCURI_LLM_MODEL` | 模型覆盖 | 取决于 provider |
| `DIOSCURI_LLM_BASE_URL` | 端点覆盖 | 取决于 provider |
| `DIOSCURI_LLM_TIMEOUT_MS` | LLM 请求超时 | `30000` |
| `GITHUB_TOKEN` | 可选的只读 PAT;将 GitHub API 限制从 60/h 提升至 5000/h | — |
| `DIOSCURI_HTTP_PORT` | 健康检查端点端口 | `8790` |
| `DIOSCURI_DATA_DIR` | 可写状态目录(审计链、KB 缓存) | `./data` (Docker 中为 `/data`) |
| `DIOSCURI_LOG_LEVEL` | `debug` \| `info` \| `warn` \| `error` | `info` |
| `DIOSCURI_CONFIG` | 配置 JSON 的路径 | `dioscuri.config.json` |
| `DIOSCURI_DRY_RUN` | `1` = 无需 token;仅运行 KB + 健康检查 | off |
| `TELEGRAM_DISABLED` / `DISCORD_DISABLED` | `1` = 强制其中一个双子休眠 | off |
### 配置文件 (`dioscuri.config.json`)
| 键 | 用途 | 默认值 |
|---|---|---|
| `githubOwner` | 其仓库为 MNEMOSYNE 提供数据的 GitHub 所有者 | `alexar76` |
| `githubRepos` | 显式仓库白名单;为空 = 所有者的所有公开仓库 | `[]` |
| `kbSyncIntervalMin` | 知识库同步遍历之间的分钟数 | `30` |
| `promoIntervalHours` | 交叉推广帖子之间的小时数(±20% 抖动);`0` 禁用 | `12` |
| `maxLlmCallsPerDay` | 每个 UTC 日内的最大 Q&A LLM 调用次数(成本防护) | `2000` |
| `userRatePerMin` | 每位用户每分钟的 Q&A 消息数 | `4` |
| `channelRatePerMin` | 每个频道每分钟的 Q&A 消息数(全局洪水阀门) | `20` |
| `moderation.enabled` | 审核总开关 | `true` |
| `moderation.llmClassifier` | 运行 LLM 分类器(仅在触发确定性风险信号后) | `true` |
| `moderation.deleteConfidence` | 允许删除操作前的分类器置信度下限 | `0.8` |
| `moderation.maxTimeoutMs` | 自动暂时禁言的硬性上限 | `600000` (10 分钟) |
| `moderation.linkAllowlist` | 链接中允许的域名;为空 = 允许除黑名单外的所有域名 | `[]` |
| `moderation.linkDenylist` | 始终被视为敌对的域名 | 短链接/记录器 |
| `links.discordInvite` | 官方 Discord 邀请链接(双生子唯一可以发布的链接) | — |
| `links.telegramChannel` | 官方 Telegram 频道链接 | — |
| `links.siteUrl` | 生态系统站点 | `https://magic-ai-factory.com` |
| `links.githubOrg` | 生态系统 GitHub | `https://github.com/alexar76` |
## 架构
```
flowchart TD
TG["Telegram (grammY)"] --> CA["CASTOR adapter"]
DS["Discord (discord.js)"] --> PX["POLLUX adapter"]
CA -- "raw messages = UNTRUSTED" --> CORE["MODERATION — deterministic rules first, LLM advisory-only
BRAIN — tool-less Q&A"] PX -- "raw messages = UNTRUSTED" --> CORE CORE --> AE["AEGIS — sanitize + firewall"] CORE --> KB["MNEMOSYNE — KB self-synced from GitHub"] AE -- "fenced DATA prompt" --> LLM["LLM client — deepseek / anthropic / openai-compat"] KB -- "fenced DATA prompt" --> LLM subgraph RAILS["Side rails"] HL["HEALTH — GET /health :8790 (liveness + KB stats)"] AU["AUDIT — /data/audit.jsonl (SHA-256 hash chain + verify)"] end CORE -.-> AU ``` 所有模块都通过 [`src/types.ts`](src/types.ts) 中的接口进行通信,并由 `src/index.ts` 中的依赖注入组装在一起。详情:[docs/architecture.md](docs/architecture.md)。 ## 文档 | 文档 | 涵盖内容 | |---|---| | [docs/runbook.md](docs/runbook.md) | **运维手册** —— 10 分钟快速入门、token、次日运维、故障排除 ([RU 版本](docs/runbook-ru.md)) | | [docs/setup.md](docs/setup.md) | 完整的设置和部署 —— token、环境、Docker、首次启动 | | [docs/usage.md](docs/usage.md) | 操作员手册 —— 日常操作、命令、调整 | | [docs/use-cases.md](docs/use-cases.md) | 场景 —— 双子在实践中的实际处理情况 | | [docs/architecture.md](docs/architecture.md) | 模块图、DI 装配、五大数据流、启动顺序、部署拓扑 | | [docs/security.md](docs/security.md) | 威胁模型、十层防御、诚实的残留风险 | | [docs/content-plan.md](docs/content-plan.md) | THEOXENIA 内容与营销计划 —— 定位、支柱、日历 | ## 安全模型 十个层次,从 Unicode 清理到容器加固 —— 简短版本: 1. 每一段不受信任的文本(聊天消息、GitHub 文档)都会被净化(NFKC、控制/零宽字符剥离、标记中和)。 2. 一个双语 (EN+RU) 签名防火墙会在任何模型调用之前拒绝已知的注入措辞。 3. 存活下来的内容会在 prompt 中被围栏化为 **DATA** —— 系统 prompt 禁止服从它。 4. 公开的 Q&A 路径没有工具;模型只能生成文本。 5. 审核操作具有硬性上限 —— 警告/删除/暂时禁言/上报;封禁不在操作空间内。 6. 所有重要的操作都会记入哈希链的、防篡改的审计日志中。 完整的威胁模型、到代码的逐层映射以及诚实的残留风险: [docs/security.md](docs/security.md)。 **生态系统:** [主页](https://alexar76.github.io/dioscuri/) · [magic-ai-factory.com](https://magic-ai-factory.com) · [Alien Monitor](https://magic-ai-factory.com/monitor/) (DIOSCURI 图节点) · [github.com/alexar76/dioscuri](https://github.com/alexar76/dioscuri) · [集成指南](../docs/ecosystem/dioscuri-integration.md) **AICOM 生态系统的一部分** —— [magic-ai-factory.com](https://magic-ai-factory.com) · [github.com/alexar76](https://github.com/alexar76)
BRAIN — tool-less Q&A"] PX -- "raw messages = UNTRUSTED" --> CORE CORE --> AE["AEGIS — sanitize + firewall"] CORE --> KB["MNEMOSYNE — KB self-synced from GitHub"] AE -- "fenced DATA prompt" --> LLM["LLM client — deepseek / anthropic / openai-compat"] KB -- "fenced DATA prompt" --> LLM subgraph RAILS["Side rails"] HL["HEALTH — GET /health :8790 (liveness + KB stats)"] AU["AUDIT — /data/audit.jsonl (SHA-256 hash chain + verify)"] end CORE -.-> AU ``` 所有模块都通过 [`src/types.ts`](src/types.ts) 中的接口进行通信,并由 `src/index.ts` 中的依赖注入组装在一起。详情:[docs/architecture.md](docs/architecture.md)。 ## 文档 | 文档 | 涵盖内容 | |---|---| | [docs/runbook.md](docs/runbook.md) | **运维手册** —— 10 分钟快速入门、token、次日运维、故障排除 ([RU 版本](docs/runbook-ru.md)) | | [docs/setup.md](docs/setup.md) | 完整的设置和部署 —— token、环境、Docker、首次启动 | | [docs/usage.md](docs/usage.md) | 操作员手册 —— 日常操作、命令、调整 | | [docs/use-cases.md](docs/use-cases.md) | 场景 —— 双子在实践中的实际处理情况 | | [docs/architecture.md](docs/architecture.md) | 模块图、DI 装配、五大数据流、启动顺序、部署拓扑 | | [docs/security.md](docs/security.md) | 威胁模型、十层防御、诚实的残留风险 | | [docs/content-plan.md](docs/content-plan.md) | THEOXENIA 内容与营销计划 —— 定位、支柱、日历 | ## 安全模型 十个层次,从 Unicode 清理到容器加固 —— 简短版本: 1. 每一段不受信任的文本(聊天消息、GitHub 文档)都会被净化(NFKC、控制/零宽字符剥离、标记中和)。 2. 一个双语 (EN+RU) 签名防火墙会在任何模型调用之前拒绝已知的注入措辞。 3. 存活下来的内容会在 prompt 中被围栏化为 **DATA** —— 系统 prompt 禁止服从它。 4. 公开的 Q&A 路径没有工具;模型只能生成文本。 5. 审核操作具有硬性上限 —— 警告/删除/暂时禁言/上报;封禁不在操作空间内。 6. 所有重要的操作都会记入哈希链的、防篡改的审计日志中。 完整的威胁模型、到代码的逐层映射以及诚实的残留风险: [docs/security.md](docs/security.md)。 **生态系统:** [主页](https://alexar76.github.io/dioscuri/) · [magic-ai-factory.com](https://magic-ai-factory.com) · [Alien Monitor](https://magic-ai-factory.com/monitor/) (DIOSCURI 图节点) · [github.com/alexar76/dioscuri](https://github.com/alexar76/dioscuri) · [集成指南](../docs/ecosystem/dioscuri-integration.md) **AICOM 生态系统的一部分** —— [magic-ai-factory.com](https://magic-ai-factory.com) · [github.com/alexar76](https://github.com/alexar76)
标签:Discord, LLM提示词注入防御, MITM代理, Petitpotam, Telegram, TypeScript, 人工智能, 安全插件, 用户模式Hook绕过, 社区机器人, 自动化攻击, 请求拦截