web-文件接口
This commit is contained in:
32
schoolNewsWeb/src/apis/ai/agent-config.ts
Normal file
32
schoolNewsWeb/src/apis/ai/agent-config.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @description 智能体配置相关API
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
|
||||
import { api } from '@/apis/index';
|
||||
import type { AiAgentConfig, ResultDomain } from '@/types';
|
||||
|
||||
/**
|
||||
* 智能体配置API服务
|
||||
*/
|
||||
export const aiAgentConfigApi = {
|
||||
/**
|
||||
* 获取智能体配置
|
||||
* @returns Promise<ResultDomain<AiAgentConfig>>
|
||||
*/
|
||||
async getAgentConfig(): Promise<ResultDomain<AiAgentConfig>> {
|
||||
const response = await api.get<AiAgentConfig>('/ai/agent-config');
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 更新智能体配置
|
||||
* @param config 配置数据
|
||||
* @returns Promise<ResultDomain<AiAgentConfig>>
|
||||
*/
|
||||
async updateAgentConfig(config: AiAgentConfig): Promise<ResultDomain<AiAgentConfig>> {
|
||||
const response = await api.put<AiAgentConfig>('/ai/agent-config', config);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
53
schoolNewsWeb/src/apis/ai/conversation.ts
Normal file
53
schoolNewsWeb/src/apis/ai/conversation.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* @description 对话相关API
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
|
||||
import { api } from '@/apis/index';
|
||||
import type { AiConversation, ResultDomain } from '@/types';
|
||||
|
||||
/**
|
||||
* 对话API服务
|
||||
*/
|
||||
export const conversationApi = {
|
||||
/**
|
||||
* 获取用户对话列表
|
||||
* @param userID 用户ID
|
||||
* @returns Promise<ResultDomain<AiConversation>>
|
||||
*/
|
||||
async getConversationList(userID: string): Promise<ResultDomain<AiConversation>> {
|
||||
const response = await api.get<AiConversation>('/ai/conversation/list', { userID });
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 创建对话
|
||||
* @param conversation 对话数据
|
||||
* @returns Promise<ResultDomain<AiConversation>>
|
||||
*/
|
||||
async createConversation(conversation: AiConversation): Promise<ResultDomain<AiConversation>> {
|
||||
const response = await api.post<AiConversation>('/ai/conversation/create', conversation);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除对话
|
||||
* @param conversationID 对话ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async deleteConversation(conversationID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.delete<boolean>(`/ai/conversation/${conversationID}`);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 清空对话记录
|
||||
* @param conversationID 对话ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async clearConversation(conversationID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.post<boolean>(`/ai/conversation/${conversationID}/clear`);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
48
schoolNewsWeb/src/apis/ai/file-upload.ts
Normal file
48
schoolNewsWeb/src/apis/ai/file-upload.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
* @description 文件上传相关API
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
|
||||
import { api } from '@/apis/index';
|
||||
import type { AiUploadFile, FileUploadResponse, ResultDomain } from '@/types';
|
||||
|
||||
/**
|
||||
* 文件上传API服务
|
||||
*/
|
||||
export const fileUploadApi = {
|
||||
/**
|
||||
* 上传文件
|
||||
* @param file 文件
|
||||
* @param userID 用户ID
|
||||
* @returns Promise<ResultDomain<FileUploadResponse>>
|
||||
*/
|
||||
async uploadFile(file: File, userID: string): Promise<ResultDomain<FileUploadResponse>> {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
formData.append('userID', userID);
|
||||
|
||||
const response = await api.upload<FileUploadResponse>('/ai/file/upload', formData);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取上传文件列表
|
||||
* @param userID 用户ID
|
||||
* @returns Promise<ResultDomain<AiUploadFile>>
|
||||
*/
|
||||
async getUploadFileList(userID: string): Promise<ResultDomain<AiUploadFile>> {
|
||||
const response = await api.get<AiUploadFile>('/ai/file/list', { userID });
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除上传文件
|
||||
* @param fileID 文件ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async deleteUploadFile(fileID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.delete<boolean>(`/ai/file/${fileID}`);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
@@ -1,236 +1,12 @@
|
||||
/**
|
||||
* @description 智能体相关API
|
||||
* @author system
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
|
||||
import { api } from '@/apis/index';
|
||||
import type {
|
||||
AiAgentConfig,
|
||||
AiConversation,
|
||||
AiMessage,
|
||||
AiKnowledge,
|
||||
AiUploadFile,
|
||||
ChatRequest,
|
||||
ChatResponse,
|
||||
FileUploadResponse,
|
||||
ResultDomain
|
||||
} from '@/types';
|
||||
|
||||
/**
|
||||
* 智能体配置API服务
|
||||
*/
|
||||
export const aiAgentConfigApi = {
|
||||
/**
|
||||
* 获取智能体配置
|
||||
* @returns Promise<ResultDomain<AiAgentConfig>>
|
||||
*/
|
||||
async getAgentConfig(): Promise<ResultDomain<AiAgentConfig>> {
|
||||
const response = await api.get<AiAgentConfig>('/ai/agent-config');
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 更新智能体配置
|
||||
* @param config 配置数据
|
||||
* @returns Promise<ResultDomain<AiAgentConfig>>
|
||||
*/
|
||||
async updateAgentConfig(config: AiAgentConfig): Promise<ResultDomain<AiAgentConfig>> {
|
||||
const response = await api.put<AiAgentConfig>('/ai/agent-config', config);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 对话API服务
|
||||
*/
|
||||
export const conversationApi = {
|
||||
/**
|
||||
* 获取用户对话列表
|
||||
* @param userID 用户ID
|
||||
* @returns Promise<ResultDomain<AiConversation>>
|
||||
*/
|
||||
async getConversationList(userID: string): Promise<ResultDomain<AiConversation>> {
|
||||
const response = await api.get<AiConversation>('/ai/conversation/list', { userID });
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 创建对话
|
||||
* @param conversation 对话数据
|
||||
* @returns Promise<ResultDomain<AiConversation>>
|
||||
*/
|
||||
async createConversation(conversation: AiConversation): Promise<ResultDomain<AiConversation>> {
|
||||
const response = await api.post<AiConversation>('/ai/conversation/create', conversation);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除对话
|
||||
* @param conversationID 对话ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async deleteConversation(conversationID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.delete<boolean>(`/ai/conversation/${conversationID}`);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 清空对话记录
|
||||
* @param conversationID 对话ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async clearConversation(conversationID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.post<boolean>(`/ai/conversation/${conversationID}/clear`);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 消息API服务
|
||||
*/
|
||||
export const messageApi = {
|
||||
/**
|
||||
* 获取对话消息列表
|
||||
* @param conversationID 对话ID
|
||||
* @returns Promise<ResultDomain<AiMessage>>
|
||||
*/
|
||||
async getMessageList(conversationID: string): Promise<ResultDomain<AiMessage>> {
|
||||
const response = await api.get<AiMessage>(`/ai/message/list`, { conversationID });
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 发送消息
|
||||
* @param request 消息请求
|
||||
* @returns Promise<ResultDomain<ChatResponse>>
|
||||
*/
|
||||
async sendMessage(request: ChatRequest): Promise<ResultDomain<ChatResponse>> {
|
||||
const response = await api.post<ChatResponse>('/ai/message/send', request);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 流式发送消息
|
||||
* @param request 消息请求
|
||||
* @param onMessage 消息回调
|
||||
* @returns Promise<void>
|
||||
*/
|
||||
// async sendMessageStream(request: ChatRequest, onMessage: (message: string) => void): Promise<void> {
|
||||
// const response = await api.post('/ai/message/stream', { ...request, stream: true }, {
|
||||
// responseType: 'stream'
|
||||
// });
|
||||
|
||||
// // 处理流式响应
|
||||
// const reader = response.data.getReader();
|
||||
// const decoder = new TextDecoder();
|
||||
// let done = false;
|
||||
|
||||
// while (!done) {
|
||||
// const readResult = await reader.read();
|
||||
// done = readResult.done;
|
||||
// if (done) break;
|
||||
|
||||
// const chunk = decoder.decode(readResult.value);
|
||||
// const lines = chunk.split('\n');
|
||||
|
||||
// for (const line of lines) {
|
||||
// if (line.startsWith('data: ')) {
|
||||
// const data = line.slice(6);
|
||||
// if (data === '[DONE]') return;
|
||||
|
||||
// try {
|
||||
// const parsed = JSON.parse(data);
|
||||
// onMessage(parsed.content || '');
|
||||
// } catch (e) {
|
||||
// console.error('解析流式数据失败:', e);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
};
|
||||
|
||||
/**
|
||||
* 知识库API服务
|
||||
*/
|
||||
export const knowledgeApi = {
|
||||
/**
|
||||
* 获取知识库列表
|
||||
* @returns Promise<ResultDomain<AiKnowledge>>
|
||||
*/
|
||||
async getKnowledgeList(): Promise<ResultDomain<AiKnowledge>> {
|
||||
const response = await api.get<AiKnowledge>('/ai/knowledge/list');
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 创建知识库条目
|
||||
* @param knowledge 知识库数据
|
||||
* @returns Promise<ResultDomain<AiKnowledge>>
|
||||
*/
|
||||
async createKnowledge(knowledge: AiKnowledge): Promise<ResultDomain<AiKnowledge>> {
|
||||
const response = await api.post<AiKnowledge>('/ai/knowledge/create', knowledge);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 更新知识库条目
|
||||
* @param knowledge 知识库数据
|
||||
* @returns Promise<ResultDomain<AiKnowledge>>
|
||||
*/
|
||||
async updateKnowledge(knowledge: AiKnowledge): Promise<ResultDomain<AiKnowledge>> {
|
||||
const response = await api.put<AiKnowledge>('/ai/knowledge/update', knowledge);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除知识库条目
|
||||
* @param knowledgeID 知识库ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async deleteKnowledge(knowledgeID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.delete<boolean>(`/ai/knowledge/${knowledgeID}`);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 文件上传API服务
|
||||
*/
|
||||
export const fileUploadApi = {
|
||||
/**
|
||||
* 上传文件
|
||||
* @param file 文件
|
||||
* @param userID 用户ID
|
||||
* @returns Promise<ResultDomain<FileUploadResponse>>
|
||||
*/
|
||||
async uploadFile(file: File, userID: string): Promise<ResultDomain<FileUploadResponse>> {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
formData.append('userID', userID);
|
||||
|
||||
const response = await api.upload<FileUploadResponse>('/ai/file/upload', formData);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取上传文件列表
|
||||
* @param userID 用户ID
|
||||
* @returns Promise<ResultDomain<AiUploadFile>>
|
||||
*/
|
||||
async getUploadFileList(userID: string): Promise<ResultDomain<AiUploadFile>> {
|
||||
const response = await api.get<AiUploadFile>('/ai/file/list', { userID });
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除上传文件
|
||||
* @param fileID 文件ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async deleteUploadFile(fileID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.delete<boolean>(`/ai/file/${fileID}`);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
// 重新导出各个子模块
|
||||
export { aiAgentConfigApi } from './agent-config';
|
||||
export { conversationApi } from './conversation';
|
||||
export { messageApi } from './message';
|
||||
export { knowledgeApi } from './knowledge';
|
||||
export { fileUploadApi } from './file-upload';
|
||||
|
||||
52
schoolNewsWeb/src/apis/ai/knowledge.ts
Normal file
52
schoolNewsWeb/src/apis/ai/knowledge.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* @description 知识库相关API
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
|
||||
import { api } from '@/apis/index';
|
||||
import type { AiKnowledge, ResultDomain } from '@/types';
|
||||
|
||||
/**
|
||||
* 知识库API服务
|
||||
*/
|
||||
export const knowledgeApi = {
|
||||
/**
|
||||
* 获取知识库列表
|
||||
* @returns Promise<ResultDomain<AiKnowledge>>
|
||||
*/
|
||||
async getKnowledgeList(): Promise<ResultDomain<AiKnowledge>> {
|
||||
const response = await api.get<AiKnowledge>('/ai/knowledge/list');
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 创建知识库条目
|
||||
* @param knowledge 知识库数据
|
||||
* @returns Promise<ResultDomain<AiKnowledge>>
|
||||
*/
|
||||
async createKnowledge(knowledge: AiKnowledge): Promise<ResultDomain<AiKnowledge>> {
|
||||
const response = await api.post<AiKnowledge>('/ai/knowledge/create', knowledge);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 更新知识库条目
|
||||
* @param knowledge 知识库数据
|
||||
* @returns Promise<ResultDomain<AiKnowledge>>
|
||||
*/
|
||||
async updateKnowledge(knowledge: AiKnowledge): Promise<ResultDomain<AiKnowledge>> {
|
||||
const response = await api.put<AiKnowledge>('/ai/knowledge/update', knowledge);
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除知识库条目
|
||||
* @param knowledgeID 知识库ID
|
||||
* @returns Promise<ResultDomain<boolean>>
|
||||
*/
|
||||
async deleteKnowledge(knowledgeID: string): Promise<ResultDomain<boolean>> {
|
||||
const response = await api.delete<boolean>(`/ai/knowledge/${knowledgeID}`);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
73
schoolNewsWeb/src/apis/ai/message.ts
Normal file
73
schoolNewsWeb/src/apis/ai/message.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* @description 消息相关API
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
|
||||
import { api } from '@/apis/index';
|
||||
import type { AiMessage, ChatRequest, ChatResponse, ResultDomain } from '@/types';
|
||||
|
||||
/**
|
||||
* 消息API服务
|
||||
*/
|
||||
export const messageApi = {
|
||||
/**
|
||||
* 获取对话消息列表
|
||||
* @param conversationID 对话ID
|
||||
* @returns Promise<ResultDomain<AiMessage>>
|
||||
*/
|
||||
async getMessageList(conversationID: string): Promise<ResultDomain<AiMessage>> {
|
||||
const response = await api.get<AiMessage>(`/ai/message/list`, { conversationID });
|
||||
return response.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* 发送消息
|
||||
* @param request 消息请求
|
||||
* @returns Promise<ResultDomain<ChatResponse>>
|
||||
*/
|
||||
async sendMessage(request: ChatRequest): Promise<ResultDomain<ChatResponse>> {
|
||||
const response = await api.post<ChatResponse>('/ai/message/send', request);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 流式发送消息
|
||||
* @param request 消息请求
|
||||
* @param onMessage 消息回调
|
||||
* @returns Promise<void>
|
||||
*/
|
||||
// async sendMessageStream(request: ChatRequest, onMessage: (message: string) => void): Promise<void> {
|
||||
// const response = await api.post('/ai/message/stream', { ...request, stream: true }, {
|
||||
// responseType: 'stream'
|
||||
// });
|
||||
|
||||
// // 处理流式响应
|
||||
// const reader = response.data.getReader();
|
||||
// const decoder = new TextDecoder();
|
||||
// let done = false;
|
||||
|
||||
// while (!done) {
|
||||
// const readResult = await reader.read();
|
||||
// done = readResult.done;
|
||||
// if (done) break;
|
||||
|
||||
// const chunk = decoder.decode(readResult.value);
|
||||
// const lines = chunk.split('\n');
|
||||
|
||||
// for (const line of lines) {
|
||||
// if (line.startsWith('data: ')) {
|
||||
// const data = line.slice(6);
|
||||
// if (data === '[DONE]') return;
|
||||
|
||||
// try {
|
||||
// const parsed = JSON.parse(data);
|
||||
// onMessage(parsed.content || '');
|
||||
// } catch (e) {
|
||||
// console.error('解析流式数据失败:', e);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
};
|
||||
Reference in New Issue
Block a user