跳到主要内容
奇点CMS v0.4.66 · 官方网站 登录 / 注册 在线激活

更新日志

版本发布逐版本列出变更说明,站点公告按置顶与时间倒序排列,共 93 条记录;升级前请先阅读对应版本的变更说明与升级步骤。

版本发布 93 条 站点公告 0 条
  • v0.4.54

    修复"运行环境下载不了"

    随交付包发布

    现象:点「下载安装包」后一直转圈 / 任务永远"进行中",安装包始终是 0 字节。

    查看完整变更

    现象:点「下载安装包」后一直转圈 / 任务永远"进行中",安装包始终是 0 字节。

    一、诊断(有据)

    证据结论
    你那次点击的任务日志卡在 0 字节 25 秒后 curl: (56) Recv failure: Connection was reset
    ollama.com/download/OllamaSetup.exe307 → GitHub Release(objects.githubusercontent.com)
    实测下载速度ollama 官网直链 4.7 KB/s;GitHub 直链 27 KB/s;gh-proxy.com 镜像 46 KB/s;另两个镜像不可用
    registry.ollama.ai(模型仓库)200 ✓ —— 模型拉取链路正常,只有安装包链路被卡

    → 700MB 按实测速度需 4 小时以上,且连接会被重置;这是网络链路问题,不是页面 bug。

    二、同时修掉的 3 个真实代码缺陷

    #缺陷后果修法
    1任务脚本里写了 if exist X (echo 完成) else (echo 失败) >> log重定向只作用于 else 分支,且该写法语法中止 → 退出标记从未写入 → 任务永远"进行中"抽出 buildBatScript():顺序命令 + 每行独立重定向 + 末尾无条件写退出标记
    2用 pclose(popen('start /B …')) 启动后台任务pclose 会等待子进程关闭继承的 stdout 管道 → 长时间下载会把 PHP/AJAX 请求挂住数小时(浏览器一直转圈)改用 PowerShell Start-Process -WindowStyle Hidden 真分离(回归测试:60 秒任务 0.96 秒返回)
    3任务状态读取整份日志长下载日志数十 MB → 拖垮请求只读日志尾部 256KB + 僵尸判定(日志 5 分钟无变化即视为已结束)

    三、本次新增能力

    能力说明
    多来源自动回退gh-proxy 镜像 → GitHub 直链 → ollama 官网 → ghproxy 镜像(按实测速度排序)
    断点续传curl -C -,可反复点「继续 / 重试下载」,已下载部分不白费
    自动重试--retry 3 --retry-all-errors,连接被重置会自动重连
    数字签名校验下载后自动 Get-AuthenticodeSignature,必须 Valid 且签发者含 Ollama(第三方镜像的安全性由此兜底);页面新增「校验安装包」按钮
    手动放置在别的网络环境下载 OllamaSetup.exe,放到服务器 data/model_jobs/ 后点「校验安装包」即可(最快的办法)
    停止下载新增「停止下载」按钮(白名单式只结束 curl/powershell,保留已下载部分)
    dryRundownloadInstaller(true) 只生成脚本不启动,便于自检与预览

    四、验证 → 26 / 26 通过

    A. 多源列表:4 个来源,首选为实测最快的镜像 ✓
    B. 脚本生成:含 -C - / goto 多源回退 / --retry-all-errors / 签名校验 ✓
       ★ 不再有 if exist…else…>> 陷阱 ✓   ★ 退出标记无条件写入 ✓   dryRun 不产生真实任务 ✓
    C. 断点续传:检测到部分文件时提示续传 ✓
    D. 僵尸任务:日志 400 秒无变化 → 不再显示"进行中" ✓
    E. 安装包校验:不存在/体积不足 均正确拒绝 ✓
    F. 页面/端点:200 无报错、含继续下载+校验+停止+手动放置说明与实测网速提示 ✓
       verify / stop / status 端点均正常 ✓
    回归:60 秒长任务 startJob 返回 0.96s(不再阻塞请求)✓

    五、你要怎么做(两条路,任选)

    1. 推荐(最快):在手机/电脑(可开加速)下载 OllamaSetup.exe,拷到服务器 D:\wwwroot\qdcms\data\model_jobs\,回页面点「校验安装包」,通过后双击安装 → 点「启动服务」→ 再下载模型(模型仓库链路实测正常)。
    2. 让服务器自己下:已为你在后台启动了下载(可断点续传),页面会显示进度;数小时后若中断,回来再点一次「继续 / 重试下载」即可。
  • v0.4.53

    把站内百科与问答接入知识库检索

    随交付包发布

    需求:"将站内的百科和问答接入知识库检索"。

    查看完整变更

    需求:"将站内的百科和问答接入知识库检索"。

    一、之前的状况

    项状况
    知识库只有 8 条问答 + 7 条站点事实,百科词条完全没进去
    百科表encyclopedia 有 3 条已发布词条(长城 / 人工智能 / 唐诗),Agent 完全不知道
    片段表agent_knowledge_fragments 0 条 —— 代码里 fragment() 方法从未被调用,长内容的片段级检索等于没有
    增量原来只按"标题哈希"去重,内容改了不会更新,标题改了还会重复

    二、改动

    #文件改动
    1includes/AgentKnowledge.php① ingestFact() 支持 source_id 主键去重 + 内容变更自动 UPDATE + 长内容自动写片段(refreshFragments,先清后建幂等);② 新增 ingestEncyclopedia()(取标题+摘要+正文+标签,非已发布状态自动移除)、ingestQaQuestion()(题目+补充+已采纳优先的回答)、removeKnowledge()、syncEncyclopedia()、syncQa()、syncSiteContent()(一键同步,幂等);③ autoSeedSite() 现在一并同步百科 → 新装站点也"部署即用"
    2admin/encyclopedia.php保存 / 新建 / 审核通过 → 自动入库;下架 → 自动移出知识库
    3encyclopedia-edit.php(前台编辑)编辑 / 新建词条保存后自动入库
    4includes/fn-qa.phpaddQaAnswer() 提交回答、acceptQaAnswer() 采纳回答 → 自动同步该问题到知识库
    5admin/qa.php关闭问题 → 移出知识库;恢复问题 → 重新入库
    6admin/workbench.php + ajax-workbench.php知识库卡片新增「同步百科与问答」按钮(新动作 kb_sync),执行后回显"扫描/新增/更新"明细

    所有钩子都包在 try/catch 里 —— 知识库同步失败绝不影响百科/问答本身的保存。

    三、验证 → 27 / 27 通过

    A. 批量同步:百科扫描 3 → 入库 3;问答扫描 8 → 共 16 条;重复同步新增 0(幂等)✓
    B. 检索:★「长城 防御工程」命中百科词条「长城」✓   片段表从 0 → 6 条(长城自身 2 条)✓   问答可命中 ✓
    C. 增量更新(临时词条,全程用完即删):
       ★ 新建词条 → 立即能被检索到 ✓
       ★ 改内容 → 知识库同步更新且**不新增重复**(条数仍为 1,含新内容)✓
       ★ 下架 → 自动移出知识库,片段一并清理 ✓   临时数据已删 ✓
    D. 问答钩子:临时问题+回答 → ★ 提交回答即自动入库 ✓ → ★ 可被检索命中 ✓ → 临时数据已清理 ✓
    E. 真机端到端:问「长城是什么?」→ source=cloud
       答案:长城又称"万里长城",是中国古代规模浩大的军事防御工程,横跨15个省(区、市),
            总长度超过2.1万千米,1987年列入《世界遗产名录》。它始建于春秋战国,秦始皇连接增筑,
            明代修筑最完善。长城不只是城墙,还包括……      ← **完全来自百科知识库**
    F. 面板/端点:含「同步百科与问答」按钮 ✓  来源分布展示 ✓  无 PHP 报错 ✓  kb_sync 幂等 ✓
    数据卫生:无测试残留(知识库/百科/问答中的"自检"条目均为 0)✓

    四、效果

    • 站内百科词条与问答现在都是 Agent 的事实来源:问「长城是什么」「怎么设置短视频单独价格」都能得到基于站内内容的回答;
    • 增量自动同步:后台改词条、审核通过、下架,前台提交/采纳回答 —— 知识库都会自动跟着变,无需手动维护;
    • 顺手修好片段级检索(此前 0 条数据形同虚设),长词条也能被精准命中。
  • v0.4.52

    网站 Agent 知识库对接模型,实现"部署即用"

    随交付包发布

    需求:"把网站Agent 知识库对接模型,实现部署即用"。

    查看完整变更

    需求:"把网站Agent 知识库对接模型,实现部署即用"。

    一、之前的两个断点

    #问题后果
    1知识库是空的(agent_knowledge 0 条,实测)模型再强也没有"本站事实"可依据,只能泛泛而谈
    2模型完全没读知识库(AiFrontAgent 里搜不到任何 knowledge 相关代码;AgentProcessor 命中知识库时直接返回模板答案,不经模型)知识库与模型各干各的,谈不上"对接"

    二、改动

    #文件改动
    1includes/AgentKnowledge.php新增 ingestFact()、autoSeedSite()(用站点自己的数据自动灌库:站内问答表 8 条问答 + 站点定位/栏目导览、Token 规则、上传限制(取真实常量)、靓号规则、认证、站内信、客服共 7 条事实;按 content_hash 去重,幂等可重复执行)、buildContext()(命中压缩成模型上下文)、contextFor()(一句话完成"检索 + 组上下文");并把原有 stats() 扩展为超集(保留旧字段)
    2includes/AiFrontAgent.php回答前自动检索知识库,命中则把事实作为 system 上下文注入模型(RAG),并在结果里返回 kb_hits / kb_used;无命中或知识库为空时自动跳过 → 部署即用
    3includes/AgentProcessor.php知识库命中时改由模型基于命中内容作答(skill=knowledge+model);模型不可用时静默回落原知识库答案(skill=knowledge)
    4admin/workbench.php + ajax-workbench.php② 页签新增「知识库 ↔ 模型」卡片:条目数/累计命中/今日命中/来源分布 + 一键导入站点知识 + 「检索命中」自检(新动作 kb_seed / kb_stats / kb_probe)

    三、验证 → 27 / 28 直接通过 + 1 项独立进程补验通过

    A. 知识库内容:15 条(site_qa 8 + 站点事实 7)✓  统计字段完整 ✓  **灌库幂等**(二次执行 0 新增)✓
    B. RAG 注入(桩模型查载荷):kb_hits=4 ✓  ★载荷含知识库原文"通用消费凭证" ✓  人设仍在 ✓
       用户问题在载荷 ✓  注入长度 974 字(受控)✓
    C. 无命中时不注入:kb_used=false ✓  上下文无知识库字样 ✓
    D. AgentProcessor:★命中时 skill=knowledge+model(模型按站点事实作答)✓
       独立进程补验:把接口地址改成不可达 → skill=knowledge(**回落知识库原答案**)✓
    E. 真机端到端:问「看短视频要消耗多少 Token?」
       → source=cloud,1047ms/628 tokens
       → 答案:看短视频会消耗 Token,具体金额由系统按内容定价自动扣费,播放前页面会显示价格。想了解余额和扣费明细,
         可登录后进入「Token 记录」查看。如果 Token 不够,在个人中心充值即可。   ← **完全基于本站知识库事实**
    F. 面板/端点:卡片与按钮 ✓  条目数展示 ✓  无 PHP 报错 ✓
       kb_stats total=15 ✓  kb_probe 命中 4 条/768 字上下文 ✓  kb_seed 重复执行 0 新增 ✓
    数据卫生:知识库 15 → 15 未被污染 ✓  模型配置已还原为云端 ✓

    本轮修掉一个自身缺陷:新增的 stats() 与既有同名方法重复声明导致致命错误 → 已改为删除重复实现、把既有 stats() 扩展成超集(保留原字段,避免影响其它调用方)。

    四、效果

    • 部署即用:装上模型(云端或本地皆可)后,点一次「一键导入站点知识」,Agent 立刻能回答"本站怎么用/要花多少 Token/上传限制/靓号/认证/客服"等站点问题 —— 因为回答建立在知识库事实上,而不是模型自由发挥;
    • 知识库为空时也不报错,模型照常回答(自动跳过注入);
    • 知识库内容会随站内问答增长继续补充(原有 autoIngest 仍在工作)。
  • v0.4.51

    本地模型运行环境 + 模型下载部署 + 部署后自动接入 Agent

    随交付包发布

    需求:"给网站增加一个本地模型运行环境和模型下载部署功能,植入模型下载页面,部署后自动接入网站Agent"。

    查看完整变更

    需求:"给网站增加一个本地模型运行环境和模型下载部署功能,植入模型下载页面,部署后自动接入网站Agent"。

    一、选型(基于本机实测)

    探测项结果结论
    是否已装 Ollama未安装、11434 端口未监听需要提供安装与部署流程
    内存 / CPU / GPU7.7 GB(可用 1.9 GB) / i3-1115G4 2 核 / Intel UHD 集显只能跑 0.5B~1.5B 小模型;清单已按此标注
    磁盘 D:可用 111.8 GB空间充足
    ollama.comHTTP 200可下载安装包 ✅
    huggingface.co超时GGUF 直链不可用 → 走 Ollama 官方仓库 ✅

    → 因此运行环境选 Ollama:官网一键安装、自带模型仓库、并暴露 OpenAI 兼容端点 http://127.0.0.1:11434/v1 —— 本站既有 AiClient 零改动即可对接,这是"部署后自动接入"能成立的关键。

    二、新增内容

    #文件说明
    1includes/LocalModel.php(新增)运行环境检测(可执行文件/版本/服务状态/已装模型/内存)、6 个候选模型清单(体积+内存建议)、后台异步任务引擎(安装包下载 / 模型拉取 / 启动服务)、进度解析、接入与回滚(写入 ai_* 配置并备份原云端配置)
    2admin/local-model.php(新增)「本地模型」页面:状态总览 + 三步走(① 下载安装包并启动服务 ② 选模型下载部署(含进度条与日志实时刷新)③ 一键接入网站 Agent / 测试 / 恢复云端配置)
    3admin/ajax-local-model.php(新增)10 个动作(status / download_installer / pull / job / job_clear / serve / activate / revert / test / delete),仅管理员 + CSRF
    4admin/header.php左侧导航顶层新增「本地模型」(与「工作面板」并列)

    接入后立即生效范围:后台「工作面板 → ①」显示本地端点;前台悬浮助手改用本地模型回答(AiFrontAgent 读同一份配置);原云端配置自动备份,可一键恢复。

    三、验证 → 55 / 55 通过

    A. 真实环境检测(本机当前未安装)
       状态结构完整 ✓  如实报告未安装/服务未运行 ✓  OpenAI 端点正确 ✓  读到内存 7.7GB ✓
       清单 6 项含体积与内存建议 ✓  首项为低配推荐 0.5B ✓  安装包为官方 URL ✓
    B. 后台任务引擎(真实跑一个任务)
       任务启动 ✓  登记可跨请求查看 ✓  执行完毕 ✓  退出码 0 ✓  **进度解析到 100%** ✓
       日志落盘 ✓  日志尾部可读 ✓  任务可清除 ✓  parseProgress 取最大值/空日志安全 ✓
    C. 拉取任务组装(假 exe,不产生真实下载)
       任务启动 ✓  批处理含 OLLAMA_HOST 与 pull 命令 ✓  **非法模型名被拒(防注入)** ✓
       失败任务如实以非 0 退出码结束(9009)✓
    D. 接入 / 回滚
       未安装的模型接入被拒 ✓  接入成功 ✓  base_url 切到 11434/v1 ✓  模型名写入 ✓
       CA 包自动清空(本机 http 不需要)✓  前台 Agent 同步启用 ✓  云端配置自动备份 ✓
       一键恢复云端成功 ✓  isActivated() 语义正确 ✓
    E. 页面与端点
       页面 HTTP 200、无 PHP 报错 ✓  含三步/6 个候选模型/全部按钮/导航入口 ✓
       端点 401/403/419 鉴权链路 ✓  status 返回环境与清单 ✓  非法模型名友好报错 ✓
       activate 未启动服务时明确提示 ✓  revert 无备份时友好提示 ✓

    本轮修掉的 3 个真实缺陷(都是测试逼出来的):

    1. jobStatus() 用 getSetting 读任务键 → 启动任务后立刻查状态拿不到(进度条永远空白)→ 改为直连数据库读取;
    2. admin/local-model.php 用了 LicenseManager 却没 require → 页面 HTTP 500 → 已补;
    3. 批处理各命令输出没有重定向进日志 → 只有退出标记落盘,进度永远 0% → 现在每行自动追加 >> 日志 2>&1。

    四、你要怎么用(三步,都在新页面里)

    1. 后台 →「本地模型」→ ① 下载安装包(约 700MB) → 下载完成后在服务器上双击运行完成安装 → 回到页面点「启动服务」;
    2. ② 在清单里选 qwen2.5:0.5b(约 397MB,最省内存,推荐) 点「下载部署」,页面会实时显示进度与日志;
    3. ③ 部署完成后点「接入网站 Agent」 → 立即生效(前台悬浮助手 + 后台工作面板同时切到本地模型); 想换回云端点「恢复云端配置」即可。

    提醒:本机 7.7GB 内存、2 核 CPU,1.5B 模型单次回答约 5~20 秒;若追求速度,建议本地模型只作为云端不可用时的备份,云端仍用 DeepSeek(当前配置)。

  • v0.4.50

    云端模型接入前台 Agent,实现真问答

    随交付包发布

    需求:"把云端模型 接入前端Agent 实现问答"。

    查看完整变更

    需求:"把云端模型 接入前端Agent 实现问答"。

    一、以前前台 Agent 是"假 AI"

    前台悬浮助手(assets/js/agent.js)的问答链路是: 站内搜索 → 有结果就套模板 ✓ → 没结果时调 agent-ai-api.php → MicroAI(规则/意图引擎,不是真模型) ✗ → 最后再兜底本地关键词。 即"回答"是模板拼接出来的,不会真正理解问题。

    二、改动

    #文件改动
    1includes/AiFrontAgent.php(新增)前台模型问答:站点人设提示词、按用户/访客 IP 的每小时额度、全站每日预算保险丝、问题长度 300 字上限、max_tokens ≤ 600、超时 20s、每次调用写用量日志(时间/身份/字数/tokens/耗时/成败)、今日统计
    2agent-ai-api.php优先走云端模型;额度用尽 / 未配置 / 调用失败 → 静默回落原规则引擎,用户侧无感知;响应新增 source(cloud/rule)、tokens、elapsed_ms、remaining,回落时附 cloud_note 便于后台排查
    3assets/js/agent.js前端超时 5 秒 → 25 秒(真模型首字偶发 2~5 秒,原来会被提前掐断)
    4admin/workbench.php + ajax-workbench.php② Agent 页签新增「前端 Agent 接入」:开关、每小时额度(登录/游客)、每日预算、前台人设提示词、今日用量统计(调用次数/tokens/平均耗时/失败数)

    三、验证

    A. 真机端到端(真实调用 DeepSeek)

    ★ 提问「用一句话介绍本站能做什么」→ source=cloud,tokens=139,760ms
       答案:墨香书阁是一个在线读书平台,你可以搜书、看书、收藏好书,还能管理自己的书架。
    ★ 把 base_url 临时改错(模拟断网)→ source=rule(自动回落规则引擎,用户侧仍然成功)
       并附 cloud_note:网络错误: Failed to connect to 127.0.0.1 port 9 ✓   之后 base_url 已还原 ✓

    B. 额度与开关(独立子进程复测,等同于生产每请求新进程)

    启用 + 游客额度 2  → 通过 2/3,模式 cloud,cloud,quota      ✓
    游客额度 0        → 全部 quota(不开放云端)              ✓
    关闭开关          → 全部 disabled(不调用模型)            ✓
    登录用户额度 3     → 通过 3/4,模式 cloud,cloud,cloud,quota ✓

    C. 单元(桩模型):答案透传 ✓、tokens/耗时记录 ✓、系统提示词含站点人设与指引要求 ✓、max_tokens 受限 ✓、extraContext 注入 ✓、模型报错返回结构化失败(调用方可回落)✓

    D. 前端与面板:agent.js 超时 25000 ✓;面板含开关/额度/预算/人设/今日用量 ✓

    所有测试写入的配置已重置回代码默认(启用、登录 20/小时、游客 5/小时、每日 500),测试额度计数已清理 ✓

    四、费用与安全控制

    • 前台对任意访客开放,因此默认就是"有额度上限 + 有每日预算保险丝";
    • 游客默认 5 次/小时、登录用户 20 次/小时、全站默认 500 次/天;都可以在面板里改,设为 0 即关闭云端(仍可用规则引擎);
    • 每次调用都记 data/.ai_front_usage.log,面板可看今日用量,便于核对费用;
    • 关闭开关或额度用尽时自动回落,前台不会报错、不会白屏。
  • v0.4.49

    云端模型配置成功后自动折叠配置区

    随交付包发布

    需求:"模型配置成功后折叠配置接口"。

    查看完整变更

    需求:"模型配置成功后折叠配置接口"。

    一、改动(admin/workbench.php)

    #内容
    1① 页签的配置卡片改为可折叠:标题右侧一行状态摘要(模型 · 接口地址 · 密钥掩码,若开了自签名会额外标注)+「展开修改 / 收起」按钮
    2已配置 → 默认折叠;未配置 → 始终展开(避免"看不到该填哪里"),并有 JS 守卫强制保证
    3保存成功后自动收起;测试连通成功后自动收起(同时更新徽章与摘要);失败时保持展开,方便直接改配置
    4手动展开/收起会记在本机(localStorage),下次打开按你的选择显示;未配置时仍强制展开
    5折叠态卡片用浅底色区分,摘要里实时显示 模型 · Base URL · 密钥掩码

    二、验证 → 22 / 22 通过

    A. 已配置(当前状态)
       卡片带 wb-cfg collapsed ✓  折叠容器 wb-cfg-body ✓  摘要含模型/地址/密钥掩码 ✓
       按钮为「展开修改」✓  折叠 CSS 规则存在 ✓  页面无 PHP 报错 ✓
    B. 未配置(用密钥快照→清空→渲染→还原,最终配置未被改动)
       卡片**不带** collapsed ✓  按钮为「收起」✓  摘要提示"尚未配置"✓  不显示密钥掩码 ✓  密钥已还原 ✓
    C. JS 行为契约
       setCfgCollapsed / refreshCfgSummary 存在 ✓  localStorage 记忆 ✓
       保存成功自动收起 ✓  连通成功自动收起(失败保持展开)✓  未配置强制展开守卫 ✓  按钮可手动切换并记忆 ✓
    D. 实时 HTTP 渲染:58,874 B,无报错 ✓

    三、效果

    配置好之后,① 页签只剩一行摘要(模型 · 接口 · 密钥 · 状态徽章),面板清爽不占地方; 需要改配置时点「展开修改」,改完保存(或测试连通成功)会再次自动收起。

  • v0.4.48

    修复云端模型接口 TLS 证书校验失败

    随交付包发布

    报错原文:网络错误: SSL certificate problem: self signed certificate in certificate chain(HTTP 0)

    查看完整变更

    报错原文:网络错误: SSL certificate problem: self signed certificate in certificate chain(HTTP 0)

    一、根因:本机 PHP 完全没有 CA 根证书包

    证据结果
    php -i 的 curl.cainfo / openssl.cafile均为空
    PHP 安装目录下 extras/ssl/cacert.pem、cacert.pem、系统 curl-ca-bundle.crt全部不存在
    直接请求 https://api.deepseek.com/v1/models(用无效密钥做 TLS 探测)ssl_verify_result=19 + SSL certificate problem: self signed certificate in certificate chain
    指定一份可用的 CA 包后重试ssl_verify_result=0、HTTP 401(TLS 已通,401 仅因探测密钥无效)

    → OpenSSL 没有信任库,任何 HTTPS 请求都会被判为"自签名证书链",与接口本身无关。

    二、修复

    #内容说明
    1导出 Windows 系统根证书为 PEMCert:\LocalMachine\Root + Cert:\CurrentUser\Root + CA 四个存储 → 87 张根证书,151,635 B。同时兼容"杀软/公司代理做了 HTTPS 拦截"的情况(其拦截根证书正在系统存储里)
    2data/cacert.pem(站点内副本)关键一步:宝塔给本站设了 open_basedir = D:/wwwroot/qdcms/;...,PHP 读不到 PHP 安装目录下的证书包 → 把证书包放进站点目录内即可稳定生效(无需重启 PHP)
    3includes/AiClient.php新增 discoverCaBundle():优先站点内 data/cacert.pem → ini 配置 → PHP 目录 → 系统路径;证书类错误自动带 CA 重试一次;仍失败则输出中文排查指引(含已尝试路径与两条出路);新增 ai_cainfo(显式证书路径)与 ai_allow_insecure(允许自签名,默认关)
    4admin/workbench.php / ajax-workbench.php面板新增「CA 根证书包路径」(留空=自动使用站点内证书包,实时显示实际路径)与「允许自签名证书(有风险)」开关;保存/状态接口同步支持
    5php.ini(站点外)curl.cainfo / openssl.cafile 指向证书包(原为注释状态);重启 PHP 后全局对所有 cURL 生效(面板不依赖它,已即时可用)

    三、验证 → 11 / 11 通过

    A. 自动发现:Web 语境(open_basedir 限制下)命中站点内 data/cacert.pem(87 张)✓  默认不关闭校验 ✓
    B. 证书错误 → 自动带 CA 重试成功 ✓  重试时校验仍开启(cainfo=站点内包, insecure=false)✓
    C. 无可用 CA 时输出中文排查指引(含两条出路)✓
    D. 面板端到端(真实调用你配置的 DeepSeek 接口):
       ★「测试连通」→ 连通正常(模型 deepseek-flash,799ms):ok   ← 你遇到的报错已消失
       ★ 对话试跑 → 正常
       status 返回站点内 CA 包路径 ✓

    四、说明与后续

    • 现在无需任何操作即可用(面板即时生效);
    • 若希望全站所有 HTTPS 调用(不止模型接口)都用上 CA 包:到宝塔面板重启一次 PHP,curl.cainfo 即全局生效;
    • 若将来接口用自签名证书:勾选「允许自签名证书(有风险)」即可,但会关闭服务器证书校验,仅在确知风险时使用。
  • v0.4.47

    工作面板对话框页增加可操作实用工具

    随交付包发布

    需求:"工作面板对话框页增加可操作实用工具"。

    查看完整变更

    需求:"工作面板对话框页增加可操作实用工具"。

    一、对话框页新增三组实用工具

    组位置内容
    快捷指令运维智能体对话框上方6 个一键提问按钮:做一次体检 / 磁盘空间 / 最近报错 / 授权状态 / Go 服务 / 上传活跃度(点击即发送)
    对话工具运维智能体 + Agent 两个对话框清空对话、复制最后回复、导出对话 .md(零依赖实现,兼容无 clipboard 的老内核)
    可执行实用工具运维智能体对话框下方6 个真正会改变站点状态的操作按钮(见下表),点击后二次确认 + 结果回显 + 审计记录

    二、6 个可执行操作(includes/OpsActions.php)

    操作作用安全设计
    清理临时分片目录删除 uploads/tmp_chunks 下超过 2 小时的分片残留活动时间取内部文件 mtime(兼容 Windows 目录 mtime 不可靠),进行中的上传不误删
    清理过期会话文件删除 PHP session 目录下超过 7 天的 sess_*只按年龄阈值删,活跃会话不动(实测保留 140 个活跃会话)
    优化数据表对 8 张核心表执行 OPTIMIZE TABLE只针对白名单表名,无任何前端传入的 SQL
    重置 OPcache清空字节码缓存,改完代码立即生效未启用 OPcache 时明确说明而非报错
    重置授权告警计数清除 data/.license_warnings,解除停机页锁定先备份再删;本次验证后已还原线上原值(保持"10123.vip 继续拦截")
    扫描孤儿上传(仅预览)列出 uploads 中未被数据库引用的文件只列不删;实测发现 5 个孤儿文件(57.7 KB)

    三、安全边界(本次重点验证)

    1. 模型无法调用写操作 —— 写操作与只读工具(OpsTools)严格分离:把 clean_tmp_chunks 交给只读注册表会返回"未知工具",智能体的工具清单里也不含任何写操作;
    2. 必须二次确认 —— 前端 confirm + 服务端 confirm=1 双重校验;未确认时拒绝执行且零副作用(已用测试夹具验证目录仍在);
    3. 白名单 —— 不接受任意动作名、路径、命令、SQL;
    4. 审计日志 —— 每次执行写 data/.ops_actions.log(时间/操作者/动作/结果/IP),面板内可查最近 10 条;不含密钥等敏感信息;
    5. 越权防护 —— 端点仅管理员(401/403)+ CSRF(419),普通用户执行写操作返回 403。

    四、验证 → 33 / 34 通过(唯一未过项为测试自身的计数口径:页面里 .wb-chip 出现 7 次=6 按钮 + 1 处 JS 选择器)

    A. 安全边界:白名单 6 项 / 未知操作被拒 / 未确认被拒且无副作用 / 模型不可调用写操作(3 项断言)✓
    B. 真实执行:临时分片"删过期 1 个、保留进行中 1 个"✓  会话"删过期 1 个、保留活跃 140 个"✓
                 优化 8 张表 ✓  OPcache 重置成功 ✓  孤儿扫描 5 个(只列不删)✓
                 授权告警重置(原 13/8)→ 校验删除与备份 → **已还原原值** ✓
    C. 审计:6 条记录、含操作者、无敏感字段 ✓
    D. 端点/页面:ops_actions 返回 6 操作+审计 ✓  无 confirm 拒绝 ✓  确认后执行 ✓  普通用户 403 ✓
                 页面含 6 个操作按钮、快捷指令、两处对话工具、审计区,且无 PHP 报错 ✓
    业务数据:核心表行数前后一致 ✓

    五、怎么用

    打开「工作面板 → ③ 网站运维工具智能体」:

    • 点 快捷指令 一键提问;点右侧 清空/复制/导出 管理对话;
    • 需要动手时点下方 可执行实用工具(悬停可看说明与预计耗时),确认后立即执行并回显结果;
    • 「最近操作审计」实时显示谁在什么时候做了什么。
  • v0.4.46

    后台新增「工作面板」:云端模型接口 + Agent 智能体 + 网站运维工具智能体

    随交付包发布

    需求:"在网站后台增加一个工作面板,内含云端模型调用接口以及 Agent 智能体,顺便写入网站运维工具智能体"。

    查看完整变更

    需求:"在网站后台增加一个工作面板,内含云端模型调用接口以及 Agent 智能体,顺便写入网站运维工具智能体"。

    一、入口

    后台左侧导航顶层新增「工作面板」(紧随「总览」,admin/workbench.php),三个页签:

    页签能力
    ① 云端模型调用接口配置 Base URL / API Key / 模型名 / 超时 / 温度;保存(密钥留空=不修改,页面只显示掩码)、测试连通(真实调用一次并给出结论)、对话试跑
    ② Agent 智能体编辑系统提示词(人设/规则)、工具调用最大步数;保存 + 对话试跑
    ③ 网站运维工具智能体10 个只读运维工具(可逐个运行)+ 自然语言问答 + 一键体检(Markdown 报告,可复制/下载)

    二、新增文件与实现要点

    文件说明
    includes/AiClient.phpOpenAI 兼容客户端:任何兼容端点(DeepSeek/通义/智谱/Moonshot/OpenRouter/自建 vLLM、Ollama)只填 base_url+key+model 即可;传输层可注入(便于离线单测);错误按 401/403/404/429/非 JSON/空内容分类给中文提示;密钥仅存服务端并掩码显示
    includes/OpsTools.php10 个只读运维工具:站点连通性、磁盘与上传占用、数据库统计、PHP 运行环境、错误日志、授权状态、Go 服务心跳、待处理积压、上传活跃度、安全体检。统一返回 {ok,level,title,summary,data,hints,ms};一键体检生成 Markdown 报告
    includes/OpsAgent.php运维工具智能体:模型模式(把工具清单交给模型,模型以 JSON 请求工具 → 服务端执行 → 回喂 → 收口,最多 N 步)+ 规则模式(无密钥也能用:关键词命中工具);模型失败自动降级;容忍模型输出的 markdown 代码块/杂字符
    admin/workbench.php三页签面板(原生 PHP + 内联 JS,无外部依赖)
    admin/ajax-workbench.php9 个动作:status / model_save / model_test / model_chat / agent_save / agent_chat / ops_run / ops_chat / ops_checkup;仅管理员(401/403)+ CSRF(419)
    admin/header.php顶层导航新增「工作面板」

    安全设计:运维工具全部只读(不写库、不删文件、不改配置);不接受任意 SQL/命令/路径;密钥不回传前端。

    三、验证 → A~C 57 项 + D/E/F 22 项,全绿

    A. AiClient(桩传输,不打真实网络)
       endpoint 拼接 / 已含路径不重复拼接 / 请求体(model,messages,stream=false,temperature) / Bearer 鉴权头
       响应解析(choices[0].message.content + usage) / 密钥掩码 / 未配置提示
       错误映射:401 密钥无效、404 地址或模型名不存在、429 限流、非 JSON 响应、空内容、传输异常被捕获
       消息规范化 / 连通性测试 / saveSettings 校验(非法地址拒绝、超时夹到 300、温度夹到 2) / 配置已还原
    B. OpsTools(真实数据、只读)
       10 个工具全部运行成功:磁盘使用 5.3%(118GB/剩余 111.78GB)、uploads 84.2MB、PHP 8.0.28 扩展齐备、
       授权告警 13/8、Go 服务心跳 3 秒前(端口 8080 HTTP 200)、最近 24h 上传 64 个文件、安全体检发现 2 项
       体检报告 Markdown 生成 / 未知工具被拒 / **核心表行数前后一致(只读性得到验证)**
    C. OpsAgent
       规则模式:磁盘→disk_usage、报错→recent_errors、授权→license_status、上传→uploads_recent 全部命中
       「做一次站点体检」→ 直接跑 7 项体检(跳过模型)
       模型模式:桩模型请求工具 → 执行 disk_usage → 回喂 → `{"final":...}` 收口(共 2 次模型调用)
       容错:非法 JSON 自动纠正重试;步数用尽优雅收口;模型失败自动降级规则模式
    D/E. 页面与端点
       管理员 200、三页签、10 个工具卡片、导航入口、页面无 PHP 报错;普通用户 302 跳登录
       端点:未登录 401 / 普通用户 403 / CSRF 错误 419 / 未知动作 404
       status 返回 10 个工具;ops_run 成功;ops_checkup 返回报告(level=error,正常 5 注意 1 异常 1);
       model_test 未配置时给出明确中文提示(不 500)
    F. 本轮修掉的真实缺陷
       ① go_service 曾显示"心跳 497677 小时前"——Go 服务写的是 epoch 字段,原代码读了 ISO 字符串 ts;
          已改为 epoch 优先 + 兼容毫秒/ISO/文件 mtime,现正确显示"心跳 3 秒前"
       ② recent_errors 的 5xx 统计曾在 CSRF token 里误匹配,**假阳性 243/300**;现只认状态码字段 → 0/512
       ③ 访问日志分支不再重复列出 *.error.log;磁盘信息增加 PowerShell 兜底(原账户下 disk_free_space 不可用)

    四、怎么用

    1. 后台左侧「工作面板」→ 页签①填 Base URL / API Key / 模型名 → 保存 → 测试连通;
    2. 页签②按需改系统提示词与步数;
    3. 页签③直接问"磁盘还剩多少?""最近有报错吗?""做一次站点体检",或点工具卡片上的运行;
    4. 未配置模型也能用:运维工具智能体会走关键词规则模式,体检报告照常生成。
  • v0.4.45

    PC 端个人主页增加「退出登录」按钮

    随交付包发布

    需求:"给 PC 端个人主页增加一个退出按钮"。

    查看完整变更

    需求:"给 PC 端个人主页增加一个退出按钮"。

    一、为什么之前 PC 端退不了

    全站唯一的「退出登录」入口在 includes/header.php 的移动端下拉菜单里 (<a href="logout.php" class="nav-link-dropdown">退出登录</a>,容器 .main-nav-dropdown 仅在窄屏显示) → PC 端打开个人主页时确实没有任何退出按钮。

    二、改动(仅 profile.php)

    #内容
    1顶部名片操作区新增按钮:编辑资料 → 管理后台(管理员)→ 退出登录,跳 logout.php(沿用原有退出逻辑,未新造接口)
    2新按钮加二次确认:确定要退出登录吗?,避免误点直接掉线
    3样式 .profile-logout-btn:危险色描边,默认透明底、悬停填充红色,与「编辑资料」明确区分;操作区本身已有 flex-wrap: wrap,窄屏自动换行不挤压

    三、验证 → 15 / 15 通过

    渲染检查(登录态真实请求 profile.php)
      HTTP 200 ✓  操作区存在 ✓  含「退出登录」→ logout.php ✓  带二次确认 ✓
      使用 profile-logout-btn 样式 ✓  原「编辑资料」保留 ✓  页面含样式规则 ✓
      顺序正确(编辑资料 → 管理后台 → 退出登录)✓  窄屏可换行 ✓
    退出流程(独立测试会话,不影响任何人登录态)
      logout.php → 302 → index.php ✓
      退出后再访问 profile.php → 302 → login.php(会话已失效)✓
      服务端会话数据已清空/销毁 ✓
    未登录访问个人主页 → 跳登录页 ✓

    四、效果

    • PC 端个人主页一眼可见「退出登录」,点一下(确认后)即退出并回到首页;
    • 移动端行为不变(下拉菜单入口仍可用);未登录用户看不到该按钮(个人主页会先跳登录页)。

第 2 / 10 页 · 每页 10 条 · 共 93 条

升级前请确认

  1. 备份

    备份站点目录与数据库,尤其是 uploads/ 与 config/。

  2. 阅读说明

    在 docs/版本升级说明.md 中找到对应版本,确认是否需要执行数据库迁移。

  3. 执行升级

    解压覆盖站点目录 → 执行 migration → 后台「系统 → 在线更新」复核版本状态。

  4. 复核功能

    检查前台首页、播放、支付与后台工作面板等关键入口是否正常。

相关入口

站点公告 官网试运行中,如需购买或试用请通过「联系我们」留言。