PharmacyWebsite / tools.py
Muhammet Enes Nas
importSpace
bb47e01
Raw
History Blame Contribute Delete
8.05 kB
"""
Eczane Sipariş Asistanı — Tool Fonksiyonları
get_drug_info, search_by_symptom, create_order, check_order_status
"""
import json
from db import find_drug, insert_drug, create_order_record, find_order, search_drugs_by_keyword
from search_provider import search_drug_info
TOOL_DEFINITIONS = [
{
"type": "function",
"function": {
"name": "get_drug_info",
"description": "Belirli bir ilacın (örn. Parol, Majezik) stok durumunu ve prospektüs özetini getirir.",
"parameters": {
"type": "object",
"properties": {
"drug_name": {"type": "string", "description": "İlacın adı (örn. Parol, Majezik, Betaserc)"}
},
"required": ["drug_name"],
},
},
},
{
"type": "function",
"function": {
"name": "search_by_symptom",
"description": "Kullanıcının şikayet/semptomuna (ör. baş dönmesi, ateş, mide bulantısı, baş ağrısı) uygun ilaçları veritabanında veya web'de arar ve önerir.",
"parameters": {
"type": "object",
"properties": {
"symptom": {"type": "string", "description": "Semptom veya şikayet adı (örn. baş dönmesi, ateş, mide yanması)"}
},
"required": ["symptom"],
},
},
},
{
"type": "function",
"function": {
"name": "create_order",
"description": "Belirtilen ilaçtan belirtilen adette sipariş oluşturur.",
"parameters": {
"type": "object",
"properties": {
"drug_name": {"type": "string"},
"quantity": {"type": "integer"},
},
"required": ["drug_name", "quantity"],
},
},
},
{
"type": "function",
"function": {
"name": "check_order_status",
"description": "Sipariş numarasına göre sipariş durumunu sorgular.",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "integer"}
},
"required": ["order_id"],
},
},
},
]
def get_drug_info(drug_name: str) -> dict:
drug = find_drug(drug_name)
if drug:
return {
"drug_name": drug["display_name"],
"stock": drug["stock"],
"price": drug["price"],
"prospektus_summary": drug["prospektus_summary"],
"source": "db",
}
keyword_matches = search_drugs_by_keyword(drug_name)
if keyword_matches:
results = [
{
"drug_name": d["display_name"],
"stock": d["stock"],
"price": d["price"],
"prospektus_summary": d["prospektus_summary"],
}
for d in keyword_matches
]
return {
"search_query": drug_name,
"matching_drugs": results,
"source": "db_keyword_search",
"note": f"Veritabanında '{drug_name}' ile ilgili {len(results)} ilaç bulundu."
}
raw_result = search_drug_info(drug_name)
if raw_result:
summary_text = raw_result[:500].strip()
if len(raw_result) > 500:
last_dot = summary_text.rfind(".")
if last_dot > 100:
summary_text = summary_text[: last_dot + 1]
disclaimer = "Bu bilgi web aramasından derlenmiş bir özettir, resmi prospektüs yerine geçmez."
full_summary = f"{disclaimer}\n\n{summary_text}"
display_name = drug_name.strip().title()
drug_id = insert_drug(
name=drug_name,
display_name=display_name,
stock=0,
price=None,
prospektus_summary=full_summary,
source="fetched",
)
return {
"drug_name": display_name,
"stock": 0,
"price": None,
"prospektus_summary": full_summary,
"source": "fetched_new",
"note": "Bu ilaç veritabanına yeni eklendi, stok bilgisi güncel değildir.",
}
return {"error": f"'{drug_name}' ile ilgili ilaç bulunamadı. Lütfen kontrol edin."}
def create_order(drug_name: str, quantity: int | None = None) -> dict:
if quantity is None:
return {"error": "Sipariş miktarı belirtilmedi. Lütfen kaç adet sipariş etmek istediğinizi yazın."}
try:
quantity = int(quantity)
except (ValueError, TypeError):
return {"error": "Geçersiz sipariş miktarı. Lütfen geçerli bir sayı girin."}
if quantity <= 0:
return {"error": "Sipariş miktarı 0'dan büyük olmalıdır."}
drug = find_drug(drug_name)
if not drug:
return {
"error": (
f"'{drug_name}' veritabanında kayıtlı değil. "
"Önce get_drug_info ile ilacı sorgulayın."
)
}
if drug["stock"] < quantity:
return {
"error": (
f"Yetersiz stok. '{drug['display_name']}' için mevcut stok: "
f"{drug['stock']}, istenen: {quantity}."
)
}
result = create_order_record(
drug_id=drug["id"],
drug_name=drug["display_name"],
quantity=quantity,
)
if result is None:
return {"error": "Sipariş oluşturulamadı (stok yetersiz olabilir)."}
return result
def check_order_status(order_id: int | None = None) -> dict:
if order_id is None:
return {"error": "Sipariş numarası belirtilmedi."}
try:
order_id = int(order_id)
except (ValueError, TypeError):
return {"error": "Geçersiz sipariş numarası."}
order = find_order(order_id)
if not order:
return {"error": f"{order_id} numaralı sipariş bulunamadı."}
return order
def search_by_symptom(symptom: str) -> dict:
keyword_matches = search_drugs_by_keyword(symptom)
if keyword_matches:
results = [
{
"drug_name": d["display_name"],
"stock": d["stock"],
"price": d["price"],
"prospektus_summary": d["prospektus_summary"],
}
for d in keyword_matches
]
return {
"symptom": symptom,
"matching_drugs": results,
"source": "db_keyword_search",
"note": f"Veritabanında '{symptom}' şikayeti ile ilgili {len(results)} ilaç bulundu."
}
raw_result = search_drug_info(f"{symptom} tedavisi kullanılan ilaçlar")
if raw_result:
summary_text = raw_result[:500].strip()
disclaimer = "Bu bilgi web aramasından derlenmiş bir özettir, resmi prospektüs yerine geçmez."
full_summary = f"{disclaimer}\n\n{summary_text}"
return {
"symptom": symptom,
"prospektus_summary": full_summary,
"source": "web_search",
"note": f"'{symptom}' şikayeti için web arama sonuçları derlendi."
}
return {"error": f"'{symptom}' şikayeti için uygun ilaç bulunamadı."}
# ---------------------------------------------------------------------------
# Tool Router
# ---------------------------------------------------------------------------
TOOL_MAP = {
"get_drug_info": get_drug_info,
"search_by_symptom": search_by_symptom,
"create_order": create_order,
"check_order_status": check_order_status,
}
def route_tool_call(tool_name: str, arguments: dict) -> dict:
func = TOOL_MAP.get(tool_name)
if func is None:
return {"error": f"Tanınmayan araç: '{tool_name}'"}
try:
return func(**arguments)
except TypeError as e:
return {"error": f"Araç argüman hatası: {e}"}
except Exception as e:
return {"error": f"Araç çalıştırma hatası: {e}"}