Spaces:
Sleeping
Sleeping
""" | |
AI destekli dinamik prompt oluşturucu. | |
Bu modül, kullanıcı girdisine göre tamamen dinamik promptlar oluşturur. | |
""" | |
import os | |
from typing import Dict, Any, Tuple, List, Optional | |
import openai | |
from google import generativeai as genai | |
import requests | |
from dotenv import load_dotenv, find_dotenv | |
# Özel .env dosyası yükleme fonksiyonu | |
def load_env_safely(): | |
""" | |
.env dosyasını güvenli bir şekilde yükler, farklı karakter kodlamalarını deneyerek. | |
""" | |
try: | |
# .env dosyasının yolunu bul | |
dotenv_path = find_dotenv() | |
# .env dosyası yoksa hemen çık | |
if not dotenv_path or not os.path.exists(dotenv_path): | |
return | |
# Çevre değişkenleri | |
env_vars = {} | |
try: | |
# Önce UTF-8 ile dene | |
with open(dotenv_path, "r", encoding="utf-8") as f: | |
lines = f.readlines() | |
except UnicodeDecodeError: | |
try: | |
# UTF-8 başarısız olursa Latin-1 ile dene | |
with open(dotenv_path, "r", encoding="latin-1") as f: | |
lines = f.readlines() | |
except Exception: | |
# Her şey başarısız olursa, .env'yi yüklemeyi atla | |
print("Uyarı: .env dosyası okunamadı, API anahtarları yüklenemedi.") | |
return | |
# Dosya içeriğini işle | |
for line in lines: | |
line = line.strip() | |
if line and not line.startswith("#") and "=" in line: | |
key, value = line.split("=", 1) | |
key = key.strip() | |
value = value.strip().strip('"\'') | |
# Değişkeni ortam değişkenlerine ekle | |
os.environ[key] = value | |
except Exception as e: | |
print(f"Uyarı: .env dosyası yüklenirken hata oluştu: {str(e)}") | |
# .env dosyasını güvenli bir şekilde yükle | |
load_env_safely() | |
class AIPromptGenerator: | |
""" | |
AI destekli dinamik prompt oluşturucu sınıfı. | |
Bu sınıf, kullanıcı girdisine göre yapay zeka kullanarak dinamik promptlar oluşturur. | |
""" | |
def __init__(self, openai_api_key=None, gemini_api_key=None, openrouter_api_key=None): | |
"""AI tabanlı prompt oluşturucu sınıfı. | |
Args: | |
openai_api_key (str, optional): OpenAI API anahtarı. Defaults to None. | |
gemini_api_key (str, optional): Google Gemini API anahtarı. Defaults to None. | |
openrouter_api_key (str, optional): OpenRouter API anahtarı. Defaults to None. | |
""" | |
self.openai_api_key = openai_api_key | |
self.gemini_api_key = gemini_api_key | |
self.openrouter_api_key = openrouter_api_key | |
# API anahtarlarını ayarla (varsa) | |
if self.openai_api_key: | |
openai.api_key = self.openai_api_key | |
if self.gemini_api_key: | |
genai.configure(api_key=self.gemini_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 == "openai": | |
self.openai_api_key = api_key | |
openai.api_key = api_key | |
elif provider == "gemini": | |
self.gemini_api_key = api_key | |
genai.configure(api_key=api_key) | |
elif provider == "openrouter": | |
self.openrouter_api_key = api_key | |
def generate_with_openai(self, user_input: str, model: str = "gpt-3.5-turbo") -> Dict[str, Any]: | |
""" | |
OpenAI API kullanarak dinamik prompt oluşturur. | |
Args: | |
user_input (str): Kullanıcı girdisi | |
model (str): Kullanılacak model | |
Returns: | |
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler | |
""" | |
if not self.openai_api_key: | |
return {"success": False, "error": "OpenAI API anahtarı ayarlanmamış.", "prompt": ""} | |
try: | |
system_message = """ | |
Sen uzman bir prompt mühendisisin. Görevin, kullanıcının isteklerini son derece detaylı, spesifik ve kapsamlı bir prompta dönüştürmektir. | |
Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.). | |
Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin. | |
Oluşturduğun prompt şunları içermeli: | |
1. Projenin/görevin çok net ve spesifik bir tanımı | |
2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.) | |
3. Kullanıcı deneyimi ve arayüz gereksinimleri | |
4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla) | |
5. Adım adım uygulama talimatları | |
6. Beklenen çıktının detaylı açıklaması | |
7. Kalite kriterleri ve test gereksinimleri | |
8. Referans olabilecek örnekler veya kaynaklar | |
Önemli kurallar: | |
- Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı | |
- Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan | |
- Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan | |
- Örneğin, hava durumu uygulaması için OpenWeatherMap API, geolocation, hava tahmin algoritmaları, sıcaklık/nem/basınç göstergeleri gibi spesifik detaylar ekle | |
- E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt | |
- Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner | |
Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler oluştur. | |
""" | |
try: | |
openai.api_key = self.openai_api_key | |
response = openai.chat.completions.create( | |
model=model, | |
messages=[ | |
{"role": "system", "content": system_message}, | |
{"role": "user", "content": f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"} | |
], | |
temperature=0.7, | |
max_tokens=3000 | |
) | |
return { | |
"success": True, | |
"prompt": response.choices[0].message.content, | |
"model": model | |
} | |
except openai.OpenAIError as e: | |
return {"success": False, "error": f"OpenAI API hatası: {str(e)}", "prompt": ""} | |
except Exception as e: | |
return {"success": False, "error": f"Beklenmeyen hata: {str(e)}", "prompt": ""} | |
def generate_with_gemini(self, user_input: str, model: str = "gemini-1.5-pro") -> Dict[str, Any]: | |
""" | |
Google Gemini API kullanarak dinamik prompt oluşturur. | |
Args: | |
user_input (str): Kullanıcı girdisi | |
model (str): Kullanılacak model | |
Returns: | |
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler | |
""" | |
if not self.gemini_api_key: | |
return {"success": False, "error": "Gemini API anahtarı ayarlanmamış.", "prompt": ""} | |
try: | |
system_prompt = """ | |
Sen uzman bir prompt mühendisisin. Görevin, kullanıcının isteklerini son derece detaylı, spesifik ve kapsamlı bir prompta dönüştürmektir. | |
Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.). | |
Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin. | |
Oluşturduğun prompt şunları içermeli: | |
1. Projenin/görevin çok net ve spesifik bir tanımı | |
2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.) | |
3. Kullanıcı deneyimi ve arayüz gereksinimleri | |
4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla) | |
5. Adım adım uygulama talimatları | |
6. Beklenen çıktının detaylı açıklaması | |
7. Kalite kriterleri ve test gereksinimleri | |
8. Referans olabilecek örnekler veya kaynaklar | |
Önemli kurallar: | |
- Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı | |
- Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan | |
- Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan | |
- Örneğin, hava durumu uygulaması için OpenWeatherMap API, geolocation, hava tahmin algoritmaları, sıcaklık/nem/basınç göstergeleri gibi spesifik detaylar ekle | |
- E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt | |
- Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner | |
Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler oluştur. | |
""" | |
try: | |
genai.configure(api_key=self.gemini_api_key) | |
model_obj = genai.GenerativeModel(model) | |
response = model_obj.generate_content([ | |
system_prompt, | |
f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}" | |
], | |
generation_config=genai.types.GenerationConfig( | |
temperature=0.7, | |
max_output_tokens=3000 | |
)) | |
return { | |
"success": True, | |
"prompt": response.text, | |
"model": model | |
} | |
except Exception as e: | |
return {"success": False, "error": f"Gemini API hatası: {str(e)}", "prompt": ""} | |
except Exception as e: | |
return {"success": False, "error": f"Beklenmeyen hata: {str(e)}", "prompt": ""} | |
def generate_with_openrouter(self, user_input: str, model: str = "openai/gpt-4-turbo") -> Dict[str, Any]: | |
""" | |
OpenRouter API kullanarak dinamik prompt oluşturur. | |
Args: | |
user_input (str): Kullanıcı girdisi | |
model (str): Kullanılacak model | |
Returns: | |
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler | |
""" | |
if not self.openrouter_api_key: | |
return {"success": False, "error": "OpenRouter API anahtarı ayarlanmamış.", "prompt": ""} | |
try: | |
system_message = """ | |
Sen uzman bir prompt mühendisisin. Görevin, kullanıcının isteklerini son derece detaylı, spesifik ve kapsamlı bir prompta dönüştürmektir. | |
Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.). | |
Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin. | |
Oluşturduğun prompt şunları içermeli: | |
1. Projenin/görevin çok net ve spesifik bir tanımı | |
2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.) | |
3. Kullanıcı deneyimi ve arayüz gereksinimleri | |
4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla) | |
5. Adım adım uygulama talimatları | |
6. Beklenen çıktının detaylı açıklaması | |
7. Kalite kriterleri ve test gereksinimleri | |
8. Referans olabilecek örnekler veya kaynaklar | |
Önemli kurallar: | |
- Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı | |
- Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan | |
- Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan | |
- Örneğin, hava durumu uygulaması için OpenWeatherMap API, geolocation, hava tahmin algoritmaları, sıcaklık/nem/basınç göstergeleri gibi spesifik detaylar ekle | |
- E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt | |
- Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner | |
Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler oluştur. | |
""" | |
headers = { | |
"Content-Type": "application/json", | |
"Authorization": f"Bearer {self.openrouter_api_key}" | |
} | |
data = { | |
"model": model, | |
"messages": [ | |
{"role": "system", "content": system_message}, | |
{"role": "user", "content": f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"} | |
], | |
"temperature": 0.7, | |
"max_tokens": 3000 | |
} | |
response = requests.post( | |
"https://openrouter.ai/api/v1/chat/completions", | |
headers=headers, | |
json=data | |
) | |
if response.status_code == 200: | |
response_data = response.json() | |
return { | |
"success": True, | |
"prompt": response_data["choices"][0]["message"]["content"], | |
"model": model | |
} | |
else: | |
return { | |
"success": False, | |
"error": f"HTTP {response.status_code}: {response.text}", | |
"prompt": "" | |
} | |
except Exception as e: | |
return {"success": False, "error": str(e), "prompt": ""} | |
def generate_prompt(self, user_input: str, provider: str, model: Optional[str] = None) -> Dict[str, Any]: | |
""" | |
Belirli bir sağlayıcı ve model kullanarak dinamik prompt oluşturur. | |
Args: | |
user_input (str): Kullanıcı girdisi | |
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter') | |
model (str, optional): Kullanılacak model | |
Returns: | |
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler | |
""" | |
try: | |
# Kullanıcının belirttiği özel teknolojilere vurgu yapalım | |
user_input_lower = user_input.lower() | |
enhanced_user_input = user_input | |
# Frontend teknolojileri için vurgu | |
if "bootstrap" in user_input_lower: | |
enhanced_user_input += "\n\nNOT: Bootstrap framework'ü mutlaka kullanılmalıdır. Tasarım Bootstrap bileşenlerini içermelidir." | |
if "react" in user_input_lower: | |
enhanced_user_input += "\n\nNOT: React kütüphanesi mutlaka kullanılmalıdır. JSX ve React bileşenleri ile uygulama oluşturulmalıdır." | |
if "vue" in user_input_lower: | |
enhanced_user_input += "\n\nNOT: Vue.js framework'ü mutlaka kullanılmalıdır. Vue bileşenleri ve direktifleri ile uygulama oluşturulmalıdır." | |
if "angular" in user_input_lower: | |
enhanced_user_input += "\n\nNOT: Angular framework'ü mutlaka kullanılmalıdır. Angular bileşenleri, modülleri ve servisleri ile uygulama oluşturulmalıdır." | |
if "tailwind" in user_input_lower: | |
enhanced_user_input += "\n\nNOT: Tailwind CSS mutlaka kullanılmalıdır. Tasarım Tailwind utility sınıfları ile oluşturulmalıdır." | |
# API anahtarını kontrol et | |
if provider == "openai" and not self.openai_api_key: | |
return { | |
"success": False, | |
"error": "OpenAI API anahtarı ayarlanmamış." | |
} | |
elif provider == "gemini" and not self.gemini_api_key: | |
return { | |
"success": False, | |
"error": "Google Gemini API anahtarı ayarlanmamış." | |
} | |
elif provider == "openrouter" and not self.openrouter_api_key: | |
return { | |
"success": False, | |
"error": "OpenRouter API anahtarı ayarlanmamış." | |
} | |
# OpenAI ile prompt oluştur | |
if provider == "openai": | |
if model is None: | |
model = "gpt-3.5-turbo" | |
return self.generate_with_openai(enhanced_user_input, model) | |
elif provider == "gemini": | |
if model is None: | |
model = "gemini-1.5-pro" | |
return self.generate_with_gemini(enhanced_user_input, model) | |
elif provider == "openrouter": | |
if model is None: | |
model = "anthropic/claude-3-opus" if self.openrouter_api_key else "openai/gpt-4-turbo" | |
return self.generate_with_openrouter(enhanced_user_input, model) | |
else: | |
return {"success": False, "error": "Geçersiz sağlayıcı. Lütfen 'openai', 'gemini' veya 'openrouter' seçin.", "prompt": ""} | |
except Exception as e: | |
return {"success": False, "error": f"Prompt oluşturma hatası: {str(e)}", "prompt": ""} | |
# Test fonksiyonu | |
def test_ai_prompt_generator(): | |
""" | |
AI prompt oluşturucuyu test eder. | |
""" | |
generator = AIPromptGenerator() | |
# Test girdileri | |
test_inputs = [ | |
"Bir hava durumu uygulaması yapmak istiyorum", | |
"Bir e-ticaret web sitesi geliştirmek istiyorum", | |
"Veri analizi için bir dashboard oluşturmak istiyorum" | |
] | |
# OpenAI API anahtarı varsa test et | |
if generator.openai_api_key: | |
print("OpenAI ile test:") | |
for input_text in test_inputs: | |
print(f"\nTest girdisi: {input_text}") | |
result = generator.generate_prompt(input_text, "openai", "gpt-4o") | |
if result["success"]: | |
print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...") | |
else: | |
print(f"Hata: {result['error']}") | |
# Gemini API anahtarı varsa test et | |
if generator.gemini_api_key: | |
print("\nGemini ile test:") | |
for input_text in test_inputs: | |
print(f"\nTest girdisi: {input_text}") | |
result = generator.generate_prompt(input_text, "gemini") | |
if result["success"]: | |
print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...") | |
else: | |
print(f"Hata: {result['error']}") | |
# OpenRouter API anahtarı varsa test et | |
if generator.openrouter_api_key: | |
print("\nOpenRouter ile test:") | |
for input_text in test_inputs: | |
print(f"\nTest girdisi: {input_text}") | |
result = generator.generate_prompt(input_text, "openrouter") | |
if result["success"]: | |
print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...") | |
else: | |
print(f"Hata: {result['error']}") | |
if __name__ == "__main__": | |
test_ai_prompt_generator() | |