5bee9288b9
1、修复了若干无权限时的失败提示语 2、新增了一个生成后续建议问题的功能 3、重构了知识问答部分的权限管理模块 4、修复了若干渲染不恰当的样式渲染
165 lines
5.8 KiB
TypeScript
165 lines
5.8 KiB
TypeScript
import { type ActionFunctionArgs, type LoaderFunctionArgs } from '@remix-run/node';
|
|
import { difyClient } from '~/api/dify-chat/client.server';
|
|
|
|
/**
|
|
* GET /api/chat-messages - 获取会话消息列表
|
|
*/
|
|
export async function loader({ request }: LoaderFunctionArgs) {
|
|
try {
|
|
// 获取用户会话信息和 JWT
|
|
const { getUserSession } = await import("~/api/login/auth.server");
|
|
const { frontendJWT } = await getUserSession(request);
|
|
|
|
// 检查 JWT 是否存在
|
|
if (!frontendJWT) {
|
|
console.error('❌ [API] Chat Messages GET - JWT不存在');
|
|
return new Response(
|
|
JSON.stringify({ error: 'JWT认证失败,请重新登录' }),
|
|
{
|
|
status: 401,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
}
|
|
);
|
|
}
|
|
|
|
// 从 URL 参数获取 conversation_id
|
|
const url = new URL(request.url);
|
|
const conversationId = url.searchParams.get('conversation_id');
|
|
|
|
if (!conversationId) {
|
|
return new Response(
|
|
JSON.stringify({ error: '缺少 conversation_id 参数' }),
|
|
{
|
|
status: 400,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
}
|
|
);
|
|
}
|
|
|
|
console.log('客戶端調用remix路由_Chat Messages GET - 获取消息列表:', { conversationId });
|
|
|
|
const result = await difyClient.getConversationMessages(conversationId, frontendJWT);
|
|
|
|
return new Response(JSON.stringify(result), {
|
|
status: 200,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
});
|
|
|
|
} catch (error: any) {
|
|
console.error('❌ [API] Chat Messages GET - Error:', error.message);
|
|
const sm = error.message?.match(/(\d{3})/); const os = sm ? parseInt(sm[1]) : 0;
|
|
const status = error.message?.includes('JWT认证失败') ? 401 : os >= 400 && os < 500 ? os : 500;
|
|
return new Response(
|
|
JSON.stringify({ error: error.message || 'Failed to get messages' }),
|
|
{
|
|
status,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* POST /api/chat-messages - 发送聊天消息
|
|
*/
|
|
export async function action({ request }: ActionFunctionArgs) {
|
|
if (request.method !== 'POST') {
|
|
return new Response('Method not allowed', { status: 405 });
|
|
}
|
|
|
|
try {
|
|
// 获取用户会话信息和 JWT
|
|
const { getUserSession } = await import("~/api/login/auth.server");
|
|
const { frontendJWT } = await getUserSession(request);
|
|
|
|
// 检查 JWT 是否存在
|
|
if (!frontendJWT) {
|
|
console.error('❌ [API] Chat Messages API - JWT不存在');
|
|
return new Response(
|
|
JSON.stringify({ error: 'JWT认证失败,请重新登录' }),
|
|
{
|
|
status: 401,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
}
|
|
);
|
|
}
|
|
|
|
const body = await request.json();
|
|
|
|
const {
|
|
inputs,
|
|
query,
|
|
files,
|
|
conversation_id: conversationId,
|
|
response_mode: responseMode,
|
|
app_id: appId, // 支持前端传递应用 ID
|
|
} = body;
|
|
|
|
console.log('客戶端調用remix路由_Chat Messages API - 收到请求:', {
|
|
queryLength: query?.length || 0,
|
|
queryPreview: query?.substring(0, 100) + (query?.length > 100 ? '...' : ''),
|
|
conversationId,
|
|
responseMode,
|
|
appId, // 记录应用 ID
|
|
hasInputs: !!inputs,
|
|
hasFiles: !!files && files.length > 0,
|
|
filesCount: files?.length || 0,
|
|
hasJWT: !!frontendJWT
|
|
});
|
|
|
|
const response = await difyClient.createChatMessage(
|
|
inputs,
|
|
query,
|
|
responseMode,
|
|
conversationId,
|
|
files,
|
|
frontendJWT, // 传递 JWT
|
|
appId // 传递应用 ID
|
|
);
|
|
|
|
// 对于流式响应,直接返回流
|
|
if (responseMode === 'streaming') {
|
|
console.log('Dify转发fastapi,返回流式响应');
|
|
return new Response(response.body, {
|
|
status: response.status,
|
|
headers: {
|
|
'Content-Type': 'text/event-stream',
|
|
'Cache-Control': 'no-cache',
|
|
'Connection': 'keep-alive',
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'POST',
|
|
'Access-Control-Allow-Headers': 'Content-Type',
|
|
},
|
|
});
|
|
}
|
|
|
|
// 对于非流式响应,返回JSON
|
|
return new Response(JSON.stringify(response), {
|
|
status: 200,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
|
|
} catch (error: any) {
|
|
console.error('❌ [API] Chat Messages API - Error:', {
|
|
message: error.message,
|
|
stack: error.stack,
|
|
name: error.name
|
|
});
|
|
|
|
// 检查是否是JWT认证失败
|
|
const sm = error.message?.match(/(\d{3})/); const os = sm ? parseInt(sm[1]) : 0;
|
|
const status = error.message?.includes('JWT认证失败') ? 401 : os >= 400 && os < 500 ? os : 500;
|
|
|
|
return new Response(
|
|
JSON.stringify({ error: error.message || 'Failed to send message' }),
|
|
{
|
|
status,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
}
|
|
);
|
|
}
|
|
}
|