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 | |
| import re | |
| 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", api_key: Optional[str] = None) -> str: | |
| """ | |
| OpenAI API kullanarak yanıt oluşturur. | |
| Args: | |
| prompt (str): Gönderilecek prompt | |
| model (str): Kullanılacak model | |
| api_key (str, optional): Doğrudan kullanılacak API anahtarı | |
| Returns: | |
| str: Oluşturulan yanıt | |
| """ | |
| # Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan | |
| current_api_key = api_key if api_key else self.api_keys["openai"] | |
| if not current_api_key: | |
| return "OpenAI API anahtarı ayarlanmamış." | |
| try: | |
| # Geçici olarak API anahtarını ayarla | |
| openai.api_key = current_api_key | |
| 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", api_key: Optional[str] = None) -> str: | |
| """ | |
| Google Gemini API kullanarak yanıt oluşturur. | |
| Args: | |
| prompt (str): Gönderilecek prompt | |
| model (str): Kullanılacak model | |
| api_key (str, optional): Doğrudan kullanılacak API anahtarı | |
| Returns: | |
| str: Oluşturulan yanıt | |
| """ | |
| # Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan | |
| current_api_key = api_key if api_key else self.api_keys["gemini"] | |
| if not current_api_key: | |
| return "Gemini API anahtarı ayarlanmamış." | |
| try: | |
| # Geçici olarak API anahtarını ayarla | |
| genai.configure(api_key=current_api_key) | |
| 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", api_key: Optional[str] = None) -> str: | |
| """ | |
| OpenRouter API kullanarak yanıt oluşturur. | |
| Args: | |
| prompt (str): Gönderilecek prompt | |
| model (str): Kullanılacak model | |
| api_key (str, optional): Doğrudan kullanılacak API anahtarı | |
| Returns: | |
| str: Oluşturulan yanıt | |
| """ | |
| # Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan | |
| current_api_key = api_key if api_key else self.api_keys["openrouter"] | |
| if not current_api_key: | |
| return "OpenRouter API anahtarı ayarlanmamış." | |
| try: | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {current_api_key}" | |
| } | |
| 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_code_templates(self, response: str) -> Dict[str, Any]: | |
| """ | |
| AI yanıtından kod şablonları, dizin yapısı ve uygulama adımlarını çıkarır. | |
| Args: | |
| response (str): AI yanıtı | |
| Returns: | |
| Dict[str, Any]: Kod şablonları, dizin yapısı ve uygulama adımları | |
| """ | |
| result = { | |
| "directory_structure": [], | |
| "code_templates": [], | |
| "implementation_steps": [] | |
| } | |
| # Dizin yapısını çıkar | |
| dir_structure_pattern = r"```(?:bash|shell|plaintext)?\s*((?:├──|└──|│\s+|(?:\w+/)+\w+|\w+\.\w+|[\w\-\.\/]+\s*)+)\s*```" | |
| dir_matches = re.findall(dir_structure_pattern, response, re.DOTALL) | |
| if dir_matches: | |
| for match in dir_matches: | |
| if any(x in match for x in ['├──', '└──', '│', '/']): | |
| result["directory_structure"].append(match.strip()) | |
| # Kod şablonlarını çıkar | |
| code_pattern = r"```(\w+)?\s*([\s\S]*?)```" | |
| code_matches = re.findall(code_pattern, response, re.DOTALL) | |
| for lang, code in code_matches: | |
| if lang and lang.lower() not in ['bash', 'shell', 'plaintext', '']: | |
| result["code_templates"].append({ | |
| "language": lang.strip() if lang else "unknown", | |
| "code": code.strip() | |
| }) | |
| # Uygulama adımlarını çıkar | |
| steps_pattern = r"(?:##|###)\s*(?:Adım|Step|İmplementasyon|Uygulama).*?(?=(?:##|###)|$)" | |
| steps_matches = re.findall(steps_pattern, response, re.DOTALL | re.IGNORECASE) | |
| if steps_matches: | |
| result["implementation_steps"] = [step.strip() for step in steps_matches] | |
| else: | |
| # Numaralı adımları ara | |
| numbered_steps = re.findall(r"\d+\.\s+[^\n]+(?:\n(?!\d+\.).*?)*", response, re.DOTALL) | |
| if numbered_steps: | |
| result["implementation_steps"] = [step.strip() for step in numbered_steps] | |
| return result | |
| def generate_response_with_code_templates(self, provider: str, prompt: str, model: Optional[str] = None, api_key: Optional[str] = None) -> Dict[str, Any]: | |
| """ | |
| Belirli bir sağlayıcı ve model kullanarak yanıt ve kod şablonları oluşturur. | |
| Args: | |
| provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter') | |
| prompt (str): Gönderilecek prompt | |
| model (str, optional): Kullanılacak model | |
| api_key (str, optional): Doğrudan kullanılacak API anahtarı | |
| Returns: | |
| Dict[str, Any]: Yanıt ve kod şablonları | |
| """ | |
| # Promptu geliştir - kod şablonları, dizin yapısı ve uygulama adımları isteyelim | |
| enhanced_prompt = f""" | |
| {prompt} | |
| Lütfen yanıtında aşağıdakileri mutlaka içer: | |
| 1. Detaylı bir dizin yapısı (klasör ve dosya hiyerarşisi) | |
| 2. Önemli dosyaların kod şablonları (HTML, CSS, JavaScript, Python vb.) | |
| 3. Adım adım uygulama talimatları | |
| Dizin yapısını ```bash veya ```plaintext içinde göster. | |
| Kod şablonlarını ```html, ```css, ```javascript, ```python gibi uygun dil belirteçleriyle göster. | |
| Uygulama adımlarını numaralandırılmış liste olarak veya ## Adım başlıkları altında göster. | |
| """ | |
| # Yanıt oluştur | |
| response = self.generate_response(provider, enhanced_prompt, model, api_key) | |
| # Yanıttan kod şablonlarını çıkar | |
| templates = self.generate_code_templates(response) | |
| return { | |
| "response": response, | |
| "templates": templates | |
| } | |
| def generate_response(self, provider: str, prompt: str, model: Optional[str] = None, api_key: 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 | |
| api_key (str, optional): Doğrudan kullanılacak API anahtarı | |
| 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, api_key) | |
| elif provider == "gemini": | |
| if model is None: | |
| model = "gemini-1.5-pro" | |
| return self.generate_with_gemini(prompt, model, api_key) | |
| elif provider == "openrouter": | |
| if model is None: | |
| model = "openai/gpt-4-turbo" | |
| return self.generate_with_openrouter(prompt, model, api_key) | |
| 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() | |