站点设置与内容审核
本页覆盖管理后台里"面向全站"的运营配置:全局设置页的每一项开关,以及公告、登录方式、技能、语音转写、上传限额、沙箱回收这些分散在各标签页的站点级配置,最后是内容审核体系。所有设置都保存在数据库的 settings 表中,点击「保存」后对后续请求即时生效,无需重启容器。
进入方式:管理后台左侧「系统」菜单,默认落在「全局设置」标签(路径 /admin/settings)。本页涉及的其他标签页会在各节标注路径。
全局设置(系统 > 全局设置)
模型指定
| 字段 | 默认 | 说明 |
|---|---|---|
| 默认对话模型 | (空) | 新用户与新会话的初始模型。全新部署必须先在渠道与模型里建好模型再回来指定 |
| 任务模型(内部 LLM 调用) | (空) | 用于标题生成、查询路由、压缩摘要、记忆抽取等内部小调用,建议指定一个便宜快速的模型 |
| 图片提示词模型 | 无 | 绘图前润色提示词的文本模型,选「无」则跳过润色、按确定性规则拼接 |
| 审校(审计)模型 | 无 | 审校模式下核查答案的第二个模型,理想是与主模型不同厂商的强模型;选「无」则全站关闭审校模式 |
| 兜底模型 | 关闭 | 所选模型在「首字超时」秒数内毫无输出时,切断上游改用它回答,用户无感、界面仍显示原模型 |
| 首字超时(秒) | 0 | 与兜底模型配套,0 = 关闭。仅在首个 token 之前触发,已开始输出的回复绝不切换 |
长上下文压缩
对话超长时,系统用任务模型把较早的轮次滚动压缩成摘要,近期轮次逐字保留,从而控制每轮的输入 token 成本。
| 字段 | 键 | 默认 | 说明 |
|---|---|---|---|
| 启用压缩 | compaction_enabled | 开 | 总开关 |
| 保留最近轮数 | keep_recent_rounds | 6 | 摘要永远不吞掉最近这几轮,它们逐字发送 |
| 超过多少 token 时压缩 | compaction_token_trigger | 32000 | 整个提示(系统提示 + 工具定义 + 历史 + 本轮注入的文件内容)超过该 token 数才触发压缩;0 = 关闭 token 触发 |
| 摘要 token 预算 | summary_max_tokens | 8192 | 压缩摘要本身的输出上限 |
几个行为要点:
- 摘要生成默认异步进行,不阻塞当前回复的首字;只有上下文严重超标(真实计数超过阈值 1.25 倍)时才会在当轮内联压缩,把本轮提示立即压下去。
- 触发器统计的是真正会发送的内容,包含本轮临时注入的 RAG / 文件文本。
- 压缩调用以「上下文压缩」用途计入用量报表,费用记在触发压缩的发送者名下。
压缩只能缩减较早的对话轮次。上传的文件内容是每轮临时注入提示的,压缩永远缩不掉它;大文件的成本应该在「能力 > 文档」页用 RAG 全文阈值和 Top-K 参数控制(只注入相关切块),而不是调低压缩阈值。
注册与账号门槛
| 字段 | 键 | 默认 | 说明 |
|---|---|---|---|
| 开放新注册 | signup_open | 开 | 关闭后新用户无法自行注册,管理员仍可在用户页手工建号 |
| 注册需要验证码 | register_captcha_required | 关 | 开启后注册前弹出滑块拼图验证。验证通过签发一个 10 分钟有效的签名通行 token,注册请求携带它提交,多副本部署与服务重启都不影响 |
| 单 IP 每日注册上限 | register_ip_daily_limit | 0 | 同一 IP 每天最多创建的账号数,0 = 不限制。这是比验证码更硬的反批量注册闸 |
| 要求邮箱验证 | email_verification_required | 关 | 开启后新注册用户需输入发送到邮箱的 6 位验证码才能登录;输满 6 位自动提交。同一邮箱连错 5 次验证码即作废,需重新发送 |
| 允许注册的邮箱域名 | email_domain_whitelist | (空) | 逗号分隔,仅列出的域名可注册;留空允许所有域名 |
邮件(SMTP)
用于发送邮箱验证码和密码重置邮件。
| 字段 | 默认 | 说明 |
|---|---|---|
| SMTP 服务器 | (空) | 如 smtp.qq.com、smtp.163.com、smtp.gmail.com |
| 端口 | 587 | 587(STARTTLS)或 465(TLS) |
| 用户名 | (空) | SMTP 登录账号 |
| 密码 | (空) | 授权码或 API Key,保存后界面显示为掩码 |
| 发件人地址 | (空) | 收件人看到的发件人,留空使用用户名 |
| 直连 TLS(465 端口) | 关 | 465 端口开启;587 走 STARTTLS,保持关闭 |
「要求邮箱验证」依赖这套 SMTP 配置发码。如果 SMTP 尚未配置或配置错误,新注册用户将收不到验证码、无法完成登录。建议先用一个测试账号跑通注册验证流程,再对外开放。
每日限额与积分预检
| 字段 | 键 | 默认 | 说明 |
|---|---|---|---|
| 每日消息上限 | daily_message_limit | 200 | 每用户每天(UTC 自然日)可发送的消息数,计数器在 UTC 午夜清零;0 = 不限制 |
| 每日图片上限 | daily_image_limit | 30 | 每用户每天可生成的图片张数,绘图模式与聊天中调用图片工具共用同一额度池 |
| 预估并拦截余额不足的请求 | credit_preflight_enabled | 开 | 见下 |
积分预检的语义:对走积分扣费(非免费额度)的回合,系统在装配好真实请求(系统提示 + 工具定义 + 含 RAG / 文件注入的完整历史)之后、调用模型之前,估算输入 token 并预留固定 2000 token 输出,按积分汇率换算成预计积分;若超过用户当前可用余额(时效积分 + 永久积分),直接以「积分不足」拒绝,不产生任何上游调用与扣费。积分系统未启用(汇率为 0)时该检查自动跳过。更细的按模型 / 按用户组额度与积分体系见用户、配额与积分。
公告(系统 > 公告)
公告页(/admin/announcement)管理两种相互独立的通知形态,共用一次「保存」。
弹窗公告
| 字段 | 说明 |
|---|---|
| 显示公告 | 总开关,关闭后不显示弹窗 |
| 文字 | 公告正文,支持 HTML,换行用 <br>;渲染前经过服务端白名单消毒 |
| 图片(可选) | 粘贴链接或直接上传 PNG/JPG。服务端硬限 256 KB,前端会先把大图自动压缩(最长边缩到 1280px、JPEG 逐级降质到约 240 KB 以内)再上传;配置了图片即为"图片公告",弹窗内图左文右 |
| 记住用户的关闭 | 默认开。关闭该项后,公告每次访问都会再次弹出 |
每次保存都会更新公告版本号:已经关闭过旧公告的用户,会在下次加载时重新看到编辑后的内容。
置顶公告条
主界面最顶部的一条细横幅,与弹窗公告互相独立:
- 「启用置顶公告条」开关 + 单行 HTML 内容,支持
<a href="...">链接</a>,建议保持简短。 - 用户可以手动关闭公告条,关闭状态按内容版本记忆:只有公告条自身内容变化时才会重新弹给已关闭的用户,只改弹窗公告不会打扰他们。
- 编辑区下方有实时预览。
登录方式(系统 > 登录方式)
OAuth 提供商管理页(/admin/oauth)配置第三方登录。配置并启用后,登录页出现对应按钮;用户也可以在「设置 > 账户」把第三方账号绑定到已有账号。
提供商类型与字段
内置三种品牌类型只需要客户端凭据,自定义 OIDC 需要补全端点:
| 类型 | 必填字段 | 说明 |
|---|---|---|
| Client ID、Client Secret | 在 Google Cloud 的「凭据」页创建 OAuth 客户端 | |
| GitHub | Client ID、Client Secret | 在 GitHub 开发者设置的 OAuth Apps 里创建 |
| Apple | Client ID(Services ID)、私钥(.p8)、Team ID、Key ID | 在 Apple Developer 创建 Services ID 与 AuthKey |
| 自定义(OAuth2 / OIDC) | Client ID、Client Secret、授权地址、令牌地址、用户信息地址、Scopes | Scopes 空格分隔,留空用默认(如 openid email profile);可自定义按钮图标 |
通用字段:按钮文字(登录页显示的名称)、启用开关(禁用后登录页不再显示该按钮,已通过它创建的账号仍可用密码或其他方式登录)。编辑已有提供商时 Client Secret 留空表示保留原密钥。
回调地址(Redirect URI)
每个提供商保存后,编辑弹窗顶部会生成需要登记到第三方控制台的回调地址,格式为:
https://你的域名/api/auth/oauth/<提供商ID>/callback
旁边有一键复制按钮。新建提供商时要先保存才会生成该地址(ID 由系统分配)。第三方控制台里登记的回调必须与它完全一致,否则授权跳转会被拒绝。
站点绑定多个域名而第三方只允许登记一个回调地址时,用环境变量 OAUTH_CALLBACK_BASE_URL 固定回调域名、OAUTH_RETURN_ORIGINS 列出允许跳回的其他域名,详见核心环境变量。单域名部署不需要设置这两项。
绑定与冲突规则
- 同一个第三方账号(同一 provider + subject)只能归属一个本地账号:它已经登录或绑定过账号 A,账号 B 再尝试绑定会报冲突,绝不覆盖改派。
- 没有设置过密码、且只剩最后一条第三方身份源的账号,不允许解绑(防止把自己锁在门外)。
技能管理(能力 > 技能)
技能(/admin/skills)是一段可复用的任务说明加可选的脚本 / 模板资产,模型在相关任务时按需加载。
| 字段 | 说明 |
|---|---|
| 名称 | 技能名,不可与现有技能重名 |
| 何时使用(一句话) | 注入系统提示索引的触发描述,直接决定模型的召回率,要写成明确的触发条件 |
| 完整指令(Markdown) | 技能正文,即 SKILL.md 主体 |
| 从 SKILL.md 导入 | 粘贴带 YAML frontmatter 的 SKILL.md,点「解析并填充」自动填充名称 / 描述 / 指令 |
| 资产(模板 / 脚本) | 可选文件,技能被加载时拷入沙箱 /workspace/skills/<名称>/ 供 Python 执行使用 |
| 启用 | 禁用的技能不注入索引、不可被加载 |
资产上传的限制:单文件 20 MB 上限;扩展名白名单只收 Office 模板(pptx/docx/xlsx)、常见数据与文本格式(pdf/csv/tsv/json/txt/md)、脚本(py/html/css)和常见图片,不接受压缩包。
技能建好后还需要绑定到模型:在模型编辑页(仅对话模型)勾选该模型支持的技能。运行时采用渐进式披露,系统提示里只注入每个已绑定技能的一行索引(名称 + 何时使用),模型判断相关时调用 use_skill 工具获取完整指令并拷入资产;不支持工具调用的模型则把勾选技能的完整指令直接内联进系统提示,这类模型建议少勾技能。
系统内置一个名为 document-generation 的代码级技能(PDF/PPT/DOCX 生成配方),不在技能列表里、无法删除。如果创建一个同名的管理员技能,它会遮蔽内置版本,可用于定制文档生成行为。
语音转写(能力 > 语音)
语音页(/admin/audio)配置输入框麦克风的语音转文字,走 OpenAI 兼容的转写接口。
| 字段 | 默认 | 说明 |
|---|---|---|
| 转写模型 | whisper-1 | 作为 model 字段发给上游 |
| Base URL | https://api.openai.com | 可指向任意 OpenAI 兼容的音频端点,后端拼接为 {Base URL}/v1/audio/transcriptions |
| API Key | (空) | 上游 Bearer 密钥。留空即禁用语音输入 |
限流与限制(转写走管理员的上游账号计费,这些护栏防滥用):
| 限制 | 值 |
|---|---|
| 单段音频大小 | 25 MiB |
| 每用户请求频率 | 20 次 / 分钟,超出返回 429 |
文档上传大小(能力 > 文档)
文档页(/admin/documents)中与上传大小相关的两项,图片与非图片分开设定:
| 字段 | 键 | 默认 | 说明 |
|---|---|---|---|
| 图片大小上限(MB) | max_image_upload_mb | 5 | 超限图片在上传时被 413 拒绝。0 = 默认(5 MB) |
| 文件大小上限(MB,非图片) | max_file_upload_mb | (空) | PDF、DOCX、CSV 等非图片文件的上限。0 或留空 = 回退到服务器上传上限 |
环境变量 MAX_UPLOAD_BYTES(默认 50 MB)是绝对上限:管理员在这里只能收紧、不能放宽,见核心环境变量。前端在用户选择文件时就按这两个值预检并提示,不发起无效上传;服务端在写盘前后各校验一次。凡是通过上传校验的图片,聊天时都会完整内联给视觉模型,不会再被静默丢弃。
同页还有允许上传的扩展名白名单;常见图片格式(png/jpg/jpeg/gif/webp/bmp/tiff/heic/avif 等)无条件放行,白名单只约束文档 / 代码 / 数据类文件。
沙箱回收与存储后端
沙箱连接与执行参数在「能力 > 工具」页,归档存储在「能力 > 文档」页。整体机制与部署细节见沙箱部署。
回收(能力 > 工具)
| 字段 | 键 | 默认 | 说明 |
|---|---|---|---|
| 执行超时(秒) | sandbox_exec_timeout_sec | 120 | 单次代码运行的最长秒数,范围 10 到 600 |
| 闲置回收(秒) | sandbox_idle_ttl_sec | 1800 | 沙箱容器闲置这么多秒后被回收,范围 60 到 86400。回收前会先把 /workspace 打包归档 |
归档以会话 ID 为键:同一对话下次再执行代码时,新容器会自动恢复上次的工作区文件,回收对用户透明。管理员在会话查看页可以「清空沙箱」,这是真正的抹除,连归档一起删除、不会被恢复找回。
存储后端(能力 > 文档)
| 字段 | 说明 |
|---|---|
| 存储类型 | 本机磁盘(默认)/ Amazon S3 或兼容 / 阿里云 OSS / 禁用 |
| 对象前缀 | 归档对象 Key 前缀,如 workspaces/ |
| 归档清理(天) | 默认 30。超过该天数未再活跃的归档自动删除,0 = 永久保留;活跃对话每次回收都会刷新时间戳,不会被误删 |
- 本机磁盘:零配置持久化,归档写入沙箱服务挂载的卷(
SANDBOX_LOCAL_STORAGE_DIR)。仅适用于单节点;MinerU 文档解析仍需要对象存储(本机模式不支持预签名 URL)。 - S3 兼容:Bucket / Region / Endpoint / Access Key / Secret Key。MinIO、Ceph 等自建对象存储填自定义 Endpoint 即可用。
- 阿里云 OSS:Bucket / Endpoint / AccessKey ID / AccessKey Secret。
内容审核
内容审核分两级配置:是否审、用哪种模式是每个模型自己的开关(模型编辑页);关键词表、审核模型、违规类型、拦截文案是全局素材,在「系统 > 内容审核」页(/admin/moderation)维护。
全局配置项
| 字段 | 键 | 默认 | 说明 |
|---|---|---|---|
| 违规关键词 | moderation_keywords | (空) | 每行一个,命中即拦截 |
| 审核模型 | moderation_model_id | 未选择 | 「模型」模式下做放行 / 拦截判定的对话模型 |
| 违规类型 | moderation_categories | politics、pornography、violence or gore、terrorism、illegal activity、hate speech、self-harm | 每行一个类别,仅「模型」模式使用 |
| 拦截提示语 | moderation_message | Your message was blocked by content moderation. Please rephrase and try again. | 拦截时展示给用户的文字,可改成任何语言的自定义文案 |
关键词模式
对用户消息做两路匹配:一路小写子串匹配,一路归一化匹配(把常见字符替换折叠回字母,如 0→o、1→i、3→e、4→a、5→s、7→t、@→a、$→s,并去掉标点与空格),能挡住最简单的变体规避。任一路命中即拦截并返回拦截提示语。
模型模式
把用户消息发给指定的审核模型做零上下文分类,要求只回答一个词(ALLOW 或 BLOCK)。配置了违规类型时,分类提示会明确列出这些类别、只按类别判定;未配置则用通用安全分类提示。两条兜底规则:
- 审核模型未配置或调用出错时,自动回退到关键词筛查,开启审核永远不会静默失去保护;
- 基础设施层面的错误(超时、上游故障)不会硬拦正常对话,判定失败按放行处理(fail-open),只有明确的 BLOCK 才拦截。
范围与计费口径
- 审核发生在生成之前,只筛查当条用户提示,不包含历史消息;图片生成的提示词同样经过审核。
- 被拦截的消息不计入每日次数、不扣积分,不产生主模型调用。
- 审核模型自身的判定调用会以「内容审核」用途记入用量报表(输出仅一个词,成本极低),见用量与分析。
审核开关是按模型的:可以只对开放注册用户可用的默认模型开启「模型」模式审核,对内部付费用户的高级模型关闭审核或仅保留关键词模式,互不影响。