本页面向从源码构建/部署的场景;最终用户照着 README 的「下载与运行」即可,不需要 .NET SDK。
- .NET 10 SDK
- OneBot 11 实现(推荐 NapCat),开启正向 WebSocket 服务端(默认
ws://127.0.0.1:3001) - LLBot(可选):另一 OneBot 实现,与 NapCat 二选一或并存;配置
LLBotCmd后随宿主一键拉起,日志自动隔离到独立文件
git clone <本仓库>
cd FlexBot
dotnet run --project FlexBot首次启动自动生成 config.json(exe 旁),按需修改后重启:
运行模式(只有一个参数):
| 启动 | 效果 |
|---|---|
| 不带参数 | 开原生窗口(Photino + WebView2 加载 WebUI),控制台收起;环境开不了窗口时自动退回控制台 |
--gui |
强制原生窗口:环境开不了窗口时报错退出(退出码 3),不静默退化 |
--no-gui |
不开窗口,控制台常驻(服务器/后台跑用这个) |
--help / -h |
打印用法、选项与退出码后退出 |
--version |
打印版本(含 .NET 运行时版本)后退出 |
退出码:0 正常(含 help/version)、2 参数错误(未知参数,或 --gui 与 --no-gui 同时给)、3 指定了 --gui 但窗口无法创建、4 已有实例在运行。未知参数不再被静默忽略 —— 会打印提示并以 2 退出。
决策与执行集中在 FlexBot/WebUi/AppShell.cs;ConsoleWindow.cs 管控制台显隐。
同一目录单实例:第二个实例被拒并提示已在运行实例的 WebUI 地址。
探测逻辑(FlexBot/WebUi/GuiSupport.cs)保守判断:Windows 用 Environment.UserInteractive,macOS 默认可用,Linux 看 DISPLAY/WAYLAND_DISPLAY;不确定时按"没有"处理。
启动后控制台会打印 WebUI 地址(本机地址 http://127.0.0.1:<端口>;实际监听 0.0.0.0,局域网可达),浏览器打开即可管理。登录失败会按来源 IP 指数退避(前 2 次立即返回,之后 2/4/8… 秒,上限 5 分钟)。
AI 模型配置在 WebUI → 插件 → Agent → 设置(存储于 plugins/Agent/settings.json,保存即热应用):
- ApiKey / BaseUrl / Model:任意 OpenAI 兼容端点(DeepSeek、智谱、OpenAI 等)
- FallbackModels:主模型失败时按序回落的备用链
- Personas:多套人格提示词,
personas/*.md随设置一并保存 - GroupChatEnabled:群聊 AI 回复全局开关(单群粒度用
!nollm <群号>) - NameKeywords / ReplyProbability / ImageReplyProbability:唤醒词与概率回复
- Windows:直接运行
FlexBot.exe(含 Photino 桌面窗口模式) - Linux:
dotnet publish FlexBot -c Release -r linux-x64后运行dotnet FlexBot.dll(仓库不带启动/守护脚本,按需自备 systemd unit 或 supervisor) - 发布包必须带上
WebUi/目录(与FlexBot.dll同级):WebUI 资源现在就放在那里,宿主每次请求都从磁盘读。缺了会在启动日志里逐条列出缺失文件,页面返回 500
FlexBot/
├─ Program.cs / BotClient.cs / PluginManager.cs / Routing.cs / Config.cs
├─ Scripting/ # csx 脚本编译前端(Roslyn 内存编译 + 指纹缓存)+ NuGet 依赖解析
├─ WebUi/ # WebUI 源码(构建/发布时原样拷到 <输出>/WebUi/;改完刷新即生效)+ Minimal API
└─ memory/ # 运行数据(构建后生成于输出目录 exe 旁)
FlexBot.Abstractions/ # 插件契约(IBotPlugin、IBotContext、IBotApi、Hub、服务)
FlexBot.OneBotLib/ # OneBot 11 协议库
FlexBot.BuiltInPlugins/ # 内置插件源码
samples/csx-json/ # csx 脚本插件示例(NuGet 依赖 + 生成审计)
./release.sh [版本号] [输出根目录] # 默认 1.0.0 → publish/release/<版本>/产物:5 个平台自包含包(RID 命名 FlexBot-<版本>-<rid>.zip:win-x64 / linux-x64 /
linux-arm64 / osx-x64 / osx-arm64)+ FlexBot-BuiltInPlugins-<版本>.zip(平台无关)
SHA256SUMS.txt(校验)。每个包内附LICENSE、THIRD-PARTY-NOTICES.txt、使用说明.txt。
CI 打包:仓库 → Actions → 发布打包 → Run workflow(手填版本号;勾选 create_release
会建/更新 v<版本> 的 Release 并把产物作为附件上传,正文取 RELEASE_NOTES.md)。
- 宿主正在运行时构建会失败:
MSB3021/MSB3027 文件被 FlexBot 锁定。先停掉宿主(和 LLBot/node)再构建, 或把输出旁路到临时目录:dotnet build FlexBot.slnx -c Debug -o <临时目录>。 - 插件工程的输出目录指向宿主
plugins/(见各内置插件 csproj 的OutDir),所以插件与宿主一起构建即可。 - WebUI 资源在
FlexBot/WebUi/,构建/发布时原样拷到<输出>/WebUi/;改这些文件不需要重新构建(见下)。 *.sh在.gitattributes里固定为 LF,CI(Linux)里用bash release.sh调用,避免可执行位/CRLF 问题。
{ "WsUrl": "ws://127.0.0.1:3001", // OneBot WebSocket 地址 "Token": "", // OneBot 访问令牌(可为空) "OwnerUin": 10000, // 机器人主人 QQ(自动具有管理员权限);不填则视为"无管理员",命令与私聊一律拒绝 "AdminUins": [], // 额外管理员(主人恒在其中,无需重复填写) "NapCatCmd": "", // 可选:随宿主一键拉起 NapCat 的命令 "NuGetFeed": "https://api.nuget.org/v3-flatcontainer", // 插件 NuGet 依赖源(可换私有源/镜像) "WebUiPort": 0, // 0 = 自动分配空闲端口 "WebUiPassword": "" // 留空则首次启动自动生成随机密码并打印到**控制台**(明文只打印一次,不写日志);WebUI 绑定全部网卡,务必不要把端口暴露到公网 }