Initial commit

This commit is contained in:
mstfyldz
2026-08-08 17:19:28 +03:00
commit df70520ede
19 changed files with 3926 additions and 0 deletions
+104
View File
@@ -0,0 +1,104 @@
import { Request, Response } from 'express';
export const searchPrecedents = async (req: Request, res: Response) => {
try {
const { phrase, court_types, page_number } = req.body;
if (!phrase) {
return res.status(400).json({ error: 'Arama metni (phrase) zorunludur.' });
}
let optimizedPhrase = phrase;
// Eğer sorgu 3 kelimeden uzunsa (doğal dil sorusu ise), AI ile anahtar kelimelere dönüştür
if (phrase.split(' ').length > 3) {
const aiModel = process.env.AI_MODEL || 'mizan-fixed';
const runpodUrl = process.env.RUNPOD_API_BASE_URL || 'https://q190env94stwis-11434.proxy.runpod.net';
const systemPrompt = `Sen uzman bir Türk avukatısın. Kullanıcının uzun ve doğal dille yazdığı hukuki soruyu, Yargıtay içtihat arama motorunda en iyi sonucu verecek şekilde 2 ila en fazla 4 temel hukuki terime/anahtar kelimeye çevir.
SADECE anahtar kelimeleri aralarına boşluk koyarak yaz. Noktalama işareti, açıklama veya ek kelimeler (ve, ile, vb.) kullanma.
Örnek Kullanıcı: İşveren tarafından performans düşüklüğü gerekçesiyle iş sözleşmesi feshedilen işçinin işe iade davası açması halinde ispat yükü kime aittir
Örnek Cevap: performans düşüklüğü ispat yükü işe iade`;
try {
const aiResponse = await fetch(`${runpodUrl}/v1/chat/completions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
model: aiModel,
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: phrase }
],
think: false,
stream: false,
}),
});
if (aiResponse.ok) {
const data = await aiResponse.json();
const aiContent = data.message?.content || (data.choices && data.choices[0]?.message?.content);
if (aiContent) {
optimizedPhrase = aiContent.trim().replace(/["'\n]/g, '');
console.log(`[AI Search] Orijinal: "${phrase}" -> Optimize: "${optimizedPhrase}"`);
}
} else {
console.error('AI Query Optimization API returned status:', aiResponse.status);
}
} catch (err) {
console.error('AI Query Optimization Fetch Error:', err);
}
}
// Yargı MCP REST API'sine (8001 portu veya YARGI_MCP_URL) optimize edilmiş sorgu ile istek at
const mcpBaseUrl = process.env.YARGI_MCP_URL || 'http://localhost:8001';
const mcpResponse = await fetch(`${mcpBaseUrl}/search`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
phrase: optimizedPhrase,
court_types: court_types || ["YARGITAYKARARI", "DANISTAYKARAR"],
page_number: page_number || 1
})
});
if (!mcpResponse.ok) {
const errorData = await mcpResponse.text();
console.error('Yargı MCP API Error:', errorData);
return res.status(mcpResponse.status).json({ error: 'Arama servisi hata döndürdü', details: errorData });
}
const data = await mcpResponse.json();
res.json(data);
} catch (error: any) {
console.error('Search Precedents Error:', error);
res.status(500).json({ error: error.message || 'Internal Server Error' });
}
};
export const getPrecedentDocument = async (req: Request, res: Response) => {
try {
const documentId = String(req.params.documentId || '');
if (!documentId) {
return res.status(400).json({ error: 'documentId zorunludur.' });
}
const mcpBaseUrl = process.env.YARGI_MCP_URL || 'http://localhost:8001';
const mcpResponse = await fetch(`${mcpBaseUrl}/document/${encodeURIComponent(documentId)}`);
if (!mcpResponse.ok) {
const errorData = await mcpResponse.text();
console.error('Yargı MCP API Error:', errorData);
return res.status(mcpResponse.status).json({ error: 'Belge servisi hata döndürdü', details: errorData });
}
const data = await mcpResponse.json();
res.json(data);
} catch (error: any) {
console.error('Get Precedent Document Error:', error);
res.status(500).json({ error: error.message || 'Internal Server Error' });
}
};