feat: 重新对接了会话及相关的接口

This commit is contained in:
zoujing
2026-03-05 16:29:03 +08:00
parent c7a37e6816
commit c85f211c9c
4 changed files with 110 additions and 23 deletions

View 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
}

View File

@@ -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>

View File

@@ -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);
@@ -493,7 +494,7 @@ const handleWebSocketMessage = (data: any) => {
chatMsgList.value[aiMsgIndex].messageContent = ""; chatMsgList.value[aiMsgIndex].messageContent = "";
} }
} }
// 处理toolCall // 处理toolCall
if (data.toolCall) { if (data.toolCall) {
chatMsgList.value[aiMsgIndex].toolCall = data.toolCall; chatMsgList.value[aiMsgIndex].toolCall = data.toolCall;

View File

@@ -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
}))) })))
} }