feat(simulator): add opponent/judge simulator feature endpoints
This commit is contained in:
@@ -60,13 +60,14 @@ function buildAttachmentContext(attachments: unknown): string {
|
||||
export const deleteChatHistory = async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const { caseId } = req.params;
|
||||
const chat_mode = req.query.chat_mode || req.body.chat_mode || 'chat';
|
||||
if (!caseId || caseId === 'general') {
|
||||
return res.status(400).json({ error: 'Geçersiz caseId' });
|
||||
}
|
||||
// requireAuth zaten bu caseId'nin isteği yapan kullanıcıya ait olduğunu doğruladı.
|
||||
// Silme işlemi burada (backend'de, service_role ile) yapılıyor — frontend'in anon
|
||||
// client'ı chat_messages'a RLS nedeniyle yazamıyor/silemiyor olabilir.
|
||||
const { error } = await supabase.from('chat_messages').delete().eq('case_id', caseId);
|
||||
const { error } = await supabase.from('chat_messages').delete().eq('case_id', caseId).eq('chat_mode', chat_mode);
|
||||
if (error) throw error;
|
||||
res.json({ ok: true });
|
||||
} catch (error: any) {
|
||||
@@ -80,7 +81,7 @@ export const deleteChatHistory = async (req: AuthenticatedRequest, res: Response
|
||||
// yerine yazılırken görür; gerçek üretim süresi aynı kalsa da algılanan hız artar.
|
||||
export const chatMessage = async (req: AuthenticatedRequest, res: Response) => {
|
||||
const { caseId } = req.params;
|
||||
const { content, attachments, document_ids } = req.body;
|
||||
const { content, attachments, document_ids, chat_mode = 'chat', persona = 'judge' } = req.body;
|
||||
const userId = req.user?.id;
|
||||
|
||||
if (!content || !caseId) {
|
||||
@@ -97,7 +98,7 @@ export const chatMessage = async (req: AuthenticatedRequest, res: Response) => {
|
||||
const persistedContent = content + buildAttachmentNote(attachments);
|
||||
const { error: userMsgError } = await supabase
|
||||
.from('chat_messages')
|
||||
.insert([{ case_id: caseId, user_id: userId, role: 'user', content: persistedContent }]);
|
||||
.insert([{ case_id: caseId, user_id: userId, role: 'user', content: persistedContent, chat_mode }]);
|
||||
if (userMsgError) throw userMsgError;
|
||||
|
||||
const { data: analyses } = await supabase
|
||||
@@ -114,6 +115,7 @@ export const chatMessage = async (req: AuthenticatedRequest, res: Response) => {
|
||||
.from('chat_messages')
|
||||
.select('role, content')
|
||||
.eq('case_id', caseId)
|
||||
.eq('chat_mode', chat_mode)
|
||||
.order('created_at', { ascending: true })
|
||||
.limit(10);
|
||||
|
||||
@@ -142,8 +144,15 @@ export const chatMessage = async (req: AuthenticatedRequest, res: Response) => {
|
||||
|
||||
documentContext += buildAttachmentContext(attachments);
|
||||
|
||||
const systemPrompt = `Sen bir hukuk asistanısın. Bu dava dosyasıyla ilgili kullanıcının sorularını, aşağıda verilen belge içeriğine dayanarak cevaplıyorsun. Eğer belge yoksa veya soruyu cevaplamaya yetmiyorsa, bunu açıkça belirt, uydurma bilgi verme.${documentContext}`;
|
||||
|
||||
let systemPrompt = `Sen bir hukuk asistanısın. Bu dava dosyasıyla ilgili kullanıcının sorularını, aşağıda verilen belge içeriğine dayanarak cevaplıyorsun. Eğer belge yoksa veya soruyu cevaplamaya yetmiyorsa, bunu açıkça belirt, uydurma bilgi verme.${documentContext}`;
|
||||
|
||||
if (chat_mode === 'simulator') {
|
||||
if (persona === 'opponent') {
|
||||
systemPrompt = `Sen davada karşı tarafın son derece agresif, açık arayan ve zeki avukatısın. Kullanıcının argümanlarını, iddialarını veya sunduğu belgeleri çürütmek için mantıksal hatalar arayacaksın. Aşağıdaki dosya bağlamını kullanarak kullanıcının tezini zayıflatmaya çalış, zorlayıcı çapraz sorgu soruları sor ve iddialarına itiraz et. Asla yardımcı olma, karşı tarafı zorla.\n${documentContext}`;
|
||||
} else { // judge
|
||||
systemPrompt = `Sen bu davanın son derece sert, tarafsız, usul ve esasa titizlikle dikkat eden acımasız hakimi rolündesin. Kullanıcının argümanlarını ve belgelerini sert bir şekilde sorgulayacaksın. Hukuki dayanaktan yoksun, soyut veya çelişkili ifadeleri anında yakala ve izahını iste. Kullanıcının argümanlarındaki açıkları bulup hukuki geçerliliğini kanıtlamasını talep et.\n${documentContext}`;
|
||||
}
|
||||
}
|
||||
const messages: ChatMsg[] = [{ role: 'system', content: systemPrompt }];
|
||||
if (pastMessages && pastMessages.length > 0) {
|
||||
pastMessages.forEach(m => messages.push({ role: m.role, content: m.content }));
|
||||
@@ -156,7 +165,7 @@ export const chatMessage = async (req: AuthenticatedRequest, res: Response) => {
|
||||
|
||||
const { data: aiMessage, error: aiMsgError } = await supabase
|
||||
.from('chat_messages')
|
||||
.insert([{ case_id: caseId, user_id: userId, role: 'assistant', content: aiContent }])
|
||||
.insert([{ case_id: caseId, user_id: userId, role: 'assistant', content: aiContent, chat_mode }])
|
||||
.select().single();
|
||||
if (aiMsgError) console.error('Save AI Message Error:', aiMsgError);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user