feat: dinamik AI prompt yönetimi (ai_prompts tablosu + promptService)

20 AI system prompt'unu (chat/analiz/dilekçe/içtihat) koddan Supabase'e
taşıyan promptService.ts eklendi — artık bir prompt metnini değiştirmek
için redeploy gerekmiyor, admin panelden Supabase'e yazılıp 5dk içinde
devreye giriyor (bkz. laawos/docs/DINAMIK_PROMPT_MIMARISI_VE_YONETIMI.md,
laawos/sql/23_ai_prompts.sql — Supabase Studio'da elle çalıştırılmalı).

Canlı kullanıcı olduğu için davranış değişikliği YOK: promptService'in
fallback metinleri bugünkü hardcoded prompt'ların birebir kopyası
(programatik script ile karakter karakter doğrulandı), Supabase migration
çalıştırılmadan/erişilemezken sistem bugünkü gibi çalışmaya devam ediyor.
Bilinçli olarak dokunulmayanlar: model seçimi (tek global AI_MODEL env),
temperature (hiç gönderilmiyor), max_tokens (call-site'a göre değişiyor)
— hiçbiri gerçek AI çağrısına yansıtılmıyor, sadece prompt METNİ dinamik.

chat_intern iki farklı promptun (canlı sohbet vs. anlık soru-cevap) aynı
chat_mode='intern' etiketini paylaştığı görüldüğü için chat_intern_live
ve chat_intern_qa olarak ayrıştırıldı. Ayrıca kodda var olup dokümanda
listelenmeyen doc_strategy, doc_mediation, legislation_keywords, chat_title
ve chat_thread_general de tabloya eklendi.
This commit is contained in:
Mustafa Yildiz
2026-08-30 12:25:10 +03:00
parent dd7fccdd0c
commit b689b0f8fc
6 changed files with 410 additions and 292 deletions
+3 -4
View File
@@ -1,5 +1,6 @@
import { supabase } from './supabase';
import { callOllama } from './aiClient';
import * as promptService from './promptService';
export interface LegislationMatch {
maddeNo: string;
@@ -106,15 +107,13 @@ async function fetchByCitations(citations: Citation[]): Promise<LegislationMatch
return matches;
}
const KEYWORD_PROMPT = `Sen uzman bir Türk avukatısın. Sana verilen dava metnini, ilgili kanun maddelerini bulmak için Türkçe tam-metin aramada kullanılacak 2 ila 4 temel hukuki terime çevir.
SADECE anahtar kelimeleri aralarına boşluk koyarak yaz. Noktalama işareti, açıklama veya ek kelime kullanma.`;
async function fetchByFullTextSearch(caseText: string): Promise<LegislationMatch[]> {
let keywords = '';
try {
const keywordPrompt = await promptService.getPrompt('legislation_keywords');
const aiContent = await callOllama(
[
{ role: 'system', content: KEYWORD_PROMPT },
{ role: 'system', content: keywordPrompt },
{ role: 'user', content: caseText.slice(0, 2000) },
],
{ numPredict: 40, timeoutMs: 20_000 }