95 lines
4.1 KiB
Markdown
95 lines
4.1 KiB
Markdown
1. 系统架构概述本系统采用前后端分离架构,旨在支持高度自定义的角色扮演体验。
|
||
前端 (Vue 3):负责 UI 渲染、插件面板挂载、脚本沙箱执行及动态 HTML 处理。
|
||
后端 (Go):处理业务逻辑、Prompt 组装、插件权限校验及静态资源分发。
|
||
数据库 (PostgreSQL):存储用户数据、角色卡设定、对话历史及插件配置(JSONB)。
|
||
|
||
2. 插件分类定义系统支持以下两类插件,并区分 公共 (Public) 与 私人 (Private) 权限:
|
||
插件类型实现技术核心功能设定集 (Lorebook)后端注入 + 数据库检索关键词触发知识点注入 Prompt。
|
||
功能扩展 (Extension)前端沙箱 (Iframe/JS)增加 UI 面板、导入脚本库、渲染自定义 HTML。
|
||
|
||
3. 数据库模型设计3.1 插件主表 (plugins)
|
||
```SQL
|
||
CREATE TABLE plugins (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
name VARCHAR(100) NOT NULL,
|
||
type VARCHAR(20) NOT NULL, -- 'lorebook' 或 'extension'
|
||
is_public BOOLEAN DEFAULT false,
|
||
owner_id UUID REFERENCES users(id),
|
||
manifest JSONB, -- 存储版本、作者、入口点等元数据
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||
);
|
||
```
|
||
3.2 设定条目表 (lore_items)
|
||
```SQL
|
||
CREATE TABLE lore_items (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
plugin_id UUID REFERENCES plugins(id) ON DELETE CASCADE,
|
||
keywords TEXT[], -- 触发词:["魔法", "火球"]
|
||
content TEXT NOT NULL, -- 注入内容
|
||
priority INT DEFAULT 10 -- 插入顺序
|
||
);
|
||
```
|
||
3.3 用户配置表 (user_plugin_configs)
|
||
```SQL
|
||
CREATE TABLE user_plugin_configs (
|
||
user_id UUID REFERENCES users(id),
|
||
plugin_id UUID REFERENCES plugins(id),
|
||
is_enabled BOOLEAN DEFAULT true,
|
||
settings JSONB, -- 存储插件的个性化设置
|
||
PRIMARY KEY (user_id, plugin_id)
|
||
);
|
||
```
|
||
|
||
4. 后端开发:设定集注入逻辑 (Go)
|
||
4.1 Prompt 组装流程后端在向 LLM 发送请求前,需执行以下伪逻辑:
|
||
分词匹配:提取用户最新输入及其上下文,比对数据库中的 keywords。
|
||
内容提取:获取命中条目的 content。
|
||
模板拼接:
|
||
```Plaintext
|
||
{{System_Prompt}}
|
||
[相关设定注入区]
|
||
{{Injected_Lore_Content}}
|
||
----------------
|
||
{{Chat_History}}
|
||
{{User_Input}}
|
||
```
|
||
|
||
5. 前端开发:扩展功能实现 (Vue 3)
|
||
5.1 插件面板挂载参考 src/Panel.vue 的设计,利用动态组件加载插件配置:功能:读取插件的 manifest.settings_schema。交互:通过 Vue 响应式表单实时预览设置效果,并保存至后端 JSONB 字段。
|
||
5.2 脚本沙箱与 HTML 渲染参考你提供的 Iframe.vue 逻辑,为“酒馆助手”类插件提供运行环境:A. 沙箱初始化使用不可见的 <iframe> 运行插件 JS,防止污染主页面全局变量。通过 postMessage 实现主窗口与插件的通信。B. 动态 HTML 接管在聊天渲染组件中预留“渲染钩子”:JavaScript
|
||
```
|
||
// 在消息渲染循环中
|
||
const renderMessage = (msg) => {
|
||
if (helperPlugin.enabled && helperPlugin.hasRenderer) {
|
||
// 调用插件提供的 HTML 渲染逻辑
|
||
return helperPlugin.process(msg.content);
|
||
}
|
||
return standardMarkdownRender(msg.content);
|
||
};
|
||
```
|
||
6. 目录结构规范后端存储 (Go 服务端)
|
||
```Plaintext
|
||
/storage/plugins
|
||
/public/ # 公共插件(如官方酒馆助手)
|
||
/tavern-helper/
|
||
manifest.json
|
||
index.js
|
||
/private/ # 用户上传
|
||
/{user_id}/
|
||
/my-custom-ui/
|
||
```
|
||
前端状态 (Pinia/Vuex)
|
||
```TypeScript
|
||
interface PluginState {
|
||
enabledPlugins: Plugin[];
|
||
activeLore: LoreItem[];
|
||
// 存储插件注入的自定义 HTML 元素
|
||
injectedUIElements: Map<string, HTMLElement>;
|
||
}
|
||
```
|
||
|
||
7. 开发路线图 (Roadmap)
|
||
阶段一 (核心):完成 Go 后端的关键词匹配算法,实现简单的设定集注入。
|
||
阶段二 (管理):开发 Vue 前端的插件管理列表,支持从 JSON 导入设定集。
|
||
阶段三 (高级):实现基于 Iframe 的脚本加载器,支持插件向侧边栏注入自定义 HTML 面板。
|
||
阶段四 (优化):引入 PostgreSQL 的向量搜索 (pgvector),取代简单的关键词匹配,实现语义级设定调取 |