This commit is contained in:
2026-08-05 10:28:44 +08:00
commit 0bacf2e0a4
103 changed files with 9415 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
import request from './request.js'
export function login(data) {
return request.post('/system-config/login', data)
}
export function getSystemConfig() {
return request.get('/system-config')
}
export function updateSystemConfig(data) {
return request.put('/system-config', data)
}
export function regenerateToken() {
return request.post('/system-config/regenerate-token')
}
export function getToken() {
return request.get('/system-config/token')
}
+73
View File
@@ -0,0 +1,73 @@
import request from './request.js'
export function listConversations() {
return request.get('/conversation/list')
}
export function saveConversation(data) {
return request.post('/conversation/save', data)
}
export function deleteConversation(id) {
return request.post('/conversation/delete', { id })
}
export function listMessages(conversationId) {
return request.get('/message/list', { params: { conversation_id: conversationId } })
}
// streamChat RAG 问答 SSEhandlers.onCitations / onDelta / onDone / onError
export async function streamChat(payload, handlers) {
const token = localStorage.getItem('token')
let resp
try {
resp = await fetch('/message/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': token ? 'Bearer ' + token : ''
},
body: JSON.stringify(payload)
})
} catch (e) {
handlers.onError(new Error('网络错误,请检查服务是否启动'))
return
}
if (!resp.ok || !resp.body) {
handlers.onError(new Error('请求失败:' + resp.status))
return
}
const reader = resp.body.getReader()
const decoder = new TextDecoder()
let buf = ''
try {
while (true) {
const { done, value } = await reader.read()
if (done) break
buf += decoder.decode(value, { stream: true })
let idx
while ((idx = buf.indexOf('\n\n')) >= 0) {
const block = buf.slice(0, idx)
buf = buf.slice(idx + 2)
for (const line of block.split('\n')) {
if (!line.startsWith('data: ')) continue
const data = line.slice(6).trim()
if (!data || data === '[DONE]') continue
let obj
try {
obj = JSON.parse(data)
} catch {
continue
}
if (obj.citations !== undefined) handlers.onCitations(obj)
else if (obj.content !== undefined) handlers.onDelta(obj.content)
else if (obj.status === 'ok') handlers.onDone()
else if (obj.message) handlers.onError(new Error(obj.message))
}
}
}
handlers.onDone()
} catch (e) {
handlers.onError(e)
}
}
+9
View File
@@ -0,0 +1,9 @@
import request from './request.js'
export function listChunks(params) {
return request.get('/chunk/list', { params })
}
export function updateChunk(data) {
return request.post('/chunk/update', data)
}
+13
View File
@@ -0,0 +1,13 @@
import request from './request.js'
export function listDatasets() {
return request.get('/dataset/list')
}
export function saveDataset(data) {
return request.post('/dataset/save', data)
}
export function deleteDataset(id) {
return request.post('/dataset/delete', { id })
}
+21
View File
@@ -0,0 +1,21 @@
import request from './request.js'
export function listDocuments(params) {
return request.get('/document/list', { params })
}
export function uploadDocument(formData) {
return request.post('/document/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } })
}
export function deleteDocument(id) {
return request.post('/document/delete', { id })
}
export function reembedDocument(id) {
return request.post('/document/reembed', { id })
}
export function retryParseTask(id) {
return request.post('/parse-task/retry', { id })
}
+9
View File
@@ -0,0 +1,9 @@
import request from './request.js'
export function listEntities(params) {
return request.get('/kg-entity/list', { params })
}
export function listRelations(params) {
return request.get('/kg-relation/list', { params })
}
+17
View File
@@ -0,0 +1,17 @@
import request from './request.js'
export function listModelConfigs(modelType) {
return request.get('/model-config/list', { params: { model_type: modelType } })
}
export function saveModelConfig(data) {
return request.post('/model-config/save', data)
}
export function deleteModelConfig(id) {
return request.post('/model-config/delete', { id })
}
export function testModelConfig(id) {
return request.post('/model-config/test', { id })
}
+43
View File
@@ -0,0 +1,43 @@
import axios from 'axios'
import { ElMessage } from 'element-plus'
const request = axios.create({
timeout: 300000
})
request.interceptors.request.use(config => {
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = 'Bearer ' + token
}
return config
})
function redirectLogin() {
localStorage.removeItem('token')
window.location.href = '/#/login'
}
request.interceptors.response.use(
response => {
const data = response.data
if (data.code !== 0) {
if (data.code === 401) {
redirectLogin()
return Promise.reject(new Error(data.message))
}
ElMessage.error(data.message || '请求失败')
return Promise.reject(new Error(data.message))
}
return data.data
},
error => {
if (error.response?.status === 401) {
redirectLogin()
}
ElMessage.error(error.message || '网络错误')
return Promise.reject(error)
}
)
export default request