nursimakgul's picture
docs: konu kaynağını (Wikipedia+Google Books) tüm dosyalarda tutarlı hale getir
a635653
Raw
History Blame Contribute Delete
9.15 kB
"""
Tool (fonksiyon) katmani.
- DB tool'lari: db.py'yi kullanir (gercek okuma/yazma).
- Web tool'u: kitap konusunu once Turkce Wikipedia'dan, bulunamazsa Google Books'tan ceker.
- TOOLS: modele verilecek JSON semalari (OpenAI/Groq uyumlu).
- TOOL_FUNCS: isim -> fonksiyon eslemesi.
Tum cevaplar gercek veriye dayanir; hicbir fonksiyon bilgi uydurmaz.
"""
import requests
import db
db.init_db() # ilk calismada tablolari kurar
# ---------- DB TABANLI TOOL'LAR ----------
def kitap_ara(sorgu: str) -> dict:
"""Baslik veya yazara gore kitap arar, durumunu doner."""
sonuc = db.kitap_ara_db(sorgu)
if not sonuc:
return {"bulundu": False, "mesaj": f"'{sorgu}' ile eslesen kitap bulunamadi."}
kitaplar = []
for k in sonuc:
item = {"id": k["id"], "baslik": k["baslik"], "yazar": k["yazar"],
"tur": k["tur"], "sayfa": k["sayfa"], "durum": k["durum"]}
if k["durum"] == "oduncte":
item["teslim_tarih"] = k["teslim_tarih"]
kitaplar.append(item)
return {"bulundu": True, "adet": len(kitaplar), "kitaplar": kitaplar}
def kitap_oner(tur: str, koken: str = None, max_sayfa: int = None, min_sayfa: int = None) -> dict:
"""Belirtilen tur ve filtrelere gore kutuphanedeki (bosta) kitaplari onerir."""
sonuc = db.oneri_db(tur=tur, koken=koken, max_sayfa=max_sayfa,
min_sayfa=min_sayfa, sadece_bosta=True)
if not sonuc:
return {"bulundu": False,
"mesaj": f"Bu kriterlere uygun bosta kitap yok (tur={tur})."}
oneriler = [{"id": k["id"], "baslik": k["baslik"], "yazar": k["yazar"],
"sayfa": k["sayfa"], "koken": k["koken"]} for k in sonuc[:6]]
return {"bulundu": True, "adet": len(oneriler), "oneriler": oneriler}
def kitap_odunc_al(kitap_id: int, okuyucu: str) -> dict:
"""Bosta olan bir kitabi okuyucuya odunc verir; 2 hafta teslim tarihi atar."""
r = db.odunc_al_db(int(kitap_id), okuyucu)
k = db.kitap_getir(int(kitap_id))
baslik = k["baslik"] if k else f"#{kitap_id}"
if not r["ok"]:
cevap = {"basarili": False, "kitap": baslik, "mesaj": r["hata"]}
if r.get("teslim_tarih"):
cevap["en_gec_teslim"] = r["teslim_tarih"]
return cevap
return {"basarili": True, "kitap": baslik, "okuyucu": okuyucu,
"odunc_tarih": r["odunc_tarih"], "en_gec_teslim": r["teslim_tarih"],
"mesaj": f"'{baslik}' odunc verildi. En gec {r['teslim_tarih']} tarihinde teslim edilmelidir."}
def kitap_iade_et(kitap_id: int) -> dict:
"""Oduncteki kitabi iade alir; erken/zamaninda/gec durumunu kaydeder."""
r = db.iade_et_db(int(kitap_id))
k = db.kitap_getir(int(kitap_id))
baslik = k["baslik"] if k else f"#{kitap_id}"
if not r["ok"]:
return {"basarili": False, "kitap": baslik, "mesaj": r["hata"]}
aciklama = {"erken": "teslim tarihinden once", "zamaninda": "tam zamaninda",
"gec": "teslim tarihinden sonra"}[r["durum_notu"]]
return {"basarili": True, "kitap": baslik, "durum_notu": r["durum_notu"],
"mesaj": f"'{baslik}' iade alindi ({aciklama})."}
def odunc_durumu(sorgu: str) -> dict:
"""Bir kitabin su an oduncte olup olmadigini ve en gec teslim tarihini soyler."""
sonuc = db.kitap_ara_db(sorgu)
if not sonuc:
return {"bulundu": False, "mesaj": f"'{sorgu}' bulunamadi."}
k = sonuc[0]
if k["durum"] == "bosta":
return {"bulundu": True, "kitap": k["baslik"], "durum": "bosta",
"mesaj": f"'{k['baslik']}' su an kutuphanede, hemen odunc alabilirsiniz."}
return {"bulundu": True, "kitap": k["baslik"], "durum": "oduncte",
"en_gec_teslim": k["teslim_tarih"],
"mesaj": f"'{k['baslik']}' su an baska bir okuyucuda. En gec {k['teslim_tarih']} tarihinde iade edilecek."}
# ---------- WEB TABANLI TOOL ----------
def _wikipedia_ozet(baslik: str):
"""Turkce Wikipedia'dan kitabin ozetini ceker (comert limit, guvenilir)."""
try:
# once arama yapip dogru sayfa basligini bul
s = requests.get("https://tr.wikipedia.org/w/api.php", params={
"action": "query", "list": "search", "srsearch": f"{baslik} kitap roman",
"format": "json", "srlimit": 1,
}, headers={"User-Agent": "KutuphaneAsistani/1.0"}, timeout=15)
s.raise_for_status()
hits = s.json().get("query", {}).get("search", [])
if not hits:
return None
sayfa = hits[0]["title"]
# sayfanin ozet (intro) metnini al
e = requests.get("https://tr.wikipedia.org/w/api.php", params={
"action": "query", "prop": "extracts", "exintro": 1, "explaintext": 1,
"titles": sayfa, "format": "json",
}, headers={"User-Agent": "KutuphaneAsistani/1.0"}, timeout=15)
e.raise_for_status()
pages = e.json().get("query", {}).get("pages", {})
for _, p in pages.items():
ozet = p.get("extract")
if ozet and len(ozet) > 40:
return {"kitap": sayfa, "konu": ozet[:600]}
return None
except Exception:
return None
def _googlebooks_ozet(baslik: str):
"""Google Books'tan ozet (yedek kaynak)."""
try:
r = requests.get("https://www.googleapis.com/books/v1/volumes",
params={"q": baslik, "maxResults": 3}, timeout=15)
r.raise_for_status()
for it in r.json().get("items", []):
vi = it.get("volumeInfo", {})
if vi.get("description"):
return {"kitap": vi.get("title", baslik), "konu": vi["description"][:600]}
return None
except Exception:
return None
def kitap_konusu(baslik: str) -> dict:
"""Kitabin konusunu internetten ceker (DB'de tutulmayan uzun bilgi).
Once Turkce Wikipedia, olmazsa Google Books denenir."""
for kaynak in (_wikipedia_ozet, _googlebooks_ozet):
sonuc = kaynak(baslik)
if sonuc:
return {"bulundu": True, "kitap": sonuc["kitap"], "konu": sonuc["konu"]}
return {"bulundu": False,
"mesaj": f"'{baslik}' icin cevrimici bir konu ozeti bulunamadi."}
# ---------- JSON SEMALARI (model icin) ----------
TOOLS = [
{"type": "function", "function": {
"name": "kitap_ara",
"description": "Baslik veya yazar adina gore kutuphanede kitap arar ve durumunu (bosta/oduncte) doner.",
"parameters": {"type": "object", "properties": {
"sorgu": {"type": "string", "description": "Kitap basligi ya da yazar adi"}},
"required": ["sorgu"]}}},
{"type": "function", "function": {
"name": "kitap_oner",
"description": "Belirtilen turde ve filtrelerde (koken, sayfa) kutuphanedeki bosta kitaplari onerir.",
"parameters": {"type": "object", "properties": {
"tur": {"type": "string", "description": "Kitap turu (orn: polisiye, roman, bilim kurgu, cocuk)"},
"koken": {"type": "string", "description": "'yerli' ya da 'yabanci' (istege bagli)"},
"max_sayfa": {"type": "integer", "description": "En fazla sayfa sayisi (ince kitap icin)"},
"min_sayfa": {"type": "integer", "description": "En az sayfa sayisi (kalin kitap icin)"}},
"required": ["tur"]}}},
{"type": "function", "function": {
"name": "kitap_odunc_al",
"description": "Bosta olan bir kitabi bir okuyucuya odunc verir ve 2 hafta sonrasina teslim tarihi atar.",
"parameters": {"type": "object", "properties": {
"kitap_id": {"type": "integer", "description": "Odunc alinacak kitabin id'si (once kitap_ara ile bul)"},
"okuyucu": {"type": "string", "description": "Okuyucunun adi"}},
"required": ["kitap_id", "okuyucu"]}}},
{"type": "function", "function": {
"name": "kitap_iade_et",
"description": "Oduncte olan bir kitabi iade alir ve erken/zamaninda/gec durumunu kaydeder.",
"parameters": {"type": "object", "properties": {
"kitap_id": {"type": "integer", "description": "Iade edilecek kitabin id'si"}},
"required": ["kitap_id"]}}},
{"type": "function", "function": {
"name": "odunc_durumu",
"description": "Bir kitabin su an oduncte olup olmadigini ve en gec teslim tarihini bildirir.",
"parameters": {"type": "object", "properties": {
"sorgu": {"type": "string", "description": "Kitap basligi"}},
"required": ["sorgu"]}}},
{"type": "function", "function": {
"name": "kitap_konusu",
"description": "Bir kitabin konusunu/ozetini internetten getirir (once Turkce Wikipedia, bulunamazsa Google Books). Kutuphane veritabaninda konu ozeti tutulmadigi icin bu bilgi web'den alinir.",
"parameters": {"type": "object", "properties": {
"baslik": {"type": "string", "description": "Konusu ogrenilecek kitabin basligi"}},
"required": ["baslik"]}}},
]
TOOL_FUNCS = {
"kitap_ara": kitap_ara,
"kitap_oner": kitap_oner,
"kitap_odunc_al": kitap_odunc_al,
"kitap_iade_et": kitap_iade_et,
"odunc_durumu": odunc_durumu,
"kitap_konusu": kitap_konusu,
}