Spaces:
Running
Running
""" | |
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 | |
# .env dosyasını yükle (varsa) | |
load_dotenv() | |
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): | |
""" | |
AI prompt oluşturucuyu başlat. | |
""" | |
self.openai_api_key = os.getenv("OPENAI_API_KEY", "") | |
self.gemini_api_key = os.getenv("GEMINI_API_KEY", "") | |
self.openrouter_api_key = os.getenv("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. | |
""" | |
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 Exception as e: | |
return {"success": False, "error": 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. | |
""" | |
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": 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 | |
""" | |
if provider == "openai": | |
if model is None: | |
model = "gpt-4o" if self.openai_api_key else "gpt-3.5-turbo" | |
return self.generate_with_openai(user_input, model) | |
elif provider == "gemini": | |
if model is None: | |
model = "gemini-1.5-pro" | |
return self.generate_with_gemini(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(user_input, model) | |
else: | |
return {"success": False, "error": "Geçersiz sağlayıcı. Lütfen 'openai', 'gemini' veya 'openrouter' seçin.", "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() | |