Nodely

欢迎来到 Nodely.cc

关于小黑屋帮助FAQ协议🎯游戏
Nodely BBS @ 2026·Powered by Rhex Plus 1.1.0
🏠首页
咖啡慈善画廊代码市场

兴趣节点

全部
日常技术情报评测游戏交易拼车推广壁纸福利Git应用WebRhex
19

不知名管理员

回复讨论
0

登录后可参与回复讨论。

Nodely Logo

Nodely

登录后即可签到、查看积分与快捷发帖

Nodely BBS

相关主题

【插件】首页轮播图 home-carouselPCL启动器, Plain Craft Launcher, 我的世界告别臃肿的传统论坛,Rhex 带你体验现代社区搭建还在为内网穿透发愁?试试这款 80K+ Star 的开源神器 frp宝塔Linux面板安装教程 - 2026年7月12日更新 - 11.8.1 正式版

主题标签

全部标签
暂无标签
目录
AI 创作(ai-creator)功能预览功能清单平台配置AI 角色管理创作任务发布方式AI 正文优化架构设计数据流安全措施技术要点多 Key 负载均衡后台任务队列定时发布时间计算AI 响应解析权限声明

当前还没有回复,欢迎成为第一个参与讨论的人。

文明发言,理性讨论
首页
代码
代码 节点
Git帖 3应用帖 0Web帖 0Rhex帖 2
Rhex

【插件】AI 创作 ai-creator

AI 创作(ai-creator)

接入 AI 接口平台,配置多种创作角色,基于灵感自动生成 Markdown 帖子。支持人工审核发布与定时发布,可开启「AI 正文优化」一键润色。

属性 值
插件 ID ai-creator
版本 1.5.0
作者 狡猾的骗骗花 nodey@qq.com
入口 dist/server.mjs
注入方式 后台管理页 + 写作页 write-action provider + 后台任务

功能预览

image.png

image.png

image.png

功能清单

平台配置

配置项 类型 默认值 说明
接口地址 文本 https://api.deepseek.com 兼容 OpenAI 协议的 API 地址
模型 文本 deepseek-v4-flash 模型标识
Temperature 数字 0.8 0-2,越高越随机
通用提示词 多行文本 内置中文社区创作规范 所有 AI 共享的基础创作要求
API SK 多行文本 空 每行一个,支持多 Key 轮询负载均衡
正文优化开关 开关 false 开启后在发帖页「功能区」面板显示 AI 润色入口
正文优化提示词 多行文本 内置中文编辑规范 优化时使用的提示词

AI 角色管理

  • CRUD 操作 — 创建、编辑、删除 AI 角色,支持启用/停用开关
  • 专属提示词 — 每个 AI 拥有独立的角色设定(persona prompt),与通用提示词叠加生效
  • 用户绑定 — AI 以绑定的用户账号身份发帖,创建时校验用户存在且状态正常
  • 停用保护 — 已停用的 AI 不可提交新任务,已绑定的任务仍可查看和发布

创作任务

状态 含义
pending 等待创作,已入队后台任务
processing 正在调用 AI 接口生成
success 创作成功,待审核发布
failed 创作失败,可查看错误原因并重试
cancelled 管理员手动取消
published 已发布到社区
  • 灵感驱动 — 提交灵感描述(5-2000 字),AI 自动生成标题、Markdown 正文和标签
  • 原子抢占 — 后台任务通过 DB 条件更新(pending → processing)防止多 Worker 并发执行
  • 重试机制 — 失败或已取消的任务可修改灵感后重新提交
  • 内容编辑 — 创作成功的帖子可编辑标题、正文、标签后再发布

发布方式

  • 人工审核发布 — 管理员在任务详情中审核内容,确认后以 AI 绑定用户身份发帖
  • 自动发布 — 创作成功后立即自动发布,无需人工干预
  • 定时发布 — 设置发布时间,到点自动发布;支持改期和取消(距触发时间不足 60 秒时锁定)

AI 正文优化

  • 功能区注入 — 通过 write-action provider 在发帖页「功能区」面板追加「AI 正文优化」条目
  • 开关控制 — 后台关闭优化开关后,功能区条目隐藏且 API 拒绝调用
  • 原文润色 — 发送用户已写的 Markdown 正文到 AI,返回优化后内容,保持事实和原意不变
  • 节流保护 — 同一用户 10 秒内仅允许调用一次,防止滥用 API 配额

架构设计

采用 MVC 分层架构,服务端与客户端分离:

text
addon.json ← 插件清单 dist/ server.mjs ← 入口:生命周期 + 路由注册(后台页/API/Provider/后台任务) model.mjs ← Model 层:建表、配置读写、AI CRUD、任务 CRUD controller.mjs ← Controller 层:快照聚合、action 分发、任务执行与发布 deepseek.mjs ← AI 接口:OpenAI 兼容协议调用、多 Key 轮询、JSON 解析 views.mjs ← 视图层:后台页渲染、write-action 条目生成 assets/ ai-creator-admin.js ← 客户端入口(controller → view) ai-creator-admin.controller.js ← 状态管理(快照加载、表单提交、对话框状态) ai-creator-admin.view.js ← 视图渲染(三个标签页 + 多个对话框) ai-creator.css ← 样式(.ai-creator / .aic-* 命名空间,复用宿主 CSS 变量)

数据流

text
管理员 → 后台页 → POST /admin-api → handleAdminAction ├── save-platform → writeConfig / writeSecret ├── ai-create/update/delete → DB CRUD ├── task-create → DB INSERT → enqueue "generate" 后台任务 ├── task-publish → context.posts.create → markTaskPublished ├── task-schedule → scheduleTaskPublish → enqueue "publish" 后台任务 └── task-retry → 重置状态 → enqueue "generate" 后台任务 "generate" → markTaskProcessing(原子抢占)→ generatePost(DeepSeek API) → markTaskSuccess → 若 autoPublish 则 enqueue "publish" 后台任务 "publish" → 检查是否到点 → publishTask(以绑定用户身份发帖) → 未到点则按剩余时间重新排队 访客发帖页 → getWriteActionItems(检查开关)→ 注入「AI 正文优化」条目 → POST /public-api/optimize → optimizeContent → 返回润色后正文

安全措施

  • SSRF 防护 — 接口地址校验,拒绝 localhost / 内网 IP(127. 10. 172.16-31. 192.168. 等)
  • API 密钥隔离 — SK 通过 context.writeSecret/readSecret 加密存储,不暴露在配置快照中
  • 多 Key 轮询 — 随机起点轮询多个 SK,4xx(非 401/429)错误直接抛出不重试,401/429 切换下一个 Key
  • 任务原子抢占 — pending → processing 通过 DB 条件 UPDATE 实现,返回受影响行数判断,防止并发重复执行
  • 定时锁定 — 距计划发布时间不足 60 秒时禁止修改或取消,防止竞态
  • 并发发布防护 — markTaskPublished 仅在 status = 'success' 时更新,返回受影响行数判断是否抢占成功
  • 请求超时 — AI 接口调用 90 秒超时,防止长时间挂起
  • 安全截断 — 错误信息存储前截断至 500 字符,避免在代理对/组合字符中间切断

技术要点

多 Key 负载均衡

每次调用从 N 个 API Key 中随机选取起点,依次轮询尝试。401(鉴权失败)和 429(限流)自动切换下一个 Key;参数类 4xx 错误直接抛出(换个 Key 也无意义)。

js
const offset = Math.floor(Math.random() * apiKeys.length) for (let i = 0; i < apiKeys.length; i += 1) { const apiKey = apiKeys[(offset + i) % apiKeys.length] // 尝试调用,失败时按错误类型决定是否继续轮询 }

后台任务队列

创作和发布均为异步后台任务,不阻塞管理后台响应:

  • generate — 提交灵感后立即入队,Worker 异步执行 AI 调用
  • publish — 创作成功后入队(delayMs 按计划时间计算),到点触发发布

定时发布时间计算

normalizeScheduledPublishAt 校验时间距当前 ≥ 30 秒且 ≤ 一年,runScheduledPublish 执行时若仍未到点则按剩余时长重新入队:

js
const remainingMs = new Date(task.scheduledPublishAt).getTime() - Date.now() if (remainingMs > 0) { await context.backgroundJobs.enqueue("publish", { taskId }, { delayMs: remainingMs }) return }

AI 响应解析

要求 AI 返回 JSON 格式,通过 parseModelJson 容错解析——先尝试直接 JSON.parse,失败后正则提取首个 {...} 块。支持 AI 偶尔包裹 ```json 代码块的情况。

权限声明

text
provider:register — 注册 write-action provider page:admin — 注册后台管理页 api:admin — 注册后台 API(快照 + 配置/任务操作) api:public — 注册公开 API(正文优化入口) config:read / config:write — 读写平台配置、通用提示词、优化配置 secret:read / secret:write — 读写 API 密钥 database:sql / database:orm — 自建表 + Prisma ORM post:create — 以绑定用户身份发帖 network:external — 调用外部 AI API background-job:register — 注册后台任务类型 background-job:enqueue — 入队后台任务

附件列表

共 1 项
站内附件

ai-creator.zip

ZIP · 35 KB · 下载 0回复可下
登录并回复本帖后可下载
站点 Logo
Nodely
站点 Logo
Nodely
·11小时前
miko