bot3 / api_client.py
Omarelrayes's picture
Update api_client.py
55b65d3 verified
Raw
History Blame Contribute Delete
3.41 kB
import requests
import io
import base64
from PIL import Image
from typing import Dict, Any, Optional
import logging
logger = logging.getLogger(__name__)
class DermaScanAPIClient:
"""Client للتواصل مع الـ API الخارجية (https://omarelrayes-api.hf.space/)"""
def __init__(self, base_url: str = "https://omarelrayes-api.hf.space"):
self.base_url = base_url.rstrip('/')
self.timeout = 120
def health_check(self) -> bool:
"""فحص حالة الـ API الخارجية"""
try:
response = requests.get(f"{self.base_url}/health", timeout=10)
return response.status_code == 200
except Exception as e:
logger.error(f"Health check failed: {e}")
return False
def set_role(self, thread_id: str, role: str) -> Dict[str, Any]:
"""تعيين الدور (patient/doctor)"""
try:
response = requests.post(
f"{self.base_url}/set-role",
json={"thread_id": thread_id, "role": role},
timeout=30
)
response.raise_for_status()
return response.json()
except Exception as e:
logger.error(f"set_role failed: {e}")
return {"ok": False, "error": str(e)}
def upload_and_analyze_image(self, image: Image.Image, thread_id: str) -> Dict[str, Any]:
"""رفع صورة وتحليلها عبر الـ API الخارجية"""
try:
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format='PNG')
img_byte_arr.seek(0)
files = {'file': ('image.png', img_byte_arr, 'image/png')}
data = {'thread_id': thread_id}
response = requests.post(
f"{self.base_url}/analyze-image",
files=files,
data=data,
timeout=self.timeout
)
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
return {"ok": False, "error": "API request timed out"}
except requests.exceptions.RequestException as e:
return {"ok": False, "error": f"API request failed: {str(e)}"}
except Exception as e:
logger.error(f"Unexpected error: {e}", exc_info=True)
return {"ok": False, "error": str(e)}
def book_appointment(self, thread_id: str, city: str = "") -> Dict[str, Any]:
"""حجز موعد"""
try:
response = requests.post(
f"{self.base_url}/book-appointment",
json={"thread_id": thread_id, "city": city},
timeout=30
)
response.raise_for_status()
return response.json()
except Exception as e:
return {"ok": False, "error": str(e)}
def get_image(self, name: str, thread_id: str) -> Dict[str, Any]:
"""الحصول على صورة من الجلسة"""
try:
response = requests.get(
f"{self.base_url}/image",
params={"name": name, "thread_id": thread_id},
timeout=30
)
response.raise_for_status()
return response.json()
except Exception as e:
return {"ok": False, "error": str(e)}