feat: 系统设置新增原始请求/响应记录开关(仅管理员)

- 系统配置键 log_raw_requests:开启后,仅管理员账号的每次请求
  在用量明细中保存客户端原始请求体与上游原始响应体
  (流式含全部 SSE 事件),用于排障
- UsageLog 新增 raw_request / raw_response 字段(type:text)
- AuthLLM 附带 user_role 供网关判断管理员
- gateway:10s TTL 缓存开关;streamResponse/bufferResponse
  支持累积上游原始响应;recordUsage 填充原始字段
- 前端 SystemConfig 新增开关(会显著增加存储的提示)
- 新增 doc/flow.md 网关调用流程示意图
This commit is contained in:
Sakurasan
2026-09-01 02:32:31 +08:00
parent 9f4d631fc4
commit f9e9a1572f
6 changed files with 393 additions and 4 deletions
@@ -13,6 +13,7 @@ const saving = ref(false)
const registrationEnabled = ref(true)
const passwordLoginEnabled = ref(true)
const logRawRequests = ref(false)
async function load() {
loading.value = true
@@ -23,6 +24,9 @@ async function load() {
])
registrationEnabled.value = regRes.data.data.enabled
passwordLoginEnabled.value = pwdRes.data.data.enabled
// 原始请求/响应记录开关(通用配置键 log_raw_requests)
const cfgRes = await request.get('/admin/config')
logRawRequests.value = cfgRes.data?.data?.log_raw_requests === 'true'
} catch (e) {
setToast(errMsg(e), 'error')
} finally {
@@ -56,6 +60,19 @@ async function savePasswordLogin(enabled: boolean) {
}
}
async function saveLogRawRequests(enabled: boolean) {
saving.value = true
try {
await request.put('/admin/config', { log_raw_requests: enabled ? 'true' : 'false' })
logRawRequests.value = enabled
setToast(enabled ? '已开启原始请求/响应记录' : '已关闭原始请求/响应记录', 'success')
} catch (e) {
setToast(errMsg(e), 'error')
} finally {
saving.value = false
}
}
onMounted(load)
</script>
@@ -116,6 +133,30 @@ onMounted(load)
</button>
</div>
</div>
<!-- 原始请求/响应记录(仅管理员) -->
<div class="card border border-base-300/60 bg-base-100 p-4 shadow-sm">
<div class="flex items-center justify-between">
<div>
<h3 class="text-sm font-medium">记录原始请求/响应</h3>
<p class="mt-1 text-xs text-base-content/50">仅对管理员账号生效:在用量明细中保存每次请求的客户端原始请求体与上游原始响应体(流式含全部 SSE 事件),用于排障。会显著增加存储。</p>
</div>
<button
type="button"
role="switch"
:aria-checked="logRawRequests"
class="relative inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"
:class="logRawRequests ? 'bg-primary' : 'bg-base-200'"
:disabled="saving"
@click="saveLogRawRequests(!logRawRequests)"
>
<span
class="pointer-events-none inline-block h-4 w-4 rounded-full bg-white shadow-sm ring-0 transition-transform"
:class="logRawRequests ? 'translate-x-6' : 'translate-x-1'"
/>
</button>
</div>
</div>
</template>
</div>
</template>