""" 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}"}