Spaces:
Running
Running
""" | |
Chatbot backend işlevselliği. | |
Bu modül, kullanıcı girdisini işleyen ve dinamik promptlar oluşturan ana mantığı içerir. | |
""" | |
import os | |
import json | |
from typing import Dict, Any, Tuple, List, Optional | |
import openai | |
from google import generativeai as genai | |
import requests | |
from dotenv import load_dotenv | |
# Prompt şablonlarını içe aktar | |
from prompt_templates import ( | |
PROMPT_CATEGORIES, | |
predict_category, | |
extract_parameters, | |
create_prompt | |
) | |
# AI Prompt Generator'ı içe aktar | |
from ai_prompt_generator import AIPromptGenerator | |
# .env dosyasını yükle (varsa) | |
load_dotenv() | |
class PromptEngineerChatbot: | |
""" | |
Prompt mühendisliği chatbot sınıfı. | |
Bu sınıf, kullanıcı girdisini işleyerek dinamik promptlar oluşturur. | |
""" | |
def __init__(self): | |
""" | |
Chatbot'u başlat ve yapılandır. | |
""" | |
self.conversation_history = [] | |
self.current_category = None | |
self.current_params = None | |
self.ai_generator = AIPromptGenerator() | |
def process_input(self, user_input: str, use_ai_generation: bool = True, provider: str = "openai", model: Optional[str] = None) -> Tuple[str, str, Dict[str, Any]]: | |
""" | |
Kullanıcı girdisini işler ve dinamik bir prompt oluşturur. | |
Args: | |
user_input (str): Kullanıcı girdisi | |
use_ai_generation (bool): AI destekli prompt oluşturmayı kullan | |
provider (str): AI sağlayıcısı ('openai', 'gemini', 'openrouter') | |
model (str, optional): Kullanılacak model | |
Returns: | |
Tuple[str, str, Dict[str, Any]]: Oluşturulan prompt, kategori ve parametreler | |
""" | |
# Kullanıcı girdisini kaydet | |
self.conversation_history.append({"role": "user", "content": user_input}) | |
# Kategori tahmini | |
category = predict_category(user_input) | |
# Parametreleri çıkar | |
params = extract_parameters(category, user_input) | |
# Mevcut kategori ve parametreleri güncelle | |
self.current_category = category | |
self.current_params = params | |
# AI destekli prompt oluşturma kullanılıyorsa | |
if use_ai_generation: | |
# Şablon tabanlı promptu oluştur (referans için) | |
template_prompt = create_prompt(category, params) | |
# Kategori bilgisini ve şablon promptu kullanarak daha spesifik bir AI prompt oluştur | |
enhanced_user_input = f""" | |
Kategori: {category} | |
Kullanıcı İsteği: {user_input} | |
Lütfen bu istek için çok detaylı ve spesifik bir prompt oluştur. | |
Şablon olarak aşağıdaki yapıyı kullanabilirsin, ancak içeriği tamamen kullanıcının isteğine göre özelleştir ve çok daha detaylı hale getir: | |
{template_prompt} | |
Önemli: Yukarıdaki şablonu olduğu gibi kullanma, sadece yapı referansı olarak kullan. | |
İçeriği tamamen kullanıcının isteğine özel olarak oluştur ve çok daha detaylı, spesifik bilgiler ekle. | |
Örneğin, kullanıcı hava durumu uygulaması istiyorsa, hava durumu API'leri, hava verilerinin görselleştirilmesi, | |
hava tahminleri, konum takibi gibi spesifik detaylar ekle. | |
""" | |
# AI destekli prompt oluştur | |
result = self.ai_generator.generate_prompt(enhanced_user_input, provider, model) | |
if result["success"]: | |
prompt = result["prompt"] | |
else: | |
# AI prompt oluşturma başarısız olursa şablon promptu kullan | |
prompt = template_prompt | |
else: | |
# Şablon tabanlı prompt oluştur | |
prompt = create_prompt(category, params) | |
# Chatbot yanıtını kaydet | |
self.conversation_history.append({"role": "assistant", "content": prompt}) | |
return prompt, category, params | |
def get_conversation_history(self) -> List[Dict[str, str]]: | |
""" | |
Konuşma geçmişini döndürür. | |
Returns: | |
List[Dict[str, str]]: Konuşma geçmişi | |
""" | |
return self.conversation_history | |
def clear_conversation_history(self) -> None: | |
""" | |
Konuşma geçmişini temizler. | |
""" | |
self.conversation_history = [] | |
self.current_category = None | |
self.current_params = None | |
class AIModelInterface: | |
""" | |
Farklı AI API'leri için arayüz sınıfı. | |
Bu sınıf, OpenAI, Google Gemini ve OpenRouter API'leri ile etkileşim sağlar. | |
""" | |
def __init__(self): | |
""" | |
AI model arayüzünü başlat. | |
""" | |
self.api_keys = { | |
"openai": os.getenv("OPENAI_API_KEY", ""), | |
"gemini": os.getenv("GEMINI_API_KEY", ""), | |
"openrouter": os.getenv("OPENROUTER_API_KEY", "") | |
} | |
def set_api_key(self, provider: str, api_key: str) -> None: | |
""" | |
Belirli bir sağlayıcı için API anahtarını ayarlar. | |
Args: | |
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter') | |
api_key (str): API anahtarı | |
""" | |
if provider in self.api_keys: | |
self.api_keys[provider] = api_key | |
def get_available_models(self, provider: str) -> List[str]: | |
""" | |
Belirli bir sağlayıcı için kullanılabilir modelleri döndürür. | |
Args: | |
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter') | |
Returns: | |
List[str]: Kullanılabilir modeller listesi | |
""" | |
if provider == "openai": | |
return ["gpt-4o", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"] | |
elif provider == "gemini": | |
return ["gemini-1.5-pro", "gemini-1.5-flash", "gemini-1.0-pro"] | |
elif provider == "openrouter": | |
return [ | |
"openai/gpt-4o", | |
"openai/gpt-4-turbo", | |
"anthropic/claude-3-opus", | |
"anthropic/claude-3-sonnet", | |
"google/gemini-1.5-pro", | |
"meta-llama/llama-3-70b-instruct" | |
] | |
return [] | |
def generate_with_openai(self, prompt: str, model: str = "gpt-3.5-turbo") -> str: | |
""" | |
OpenAI API kullanarak yanıt oluşturur. | |
Args: | |
prompt (str): Gönderilecek prompt | |
model (str): Kullanılacak model | |
Returns: | |
str: Oluşturulan yanıt | |
""" | |
if not self.api_keys["openai"]: | |
return "OpenAI API anahtarı ayarlanmamış." | |
try: | |
openai.api_key = self.api_keys["openai"] | |
response = openai.chat.completions.create( | |
model=model, | |
messages=[{"role": "user", "content": prompt}], | |
temperature=0.7, | |
max_tokens=2000 | |
) | |
return response.choices[0].message.content | |
except Exception as e: | |
return f"OpenAI API hatası: {str(e)}" | |
def generate_with_gemini(self, prompt: str, model: str = "gemini-1.5-pro") -> str: | |
""" | |
Google Gemini API kullanarak yanıt oluşturur. | |
Args: | |
prompt (str): Gönderilecek prompt | |
model (str): Kullanılacak model | |
Returns: | |
str: Oluşturulan yanıt | |
""" | |
if not self.api_keys["gemini"]: | |
return "Gemini API anahtarı ayarlanmamış." | |
try: | |
genai.configure(api_key=self.api_keys["gemini"]) | |
model_obj = genai.GenerativeModel(model) | |
response = model_obj.generate_content(prompt) | |
return response.text | |
except Exception as e: | |
return f"Gemini API hatası: {str(e)}" | |
def generate_with_openrouter(self, prompt: str, model: str = "openai/gpt-4-turbo") -> str: | |
""" | |
OpenRouter API kullanarak yanıt oluşturur. | |
Args: | |
prompt (str): Gönderilecek prompt | |
model (str): Kullanılacak model | |
Returns: | |
str: Oluşturulan yanıt | |
""" | |
if not self.api_keys["openrouter"]: | |
return "OpenRouter API anahtarı ayarlanmamış." | |
try: | |
headers = { | |
"Content-Type": "application/json", | |
"Authorization": f"Bearer {self.api_keys['openrouter']}" | |
} | |
data = { | |
"model": model, | |
"messages": [{"role": "user", "content": prompt}], | |
"temperature": 0.7, | |
"max_tokens": 2000 | |
} | |
response = requests.post( | |
"https://openrouter.ai/api/v1/chat/completions", | |
headers=headers, | |
json=data | |
) | |
if response.status_code == 200: | |
return response.json()["choices"][0]["message"]["content"] | |
else: | |
return f"OpenRouter API hatası: {response.status_code} - {response.text}" | |
except Exception as e: | |
return f"OpenRouter API hatası: {str(e)}" | |
def generate_response(self, provider: str, prompt: str, model: Optional[str] = None) -> str: | |
""" | |
Belirli bir sağlayıcı ve model kullanarak yanıt oluşturur. | |
Args: | |
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter') | |
prompt (str): Gönderilecek prompt | |
model (str, optional): Kullanılacak model | |
Returns: | |
str: Oluşturulan yanıt | |
""" | |
if provider == "openai": | |
if model is None: | |
model = "gpt-3.5-turbo" | |
return self.generate_with_openai(prompt, model) | |
elif provider == "gemini": | |
if model is None: | |
model = "gemini-1.5-pro" | |
return self.generate_with_gemini(prompt, model) | |
elif provider == "openrouter": | |
if model is None: | |
model = "openai/gpt-4-turbo" | |
return self.generate_with_openrouter(prompt, model) | |
else: | |
return "Geçersiz sağlayıcı. Lütfen 'openai', 'gemini' veya 'openrouter' seçin." | |
# Chatbot ve AI model arayüzü örneklerini oluştur | |
chatbot = PromptEngineerChatbot() | |
ai_interface = AIModelInterface() | |
# Test fonksiyonu | |
def test_chatbot(): | |
""" | |
Chatbot'u test eder. | |
""" | |
test_input = "Bir e-ticaret web sitesi yapmak istiyorum. Ürünleri listeleyebilmeli, sepete ekleyebilmeli ve ödeme alabilmeliyim." | |
prompt, category, params = chatbot.process_input(test_input, use_ai_generation=True) | |
print(f"Kategori: {category}") | |
print(f"Parametreler: {json.dumps(params, indent=2, ensure_ascii=False)}") | |
print("\nOluşturulan Prompt:") | |
print(prompt) | |
# API yanıtı test (API anahtarı varsa) | |
if ai_interface.api_keys["openai"]: | |
print("\nOpenAI Yanıtı:") | |
response = ai_interface.generate_response("openai", prompt) | |
print(response) | |
if __name__ == "__main__": | |
test_chatbot() | |