-
-
分块默认值
-
新建数据集时自动带出,单个数据集仍可在表单中修改
-
- 分块大小
-
- 重叠字数
-
- 智能体轮次
-
- 保存
-
-
智能体轮次:0=关闭(单次检索问答);1~10=启用 ReAct 智能体模式,模型自主调用检索工具,此为轮次上限。新建数据集时自动带出。
-
-
对话模型
@@ -80,33 +65,9 @@
import { onMounted, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { listModelConfigs, saveModelConfig, deleteModelConfig, testModelConfig, setDefaultModelConfig } from '../api/model_config.js'
-import { getSettings, saveSettings } from '../api/settings.js'
const modelType = ref('chat')
-const chunkForm = ref({ chunk_size: 800, chunk_overlap: 150, react_rounds: 0 })
-const chunkSaving = ref(false)
-
-async function loadChunkDefaults() {
- try {
- const s = await getSettings()
- if (s) {
- chunkForm.value.chunk_size = s.chunk_size || 800
- chunkForm.value.chunk_overlap = s.chunk_overlap ?? 150
- chunkForm.value.react_rounds = s.react_rounds ?? 0
- }
- } catch { /* 忽略 */ }
-}
-
-async function saveChunkDefaults() {
- chunkSaving.value = true
- try {
- await saveSettings(chunkForm.value)
- ElMessage.success('分块默认值已保存')
- } finally {
- chunkSaving.value = false
- }
-}
const models = ref([])
const allModels = ref([])
const modelLoading = ref(false)
@@ -118,7 +79,6 @@ const modelForm = ref({ id: 0, name: '', model_type: 'chat', model_name: '', end
onMounted(async () => {
await loadModels()
- await loadChunkDefaults()
try { const all = await listModelConfigs(''); if (all && all.list) allModels.value = all.list } catch { /* 忽略 */ }
})
@@ -221,28 +181,4 @@ async function test(row) {
align-items: center;
margin-bottom: 12px;
}
-.block-card {
- border: 1px solid #e4e7ed;
- border-radius: 6px;
- padding: 14px 16px;
- margin-bottom: 16px;
-}
-.block-title {
- font-weight: 600;
- margin-bottom: 4px;
-}
-.block-tip {
- font-size: 12px;
- color: #909399;
- margin-bottom: 10px;
-}
-.block-row {
- display: flex;
- align-items: center;
- gap: 8px;
-}
-.field-label {
- color: #606266;
- font-size: 14px;
-}
diff --git a/技术设计.md b/技术设计.md
index 653442f..d92bb41 100644
--- a/技术设计.md
+++ b/技术设计.md
@@ -88,7 +88,6 @@ kb_dataset --1:N-- kb_document --1:N-- kb_chunk --1:1-- kb_chunk_vec (vec0, chun
model_config: is_default 标记默认 chat/embedding 配置(GetDefault 取数)
chat_conversation --1:N-- chat_message(删会话级联删消息)
-app_config: 无外联(全局键值)
```
**删除级联矩阵**(已实现行为,删除动作均落库失败回滚):
@@ -315,7 +314,7 @@ StartParsePoller(main.go 启动,gtimer 单例 5 秒轮询,job 未结束不
```
每次启动
│ EnsureAccessToken():RandomToken(16) 生成 32 位 hex token,SetAccessToken 存入内存
- │ (common/auth.go 包级变量,不落库;app_config 仅存分块默认值,无 access_token 键)
+ │ (common/auth.go 包级变量,不落库)
▼
启动日志打印(main.go):
============================================
@@ -333,7 +332,7 @@ StartParsePoller(main.go 启动,gtimer 单例 5 秒轮询,job 未结束不
- **内存持有,不落库**:`common/auth.go` 中 `var accessToken string` 包级变量;`EnsureAccessToken`(system_config_service.go)每次启动无条件重新生成。登录页提示语「请输入服务启动时打印在控制台的访问令牌」
- **指纹校验**:JWT 中携带令牌的 SHA-256 指纹(`TokenFingerprint`,取前 16 位 hex);鉴权中间件将 JWT 指纹与内存令牌指纹比对(`claims.TokenFp != AccessTokenFingerprint()`),不一致即 401「访问令牌已变更,请重新登录」。因此**重启服务后所有旧会话立即失效**,前端 401 拦截器自动跳登录页
-- **无 regenerate-token 接口**:`system_config_dto.go` 仅有 `/login`、`/settings`、`/save-settings` 三个接口;换令牌 = 重启服务(新令牌自动打印到日志)。设置页**没有**令牌管理 UI(Settings.vue 只含分块默认值 + 模型配置)
+- **无 regenerate-token 接口**:`system_config_dto.go` 仅有 `/login` 一个接口;换令牌 = 重启服务(新令牌自动打印到日志)。设置页**没有**令牌管理 UI(Settings.vue 只含模型配置)
- **公开路径白名单**(auth_middleware.go 精确匹配):`/system-config/login`、`GET /`、`GET /assets/*`(hash 路由下 SPA 只请求这两类静态路径,无鉴权绕过);`GET /workspace/*` 前缀放行(浏览器下载/预览请求不带 Authorization),仅做路径穿越防护(拒绝 `..`);其余路径一律校验
- 无注册、无角色、无用户表;登录日志不落库(如需审计可在日志文件输出);JWT 密钥为代码内固定常量(单机场景可接受,如需更换改 `common/auth.go` 的 `jwtSecret`)
@@ -364,7 +363,7 @@ func Auth(r *ghttp.Request) {
### 9.3 API 封装
- `api/request.js`:axios 实例(baseURL `/`、token 注入、401 跳转、错误 toast)
-- `api/xxx.js`:按后端模块组织,与 dto 对齐(dataset/document/chunk/chat/kg/contract/model_config/settings/auth)
+- `api/xxx.js`:按后端模块组织,与 dto 对齐(dataset/document/chunk/chat/kg/contract/model_config/auth)
- 二进制下载(导出标注版 HTML)走原生 fetch + 手动 `Authorization` 头,绕过拦截器对 blob 的 JSON 误判
- 流式:`fetch` + `ReadableStream` 解析 SSE(按 `\n\n` 分块、解析 `data: ` 行 JSON,按字段识别:`citations`(引用 + conversation_id)/ `content`(增量文本)/ `status==='ok'`(完成,或流读完兜底)/ `message`(错误);`data: [DONE]` 与 15 秒心跳注释行静默跳过)