feat: 重新对接了会话及相关的接口
This commit is contained in:
85
src/renderer/api/SessionsApi.ts
Normal file
85
src/renderer/api/SessionsApi.ts
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import { getRequest, postRequest, ResponseModel } from '@utils/request'
|
||||||
|
|
||||||
|
// 创建会话 的请求参数和响应数据结构
|
||||||
|
export interface CreateSessionRequest {
|
||||||
|
title?: string
|
||||||
|
tenant_id_query?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreateSessionResponse {
|
||||||
|
session_id: string
|
||||||
|
user_id: string
|
||||||
|
tenant_id: string
|
||||||
|
title: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createSession = async (params: CreateSessionRequest) => {
|
||||||
|
const res: ResponseModel = await postRequest('/nianxx/api/sessions', params)
|
||||||
|
return res.data as CreateSessionResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 获取会话列表 的请求参数和响应数据结构
|
||||||
|
export interface SessionListRequest {
|
||||||
|
tenant_id_query?: string
|
||||||
|
limit?: number
|
||||||
|
offset?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SessionListResponse {
|
||||||
|
sessions: Array<SessionListRecords>
|
||||||
|
total: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SessionListRecords {
|
||||||
|
session_id: string
|
||||||
|
user_id: string
|
||||||
|
tenant_id: string
|
||||||
|
title: string
|
||||||
|
status: string
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getSessionList = async (params: SessionListRequest) => {
|
||||||
|
const res: ResponseModel = await getRequest('/nianxx/api/sessions', params)
|
||||||
|
return res.data as SessionListResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// 获取会话消息历史 的请求参数和响应数据结构
|
||||||
|
export interface SessionMessagesRequest {
|
||||||
|
user_id_query?: string
|
||||||
|
tenant_id_query?: number
|
||||||
|
limit?: number
|
||||||
|
offset?: number
|
||||||
|
session_id: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SessionMessagesResponse {
|
||||||
|
messages: Array<SessionMessageRecords>
|
||||||
|
total: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SessionMessageRecords {
|
||||||
|
id: number
|
||||||
|
session_id: string
|
||||||
|
role: string
|
||||||
|
content: string
|
||||||
|
source: string
|
||||||
|
message_id: string | null
|
||||||
|
created_at: string
|
||||||
|
timestamp?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取会话消息历史 的函数实现
|
||||||
|
export const getSessionMessages = async (params: SessionMessagesRequest) => {
|
||||||
|
const res: ResponseModel = await getRequest(`/nianxx/api/sessions/${params.session_id}/messages`, {
|
||||||
|
limit: params.limit,
|
||||||
|
offset: params.offset,
|
||||||
|
user_id_query: params.user_id_query,
|
||||||
|
tenant_id_query: params.tenant_id_query,
|
||||||
|
})
|
||||||
|
return res.data as SessionMessagesResponse
|
||||||
|
}
|
||||||
@@ -77,6 +77,7 @@ instance.interceptors.request.use(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(`🚀 ~ request: \n url:${config.url} \n params:${JSON.stringify(config.data)} \n`)
|
||||||
return config
|
return config
|
||||||
},
|
},
|
||||||
(error) => {
|
(error) => {
|
||||||
@@ -87,7 +88,7 @@ instance.interceptors.request.use(
|
|||||||
// 添加响应拦截器
|
// 添加响应拦截器
|
||||||
instance.interceptors.response.use(
|
instance.interceptors.response.use(
|
||||||
(res) => {
|
(res) => {
|
||||||
console.log(`🚀 ~ response: \n url:${res.config.url} \n params:${JSON.stringify(res.config.params)} \n data:\n ${JSON.stringify(res.data)}`)
|
console.log(`🚀 ~ response: \n url:${res.config.url} \n params:${JSON.stringify(res.config.data)} \n data:\n ${JSON.stringify(res.data)}`)
|
||||||
// 未设置状态码则默认成功状态
|
// 未设置状态码则默认成功状态
|
||||||
const code = res.data.code || 200
|
const code = res.data.code || 200
|
||||||
// 获取错误信息
|
// 获取错误信息
|
||||||
@@ -143,7 +144,7 @@ instance.interceptors.response.use(
|
|||||||
export const postRequest = <ResponseModel>(url: string, data?: any, options?: any): Promise<ResponseModel> => {
|
export const postRequest = <ResponseModel>(url: string, data?: any, options?: any): Promise<ResponseModel> => {
|
||||||
return instance.request({
|
return instance.request({
|
||||||
url,
|
url,
|
||||||
method: 'POST',
|
method: 'post',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
@@ -156,7 +157,7 @@ export const postRequest = <ResponseModel>(url: string, data?: any, options?: an
|
|||||||
export const getRequest = <ResponseModel>(url: string, params?: any, options?: any): Promise<ResponseModel> => {
|
export const getRequest = <ResponseModel>(url: string, params?: any, options?: any): Promise<ResponseModel> => {
|
||||||
return instance.request({
|
return instance.request({
|
||||||
url,
|
url,
|
||||||
method: 'GET',
|
method: 'get',
|
||||||
params,
|
params,
|
||||||
...(options || {}),
|
...(options || {}),
|
||||||
}) as Promise<ResponseModel>
|
}) as Promise<ResponseModel>
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ import { Session } from '../../utils/storage';
|
|||||||
|
|
||||||
import userAvatar from '@assets/images/login/user_icon.png';
|
import userAvatar from '@assets/images/login/user_icon.png';
|
||||||
import aiAvatar from '@assets/images/login/blue_logo.png';
|
import aiAvatar from '@assets/images/login/blue_logo.png';
|
||||||
import { createConversation, conversationMessageList } from '../../api/ConversationApi';
|
import { createSession, getSessionMessages } from '../../api/SessionsApi';
|
||||||
import { ElMessage, ElLoading } from 'element-plus'
|
import { ElMessage, ElLoading } from 'element-plus'
|
||||||
|
|
||||||
// 支持外部通过 prop 控制是否为引导页
|
// 支持外部通过 prop 控制是否为引导页
|
||||||
@@ -275,7 +275,7 @@ onMounted(() => {
|
|||||||
|
|
||||||
// token存在,初始化数据
|
// token存在,初始化数据
|
||||||
const initHandler = async () => {
|
const initHandler = async () => {
|
||||||
console.log("initHandler");
|
console.log("initHandler:检查 token 并初始化数据");
|
||||||
const token = getAccessToken();
|
const token = getAccessToken();
|
||||||
if (!token) return;
|
if (!token) return;
|
||||||
await createConversationRequest();
|
await createConversationRequest();
|
||||||
@@ -296,11 +296,11 @@ const checkToken = async () => {
|
|||||||
|
|
||||||
// 调用接口创建新会话
|
// 调用接口创建新会话
|
||||||
const createConversationRequest = async (): Promise<string | null> => {
|
const createConversationRequest = async (): Promise<string | null> => {
|
||||||
const res = await createConversation();
|
const res = await createSession({});
|
||||||
if (res && res.conversationId) {
|
if (res && res.session_id) {
|
||||||
conversationId.value = res.conversationId;
|
conversationId.value = res.session_id;
|
||||||
console.log("创建新会话,ID:", conversationId.value);
|
console.log("创建新会话,ID:", conversationId.value);
|
||||||
return res.conversationId;
|
return res.session_id;
|
||||||
} else {
|
} else {
|
||||||
console.log("创建会话失败,接口返回异常");
|
console.log("创建会话失败,接口返回异常");
|
||||||
return null;
|
return null;
|
||||||
@@ -310,13 +310,14 @@ const createConversationRequest = async (): Promise<string | null> => {
|
|||||||
// 加载历史会话消息
|
// 加载历史会话消息
|
||||||
const loadConversationMessages = async (convId: string) => {
|
const loadConversationMessages = async (convId: string) => {
|
||||||
try {
|
try {
|
||||||
const res = await conversationMessageList({ conversationId: convId, pageSize: 50, pageNum: 1 });
|
const res = await getSessionMessages({ session_id: convId, limit: 50, offset: 0 });
|
||||||
// 将消息转换为 ChatMessage 格式
|
// 将消息转换为 ChatMessage 格式
|
||||||
chatMsgList.value = res.records.map((msg: any) => ({
|
chatMsgList.value = res.messages.map((msg: any) => ({
|
||||||
messageId: msg.messageId,
|
messageId: msg.message_id,
|
||||||
messageRole: msg.messageSenderRole === 'user' ? MessageRole.ME : MessageRole.AI,
|
messageRole: msg.role === 'user' ? MessageRole.ME : MessageRole.AI,
|
||||||
messageContent: msg.messageContent,
|
messageContent: msg.content,
|
||||||
timestamp: msg.timestamp,
|
messageContentList: [msg.content],
|
||||||
|
timestamp: msg.created_at_ts,
|
||||||
finished: true, // 历史消息已完成
|
finished: true, // 历史消息已完成
|
||||||
}));
|
}));
|
||||||
console.log("加载历史消息:", chatMsgList.value);
|
console.log("加载历史消息:", chatMsgList.value);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
]">
|
]">
|
||||||
<span class="w-2 h-2 rounded-full bg-[#BEDBFF] flex-none"></span>
|
<span class="w-2 h-2 rounded-full bg-[#BEDBFF] flex-none"></span>
|
||||||
<div class="flex-1 min-w-0">
|
<div class="flex-1 min-w-0">
|
||||||
<div class="truncate text-sm">{{ item.conversationId }}</div>
|
<div class="truncate text-sm">{{ item.conversationTitle }}</div>
|
||||||
</div>
|
</div>
|
||||||
<button v-if="item.conversationId === selectedConversationId"
|
<button v-if="item.conversationId === selectedConversationId"
|
||||||
class="bg-transparent border-0 text-gray-500 text-lg px-1 py-0">…</button>
|
class="bg-transparent border-0 text-gray-500 text-lg px-1 py-0">…</button>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted, defineEmits } from 'vue'
|
import { ref, onMounted, defineEmits } from 'vue'
|
||||||
import { RiAddLine, RiArrowRightSLine, RiArrowDownSLine } from '@remixicon/vue'
|
import { RiAddLine, RiArrowRightSLine, RiArrowDownSLine } from '@remixicon/vue'
|
||||||
import { getConversationList } from '../../api/ConversationApi';
|
import { getSessionList } from '../../api/SessionsApi';
|
||||||
|
|
||||||
interface HistoryMessage {
|
interface HistoryMessage {
|
||||||
conversationId: string;
|
conversationId: string;
|
||||||
@@ -72,11 +72,11 @@ onMounted(() => {
|
|||||||
|
|
||||||
/// 获取历史会话列表
|
/// 获取历史会话列表
|
||||||
const getHistoryConversationList = async () => {
|
const getHistoryConversationList = async () => {
|
||||||
const list = await getConversationList({ pageSize: 20, pageNum: 1 })
|
const list = await getSessionList({ limit: 50, offset: 0 })
|
||||||
if (!list || !list.records) return;
|
if (!list || !list.sessions) return;
|
||||||
groups.value.push(...list.records.map((item: any) => ({
|
groups.value.push(...list.sessions.map((item: any) => ({
|
||||||
conversationId: item.conversationId,
|
conversationId: item.session_id,
|
||||||
conversationTitle: item.conversationTitle
|
conversationTitle: item.title
|
||||||
})))
|
})))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user