alexar76/dioscuri

GitHub: alexar76/dioscuri

一个同时接入 Telegram 和 Discord 的双平台社区 AI 代理框架,通过 GitHub 同步的共享知识库提供问答服务,并内置提示词注入防护与内容审核机制。

Stars: 0 | Forks: 0

# DIOSCURI —— 一个心智,两片天空 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/alexar76/dioscuri/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Node](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](package.json) [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178c6.svg)](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)
标签:Discord, LLM提示词注入防御, MITM代理, Petitpotam, Telegram, TypeScript, 人工智能, 安全插件, 用户模式Hook绕过, 社区机器人, 自动化攻击, 请求拦截