Spaces:
Running
Running
Upload 18 files
Browse files- .env +3 -0
- .gitattributes +35 -35
- README.md +74 -14
- __pycache__/ai_prompt_generator.cpython-313.pyc +0 -0
- __pycache__/api_integrations.cpython-313.pyc +0 -0
- __pycache__/chatbot_backend.cpython-313.pyc +0 -0
- __pycache__/prompt_templates.cpython-313.pyc +0 -0
- __pycache__/streamlit_ui.cpython-313.pyc +0 -0
- ai_prompt_generator.py +421 -0
- api_integrations.py +740 -0
- app.py +31 -0
- chatbot_backend.py +460 -0
- model_cache.json +1 -0
- prompt_templates.py +1976 -0
- requirements.txt +6 -0
- streamlit_ui.py +1418 -0
- test_dynamic_models.py +93 -0
- todo.md +47 -0
.env
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
# API Anahtarları
|
2 |
+
GEMINI_API_KEY=AIzaSyDiXr0ILlZ7mD3zLlWKisBXaqRlP0EfxzA
|
3 |
+
OPENROUTER_API_KEY=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
|
.gitattributes
CHANGED
@@ -1,35 +1,35 @@
|
|
1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
@@ -1,14 +1,74 @@
|
|
1 |
-
---
|
2 |
-
title:
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
-
sdk: streamlit
|
7 |
-
sdk_version: 1.44.1
|
8 |
-
app_file: app.py
|
9 |
-
pinned: false
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Prompt Mühendisi Chatbot
|
3 |
+
emoji: 🤖
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: indigo
|
6 |
+
sdk: streamlit
|
7 |
+
sdk_version: 1.44.1
|
8 |
+
app_file: app.py
|
9 |
+
pinned: false
|
10 |
+
---
|
11 |
+
|
12 |
+
# Prompt Mühendisi Chatbot - Hugging Face Deployment Kılavuzu
|
13 |
+
|
14 |
+
Bu belge, Prompt Mühendisi Chatbot'un Hugging Face'de nasıl deploy edileceğini açıklar.
|
15 |
+
|
16 |
+
## Proje Hakkında
|
17 |
+
|
18 |
+
Prompt Mühendisi Chatbot, kullanıcıların isteklerini profesyonel ve detaylı promptlara dönüştüren bir araçtır. Kullanıcılar, yapmak istedikleri şeyi (örneğin bir web sitesi geliştirme) anlatır ve chatbot bunu adım adım, detaylı bir prompta dönüştürür.
|
19 |
+
|
20 |
+
### Özellikler
|
21 |
+
|
22 |
+
- Farklı senaryolar için özelleştirilmiş prompt şablonları
|
23 |
+
- OpenAI, Google Gemini ve OpenRouter API entegrasyonları
|
24 |
+
- Kullanıcı dostu Streamlit arayüzü
|
25 |
+
- Oluşturulan promptları test etme imkanı
|
26 |
+
|
27 |
+
## Dosya Yapısı
|
28 |
+
|
29 |
+
```
|
30 |
+
prompt_engineer_chatbot/
|
31 |
+
├── app.py # Ana uygulama dosyası
|
32 |
+
├── prompt_templates.py # Prompt şablonları ve yardımcı fonksiyonlar
|
33 |
+
├── chatbot_backend.py # Chatbot backend işlevselliği
|
34 |
+
├── api_integrations.py # API entegrasyonları
|
35 |
+
├── streamlit_ui.py # Streamlit kullanıcı arayüzü
|
36 |
+
└── requirements.txt # Bağımlılıklar
|
37 |
+
```
|
38 |
+
|
39 |
+
## Hugging Face'de Deployment
|
40 |
+
|
41 |
+
1. Hugging Face hesabınıza giriş yapın
|
42 |
+
2. Yeni bir Space oluşturun
|
43 |
+
3. Space türü olarak "Streamlit" seçin
|
44 |
+
4. Bu repo'daki dosyaları Space'inize yükleyin
|
45 |
+
5. Space'iniz otomatik olarak deploy edilecektir
|
46 |
+
|
47 |
+
## Kullanım
|
48 |
+
|
49 |
+
1. Uygulamaya erişin
|
50 |
+
2. API anahtarlarınızı girin (OpenAI, Gemini veya OpenRouter)
|
51 |
+
3. Ne yapmak istediğinizi detaylı bir şekilde anlatın
|
52 |
+
4. "Prompt Oluştur" butonuna tıklayın
|
53 |
+
5. Oluşturulan promptu kopyalayın veya API ile test edin
|
54 |
+
|
55 |
+
## Geliştirme
|
56 |
+
|
57 |
+
### Yerel Kurulum
|
58 |
+
|
59 |
+
```bash
|
60 |
+
git clone <repo-url>
|
61 |
+
cd prompt_engineer_chatbot
|
62 |
+
pip install -r requirements.txt
|
63 |
+
streamlit run app.py
|
64 |
+
```
|
65 |
+
|
66 |
+
### Yeni Prompt Şablonları Ekleme
|
67 |
+
|
68 |
+
`prompt_templates.py` dosyasında `PROMPT_TEMPLATES` sözlüğüne yeni şablonlar ekleyebilirsiniz.
|
69 |
+
|
70 |
+
## Notlar
|
71 |
+
|
72 |
+
- API anahtarları kullanıcı tarafından sağlanmalıdır
|
73 |
+
- Uygulama, API anahtarlarını sadece oturum süresince saklar
|
74 |
+
- Hugging Face'de deploy edildiğinde, kullanıcılar kendi API anahtarlarını kullanmalıdır
|
__pycache__/ai_prompt_generator.cpython-313.pyc
ADDED
Binary file (15.7 kB). View file
|
|
__pycache__/api_integrations.cpython-313.pyc
ADDED
Binary file (25.7 kB). View file
|
|
__pycache__/chatbot_backend.cpython-313.pyc
ADDED
Binary file (18.3 kB). View file
|
|
__pycache__/prompt_templates.cpython-313.pyc
ADDED
Binary file (45.1 kB). View file
|
|
__pycache__/streamlit_ui.cpython-313.pyc
ADDED
Binary file (63.6 kB). View file
|
|
ai_prompt_generator.py
ADDED
@@ -0,0 +1,421 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
AI destekli dinamik prompt oluşturucu.
|
3 |
+
Bu modül, kullanıcı girdisine göre tamamen dinamik promptlar oluşturur.
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
from typing import Dict, Any, Tuple, List, Optional
|
8 |
+
import openai
|
9 |
+
from google import generativeai as genai
|
10 |
+
import requests
|
11 |
+
from dotenv import load_dotenv, find_dotenv
|
12 |
+
|
13 |
+
# Özel .env dosyası yükleme fonksiyonu
|
14 |
+
def load_env_safely():
|
15 |
+
"""
|
16 |
+
.env dosyasını güvenli bir şekilde yükler, farklı karakter kodlamalarını deneyerek.
|
17 |
+
"""
|
18 |
+
try:
|
19 |
+
# .env dosyasının yolunu bul
|
20 |
+
dotenv_path = find_dotenv()
|
21 |
+
|
22 |
+
# .env dosyası yoksa hemen çık
|
23 |
+
if not dotenv_path or not os.path.exists(dotenv_path):
|
24 |
+
return
|
25 |
+
|
26 |
+
# Çevre değişkenleri
|
27 |
+
env_vars = {}
|
28 |
+
|
29 |
+
try:
|
30 |
+
# Önce UTF-8 ile dene
|
31 |
+
with open(dotenv_path, "r", encoding="utf-8") as f:
|
32 |
+
lines = f.readlines()
|
33 |
+
except UnicodeDecodeError:
|
34 |
+
try:
|
35 |
+
# UTF-8 başarısız olursa Latin-1 ile dene
|
36 |
+
with open(dotenv_path, "r", encoding="latin-1") as f:
|
37 |
+
lines = f.readlines()
|
38 |
+
except Exception:
|
39 |
+
# Her şey başarısız olursa, .env'yi yüklemeyi atla
|
40 |
+
print("Uyarı: .env dosyası okunamadı, API anahtarları yüklenemedi.")
|
41 |
+
return
|
42 |
+
|
43 |
+
# Dosya içeriğini işle
|
44 |
+
for line in lines:
|
45 |
+
line = line.strip()
|
46 |
+
if line and not line.startswith("#") and "=" in line:
|
47 |
+
key, value = line.split("=", 1)
|
48 |
+
key = key.strip()
|
49 |
+
value = value.strip().strip('"\'')
|
50 |
+
|
51 |
+
# Değişkeni ortam değişkenlerine ekle
|
52 |
+
os.environ[key] = value
|
53 |
+
|
54 |
+
except Exception as e:
|
55 |
+
print(f"Uyarı: .env dosyası yüklenirken hata oluştu: {str(e)}")
|
56 |
+
|
57 |
+
# .env dosyasını güvenli bir şekilde yükle
|
58 |
+
load_env_safely()
|
59 |
+
|
60 |
+
class AIPromptGenerator:
|
61 |
+
"""
|
62 |
+
AI destekli dinamik prompt oluşturucu sınıfı.
|
63 |
+
Bu sınıf, kullanıcı girdisine göre yapay zeka kullanarak dinamik promptlar oluşturur.
|
64 |
+
"""
|
65 |
+
|
66 |
+
def __init__(self, openai_api_key=None, gemini_api_key=None, openrouter_api_key=None):
|
67 |
+
"""AI tabanlı prompt oluşturucu sınıfı.
|
68 |
+
|
69 |
+
Args:
|
70 |
+
openai_api_key (str, optional): OpenAI API anahtarı. Defaults to None.
|
71 |
+
gemini_api_key (str, optional): Google Gemini API anahtarı. Defaults to None.
|
72 |
+
openrouter_api_key (str, optional): OpenRouter API anahtarı. Defaults to None.
|
73 |
+
"""
|
74 |
+
self.openai_api_key = openai_api_key
|
75 |
+
self.gemini_api_key = gemini_api_key
|
76 |
+
self.openrouter_api_key = openrouter_api_key
|
77 |
+
|
78 |
+
# API anahtarlarını ayarla (varsa)
|
79 |
+
if self.openai_api_key:
|
80 |
+
openai.api_key = self.openai_api_key
|
81 |
+
|
82 |
+
if self.gemini_api_key:
|
83 |
+
genai.configure(api_key=self.gemini_api_key)
|
84 |
+
|
85 |
+
def set_api_key(self, provider: str, api_key: str) -> None:
|
86 |
+
"""
|
87 |
+
Belirli bir sağlayıcı için API anahtarını ayarlar.
|
88 |
+
|
89 |
+
Args:
|
90 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
91 |
+
api_key (str): API anahtarı
|
92 |
+
"""
|
93 |
+
if provider == "openai":
|
94 |
+
self.openai_api_key = api_key
|
95 |
+
openai.api_key = api_key
|
96 |
+
elif provider == "gemini":
|
97 |
+
self.gemini_api_key = api_key
|
98 |
+
genai.configure(api_key=api_key)
|
99 |
+
elif provider == "openrouter":
|
100 |
+
self.openrouter_api_key = api_key
|
101 |
+
|
102 |
+
def generate_with_openai(self, user_input: str, model: str = "gpt-3.5-turbo") -> Dict[str, Any]:
|
103 |
+
"""
|
104 |
+
OpenAI API kullanarak dinamik prompt oluşturur.
|
105 |
+
|
106 |
+
Args:
|
107 |
+
user_input (str): Kullanıcı girdisi
|
108 |
+
model (str): Kullanılacak model
|
109 |
+
|
110 |
+
Returns:
|
111 |
+
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
|
112 |
+
"""
|
113 |
+
if not self.openai_api_key:
|
114 |
+
return {"success": False, "error": "OpenAI API anahtarı ayarlanmamış.", "prompt": ""}
|
115 |
+
|
116 |
+
try:
|
117 |
+
system_message = """
|
118 |
+
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.
|
119 |
+
|
120 |
+
Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.).
|
121 |
+
Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin.
|
122 |
+
|
123 |
+
Oluşturduğun prompt şunları içermeli:
|
124 |
+
1. Projenin/görevin çok net ve spesifik bir tanımı
|
125 |
+
2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.)
|
126 |
+
3. Kullanıcı deneyimi ve arayüz gereksinimleri
|
127 |
+
4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla)
|
128 |
+
5. Adım adım uygulama talimatları
|
129 |
+
6. Beklenen çıktının detaylı açıklaması
|
130 |
+
7. Kalite kriterleri ve test gereksinimleri
|
131 |
+
8. Referans olabilecek örnekler veya kaynaklar
|
132 |
+
|
133 |
+
Önemli kurallar:
|
134 |
+
- Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı
|
135 |
+
- Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan
|
136 |
+
- Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan
|
137 |
+
- Ö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
|
138 |
+
- E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt
|
139 |
+
- Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner
|
140 |
+
|
141 |
+
Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler oluştur.
|
142 |
+
"""
|
143 |
+
|
144 |
+
try:
|
145 |
+
openai.api_key = self.openai_api_key
|
146 |
+
response = openai.chat.completions.create(
|
147 |
+
model=model,
|
148 |
+
messages=[
|
149 |
+
{"role": "system", "content": system_message},
|
150 |
+
{"role": "user", "content": f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"}
|
151 |
+
],
|
152 |
+
temperature=0.7,
|
153 |
+
max_tokens=3000
|
154 |
+
)
|
155 |
+
|
156 |
+
return {
|
157 |
+
"success": True,
|
158 |
+
"prompt": response.choices[0].message.content,
|
159 |
+
"model": model
|
160 |
+
}
|
161 |
+
except openai.OpenAIError as e:
|
162 |
+
return {"success": False, "error": f"OpenAI API hatası: {str(e)}", "prompt": ""}
|
163 |
+
except Exception as e:
|
164 |
+
return {"success": False, "error": f"Beklenmeyen hata: {str(e)}", "prompt": ""}
|
165 |
+
|
166 |
+
def generate_with_gemini(self, user_input: str, model: str = "gemini-1.5-pro") -> Dict[str, Any]:
|
167 |
+
"""
|
168 |
+
Google Gemini API kullanarak dinamik prompt oluşturur.
|
169 |
+
|
170 |
+
Args:
|
171 |
+
user_input (str): Kullanıcı girdisi
|
172 |
+
model (str): Kullanılacak model
|
173 |
+
|
174 |
+
Returns:
|
175 |
+
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
|
176 |
+
"""
|
177 |
+
if not self.gemini_api_key:
|
178 |
+
return {"success": False, "error": "Gemini API anahtarı ayarlanmamış.", "prompt": ""}
|
179 |
+
|
180 |
+
try:
|
181 |
+
system_prompt = """
|
182 |
+
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.
|
183 |
+
|
184 |
+
Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.).
|
185 |
+
Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin.
|
186 |
+
|
187 |
+
Oluşturduğun prompt şunları içermeli:
|
188 |
+
1. Projenin/görevin çok net ve spesifik bir tanımı
|
189 |
+
2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.)
|
190 |
+
3. Kullanıcı deneyimi ve arayüz gereksinimleri
|
191 |
+
4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla)
|
192 |
+
5. Adım adım uygulama talimatları
|
193 |
+
6. Beklenen çıktının detaylı açıklaması
|
194 |
+
7. Kalite kriterleri ve test gereksinimleri
|
195 |
+
8. Referans olabilecek örnekler veya kaynaklar
|
196 |
+
|
197 |
+
Önemli kurallar:
|
198 |
+
- Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı
|
199 |
+
- Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan
|
200 |
+
- Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan
|
201 |
+
- Ö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
|
202 |
+
- E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt
|
203 |
+
- Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner
|
204 |
+
|
205 |
+
Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler olu��tur.
|
206 |
+
"""
|
207 |
+
|
208 |
+
try:
|
209 |
+
genai.configure(api_key=self.gemini_api_key)
|
210 |
+
model_obj = genai.GenerativeModel(model)
|
211 |
+
response = model_obj.generate_content([
|
212 |
+
system_prompt,
|
213 |
+
f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"
|
214 |
+
],
|
215 |
+
generation_config=genai.types.GenerationConfig(
|
216 |
+
temperature=0.7,
|
217 |
+
max_output_tokens=3000
|
218 |
+
))
|
219 |
+
|
220 |
+
return {
|
221 |
+
"success": True,
|
222 |
+
"prompt": response.text,
|
223 |
+
"model": model
|
224 |
+
}
|
225 |
+
except Exception as e:
|
226 |
+
return {"success": False, "error": f"Gemini API hatası: {str(e)}", "prompt": ""}
|
227 |
+
except Exception as e:
|
228 |
+
return {"success": False, "error": f"Beklenmeyen hata: {str(e)}", "prompt": ""}
|
229 |
+
|
230 |
+
def generate_with_openrouter(self, user_input: str, model: str = "openai/gpt-4-turbo") -> Dict[str, Any]:
|
231 |
+
"""
|
232 |
+
OpenRouter API kullanarak dinamik prompt oluşturur.
|
233 |
+
|
234 |
+
Args:
|
235 |
+
user_input (str): Kullanıcı girdisi
|
236 |
+
model (str): Kullanılacak model
|
237 |
+
|
238 |
+
Returns:
|
239 |
+
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
|
240 |
+
"""
|
241 |
+
if not self.openrouter_api_key:
|
242 |
+
return {"success": False, "error": "OpenRouter API anahtarı ayarlanmamış.", "prompt": ""}
|
243 |
+
|
244 |
+
try:
|
245 |
+
system_message = """
|
246 |
+
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.
|
247 |
+
|
248 |
+
Kullanıcı sana ne yapmak istediğini anlatacak (örneğin bir web sitesi, mobil uygulama, oyun, veri analizi, görsel üretimi, video üretimi vb.).
|
249 |
+
Sen de bunu yapay zeka modellerine verilebilecek detaylı bir prompta dönüştüreceksin.
|
250 |
+
|
251 |
+
Oluşturduğun prompt şunları içermeli:
|
252 |
+
1. Projenin/görevin çok net ve spesifik bir tanımı
|
253 |
+
2. Teknik gereksinimler ve kısıtlamalar (programlama dilleri, framework'ler, API'ler, vb.)
|
254 |
+
3. Kullanıcı deneyimi ve arayüz gereksinimleri
|
255 |
+
4. Özel özellikler ve işlevsellikler (domain'e özgü detaylarla)
|
256 |
+
5. Adım adım uygulama talimatları
|
257 |
+
6. Beklenen çıktının detaylı açıklaması
|
258 |
+
7. Kalite kriterleri ve test gereksinimleri
|
259 |
+
8. Referans olabilecek örnekler veya kaynaklar
|
260 |
+
|
261 |
+
Önemli kurallar:
|
262 |
+
- Asla genel şablonlar kullanma, her prompt tamamen kullanıcının spesifik isteğine göre özelleştirilmiş olmalı
|
263 |
+
- Kullanıcının belirttiği alana özgü teknik detaylar ve terminoloji kullan
|
264 |
+
- Prompt içeriğini zenginleştirmek için kendi teknik bilgini kullan
|
265 |
+
- Ö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
|
266 |
+
- E-ticaret için ödeme işleme API'leri, sepet yönetimi, ürün filtreleme, kullanıcı yorumları gibi spesifik özellikler belirt
|
267 |
+
- Veri analizi için veri temizleme teknikleri, istatistiksel modeller, görselleştirme kütüphaneleri gibi spesifik araçlar öner
|
268 |
+
|
269 |
+
Promptu yapılandırırken bölümlere ayır, başlıklar kullan ve numaralandırılmış listeler oluştur.
|
270 |
+
"""
|
271 |
+
|
272 |
+
headers = {
|
273 |
+
"Content-Type": "application/json",
|
274 |
+
"Authorization": f"Bearer {self.openrouter_api_key}"
|
275 |
+
}
|
276 |
+
|
277 |
+
data = {
|
278 |
+
"model": model,
|
279 |
+
"messages": [
|
280 |
+
{"role": "system", "content": system_message},
|
281 |
+
{"role": "user", "content": f"Şu konuda çok detaylı ve spesifik bir prompt oluştur: {user_input}"}
|
282 |
+
],
|
283 |
+
"temperature": 0.7,
|
284 |
+
"max_tokens": 3000
|
285 |
+
}
|
286 |
+
|
287 |
+
response = requests.post(
|
288 |
+
"https://openrouter.ai/api/v1/chat/completions",
|
289 |
+
headers=headers,
|
290 |
+
json=data
|
291 |
+
)
|
292 |
+
|
293 |
+
if response.status_code == 200:
|
294 |
+
response_data = response.json()
|
295 |
+
return {
|
296 |
+
"success": True,
|
297 |
+
"prompt": response_data["choices"][0]["message"]["content"],
|
298 |
+
"model": model
|
299 |
+
}
|
300 |
+
else:
|
301 |
+
return {
|
302 |
+
"success": False,
|
303 |
+
"error": f"HTTP {response.status_code}: {response.text}",
|
304 |
+
"prompt": ""
|
305 |
+
}
|
306 |
+
except Exception as e:
|
307 |
+
return {"success": False, "error": str(e), "prompt": ""}
|
308 |
+
|
309 |
+
def generate_prompt(self, user_input: str, provider: str, model: Optional[str] = None) -> Dict[str, Any]:
|
310 |
+
"""
|
311 |
+
Belirli bir sağlayıcı ve model kullanarak dinamik prompt oluşturur.
|
312 |
+
|
313 |
+
Args:
|
314 |
+
user_input (str): Kullanıcı girdisi
|
315 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
316 |
+
model (str, optional): Kullanılacak model
|
317 |
+
|
318 |
+
Returns:
|
319 |
+
Dict[str, Any]: Oluşturulan prompt ve ilgili bilgiler
|
320 |
+
"""
|
321 |
+
try:
|
322 |
+
# Kullanıcının belirttiği özel teknolojilere vurgu yapalım
|
323 |
+
user_input_lower = user_input.lower()
|
324 |
+
enhanced_user_input = user_input
|
325 |
+
|
326 |
+
# Frontend teknolojileri için vurgu
|
327 |
+
if "bootstrap" in user_input_lower:
|
328 |
+
enhanced_user_input += "\n\nNOT: Bootstrap framework'ü mutlaka kullanılmalıdır. Tasarım Bootstrap bileşenlerini içermelidir."
|
329 |
+
if "react" in user_input_lower:
|
330 |
+
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."
|
331 |
+
if "vue" in user_input_lower:
|
332 |
+
enhanced_user_input += "\n\nNOT: Vue.js framework'ü mutlaka kullanılmalıdır. Vue bileşenleri ve direktifleri ile uygulama oluşturulmalıdır."
|
333 |
+
if "angular" in user_input_lower:
|
334 |
+
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."
|
335 |
+
if "tailwind" in user_input_lower:
|
336 |
+
enhanced_user_input += "\n\nNOT: Tailwind CSS mutlaka kullanılmalıdır. Tasarım Tailwind utility sınıfları ile oluşturulmalıdır."
|
337 |
+
|
338 |
+
# API anahtarını kontrol et
|
339 |
+
if provider == "openai" and not self.openai_api_key:
|
340 |
+
return {
|
341 |
+
"success": False,
|
342 |
+
"error": "OpenAI API anahtarı ayarlanmamış."
|
343 |
+
}
|
344 |
+
elif provider == "gemini" and not self.gemini_api_key:
|
345 |
+
return {
|
346 |
+
"success": False,
|
347 |
+
"error": "Google Gemini API anahtarı ayarlanmamış."
|
348 |
+
}
|
349 |
+
elif provider == "openrouter" and not self.openrouter_api_key:
|
350 |
+
return {
|
351 |
+
"success": False,
|
352 |
+
"error": "OpenRouter API anahtarı ayarlanmamış."
|
353 |
+
}
|
354 |
+
|
355 |
+
# OpenAI ile prompt oluştur
|
356 |
+
if provider == "openai":
|
357 |
+
if model is None:
|
358 |
+
model = "gpt-3.5-turbo"
|
359 |
+
return self.generate_with_openai(enhanced_user_input, model)
|
360 |
+
elif provider == "gemini":
|
361 |
+
if model is None:
|
362 |
+
model = "gemini-1.5-pro"
|
363 |
+
return self.generate_with_gemini(enhanced_user_input, model)
|
364 |
+
elif provider == "openrouter":
|
365 |
+
if model is None:
|
366 |
+
model = "anthropic/claude-3-opus" if self.openrouter_api_key else "openai/gpt-4-turbo"
|
367 |
+
return self.generate_with_openrouter(enhanced_user_input, model)
|
368 |
+
else:
|
369 |
+
return {"success": False, "error": "Geçersiz sağlayıcı. Lütfen 'openai', 'gemini' veya 'openrouter' seçin.", "prompt": ""}
|
370 |
+
except Exception as e:
|
371 |
+
return {"success": False, "error": f"Prompt oluşturma hatası: {str(e)}", "prompt": ""}
|
372 |
+
|
373 |
+
# Test fonksiyonu
|
374 |
+
def test_ai_prompt_generator():
|
375 |
+
"""
|
376 |
+
AI prompt oluşturucuyu test eder.
|
377 |
+
"""
|
378 |
+
generator = AIPromptGenerator()
|
379 |
+
|
380 |
+
# Test girdileri
|
381 |
+
test_inputs = [
|
382 |
+
"Bir hava durumu uygulaması yapmak istiyorum",
|
383 |
+
"Bir e-ticaret web sitesi geliştirmek istiyorum",
|
384 |
+
"Veri analizi için bir dashboard oluşturmak istiyorum"
|
385 |
+
]
|
386 |
+
|
387 |
+
# OpenAI API anahtarı varsa test et
|
388 |
+
if generator.openai_api_key:
|
389 |
+
print("OpenAI ile test:")
|
390 |
+
for input_text in test_inputs:
|
391 |
+
print(f"\nTest girdisi: {input_text}")
|
392 |
+
result = generator.generate_prompt(input_text, "openai", "gpt-4o")
|
393 |
+
if result["success"]:
|
394 |
+
print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...")
|
395 |
+
else:
|
396 |
+
print(f"Hata: {result['error']}")
|
397 |
+
|
398 |
+
# Gemini API anahtarı varsa test et
|
399 |
+
if generator.gemini_api_key:
|
400 |
+
print("\nGemini ile test:")
|
401 |
+
for input_text in test_inputs:
|
402 |
+
print(f"\nTest girdisi: {input_text}")
|
403 |
+
result = generator.generate_prompt(input_text, "gemini")
|
404 |
+
if result["success"]:
|
405 |
+
print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...")
|
406 |
+
else:
|
407 |
+
print(f"Hata: {result['error']}")
|
408 |
+
|
409 |
+
# OpenRouter API anahtarı varsa test et
|
410 |
+
if generator.openrouter_api_key:
|
411 |
+
print("\nOpenRouter ile test:")
|
412 |
+
for input_text in test_inputs:
|
413 |
+
print(f"\nTest girdisi: {input_text}")
|
414 |
+
result = generator.generate_prompt(input_text, "openrouter")
|
415 |
+
if result["success"]:
|
416 |
+
print(f"Oluşturulan prompt (ilk 300 karakter):\n{result['prompt'][:300]}...")
|
417 |
+
else:
|
418 |
+
print(f"Hata: {result['error']}")
|
419 |
+
|
420 |
+
if __name__ == "__main__":
|
421 |
+
test_ai_prompt_generator()
|
api_integrations.py
ADDED
@@ -0,0 +1,740 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
API entegrasyonları için yardımcı fonksiyonlar.
|
3 |
+
Bu modül, OpenAI, Google Gemini ve OpenRouter API'leri ile etkileşim için gerekli fonksiyonları içerir.
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
import json
|
8 |
+
import time
|
9 |
+
import threading
|
10 |
+
from typing import Dict, Any, List, Optional
|
11 |
+
import openai
|
12 |
+
from google import generativeai as genai
|
13 |
+
import requests
|
14 |
+
from dotenv import load_dotenv, set_key
|
15 |
+
|
16 |
+
# Prompt şablonlarından model listelerini içe aktar
|
17 |
+
from prompt_templates import OPENAI_MODELS, GEMINI_MODELS, OPENROUTER_MODELS
|
18 |
+
|
19 |
+
# .env dosyasını latin-1 encoding ile yükle
|
20 |
+
load_dotenv(encoding="latin-1")
|
21 |
+
|
22 |
+
# Model önbelleği için global değişkenler
|
23 |
+
MODEL_CACHE = {
|
24 |
+
"openai": {
|
25 |
+
"models": [],
|
26 |
+
"last_updated": 0,
|
27 |
+
"update_interval": 3600 # 1 saat (saniye cinsinden)
|
28 |
+
},
|
29 |
+
"gemini": {
|
30 |
+
"models": [],
|
31 |
+
"last_updated": 0,
|
32 |
+
"update_interval": 3600 # 1 saat (saniye cinsinden)
|
33 |
+
},
|
34 |
+
"openrouter": {
|
35 |
+
"models": [],
|
36 |
+
"last_updated": 0,
|
37 |
+
"update_interval": 3600 # 1 saat (saniye cinsinden)
|
38 |
+
}
|
39 |
+
}
|
40 |
+
|
41 |
+
# Model önbelleği dosya yolu
|
42 |
+
CACHE_FILE_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "model_cache.json")
|
43 |
+
|
44 |
+
def load_model_cache():
|
45 |
+
"""
|
46 |
+
Disk üzerindeki model önbelleğini yükler.
|
47 |
+
"""
|
48 |
+
global MODEL_CACHE
|
49 |
+
try:
|
50 |
+
if os.path.exists(CACHE_FILE_PATH):
|
51 |
+
with open(CACHE_FILE_PATH, 'r') as f:
|
52 |
+
cache_data = json.load(f)
|
53 |
+
MODEL_CACHE = cache_data
|
54 |
+
print(f"Model önbelleği yüklendi: {len(MODEL_CACHE['openai']['models'])} OpenAI, {len(MODEL_CACHE['gemini']['models'])} Gemini, {len(MODEL_CACHE['openrouter']['models'])} OpenRouter modeli")
|
55 |
+
except Exception as e:
|
56 |
+
print(f"Model önbelleği yüklenirken hata oluştu: {str(e)}")
|
57 |
+
|
58 |
+
def save_model_cache():
|
59 |
+
"""
|
60 |
+
Model önbelleğini diske kaydeder.
|
61 |
+
"""
|
62 |
+
try:
|
63 |
+
with open(CACHE_FILE_PATH, 'w') as f:
|
64 |
+
json.dump(MODEL_CACHE, f)
|
65 |
+
print("Model önbelleği diske kaydedildi")
|
66 |
+
except Exception as e:
|
67 |
+
print(f"Model önbelleği kaydedilirken hata oluştu: {str(e)}")
|
68 |
+
|
69 |
+
# Uygulama başlangıcında önbelleği yükle
|
70 |
+
load_model_cache()
|
71 |
+
|
72 |
+
class APIManager:
|
73 |
+
"""
|
74 |
+
API yönetimi için sınıf.
|
75 |
+
Bu sınıf, API anahtarlarını yönetir ve API'lerin durumunu kontrol eder.
|
76 |
+
"""
|
77 |
+
|
78 |
+
def __init__(self):
|
79 |
+
"""
|
80 |
+
API yöneticisini başlat.
|
81 |
+
"""
|
82 |
+
self.api_keys = {
|
83 |
+
"openai": os.getenv("OPENAI_API_KEY", ""),
|
84 |
+
"gemini": os.getenv("GEMINI_API_KEY", ""),
|
85 |
+
"openrouter": os.getenv("OPENROUTER_API_KEY", "")
|
86 |
+
}
|
87 |
+
|
88 |
+
def set_api_key(self, provider: str, api_key: str) -> None:
|
89 |
+
"""
|
90 |
+
Belirli bir sağlayıcı için API anahtarını ayarlar.
|
91 |
+
|
92 |
+
Args:
|
93 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
94 |
+
api_key (str): API anahtarı
|
95 |
+
"""
|
96 |
+
if provider in self.api_keys:
|
97 |
+
self.api_keys[provider] = api_key
|
98 |
+
|
99 |
+
# API anahtarını ilgili kütüphane için de ayarla
|
100 |
+
if provider == "openai":
|
101 |
+
openai.api_key = api_key
|
102 |
+
elif provider == "gemini":
|
103 |
+
genai.configure(api_key=api_key)
|
104 |
+
|
105 |
+
# API anahtarı değiştiğinde model önbelleğini sıfırla
|
106 |
+
global MODEL_CACHE
|
107 |
+
MODEL_CACHE[provider]["last_updated"] = 0
|
108 |
+
|
109 |
+
def get_api_key(self, provider: str) -> str:
|
110 |
+
"""
|
111 |
+
Belirli bir sağlayıcı için API anahtarını döndürür.
|
112 |
+
|
113 |
+
Args:
|
114 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
115 |
+
|
116 |
+
Returns:
|
117 |
+
str: API anahtarı
|
118 |
+
"""
|
119 |
+
return self.api_keys.get(provider, "")
|
120 |
+
|
121 |
+
def check_api_key_validity(self, provider: str) -> bool:
|
122 |
+
"""
|
123 |
+
Belirli bir sağlayıcı için API anahtarının geçerliliğini kontrol eder.
|
124 |
+
|
125 |
+
Args:
|
126 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
127 |
+
|
128 |
+
Returns:
|
129 |
+
bool: API anahtarı geçerli ise True, değilse False
|
130 |
+
"""
|
131 |
+
api_key = self.get_api_key(provider)
|
132 |
+
|
133 |
+
if not api_key:
|
134 |
+
return False
|
135 |
+
|
136 |
+
try:
|
137 |
+
if provider == "openai":
|
138 |
+
openai.api_key = api_key
|
139 |
+
# Basit bir model listesi isteği ile API anahtarının geçerliliğini kontrol et
|
140 |
+
openai.models.list()
|
141 |
+
return True
|
142 |
+
|
143 |
+
elif provider == "gemini":
|
144 |
+
genai.configure(api_key=api_key)
|
145 |
+
# Kullanılabilir modelleri listeleyerek API anahtarının geçerliliğini kontrol et
|
146 |
+
genai.list_models()
|
147 |
+
return True
|
148 |
+
|
149 |
+
elif provider == "openrouter":
|
150 |
+
headers = {
|
151 |
+
"Authorization": f"Bearer {api_key}"
|
152 |
+
}
|
153 |
+
response = requests.get(
|
154 |
+
"https://openrouter.ai/api/v1/models",
|
155 |
+
headers=headers
|
156 |
+
)
|
157 |
+
return response.status_code == 200
|
158 |
+
|
159 |
+
return False
|
160 |
+
|
161 |
+
except Exception:
|
162 |
+
return False
|
163 |
+
|
164 |
+
|
165 |
+
class OpenAIHandler:
|
166 |
+
"""
|
167 |
+
OpenAI API ile etkileşim için sınıf.
|
168 |
+
"""
|
169 |
+
|
170 |
+
def __init__(self, api_key: str = ""):
|
171 |
+
"""
|
172 |
+
OpenAI işleyicisini başlat.
|
173 |
+
|
174 |
+
Args:
|
175 |
+
api_key (str, optional): OpenAI API anahtarı
|
176 |
+
"""
|
177 |
+
self.api_key = api_key
|
178 |
+
if api_key:
|
179 |
+
openai.api_key = api_key
|
180 |
+
|
181 |
+
def set_api_key(self, api_key: str) -> None:
|
182 |
+
"""
|
183 |
+
OpenAI API anahtarını ayarlar.
|
184 |
+
|
185 |
+
Args:
|
186 |
+
api_key (str): OpenAI API anahtarı
|
187 |
+
"""
|
188 |
+
self.api_key = api_key
|
189 |
+
openai.api_key = api_key
|
190 |
+
|
191 |
+
# API anahtarı değiştiğinde model önbelleğini sıfırla
|
192 |
+
global MODEL_CACHE
|
193 |
+
MODEL_CACHE["openai"]["last_updated"] = 0
|
194 |
+
|
195 |
+
def fetch_models_from_api(self) -> List[str]:
|
196 |
+
"""
|
197 |
+
OpenAI API'sinden modelleri çeker.
|
198 |
+
|
199 |
+
Returns:
|
200 |
+
List[str]: API'den çekilen modeller listesi
|
201 |
+
"""
|
202 |
+
if not self.api_key:
|
203 |
+
return []
|
204 |
+
|
205 |
+
try:
|
206 |
+
models = openai.models.list()
|
207 |
+
# Sadece GPT modellerini filtrele
|
208 |
+
gpt_models = [model.id for model in models.data if "gpt" in model.id.lower()]
|
209 |
+
return gpt_models
|
210 |
+
except Exception as e:
|
211 |
+
print(f"OpenAI modellerini çekerken hata oluştu: {str(e)}")
|
212 |
+
return []
|
213 |
+
|
214 |
+
def get_available_models(self, force_refresh: bool = False) -> List[str]:
|
215 |
+
"""
|
216 |
+
Kullanılabilir OpenAI modellerini döndürür.
|
217 |
+
|
218 |
+
Args:
|
219 |
+
force_refresh (bool): Önbelleği zorla yenileme
|
220 |
+
|
221 |
+
Returns:
|
222 |
+
List[str]: Kullanılabilir modeller listesi
|
223 |
+
"""
|
224 |
+
global MODEL_CACHE
|
225 |
+
|
226 |
+
current_time = time.time()
|
227 |
+
cache = MODEL_CACHE["openai"]
|
228 |
+
|
229 |
+
# Önbellek yenileme koşulları:
|
230 |
+
# 1. Zorla yenileme istenmiş
|
231 |
+
# 2. Önbellek boş
|
232 |
+
# 3. Önbellek güncellenme zamanı aşılmış
|
233 |
+
if (force_refresh or
|
234 |
+
not cache["models"] or
|
235 |
+
current_time - cache["last_updated"] > cache["update_interval"]):
|
236 |
+
|
237 |
+
# API'den modelleri çek
|
238 |
+
api_models = self.fetch_models_from_api()
|
239 |
+
|
240 |
+
if api_models:
|
241 |
+
# API'den modeller başarıyla çekildiyse önbelleği güncelle
|
242 |
+
all_models = list(set(api_models + OPENAI_MODELS))
|
243 |
+
|
244 |
+
# Varsayılan modelleri önceliklendir
|
245 |
+
sorted_models = sorted(
|
246 |
+
all_models,
|
247 |
+
key=lambda x: (
|
248 |
+
0 if x in OPENAI_MODELS else 1,
|
249 |
+
OPENAI_MODELS.index(x) if x in OPENAI_MODELS else float('inf')
|
250 |
+
)
|
251 |
+
)
|
252 |
+
|
253 |
+
# Önbelleği güncelle
|
254 |
+
MODEL_CACHE["openai"]["models"] = sorted_models
|
255 |
+
MODEL_CACHE["openai"]["last_updated"] = current_time
|
256 |
+
|
257 |
+
# Önbelleği diske kaydet
|
258 |
+
save_model_cache()
|
259 |
+
|
260 |
+
return sorted_models
|
261 |
+
else:
|
262 |
+
# API'den model çekilemediyse önbellekteki modelleri kullan
|
263 |
+
if cache["models"]:
|
264 |
+
return cache["models"]
|
265 |
+
else:
|
266 |
+
return OPENAI_MODELS
|
267 |
+
else:
|
268 |
+
# Önbellek güncel, önbellekteki modelleri kullan
|
269 |
+
return cache["models"] if cache["models"] else OPENAI_MODELS
|
270 |
+
|
271 |
+
def generate_response(self, prompt: str, model: str = "gpt-3.5-turbo", temperature: float = 0.7, max_tokens: int = 2000) -> Dict[str, Any]:
|
272 |
+
"""
|
273 |
+
OpenAI API kullanarak yanıt oluşturur.
|
274 |
+
|
275 |
+
Args:
|
276 |
+
prompt (str): Gönderilecek prompt
|
277 |
+
model (str): Kullanılacak model
|
278 |
+
temperature (float): Sıcaklık değeri (0.0-1.0)
|
279 |
+
max_tokens (int): Maksimum token sayısı
|
280 |
+
|
281 |
+
Returns:
|
282 |
+
Dict[str, Any]: Yanıt bilgilerini içeren sözlük
|
283 |
+
"""
|
284 |
+
if not self.api_key:
|
285 |
+
return {"success": False, "error": "OpenAI API anahtarı ayarlanmamış.", "content": ""}
|
286 |
+
|
287 |
+
try:
|
288 |
+
response = openai.chat.completions.create(
|
289 |
+
model=model,
|
290 |
+
messages=[{"role": "user", "content": prompt}],
|
291 |
+
temperature=temperature,
|
292 |
+
max_tokens=max_tokens
|
293 |
+
)
|
294 |
+
|
295 |
+
return {
|
296 |
+
"success": True,
|
297 |
+
"content": response.choices[0].message.content,
|
298 |
+
"model": model,
|
299 |
+
"usage": {
|
300 |
+
"prompt_tokens": response.usage.prompt_tokens,
|
301 |
+
"completion_tokens": response.usage.completion_tokens,
|
302 |
+
"total_tokens": response.usage.total_tokens
|
303 |
+
}
|
304 |
+
}
|
305 |
+
except Exception as e:
|
306 |
+
return {"success": False, "error": str(e), "content": ""}
|
307 |
+
|
308 |
+
|
309 |
+
class GeminiHandler:
|
310 |
+
"""
|
311 |
+
Google Gemini API ile etkileşim için sınıf.
|
312 |
+
"""
|
313 |
+
|
314 |
+
def __init__(self, api_key: str = ""):
|
315 |
+
"""
|
316 |
+
Gemini işleyicisini başlat.
|
317 |
+
|
318 |
+
Args:
|
319 |
+
api_key (str, optional): Gemini API anahtarı
|
320 |
+
"""
|
321 |
+
self.api_key = api_key
|
322 |
+
if api_key:
|
323 |
+
genai.configure(api_key=api_key)
|
324 |
+
|
325 |
+
def set_api_key(self, api_key: str) -> None:
|
326 |
+
"""
|
327 |
+
Gemini API anahtarını ayarlar.
|
328 |
+
|
329 |
+
Args:
|
330 |
+
api_key (str): Gemini API anahtarı
|
331 |
+
"""
|
332 |
+
self.api_key = api_key
|
333 |
+
genai.configure(api_key=api_key)
|
334 |
+
|
335 |
+
# API anahtarı değiştiğinde model önbelleğini sıfırla
|
336 |
+
global MODEL_CACHE
|
337 |
+
MODEL_CACHE["gemini"]["last_updated"] = 0
|
338 |
+
|
339 |
+
def fetch_models_from_api(self) -> List[str]:
|
340 |
+
"""
|
341 |
+
Gemini API'sinden modelleri çeker.
|
342 |
+
|
343 |
+
Returns:
|
344 |
+
List[str]: API'den çekilen modeller listesi
|
345 |
+
"""
|
346 |
+
if not self.api_key:
|
347 |
+
return []
|
348 |
+
|
349 |
+
try:
|
350 |
+
models = genai.list_models()
|
351 |
+
api_models = []
|
352 |
+
|
353 |
+
# Tüm model türlerini topla (gemini, imagen, veo, vb.)
|
354 |
+
for model in models:
|
355 |
+
model_name = model.name.split("/")[-1]
|
356 |
+
if any(keyword in model_name.lower() for keyword in ["gemini", "imagen", "veo"]):
|
357 |
+
api_models.append(model_name)
|
358 |
+
|
359 |
+
return api_models
|
360 |
+
except Exception as e:
|
361 |
+
print(f"Gemini modellerini çekerken hata oluştu: {str(e)}")
|
362 |
+
return []
|
363 |
+
|
364 |
+
def get_available_models(self, force_refresh: bool = False) -> List[str]:
|
365 |
+
"""
|
366 |
+
Kullanılabilir Gemini modellerini döndürür.
|
367 |
+
|
368 |
+
Args:
|
369 |
+
force_refresh (bool): Önbelleği zorla yenileme
|
370 |
+
|
371 |
+
Returns:
|
372 |
+
List[str]: Kullanılabilir modeller listesi
|
373 |
+
"""
|
374 |
+
global MODEL_CACHE
|
375 |
+
|
376 |
+
current_time = time.time()
|
377 |
+
cache = MODEL_CACHE["gemini"]
|
378 |
+
|
379 |
+
# Önbellek yenileme koşulları:
|
380 |
+
# 1. Zorla yenileme istenmiş
|
381 |
+
# 2. Önbellek boş
|
382 |
+
# 3. Önbellek güncellenme zamanı aşılmış
|
383 |
+
if (force_refresh or
|
384 |
+
not cache["models"] or
|
385 |
+
current_time - cache["last_updated"] > cache["update_interval"]):
|
386 |
+
|
387 |
+
# API'den modelleri çek
|
388 |
+
api_models = self.fetch_models_from_api()
|
389 |
+
|
390 |
+
if api_models:
|
391 |
+
# API'den modeller başarıyla çekildiyse önbelleği güncelle
|
392 |
+
all_models = list(set(api_models + GEMINI_MODELS))
|
393 |
+
|
394 |
+
# Varsayılan modelleri önceliklendir
|
395 |
+
sorted_models = sorted(
|
396 |
+
all_models,
|
397 |
+
key=lambda x: (
|
398 |
+
0 if x in GEMINI_MODELS else 1,
|
399 |
+
GEMINI_MODELS.index(x) if x in GEMINI_MODELS else float('inf')
|
400 |
+
)
|
401 |
+
)
|
402 |
+
|
403 |
+
# Önbelleği güncelle
|
404 |
+
MODEL_CACHE["gemini"]["models"] = sorted_models
|
405 |
+
MODEL_CACHE["gemini"]["last_updated"] = current_time
|
406 |
+
|
407 |
+
# Önbelleği diske kaydet
|
408 |
+
save_model_cache()
|
409 |
+
|
410 |
+
return sorted_models
|
411 |
+
else:
|
412 |
+
# API'den model çekilemediyse önbellekteki modelleri kullan
|
413 |
+
if cache["models"]:
|
414 |
+
return cache["models"]
|
415 |
+
else:
|
416 |
+
return GEMINI_MODELS
|
417 |
+
else:
|
418 |
+
# Önbellek güncel, önbellekteki modelleri kullan
|
419 |
+
return cache["models"] if cache["models"] else GEMINI_MODELS
|
420 |
+
|
421 |
+
def generate_response(self, prompt: str, model: str = "gemini-1.5-pro", temperature: float = 0.7) -> Dict[str, Any]:
|
422 |
+
"""
|
423 |
+
Gemini API kullanarak yanıt oluşturur.
|
424 |
+
|
425 |
+
Args:
|
426 |
+
prompt (str): Gönderilecek prompt
|
427 |
+
model (str): Kullanılacak model
|
428 |
+
temperature (float): Sıcaklık değeri (0.0-1.0)
|
429 |
+
|
430 |
+
Returns:
|
431 |
+
Dict[str, Any]: Yanıt bilgilerini içeren sözlük
|
432 |
+
"""
|
433 |
+
if not self.api_key:
|
434 |
+
return {"success": False, "error": "Gemini API anahtarı ayarlanmamış.", "content": ""}
|
435 |
+
|
436 |
+
try:
|
437 |
+
model_obj = genai.GenerativeModel(model)
|
438 |
+
response = model_obj.generate_content(
|
439 |
+
prompt,
|
440 |
+
generation_config=genai.types.GenerationConfig(
|
441 |
+
temperature=temperature
|
442 |
+
)
|
443 |
+
)
|
444 |
+
|
445 |
+
return {
|
446 |
+
"success": True,
|
447 |
+
"content": response.text,
|
448 |
+
"model": model
|
449 |
+
}
|
450 |
+
except Exception as e:
|
451 |
+
return {"success": False, "error": str(e), "content": ""}
|
452 |
+
|
453 |
+
|
454 |
+
class OpenRouterHandler:
|
455 |
+
"""
|
456 |
+
OpenRouter API ile etkileşim için sınıf.
|
457 |
+
"""
|
458 |
+
|
459 |
+
def __init__(self, api_key: str = ""):
|
460 |
+
"""
|
461 |
+
OpenRouter işleyicisini başlat.
|
462 |
+
|
463 |
+
Args:
|
464 |
+
api_key (str, optional): OpenRouter API anahtarı
|
465 |
+
"""
|
466 |
+
self.api_key = api_key
|
467 |
+
self.base_url = "https://openrouter.ai/api/v1"
|
468 |
+
|
469 |
+
def set_api_key(self, api_key: str) -> None:
|
470 |
+
"""
|
471 |
+
OpenRouter API anahtarını ayarlar.
|
472 |
+
|
473 |
+
Args:
|
474 |
+
api_key (str): OpenRouter API anahtarı
|
475 |
+
"""
|
476 |
+
self.api_key = api_key
|
477 |
+
|
478 |
+
# API anahtarı değiştiğinde model önbelleğini sıfırla
|
479 |
+
global MODEL_CACHE
|
480 |
+
MODEL_CACHE["openrouter"]["last_updated"] = 0
|
481 |
+
|
482 |
+
def fetch_models_from_api(self) -> List[str]:
|
483 |
+
"""
|
484 |
+
OpenRouter API'sinden modelleri çeker.
|
485 |
+
|
486 |
+
Returns:
|
487 |
+
List[str]: API'den çekilen modeller listesi
|
488 |
+
"""
|
489 |
+
if not self.api_key:
|
490 |
+
return []
|
491 |
+
|
492 |
+
try:
|
493 |
+
headers = {
|
494 |
+
"Authorization": f"Bearer {self.api_key}"
|
495 |
+
}
|
496 |
+
|
497 |
+
response = requests.get(
|
498 |
+
f"{self.base_url}/models",
|
499 |
+
headers=headers
|
500 |
+
)
|
501 |
+
|
502 |
+
if response.status_code == 200:
|
503 |
+
models_data = response.json()
|
504 |
+
api_models = [model["id"] for model in models_data["data"]]
|
505 |
+
return api_models
|
506 |
+
else:
|
507 |
+
print(f"OpenRouter modellerini çekerken HTTP hatası: {response.status_code}")
|
508 |
+
return []
|
509 |
+
except Exception as e:
|
510 |
+
print(f"OpenRouter modellerini çekerken hata oluştu: {str(e)}")
|
511 |
+
return []
|
512 |
+
|
513 |
+
def get_available_models(self, force_refresh: bool = False) -> List[str]:
|
514 |
+
"""
|
515 |
+
Kullanılabilir OpenRouter modellerini döndürür.
|
516 |
+
|
517 |
+
Args:
|
518 |
+
force_refresh (bool): Önbelleği zorla yenileme
|
519 |
+
|
520 |
+
Returns:
|
521 |
+
List[str]: Kullanılabilir modeller listesi
|
522 |
+
"""
|
523 |
+
global MODEL_CACHE
|
524 |
+
|
525 |
+
current_time = time.time()
|
526 |
+
cache = MODEL_CACHE["openrouter"]
|
527 |
+
|
528 |
+
# Önbellek yenileme koşulları:
|
529 |
+
# 1. Zorla yenileme istenmiş
|
530 |
+
# 2. Önbellek boş
|
531 |
+
# 3. Önbellek güncellenme zamanı aşılmış
|
532 |
+
if (force_refresh or
|
533 |
+
not cache["models"] or
|
534 |
+
current_time - cache["last_updated"] > cache["update_interval"]):
|
535 |
+
|
536 |
+
# API'den modelleri çek
|
537 |
+
api_models = self.fetch_models_from_api()
|
538 |
+
|
539 |
+
if api_models:
|
540 |
+
# API'den modeller başarıyla çekildiyse önbelleği güncelle
|
541 |
+
all_models = list(set(api_models + OPENROUTER_MODELS))
|
542 |
+
|
543 |
+
# Varsayılan modelleri önceliklendir
|
544 |
+
sorted_models = sorted(
|
545 |
+
all_models,
|
546 |
+
key=lambda x: (
|
547 |
+
0 if x in OPENROUTER_MODELS else 1,
|
548 |
+
OPENROUTER_MODELS.index(x) if x in OPENROUTER_MODELS else float('inf')
|
549 |
+
)
|
550 |
+
)
|
551 |
+
|
552 |
+
# Önbelleği güncelle
|
553 |
+
MODEL_CACHE["openrouter"]["models"] = sorted_models
|
554 |
+
MODEL_CACHE["openrouter"]["last_updated"] = current_time
|
555 |
+
|
556 |
+
# Önbelleği diske kaydet
|
557 |
+
save_model_cache()
|
558 |
+
|
559 |
+
return sorted_models
|
560 |
+
else:
|
561 |
+
# API'den model çekilemediyse önbellekteki modelleri kullan
|
562 |
+
if cache["models"]:
|
563 |
+
return cache["models"]
|
564 |
+
else:
|
565 |
+
return OPENROUTER_MODELS
|
566 |
+
else:
|
567 |
+
# Önbellek güncel, önbellekteki modelleri kullan
|
568 |
+
return cache["models"] if cache["models"] else OPENROUTER_MODELS
|
569 |
+
|
570 |
+
def generate_response(self, prompt: str, model: str = "openai/gpt-4-turbo", temperature: float = 0.7, max_tokens: int = 2000) -> Dict[str, Any]:
|
571 |
+
"""
|
572 |
+
OpenRouter API kullanarak yanıt oluşturur.
|
573 |
+
|
574 |
+
Args:
|
575 |
+
prompt (str): Gönderilecek prompt
|
576 |
+
model (str): Kullanılacak model
|
577 |
+
temperature (float): Sıcaklık değeri (0.0-1.0)
|
578 |
+
max_tokens (int): Maksimum token sayısı
|
579 |
+
|
580 |
+
Returns:
|
581 |
+
Dict[str, Any]: Yanıt bilgilerini içeren sözlük
|
582 |
+
"""
|
583 |
+
if not self.api_key:
|
584 |
+
return {"success": False, "error": "OpenRouter API anahtarı ayarlanmamış.", "content": ""}
|
585 |
+
|
586 |
+
try:
|
587 |
+
headers = {
|
588 |
+
"Content-Type": "application/json",
|
589 |
+
"Authorization": f"Bearer {self.api_key}"
|
590 |
+
}
|
591 |
+
|
592 |
+
data = {
|
593 |
+
"model": model,
|
594 |
+
"messages": [{"role": "user", "content": prompt}],
|
595 |
+
"temperature": temperature,
|
596 |
+
"max_tokens": max_tokens
|
597 |
+
}
|
598 |
+
|
599 |
+
response = requests.post(
|
600 |
+
f"{self.base_url}/chat/completions",
|
601 |
+
headers=headers,
|
602 |
+
json=data
|
603 |
+
)
|
604 |
+
|
605 |
+
if response.status_code == 200:
|
606 |
+
response_data = response.json()
|
607 |
+
return {
|
608 |
+
"success": True,
|
609 |
+
"content": response_data["choices"][0]["message"]["content"],
|
610 |
+
"model": model,
|
611 |
+
"usage": response_data.get("usage", {})
|
612 |
+
}
|
613 |
+
else:
|
614 |
+
return {
|
615 |
+
"success": False,
|
616 |
+
"error": f"HTTP {response.status_code}: {response.text}",
|
617 |
+
"content": ""
|
618 |
+
}
|
619 |
+
except Exception as e:
|
620 |
+
return {"success": False, "error": str(e), "content": ""}
|
621 |
+
|
622 |
+
|
623 |
+
# Arka planda model listelerini güncelleyen fonksiyon
|
624 |
+
def background_model_updater():
|
625 |
+
"""
|
626 |
+
Arka planda çalışarak model listelerini periyodik olarak günceller.
|
627 |
+
"""
|
628 |
+
while True:
|
629 |
+
try:
|
630 |
+
# Her sağlayıcı için modelleri güncelle
|
631 |
+
if openai_handler.api_key:
|
632 |
+
openai_handler.get_available_models(force_refresh=True)
|
633 |
+
|
634 |
+
if gemini_handler.api_key:
|
635 |
+
gemini_handler.get_available_models(force_refresh=True)
|
636 |
+
|
637 |
+
if openrouter_handler.api_key:
|
638 |
+
openrouter_handler.get_available_models(force_refresh=True)
|
639 |
+
|
640 |
+
print("Model listeleri arka planda güncellendi")
|
641 |
+
|
642 |
+
# 1 saat bekle
|
643 |
+
time.sleep(3600)
|
644 |
+
except Exception as e:
|
645 |
+
print(f"Arka plan model güncelleyicisinde hata: {str(e)}")
|
646 |
+
time.sleep(60) # Hata durumunda 1 dakika bekle ve tekrar dene
|
647 |
+
|
648 |
+
|
649 |
+
# API işleyicilerini oluştur
|
650 |
+
api_manager = APIManager()
|
651 |
+
openai_handler = OpenAIHandler()
|
652 |
+
gemini_handler = GeminiHandler()
|
653 |
+
openrouter_handler = OpenRouterHandler()
|
654 |
+
|
655 |
+
# API anahtarlarını ayarla (varsa)
|
656 |
+
openai_api_key = os.getenv("OPENAI_API_KEY", "")
|
657 |
+
gemini_api_key = os.getenv("GEMINI_API_KEY", "")
|
658 |
+
openrouter_api_key = os.getenv("OPENROUTER_API_KEY", "")
|
659 |
+
|
660 |
+
if openai_api_key:
|
661 |
+
openai_handler.set_api_key(openai_api_key)
|
662 |
+
|
663 |
+
if gemini_api_key:
|
664 |
+
gemini_handler.set_api_key(gemini_api_key)
|
665 |
+
|
666 |
+
if openrouter_api_key:
|
667 |
+
openrouter_handler.set_api_key(openrouter_api_key)
|
668 |
+
|
669 |
+
# Arka plan model güncelleyicisini başlat
|
670 |
+
updater_thread = threading.Thread(target=background_model_updater, daemon=True)
|
671 |
+
updater_thread.start()
|
672 |
+
|
673 |
+
# Test fonksiyonu
|
674 |
+
def test_api_connections():
|
675 |
+
"""
|
676 |
+
API bağlantılarını test eder.
|
677 |
+
"""
|
678 |
+
print("API Bağlantı Testi:")
|
679 |
+
|
680 |
+
# OpenAI API testi
|
681 |
+
if openai_api_key:
|
682 |
+
print("\nOpenAI API Testi:")
|
683 |
+
try:
|
684 |
+
models = openai_handler.get_available_models(force_refresh=True)
|
685 |
+
print(f"Kullanılabilir modeller: {models[:5]}...")
|
686 |
+
print("OpenAI API bağlantısı başarılı.")
|
687 |
+
except Exception as e:
|
688 |
+
print(f"OpenAI API hatası: {str(e)}")
|
689 |
+
else:
|
690 |
+
print("\nOpenAI API anahtarı ayarlanmamış.")
|
691 |
+
print(f"Varsayılan modeller: {OPENAI_MODELS}")
|
692 |
+
|
693 |
+
# Gemini API testi
|
694 |
+
if gemini_api_key:
|
695 |
+
print("\nGemini API Testi:")
|
696 |
+
try:
|
697 |
+
models = gemini_handler.get_available_models(force_refresh=True)
|
698 |
+
print(f"Kullanılabilir modeller: {models}")
|
699 |
+
print("Gemini API bağlantısı başarılı.")
|
700 |
+
except Exception as e:
|
701 |
+
print(f"Gemini API hatası: {str(e)}")
|
702 |
+
else:
|
703 |
+
print("\nGemini API anahtarı ayarlanmamış.")
|
704 |
+
print(f"Varsayılan modeller: {GEMINI_MODELS}")
|
705 |
+
|
706 |
+
# OpenRouter API testi
|
707 |
+
if openrouter_api_key:
|
708 |
+
print("\nOpenRouter API Testi:")
|
709 |
+
try:
|
710 |
+
models = openrouter_handler.get_available_models(force_refresh=True)
|
711 |
+
print(f"Kullanılabilir modeller: {len(models)} model bulundu")
|
712 |
+
print(f"İlk 10 model: {models[:10]}...")
|
713 |
+
print("OpenRouter API bağlantısı başarılı.")
|
714 |
+
except Exception as e:
|
715 |
+
print(f"OpenRouter API hatası: {str(e)}")
|
716 |
+
else:
|
717 |
+
print("\nOpenRouter API anahtarı ayarlanmamış.")
|
718 |
+
print(f"Varsayılan modeller: {len(OPENROUTER_MODELS)} model bulundu")
|
719 |
+
print(f"İlk 10 model: {OPENROUTER_MODELS[:10]}...")
|
720 |
+
|
721 |
+
if __name__ == "__main__":
|
722 |
+
test_api_connections()
|
723 |
+
|
724 |
+
def load_api_keys():
|
725 |
+
"""API anahtarlarını .env dosyasından yükler"""
|
726 |
+
try:
|
727 |
+
load_dotenv(encoding="latin-1")
|
728 |
+
|
729 |
+
openai_api_key = os.getenv('OPENAI_API_KEY')
|
730 |
+
gemini_api_key = os.getenv('GEMINI_API_KEY')
|
731 |
+
openrouter_api_key = os.getenv('OPENROUTER_API_KEY')
|
732 |
+
|
733 |
+
return {
|
734 |
+
'openai': openai_api_key,
|
735 |
+
'gemini': gemini_api_key,
|
736 |
+
'openrouter': openrouter_api_key
|
737 |
+
}
|
738 |
+
except Exception as e:
|
739 |
+
st.error(f"API anahtarları yüklenirken hata oluştu: {e}")
|
740 |
+
return {'openai': None, 'gemini': None, 'openrouter': None}
|
app.py
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Prompt Mühendisi Chatbot - Ana Uygulama Dosyası
|
3 |
+
Bu dosya, Hugging Face'de deployment için ana giriş noktasıdır.
|
4 |
+
"""
|
5 |
+
|
6 |
+
import streamlit as st
|
7 |
+
import os
|
8 |
+
from dotenv import load_dotenv
|
9 |
+
|
10 |
+
# Kendi modüllerimizi içe aktar
|
11 |
+
from prompt_templates import (
|
12 |
+
PROMPT_CATEGORIES,
|
13 |
+
predict_category,
|
14 |
+
extract_parameters,
|
15 |
+
create_prompt
|
16 |
+
)
|
17 |
+
from chatbot_backend import PromptEngineerChatbot
|
18 |
+
from api_integrations import (
|
19 |
+
APIManager,
|
20 |
+
OpenAIHandler,
|
21 |
+
GeminiHandler,
|
22 |
+
OpenRouterHandler
|
23 |
+
)
|
24 |
+
from streamlit_ui import main
|
25 |
+
|
26 |
+
# .env dosyasını yükle (varsa)
|
27 |
+
load_dotenv(encoding="latin-1")
|
28 |
+
|
29 |
+
# Ana uygulamayı çalıştır
|
30 |
+
if __name__ == "__main__":
|
31 |
+
main()
|
chatbot_backend.py
ADDED
@@ -0,0 +1,460 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Chatbot backend işlevselliği.
|
3 |
+
Bu modül, kullanıcı girdisini işleyen ve dinamik promptlar oluşturan ana mantığı içerir.
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
import json
|
8 |
+
import re
|
9 |
+
from typing import Dict, Any, Tuple, List, Optional
|
10 |
+
import openai
|
11 |
+
from google import generativeai as genai
|
12 |
+
import requests
|
13 |
+
from dotenv import load_dotenv
|
14 |
+
|
15 |
+
# Prompt şablonlarını içe aktar
|
16 |
+
from prompt_templates import (
|
17 |
+
PROMPT_CATEGORIES,
|
18 |
+
predict_category,
|
19 |
+
extract_parameters,
|
20 |
+
create_prompt
|
21 |
+
)
|
22 |
+
|
23 |
+
# AI Prompt Generator'ı içe aktar
|
24 |
+
from ai_prompt_generator import AIPromptGenerator, load_env_safely
|
25 |
+
|
26 |
+
# .env dosyasını güvenli şekilde yükle
|
27 |
+
# Not: ai_prompt_generator modülünde zaten yükleniyor, burada tekrar çağırmaya gerek yok
|
28 |
+
# load_env_safely()
|
29 |
+
|
30 |
+
class PromptEngineerChatbot:
|
31 |
+
"""
|
32 |
+
Prompt mühendisliği chatbot sınıfı.
|
33 |
+
Bu sınıf, kullanıcı girdisini işleyerek dinamik promptlar oluşturur.
|
34 |
+
"""
|
35 |
+
|
36 |
+
def __init__(self):
|
37 |
+
"""
|
38 |
+
Chatbot'u başlat ve yapılandır.
|
39 |
+
"""
|
40 |
+
self.conversation_history = []
|
41 |
+
self.current_category = None
|
42 |
+
self.current_params = None
|
43 |
+
self.ai_generator = AIPromptGenerator()
|
44 |
+
|
45 |
+
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]]:
|
46 |
+
"""
|
47 |
+
Kullanıcı girdisini işler ve dinamik bir prompt oluşturur.
|
48 |
+
|
49 |
+
Args:
|
50 |
+
user_input (str): Kullanıcı girdisi
|
51 |
+
use_ai_generation (bool): AI destekli prompt oluşturmayı kullan
|
52 |
+
provider (str): AI sağlayıcısı ('openai', 'gemini', 'openrouter')
|
53 |
+
model (str, optional): Kullanılacak model
|
54 |
+
|
55 |
+
Returns:
|
56 |
+
Tuple[str, str, Dict[str, Any]]: Oluşturulan prompt, kategori ve parametreler
|
57 |
+
"""
|
58 |
+
# Kullanıcı girdisini kaydet
|
59 |
+
self.conversation_history.append({"role": "user", "content": user_input})
|
60 |
+
|
61 |
+
# Kategori tahmini
|
62 |
+
category = predict_category(user_input)
|
63 |
+
|
64 |
+
# Parametreleri çıkar
|
65 |
+
params = extract_parameters(category, user_input)
|
66 |
+
|
67 |
+
# Mevcut kategori ve parametreleri güncelle
|
68 |
+
self.current_category = category
|
69 |
+
self.current_params = params
|
70 |
+
|
71 |
+
# AI destekli prompt oluşturma kullanılıyorsa
|
72 |
+
if use_ai_generation:
|
73 |
+
try:
|
74 |
+
# Şablon tabanlı promptu oluştur (referans için)
|
75 |
+
template_prompt = create_prompt(category, params)
|
76 |
+
|
77 |
+
# Kullanıcının belirttiği özel teknolojilere vurgu yapalım
|
78 |
+
user_input_lower = user_input.lower()
|
79 |
+
special_tech_notes = ""
|
80 |
+
|
81 |
+
if "bootstrap" in user_input_lower:
|
82 |
+
special_tech_notes += "\n- Bootstrap framework'ü kullanılmalıdır."
|
83 |
+
if "react" in user_input_lower:
|
84 |
+
special_tech_notes += "\n- React kütüphanesi kullanılmalıdır."
|
85 |
+
if "vue" in user_input_lower:
|
86 |
+
special_tech_notes += "\n- Vue.js framework'ü kullanılmalıdır."
|
87 |
+
if "angular" in user_input_lower:
|
88 |
+
special_tech_notes += "\n- Angular framework'ü kullanılmalıdır."
|
89 |
+
if "tailwind" in user_input_lower:
|
90 |
+
special_tech_notes += "\n- Tailwind CSS kullanılmalıdır."
|
91 |
+
|
92 |
+
# Özel teknoloji notları varsa ekleyelim
|
93 |
+
tech_emphasis = ""
|
94 |
+
if special_tech_notes:
|
95 |
+
tech_emphasis = f"\n\nÖNEMLİ TEKNOLOJİ GEREKSİNİMLERİ: {special_tech_notes}"
|
96 |
+
|
97 |
+
# Kategori bilgisini ve şablon promptu kullanarak daha spesifik bir AI prompt oluştur
|
98 |
+
enhanced_user_input = f"""
|
99 |
+
Kategori: {category}
|
100 |
+
|
101 |
+
Kullanıcı İsteği: {user_input}{tech_emphasis}
|
102 |
+
|
103 |
+
Lütfen bu istek için çok detaylı ve spesifik bir prompt oluştur.
|
104 |
+
Ş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:
|
105 |
+
|
106 |
+
{template_prompt}
|
107 |
+
|
108 |
+
Önemli: Yukarıdaki şablonu olduğu gibi kullanma, sadece yapı referansı olarak kullan.
|
109 |
+
İçeriği tamamen kullanıcının isteğine özel olarak oluştur ve çok daha detaylı, spesifik bilgiler ekle.
|
110 |
+
Örneğin, kullanıcı hava durumu uygulaması istiyorsa, hava durumu API'leri, hava verilerinin görselleştirilmesi,
|
111 |
+
hava tahminleri, konum takibi gibi spesifik detaylar ekle.
|
112 |
+
"""
|
113 |
+
|
114 |
+
# API anahtarı kontrolü
|
115 |
+
if not self.ai_generator.openai_api_key and provider == "openai":
|
116 |
+
prompt = template_prompt
|
117 |
+
elif not self.ai_generator.gemini_api_key and provider == "gemini":
|
118 |
+
prompt = template_prompt
|
119 |
+
elif not self.ai_generator.openrouter_api_key and provider == "openrouter":
|
120 |
+
prompt = template_prompt
|
121 |
+
else:
|
122 |
+
# AI destekli prompt oluştur
|
123 |
+
result = self.ai_generator.generate_prompt(enhanced_user_input, provider, model)
|
124 |
+
|
125 |
+
if result["success"]:
|
126 |
+
prompt = result["prompt"]
|
127 |
+
else:
|
128 |
+
# Hata mesajını logla ve şablon promptu kullan
|
129 |
+
print(f"AI prompt oluşturma hatası: {result.get('error', 'Bilinmeyen hata')}")
|
130 |
+
prompt = template_prompt
|
131 |
+
except Exception as e:
|
132 |
+
print(f"Prompt oluşturma hatası: {str(e)}")
|
133 |
+
# Hata durumunda şablon promptu kullan
|
134 |
+
prompt = create_prompt(category, params)
|
135 |
+
else:
|
136 |
+
# Şablon tabanlı prompt oluştur
|
137 |
+
prompt = create_prompt(category, params)
|
138 |
+
|
139 |
+
# Chatbot yanıtını kaydet
|
140 |
+
self.conversation_history.append({"role": "assistant", "content": prompt})
|
141 |
+
|
142 |
+
return prompt, category, params
|
143 |
+
|
144 |
+
def get_conversation_history(self) -> List[Dict[str, str]]:
|
145 |
+
"""
|
146 |
+
Konuşma geçmişini döndürür.
|
147 |
+
|
148 |
+
Returns:
|
149 |
+
List[Dict[str, str]]: Konuşma geçmişi
|
150 |
+
"""
|
151 |
+
return self.conversation_history
|
152 |
+
|
153 |
+
def clear_conversation_history(self) -> None:
|
154 |
+
"""
|
155 |
+
Konuşma geçmişini temizler.
|
156 |
+
"""
|
157 |
+
self.conversation_history = []
|
158 |
+
self.current_category = None
|
159 |
+
self.current_params = None
|
160 |
+
|
161 |
+
|
162 |
+
class AIModelInterface:
|
163 |
+
"""
|
164 |
+
Farklı AI API'leri için arayüz sınıfı.
|
165 |
+
Bu sınıf, OpenAI, Google Gemini ve OpenRouter API'leri ile etkileşim sağlar.
|
166 |
+
"""
|
167 |
+
|
168 |
+
def __init__(self):
|
169 |
+
"""
|
170 |
+
AI model arayüzünü başlat.
|
171 |
+
"""
|
172 |
+
self.api_keys = {
|
173 |
+
"openai": os.getenv("OPENAI_API_KEY", ""),
|
174 |
+
"gemini": os.getenv("GEMINI_API_KEY", ""),
|
175 |
+
"openrouter": os.getenv("OPENROUTER_API_KEY", "")
|
176 |
+
}
|
177 |
+
|
178 |
+
def set_api_key(self, provider: str, api_key: str) -> None:
|
179 |
+
"""
|
180 |
+
Belirli bir sağlayıcı için API anahtarını ayarlar.
|
181 |
+
|
182 |
+
Args:
|
183 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
184 |
+
api_key (str): API anahtarı
|
185 |
+
"""
|
186 |
+
if provider in self.api_keys:
|
187 |
+
self.api_keys[provider] = api_key
|
188 |
+
|
189 |
+
def get_available_models(self, provider: str) -> List[str]:
|
190 |
+
"""
|
191 |
+
Belirli bir sağlayıcı için kullanılabilir modelleri döndürür.
|
192 |
+
|
193 |
+
Args:
|
194 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
195 |
+
|
196 |
+
Returns:
|
197 |
+
List[str]: Kullanılabilir modeller listesi
|
198 |
+
"""
|
199 |
+
if provider == "openai":
|
200 |
+
return ["gpt-4o", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"]
|
201 |
+
elif provider == "gemini":
|
202 |
+
return ["gemini-1.5-pro", "gemini-1.5-flash", "gemini-1.0-pro"]
|
203 |
+
elif provider == "openrouter":
|
204 |
+
return [
|
205 |
+
"openai/gpt-4o",
|
206 |
+
"openai/gpt-4-turbo",
|
207 |
+
"anthropic/claude-3-opus",
|
208 |
+
"anthropic/claude-3-sonnet",
|
209 |
+
"google/gemini-1.5-pro",
|
210 |
+
"meta-llama/llama-3-70b-instruct"
|
211 |
+
]
|
212 |
+
return []
|
213 |
+
|
214 |
+
def generate_with_openai(self, prompt: str, model: str = "gpt-3.5-turbo", api_key: Optional[str] = None) -> str:
|
215 |
+
"""
|
216 |
+
OpenAI API kullanarak yanıt oluşturur.
|
217 |
+
|
218 |
+
Args:
|
219 |
+
prompt (str): Gönderilecek prompt
|
220 |
+
model (str): Kullanılacak model
|
221 |
+
api_key (str, optional): Doğrudan kullanılacak API anahtarı
|
222 |
+
|
223 |
+
Returns:
|
224 |
+
str: Oluşturulan yanıt
|
225 |
+
"""
|
226 |
+
# Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan
|
227 |
+
current_api_key = api_key if api_key else self.api_keys["openai"]
|
228 |
+
|
229 |
+
if not current_api_key:
|
230 |
+
return "OpenAI API anahtarı ayarlanmamış."
|
231 |
+
|
232 |
+
try:
|
233 |
+
# Geçici olarak API anahtarını ayarla
|
234 |
+
openai.api_key = current_api_key
|
235 |
+
|
236 |
+
response = openai.chat.completions.create(
|
237 |
+
model=model,
|
238 |
+
messages=[{"role": "user", "content": prompt}],
|
239 |
+
temperature=0.7,
|
240 |
+
max_tokens=2000
|
241 |
+
)
|
242 |
+
return response.choices[0].message.content
|
243 |
+
except Exception as e:
|
244 |
+
return f"OpenAI API hatası: {str(e)}"
|
245 |
+
|
246 |
+
def generate_with_gemini(self, prompt: str, model: str = "gemini-1.5-pro", api_key: Optional[str] = None) -> str:
|
247 |
+
"""
|
248 |
+
Google Gemini API kullanarak yanıt oluşturur.
|
249 |
+
|
250 |
+
Args:
|
251 |
+
prompt (str): Gönderilecek prompt
|
252 |
+
model (str): Kullanılacak model
|
253 |
+
api_key (str, optional): Doğrudan kullanılacak API anahtarı
|
254 |
+
|
255 |
+
Returns:
|
256 |
+
str: Oluşturulan yanıt
|
257 |
+
"""
|
258 |
+
# Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan
|
259 |
+
current_api_key = api_key if api_key else self.api_keys["gemini"]
|
260 |
+
|
261 |
+
if not current_api_key:
|
262 |
+
return "Gemini API anahtarı ayarlanmamış."
|
263 |
+
|
264 |
+
try:
|
265 |
+
# Geçici olarak API anahtarını ayarla
|
266 |
+
genai.configure(api_key=current_api_key)
|
267 |
+
|
268 |
+
model_obj = genai.GenerativeModel(model)
|
269 |
+
response = model_obj.generate_content(prompt)
|
270 |
+
return response.text
|
271 |
+
except Exception as e:
|
272 |
+
return f"Gemini API hatası: {str(e)}"
|
273 |
+
|
274 |
+
def generate_with_openrouter(self, prompt: str, model: str = "openai/gpt-4-turbo", api_key: Optional[str] = None) -> str:
|
275 |
+
"""
|
276 |
+
OpenRouter API kullanarak yanıt oluşturur.
|
277 |
+
|
278 |
+
Args:
|
279 |
+
prompt (str): Gönderilecek prompt
|
280 |
+
model (str): Kullanılacak model
|
281 |
+
api_key (str, optional): Doğrudan kullanılacak API anahtarı
|
282 |
+
|
283 |
+
Returns:
|
284 |
+
str: Oluşturulan yanıt
|
285 |
+
"""
|
286 |
+
# Doğrudan API anahtarı verilmişse onu kullan, yoksa saklanan anahtarı kullan
|
287 |
+
current_api_key = api_key if api_key else self.api_keys["openrouter"]
|
288 |
+
|
289 |
+
if not current_api_key:
|
290 |
+
return "OpenRouter API anahtarı ayarlanmamış."
|
291 |
+
|
292 |
+
try:
|
293 |
+
headers = {
|
294 |
+
"Content-Type": "application/json",
|
295 |
+
"Authorization": f"Bearer {current_api_key}"
|
296 |
+
}
|
297 |
+
|
298 |
+
data = {
|
299 |
+
"model": model,
|
300 |
+
"messages": [{"role": "user", "content": prompt}],
|
301 |
+
"temperature": 0.7,
|
302 |
+
"max_tokens": 2000
|
303 |
+
}
|
304 |
+
|
305 |
+
response = requests.post(
|
306 |
+
"https://openrouter.ai/api/v1/chat/completions",
|
307 |
+
headers=headers,
|
308 |
+
json=data
|
309 |
+
)
|
310 |
+
|
311 |
+
if response.status_code == 200:
|
312 |
+
return response.json()["choices"][0]["message"]["content"]
|
313 |
+
else:
|
314 |
+
return f"OpenRouter API hatası: {response.status_code} - {response.text}"
|
315 |
+
except Exception as e:
|
316 |
+
return f"OpenRouter API hatası: {str(e)}"
|
317 |
+
|
318 |
+
def generate_code_templates(self, response: str) -> Dict[str, Any]:
|
319 |
+
"""
|
320 |
+
AI yanıtından kod şablonları, dizin yapısı ve uygulama adımlarını çıkarır.
|
321 |
+
|
322 |
+
Args:
|
323 |
+
response (str): AI yanıtı
|
324 |
+
|
325 |
+
Returns:
|
326 |
+
Dict[str, Any]: Kod şablonları, dizin yapısı ve uygulama adımları
|
327 |
+
"""
|
328 |
+
result = {
|
329 |
+
"directory_structure": [],
|
330 |
+
"code_templates": [],
|
331 |
+
"implementation_steps": []
|
332 |
+
}
|
333 |
+
|
334 |
+
# Dizin yapısını çıkar
|
335 |
+
dir_structure_pattern = r"```(?:bash|shell|plaintext)?\s*((?:├──|└──|│\s+|(?:\w+/)+\w+|\w+\.\w+|[\w\-\.\/]+\s*)+)\s*```"
|
336 |
+
dir_matches = re.findall(dir_structure_pattern, response, re.DOTALL)
|
337 |
+
|
338 |
+
if dir_matches:
|
339 |
+
for match in dir_matches:
|
340 |
+
if any(x in match for x in ['├──', '└──', '│', '/']):
|
341 |
+
result["directory_structure"].append(match.strip())
|
342 |
+
|
343 |
+
# Kod şablonlarını çıkar
|
344 |
+
code_pattern = r"```(\w+)?\s*([\s\S]*?)```"
|
345 |
+
code_matches = re.findall(code_pattern, response, re.DOTALL)
|
346 |
+
|
347 |
+
for lang, code in code_matches:
|
348 |
+
if lang and lang.lower() not in ['bash', 'shell', 'plaintext', '']:
|
349 |
+
result["code_templates"].append({
|
350 |
+
"language": lang.strip() if lang else "unknown",
|
351 |
+
"code": code.strip()
|
352 |
+
})
|
353 |
+
|
354 |
+
# Uygulama adımlarını çıkar
|
355 |
+
steps_pattern = r"(?:##|###)\s*(?:Adım|Step|İmplementasyon|Uygulama).*?(?=(?:##|###)|$)"
|
356 |
+
steps_matches = re.findall(steps_pattern, response, re.DOTALL | re.IGNORECASE)
|
357 |
+
|
358 |
+
if steps_matches:
|
359 |
+
result["implementation_steps"] = [step.strip() for step in steps_matches]
|
360 |
+
else:
|
361 |
+
# Numaralı adımları ara
|
362 |
+
numbered_steps = re.findall(r"\d+\.\s+[^\n]+(?:\n(?!\d+\.).*?)*", response, re.DOTALL)
|
363 |
+
if numbered_steps:
|
364 |
+
result["implementation_steps"] = [step.strip() for step in numbered_steps]
|
365 |
+
|
366 |
+
return result
|
367 |
+
|
368 |
+
def generate_response_with_code_templates(self, provider: str, prompt: str, model: Optional[str] = None, api_key: Optional[str] = None) -> Dict[str, Any]:
|
369 |
+
"""
|
370 |
+
Belirli bir sağlayıcı ve model kullanarak yanıt ve kod şablonları oluşturur.
|
371 |
+
|
372 |
+
Args:
|
373 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
374 |
+
prompt (str): Gönderilecek prompt
|
375 |
+
model (str, optional): Kullanılacak model
|
376 |
+
api_key (str, optional): Doğrudan kullanılacak API anahtarı
|
377 |
+
|
378 |
+
Returns:
|
379 |
+
Dict[str, Any]: Yanıt ve kod şablonları
|
380 |
+
"""
|
381 |
+
# Promptu geliştir - kod şablonları, dizin yapısı ve uygulama adımları isteyelim
|
382 |
+
enhanced_prompt = f"""
|
383 |
+
{prompt}
|
384 |
+
|
385 |
+
Lütfen yanıtında aşağıdakileri mutlaka içer:
|
386 |
+
|
387 |
+
1. Detaylı bir dizin yapısı (klasör ve dosya hiyerarşisi)
|
388 |
+
2. Önemli dosyaların kod şablonları (HTML, CSS, JavaScript, Python vb.)
|
389 |
+
3. Adım adım uygulama talimatları
|
390 |
+
|
391 |
+
Dizin yapısını ```bash veya ```plaintext içinde göster.
|
392 |
+
Kod şablonlarını ```html, ```css, ```javascript, ```python gibi uygun dil belirteçleriyle göster.
|
393 |
+
Uygulama adımlarını numaralandırılmış liste olarak veya ## Adım başlıkları altında göster.
|
394 |
+
"""
|
395 |
+
|
396 |
+
# Yanıt oluştur
|
397 |
+
response = self.generate_response(provider, enhanced_prompt, model, api_key)
|
398 |
+
|
399 |
+
# Yanıttan kod şablonlarını çıkar
|
400 |
+
templates = self.generate_code_templates(response)
|
401 |
+
|
402 |
+
return {
|
403 |
+
"response": response,
|
404 |
+
"templates": templates
|
405 |
+
}
|
406 |
+
|
407 |
+
def generate_response(self, provider: str, prompt: str, model: Optional[str] = None, api_key: Optional[str] = None) -> str:
|
408 |
+
"""
|
409 |
+
Belirli bir sağlayıcı ve model kullanarak yanıt oluşturur.
|
410 |
+
|
411 |
+
Args:
|
412 |
+
provider (str): API sağlayıcısı ('openai', 'gemini', 'openrouter')
|
413 |
+
prompt (str): Gönderilecek prompt
|
414 |
+
model (str, optional): Kullanılacak model
|
415 |
+
api_key (str, optional): Doğrudan kullanılacak API anahtarı
|
416 |
+
|
417 |
+
Returns:
|
418 |
+
str: Oluşturulan yanıt
|
419 |
+
"""
|
420 |
+
if provider == "openai":
|
421 |
+
if model is None:
|
422 |
+
model = "gpt-3.5-turbo"
|
423 |
+
return self.generate_with_openai(prompt, model, api_key)
|
424 |
+
elif provider == "gemini":
|
425 |
+
if model is None:
|
426 |
+
model = "gemini-1.5-pro"
|
427 |
+
return self.generate_with_gemini(prompt, model, api_key)
|
428 |
+
elif provider == "openrouter":
|
429 |
+
if model is None:
|
430 |
+
model = "openai/gpt-4-turbo"
|
431 |
+
return self.generate_with_openrouter(prompt, model, api_key)
|
432 |
+
else:
|
433 |
+
return "Geçersiz sağlayıcı. Lütfen 'openai', 'gemini' veya 'openrouter' seçin."
|
434 |
+
|
435 |
+
|
436 |
+
# Chatbot ve AI model arayüzü örneklerini oluştur
|
437 |
+
chatbot = PromptEngineerChatbot()
|
438 |
+
ai_interface = AIModelInterface()
|
439 |
+
|
440 |
+
# Test fonksiyonu
|
441 |
+
def test_chatbot():
|
442 |
+
"""
|
443 |
+
Chatbot'u test eder.
|
444 |
+
"""
|
445 |
+
test_input = "Bir e-ticaret web sitesi yapmak istiyorum. Ürünleri listeleyebilmeli, sepete ekleyebilmeli ve ödeme alabilmeliyim."
|
446 |
+
prompt, category, params = chatbot.process_input(test_input, use_ai_generation=True)
|
447 |
+
|
448 |
+
print(f"Kategori: {category}")
|
449 |
+
print(f"Parametreler: {json.dumps(params, indent=2, ensure_ascii=False)}")
|
450 |
+
print("\nOluşturulan Prompt:")
|
451 |
+
print(prompt)
|
452 |
+
|
453 |
+
# API yanıtı test (API anahtarı varsa)
|
454 |
+
if ai_interface.api_keys["openai"]:
|
455 |
+
print("\nOpenAI Yanıtı:")
|
456 |
+
response = ai_interface.generate_response("openai", prompt)
|
457 |
+
print(response)
|
458 |
+
|
459 |
+
if __name__ == "__main__":
|
460 |
+
test_chatbot()
|
model_cache.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"openai": {"models": [], "last_updated": 0, "update_interval": 3600}, "gemini": {"models": ["gemini-2.5-pro-preview-03-25", "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-1.5-flash", "gemini-1.5-flash-8b", "gemini-1.5-pro", "gemini-embedding-exp", "imagen-3.0-generate-002", "veo-2.0-generate-001", "gemini-2.0-flash-live-001", "gemini-1.0-pro", "gemini-1.0-pro-vision", "gemini-1.0-pro-latest", "gemini-1.0-pro-vision-latest", "gemini-1.5-flash-002", "gemini-1.5-pro-latest", "gemini-1.5-flash-001", "gemini-2.0-flash-thinking-exp-1219", "gemini-1.5-flash-latest", "gemini-2.0-pro-exp-02-05", "gemini-2.0-flash-001", "gemini-2.0-flash-thinking-exp-01-21", "gemini-1.5-pro-001", "gemini-pro-vision", "gemini-2.0-flash-exp-image-generation", "gemini-1.5-flash-8b-001", "gemini-2.0-flash-lite-001", "gemini-exp-1206", "gemini-2.5-pro-exp-03-25", "gemini-2.0-flash-exp", "gemini-1.5-pro-002", "gemini-2.0-flash-lite-preview-02-05", "gemini-embedding-exp-03-07", "gemini-2.0-flash-lite-preview", "gemini-2.0-flash-thinking-exp", "gemini-1.5-flash-8b-latest", "gemini-1.5-flash-001-tuning", "gemini-2.0-pro-exp", "gemini-1.5-flash-8b-exp-0924", "gemini-1.5-flash-8b-exp-0827"], "last_updated": 1744585883.373882, "update_interval": 3600}, "openrouter": {"models": ["openai/gpt-4o", "openai/gpt-4o-mini", "openai/gpt-4-turbo", "openai/gpt-4", "openai/gpt-4-32k", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-16k", "anthropic/claude-3.7-sonnet", "anthropic/claude-3.5-sonnet", "anthropic/claude-3-opus", "anthropic/claude-3-sonnet", "anthropic/claude-3-haiku", "anthropic/claude-2.1", "anthropic/claude-2", "anthropic/claude-instant-1.2", "google/gemini-2.5-pro-preview-03-25", "google/gemini-2.0-flash", "google/gemini-2.0-flash-lite", "google/gemini-1.5-flash", "google/gemini-1.5-flash-8b", "google/gemini-1.5-pro", "google/gemini-1.0-pro", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-405b-instruct", "meta-llama/llama-3.1-70b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-2-70b-chat", "meta-llama/llama-2-13b-chat", "meta-llama/llama-2-7b-chat", "mistral/mistral-large-2", "mistral/mistral-large", "mistral/mistral-medium", "mistral/mistral-small", "mistral/mistral-7b-instruct", "x-ai/grok-3-beta", "x-ai/grok-3-mini-beta", "x-ai/grok-2", "x-ai/grok-1.5-pro", "x-ai/grok-1", "cohere/command-r-plus", "cohere/command-r", "perplexity/sonar-small-online", "perplexity/sonar-medium-online", "perplexity/sonar-medium-chat", "nvidia/llama-3.1-nemotron-ultra-253b-v1", "nvidia/llama-3.3-nemotron-super-49b-v1", "nvidia/llama-3.1-nemotron-nano-8b-v1", "moonshotai/kimi-vl-a3b-thinking", "openrouter/optimus-alpha", "tokyotech-llm/llama-3.1-swallow-8b-instruct-v0.3", "meta-llama/llama-4-maverick", "qwen/qwen-2-72b-instruct", "qwen/qwen-2-7b-instruct", "deepseek/deepseek-coder-v2", "deepseek/deepseek-v2", "aleph-alpha/luminous-supreme", "aleph-alpha/luminous-base", "databricks/dbrx-instruct", "nous/nous-hermes-2-mixtral-8x7b-dpo", "nous/nous-hermes-2-yi-34b", "jais/jais-30b-chat", "jais/jais-13b-chat", "snowflake/arctic", "adept/fuyu-8b", "anyscale/mistral-7b-instruct", "stability/stable-code-3b", "fireworks/firefunction-v2", "fireworks/firellava-13b", "voyage/voyage-2", "voyage/voyage-lite-2", "groq/llama-3-70b-8192", "groq/mixtral-8x7b-32768", "reka/reka-core", "reka/reka-flash", "quasar/quasar-alpha", "zypher/zypher-7b-beta", "inflection/inflection-2", "cloudflare/workers-ai-mistral-7b", "huggingface/zephyr-7b-beta", "replicate/llama-2-70b-chat", "together/yi-34b-chat", "together/llama-2-7b-chat", "phind/phind-codellama-34b", "teknium/openhermes-2.5-mistral-7b", "gryphe/mythomist-7b", "neversleep/llama-2-13b-chat-hf", "mancer/weaver", "openchat/openchat-7b", "cognitivecomputations/dolphin-2.5-mixtral-8x7b", "nousresearch/nous-hermes-llama2-13b", "lizpreciatior/lzlv-70b-fp16-hf", "pygmalionai/mythalion-13b", "undi95/remm-slerp-l2-13b", "jondurbin/airoboros-l2-70b-gpt4-1.4.1", "migtissera/synthia-70b", "alpindale/goliath-120b", "koboldai/psyfighter-13b-2", "ehartford/samantha-1.2-mistral-7b", "austism/chronos-hermes-13b", "openaccess-ai-collective/manticore-13b-chat", "lmsys/vicuna-13b-v1.5", "databricks/dolly-v2-12b", "stabilityai/stablelm-tuned-alpha-7b", "togethercomputer/redpajama-incite-7b-chat", "rwkv/rwkv-4-raven-14b", "cerebras/cerebras-gpt-13b", "mosaicml/mpt-7b-chat", "bigscience/bloom-7b1", "eleutherai/gpt-neox-20b", "tiiuae/falcon-7b-instruct", "writer/palmyra-e", "alibaba/qwen-7b-chat", "01-ai/yi-6b-chat", "baichuan/baichuan-13b-chat", "internlm/internlm-7b", "chatglm/chatglm2-6b", "thudm/chatglm-6b", "zhipu/chatglm3-6b", "moonshot/moonshot-v1-8k", "deepinfra/mistral-7b", "deepseek/deepseek-llm-7b-chat", "upstage/solar-10.7b-instruct", "snorkelai/snorkel-mistral-7b", "recursal/rwkv-5-3b-ai-town", "allenai/tulu-2-dpo-7b", "adept/persimmon-8b-base", "fireworks/firefunction-v1", "openai/gpt-4.5-preview", "mistralai/mistral-small-3.1-24b-instruct", "cognitivecomputations/dolphin-mixtral-8x7b", "mistralai/mistral-7b-instruct-v0.3", "neversleep/llama-3-lumimaid-8b:extended", "mistralai/pixtral-large-2411", "openai/gpt-3.5-turbo-instruct", "anthropic/claude-3-sonnet:beta", "google/gemini-pro", "openai/chatgpt-4o-latest", "anthropic/claude-2.0:beta", "undi95/toppy-m-7b", "mistralai/ministral-8b", "raifle/sorcererlm-8x22b", "google/gemini-flash-1.5-8b-exp", "moonshotai/moonlight-16b-a3b-instruct:free", "mistralai/mistral-nemo:free", "aion-labs/aion-1.0-mini", "cohere/command-r-plus-04-2024", "deepseek/deepseek-r1-distill-llama-70b", "eva-unit-01/eva-llama-3.33-70b", "deepseek/deepseek-chat-v3-0324:free", "openai/o1-mini-2024-09-12", "01-ai/yi-large", "meta-llama/llama-3.2-11b-vision-instruct:free", "sao10k/l3.1-euryale-70b", "deepseek/deepseek-r1-distill-qwen-14b", "deepseek/deepseek-r1:free", "google/gemini-flash-1.5", "openai/gpt-4o-2024-05-13", "qwen/qwq-32b-preview", "deepseek/deepseek-chat", "google/gemma-3-12b-it", "thedrummer/skyfall-36b-v2", "perplexity/sonar-pro", "perplexity/llama-3.1-sonar-large-128k-online", "mistralai/mistral-tiny", "openai/gpt-4o-2024-11-20", "sao10k/l3-lunaris-8b", "deepseek/deepseek-r1-distill-qwen-32b:free", "open-r1/olympiccoder-7b:free", "google/palm-2-chat-bison-32k", "qwen/qwq-32b", "google/gemini-2.0-flash-001", "google/gemma-2-9b-it", "x-ai/grok-beta", "steelskull/l3.3-electra-r1-70b", "nousresearch/deephermes-3-llama-3-8b-preview:free", "anthropic/claude-3.5-sonnet-20240620:beta", "eva-unit-01/eva-qwen-2.5-32b", "deepseek/deepseek-chat:free", "moonshotai/kimi-vl-a3b-thinking:free", "gryphe/mythomax-l2-13b", "arliai/qwq-32b-arliai-rpr-v1:free", "anthropic/claude-3.5-sonnet-20240620", "qwen/qwen-2.5-7b-instruct", "google/gemini-2.0-flash-exp:free", "mistralai/codestral-2501", "qwen/qwen2.5-32b-instruct", "deepseek/deepseek-v3-base:free", "meta-llama/llama-3.1-8b-instruct:free", "meta-llama/llama-guard-2-8b", "cohere/command-r-plus-08-2024", "mistralai/pixtral-12b", "google/gemma-3-27b-it:free", "openai/gpt-4-0314", "meta-llama/llama-3.2-11b-vision-instruct", "deepseek/deepseek-r1-distill-qwen-14b:free", "eva-unit-01/eva-qwen-2.5-72b", "google/gemma-3-4b-it:free", "liquid/lfm-7b", "qwen/qwq-32b:free", "mistralai/mistral-small-24b-instruct-2501", "mistralai/mistral-large-2411", "meta-llama/llama-3.1-405b", "sao10k/fimbulvetr-11b-v2", "nvidia/llama-3.3-nemotron-super-49b-v1:free", "anthropic/claude-2.0", "bytedance-research/ui-tars-72b:free", "mistralai/mistral-7b-instruct-v0.2", "nousresearch/hermes-3-llama-3.1-405b", "qwen/qwen-vl-plus", "google/gemini-2.0-flash-lite-001", "meta-llama/llama-3.3-70b-instruct", "qwen/qwen2.5-vl-72b-instruct:free", "anthropic/claude-3.5-haiku:beta", "cognitivecomputations/dolphin3.0-r1-mistral-24b:free", "neversleep/llama-3.1-lumimaid-8b", "meta-llama/llama-3.3-70b-instruct:free", "google/gemini-2.0-flash-thinking-exp:free", "scb10x/llama3.1-typhoon2-8b-instruct", "google/gemini-flash-1.5-8b", "microsoft/phi-3-medium-128k-instruct", "aetherwiing/mn-starcannon-12b", "openai/gpt-4o-search-preview", "openai/gpt-4-turbo-preview", "x-ai/grok-2-1212", "mistralai/mistral-small-24b-instruct-2501:free", "sophosympatheia/midnight-rose-70b", "qwen/qwq-32b-preview:free", "google/gemini-2.5-pro-exp-03-25:free", "openai/gpt-3.5-turbo-1106", "x-ai/grok-vision-beta", "google/gemma-2-9b-it:free", "google/palm-2-chat-bison", "mistralai/mixtral-8x22b-instruct", "mistralai/codestral-mamba", "all-hands/openhands-lm-32b-v0.1", "inflection/inflection-3-pi", "openai/gpt-4-1106-preview", "minimax/minimax-01", "mistralai/mixtral-8x7b-instruct", "openai/o3-mini-high", "openai/gpt-4o-mini-search-preview", "liquid/lfm-3b", "deepseek/deepseek-r1", "nvidia/llama-3.1-nemotron-70b-instruct", "openai/o3-mini", "mistralai/mistral-7b-instruct", "sao10k/l3.3-euryale-70b", "perplexity/r1-1776", "microsoft/phi-4-multimodal-instruct", "featherless/qwerky-72b:free", "qwen/qwen-turbo", "openai/gpt-3.5-turbo-0613", "cognitivecomputations/dolphin3.0-mistral-24b:free", "sao10k/l3.1-70b-hanami-x1", "qwen/qwen-max", "aion-labs/aion-1.0", "cohere/command-a", "google/gemini-pro-1.5", "deepseek/deepseek-r1-zero:free", "microsoft/phi-3.5-mini-128k-instruct", "liquid/lfm-40b", "ai21/jamba-1-5-mini", "huggingfaceh4/zephyr-7b-beta:free", "anthropic/claude-3.7-sonnet:beta", "qwen/qwen-2.5-7b-instruct:free", "anthropic/claude-3-opus:beta", "mistralai/mistral-saba", "mistralai/mistral-7b-instruct-v0.1", "tokyotech-llm/llama-3.1-swallow-70b-instruct-v0.3", "allenai/molmo-7b-d:free", "amazon/nova-lite-v1", "thedrummer/unslopnemo-12b", "deepseek/deepseek-r1-distill-llama-70b:free", "mistralai/mistral-large", "qwen/qwen-2.5-72b-instruct:free", "microsoft/phi-4", "perplexity/llama-3.1-sonar-small-128k-online", "amazon/nova-pro-v1", "mistralai/mistral-nemo", "anthropic/claude-3.5-sonnet:beta", "aion-labs/aion-rp-llama-3.1-8b", "neversleep/llama-3-lumimaid-70b", "microsoft/wizardlm-2-7b", "google/gemma-2-27b-it", "sao10k/l3-euryale-70b", "cohere/command", "alpindale/magnum-72b", "cohere/command-r7b-12-2024", "qwen/qwen-2.5-72b-instruct", "ai21/jamba-instruct", "openai/gpt-3.5-turbo-0125", "deepseek/deepseek-r1-distill-qwen-32b", "openai/o1-preview", "ai21/jamba-1.6-large", "meta-llama/llama-3.2-3b-instruct:free", "cohere/command-r-03-2024", "openai/gpt-4o-2024-08-06", "meta-llama/llama-guard-3-8b", "nvidia/llama-3.1-nemotron-ultra-253b-v1:free", "thedrummer/anubis-pro-105b-v1", "openai/o1-mini", "anthracite-org/magnum-v4-72b", "anthropic/claude-2:beta", "qwen/qwen-vl-max", "anthropic/claude-3.7-sonnet:thinking", "openrouter/auto", "deepseek/deepseek-chat-v3-0324", "ai21/jamba-1.6-mini", "mistralai/ministral-3b", "anthropic/claude-3.5-haiku-20241022:beta", "qwen/qwen-plus", "qwen/qwen-2.5-coder-32b-instruct", "google/learnlm-1.5-pro-experimental:free", "google/gemma-3-27b-it", "ai21/jamba-1-5-large", "openai/o1-pro", "xwin-lm/xwin-lm-70b", "anthropic/claude-3.5-haiku-20241022", "perplexity/sonar", "open-r1/olympiccoder-32b:free", "anthropic/claude-3.5-haiku", "scb10x/llama3.1-typhoon2-70b-instruct", "deepseek/deepseek-r1-distill-llama-8b", "perplexity/sonar-deep-research", "openai/gpt-4-32k-0314", "meta-llama/llama-3.2-1b-instruct", "nousresearch/hermes-2-pro-llama-3-8b", "amazon/nova-micro-v1", "nvidia/llama-3.1-nemotron-70b-instruct:free", "openai/o1-preview-2024-09-12", "meta-llama/llama-3.2-90b-vision-instruct", "neversleep/noromaid-20b", "mistralai/mistral-large-2407", "deepseek/deepseek-r1-distill-qwen-1.5b", "nothingiisreal/mn-celeste-12b", "google/gemma-3-12b-it:free", "sophosympatheia/rogue-rose-103b-v0.2:free", "qwen/qwen-2.5-vl-7b-instruct:free", "perplexity/sonar-reasoning", "meta-llama/llama-3.2-3b-instruct", "google/gemini-2.0-flash-thinking-exp-1219:free", "openai/o1", "openai/gpt-4o-mini-2024-07-18", "qwen/qwen-2.5-vl-7b-instruct", "rekaai/reka-flash-3:free", "neversleep/llama-3-lumimaid-8b", "mistral/ministral-8b", "mistralai/mistral-small", "google/palm-2-codechat-bison", "qwen/qwen2.5-vl-3b-instruct:free", "meta-llama/llama-4-maverick:free", "anthropic/claude-3-haiku:beta", "openai/gpt-4o:extended", "infermatic/mn-inferor-12b", "mistralai/mistral-medium", "qwen/qwen2.5-vl-32b-instruct", "qwen/qwen2.5-vl-32b-instruct:free", "cohere/command-r-08-2024", "microsoft/wizardlm-2-8x22b", "anthracite-org/magnum-v2-72b", "meta-llama/llama-4-scout", "meta-llama/llama-4-scout:free", "jondurbin/airoboros-l2-70b", "x-ai/grok-2-vision-1212", "google/gemma-3-1b-it:free", "anthropic/claude-2.1:beta", "thedrummer/rocinante-12b", "nvidia/llama-3.1-nemotron-nano-8b-v1:free", "latitudegames/wayfarer-large-70b-llama-3.3", "microsoft/phi-3-mini-128k-instruct", "qwen/qwen-2.5-vl-72b-instruct", "qwen/qwen2.5-vl-72b-instruct", "mistralai/mistral-7b-instruct:free", "inflection/inflection-3-productivity", "google/gemma-3-4b-it", "google/palm-2-codechat-bison-32k", "perplexity/sonar-reasoning-pro", "mistralai/mistral-small-3.1-24b-instruct:free", "meta-llama/llama-3.2-1b-instruct:free", "nousresearch/nous-hermes-2-mixtral-8x7b-dpo", "nousresearch/hermes-3-llama-3.1-70b", "agentica-org/deepcoder-14b-preview:free", "cognitivecomputations/dolphin-mixtral-8x22b", "qwen/qwen-2.5-coder-32b-instruct:free", "neversleep/llama-3.1-lumimaid-70b", "google/gemini-pro-vision"], "last_updated": 1744585883.7369876, "update_interval": 3600}}
|
prompt_templates.py
ADDED
@@ -0,0 +1,1976 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Prompt şablonları ve prompt mühendisliği bilgi tabanı.
|
3 |
+
Bu modül, farklı kullanım senaryoları için prompt şablonlarını içerir.
|
4 |
+
"""
|
5 |
+
|
6 |
+
# Web sitesi geliştirme için prompt şablonları
|
7 |
+
WEB_DEVELOPMENT_TEMPLATE = """
|
8 |
+
# Web Sitesi Geliştirme Uzmanı Prompt
|
9 |
+
|
10 |
+
## Proje Tanımı
|
11 |
+
{project_description}
|
12 |
+
|
13 |
+
## Teknik Gereksinimler
|
14 |
+
- **Frontend Framework/Kütüphane**: {frontend_tech}
|
15 |
+
- **Backend Teknolojisi** (varsa): {backend_tech}
|
16 |
+
- **Veritabanı** (varsa): {database}
|
17 |
+
- **Hedef Cihazlar**: {target_devices}
|
18 |
+
- **Tasarım Tercihleri**: {design_preferences}
|
19 |
+
|
20 |
+
## İstenen Özellikler
|
21 |
+
{features}
|
22 |
+
|
23 |
+
## Adım Adım Geliştirme Planı
|
24 |
+
1. Proje yapısını oluştur
|
25 |
+
2. Temel bileşenleri ve sayfaları tasarla
|
26 |
+
3. Stil ve görsel tasarımı uygula
|
27 |
+
4. Backend entegrasyonunu gerçekleştir (gerekirse)
|
28 |
+
5. Veritabanı bağlantılarını kur (gerekirse)
|
29 |
+
6. Kullanıcı etkileşimlerini ve işlevselliği ekle
|
30 |
+
7. Responsive tasarımı optimize et
|
31 |
+
8. Test et ve hataları düzelt
|
32 |
+
9. Performans optimizasyonu yap
|
33 |
+
10. Deployment için hazırla
|
34 |
+
|
35 |
+
## Çıktı Formatı
|
36 |
+
- Tam kaynak kodu (HTML, CSS, JavaScript/Framework dosyaları)
|
37 |
+
- Dosya yapısı açıklaması
|
38 |
+
- Kurulum ve çalıştırma talimatları
|
39 |
+
- Kullanılan kaynaklar ve kütüphaneler listesi
|
40 |
+
|
41 |
+
## Ek Notlar
|
42 |
+
{additional_notes}
|
43 |
+
|
44 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
45 |
+
"""
|
46 |
+
|
47 |
+
# Mobil uygulama geliştirme için prompt şablonu
|
48 |
+
MOBILE_APP_TEMPLATE = """
|
49 |
+
# Mobil Uygulama Geliştirme Uzmanı Prompt
|
50 |
+
|
51 |
+
## Proje Tanımı
|
52 |
+
{project_description}
|
53 |
+
|
54 |
+
## Teknik Gereksinimler
|
55 |
+
- **Uygulama Türü**: {app_type} (Native/Hybrid/Cross-platform)
|
56 |
+
- **Platformlar**: {platforms} (iOS/Android/Her ikisi)
|
57 |
+
- **Geliştirme Framework'ü**: {framework}
|
58 |
+
- **Backend Gereksinimleri**: {backend_requirements}
|
59 |
+
- **Hedef Kullanıcı**: {target_audience}
|
60 |
+
|
61 |
+
## İstenen Özellikler
|
62 |
+
{features}
|
63 |
+
|
64 |
+
## Kullanıcı Arayüzü Gereksinimleri
|
65 |
+
{ui_requirements}
|
66 |
+
|
67 |
+
## Adım Adım Geliştirme Planı
|
68 |
+
1. Proje yapısını ve mimarisini oluştur
|
69 |
+
2. UI/UX tasarımını uygula
|
70 |
+
3. Temel işlevselliği geliştir
|
71 |
+
4. Backend entegrasyonunu gerçekleştir
|
72 |
+
5. Veri depolama ve yönetimini uygula
|
73 |
+
6. Kullanıcı kimlik doğrulama ve yetkilendirmeyi ekle (gerekirse)
|
74 |
+
7. Ek özellikleri entegre et
|
75 |
+
8. Test et ve hataları düzelt
|
76 |
+
9. Performans optimizasyonu yap
|
77 |
+
10. Mağaza yayını için hazırla
|
78 |
+
|
79 |
+
## Çıktı Formatı
|
80 |
+
- Tam kaynak kodu
|
81 |
+
- Dosya yapısı açıklaması
|
82 |
+
- Kurulum ve çalıştırma talimatları
|
83 |
+
- Kullanılan API'ler ve kütüphaneler listesi
|
84 |
+
- Test senaryoları
|
85 |
+
|
86 |
+
## Ek Notlar
|
87 |
+
{additional_notes}
|
88 |
+
|
89 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
90 |
+
"""
|
91 |
+
|
92 |
+
# Veri analizi için prompt şablonu
|
93 |
+
DATA_ANALYSIS_TEMPLATE = """
|
94 |
+
# Veri Analizi Uzmanı Prompt
|
95 |
+
|
96 |
+
## Proje Tanımı
|
97 |
+
{project_description}
|
98 |
+
|
99 |
+
## Veri Kaynağı Bilgileri
|
100 |
+
- **Veri Formatı**: {data_format}
|
101 |
+
- **Veri Boyutu**: {data_size}
|
102 |
+
- **Veri Kaynağı**: {data_source}
|
103 |
+
- **Zaman Aralığı**: {time_range}
|
104 |
+
|
105 |
+
## Analiz Hedefleri
|
106 |
+
{analysis_goals}
|
107 |
+
|
108 |
+
## İstenen Analizler
|
109 |
+
{required_analyses}
|
110 |
+
|
111 |
+
## Görselleştirme Gereksinimleri
|
112 |
+
{visualization_requirements}
|
113 |
+
|
114 |
+
## Adım Adım Analiz Planı
|
115 |
+
1. Veri yükleme ve ön işleme
|
116 |
+
2. Keşifsel veri analizi (EDA)
|
117 |
+
3. Veri temizleme ve dönüştürme
|
118 |
+
4. İstatistiksel analizler
|
119 |
+
5. İleri analiz teknikleri uygulama (gerekirse)
|
120 |
+
6. Görselleştirmeler oluşturma
|
121 |
+
7. Bulguları yorumlama
|
122 |
+
8. Sonuçları raporlama
|
123 |
+
|
124 |
+
## Çıktı Formatı
|
125 |
+
- Tam analiz kodu (Python/R)
|
126 |
+
- Görselleştirmeler
|
127 |
+
- Bulgular ve yorumlar
|
128 |
+
- Metodoloji açıklaması
|
129 |
+
- Öneriler ve sonraki adımlar
|
130 |
+
|
131 |
+
## Ek Notlar
|
132 |
+
{additional_notes}
|
133 |
+
|
134 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, kod örnekleri ve görselleştirmeler sağla.
|
135 |
+
"""
|
136 |
+
|
137 |
+
# Veri görselleştirme için prompt şablonu
|
138 |
+
DATA_VISUALIZATION_TEMPLATE = """
|
139 |
+
# Veri Görselleştirme Uzmanı Prompt
|
140 |
+
|
141 |
+
## Proje Tanımı
|
142 |
+
{project_description}
|
143 |
+
|
144 |
+
## Veri Kaynağı Bilgileri
|
145 |
+
- **Veri Formatı**: {data_format}
|
146 |
+
- **Veri Boyutu**: {data_size}
|
147 |
+
- **Veri Kaynağı**: {data_source}
|
148 |
+
- **Veri Türü**: {data_type}
|
149 |
+
|
150 |
+
## Görselleştirme Hedefleri
|
151 |
+
{visualization_goals}
|
152 |
+
|
153 |
+
## İstenen Görselleştirmeler
|
154 |
+
{required_visualizations}
|
155 |
+
|
156 |
+
## Tasarım Gereksinimleri
|
157 |
+
{design_requirements}
|
158 |
+
|
159 |
+
## Adım Adım Görselleştirme Planı
|
160 |
+
1. Veri yükleme ve ön işleme
|
161 |
+
2. Görselleştirme türlerini belirleme
|
162 |
+
3. Temel görselleştirmeleri oluşturma
|
163 |
+
4. İnteraktif özellikler ekleme (gerekirse)
|
164 |
+
5. Görsel tasarımı iyileştirme
|
165 |
+
6. Dashboard oluşturma (gerekirse)
|
166 |
+
7. Görselleştirmeleri optimize etme
|
167 |
+
8. Sonuçları paylaşılabilir formatta hazırlama
|
168 |
+
|
169 |
+
## Çıktı Formatı
|
170 |
+
- Tam görselleştirme kodu (Python/R/JavaScript)
|
171 |
+
- Görselleştirme dosyaları (PNG, SVG, HTML, vb.)
|
172 |
+
- Kullanılan kütüphaneler ve araçlar
|
173 |
+
- Metodoloji açıklaması
|
174 |
+
- İnteraktif dashboard (gerekirse)
|
175 |
+
|
176 |
+
## Ek Notlar
|
177 |
+
{additional_notes}
|
178 |
+
|
179 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
180 |
+
"""
|
181 |
+
|
182 |
+
# Makine öğrenmesi modeli geliştirme için prompt şablonu
|
183 |
+
ML_MODEL_TEMPLATE = """
|
184 |
+
# Makine Öğrenmesi Uzmanı Prompt
|
185 |
+
|
186 |
+
## Proje Tanımı
|
187 |
+
{project_description}
|
188 |
+
|
189 |
+
## Veri ve Problem Bilgileri
|
190 |
+
- **Problem Türü**: {problem_type} (Sınıflandırma/Regresyon/Kümeleme/vb.)
|
191 |
+
- **Veri Seti Özellikleri**: {dataset_features}
|
192 |
+
- **Hedef Değişken**: {target_variable}
|
193 |
+
- **Değerlendirme Metrikleri**: {evaluation_metrics}
|
194 |
+
|
195 |
+
## Model Gereksinimleri
|
196 |
+
{model_requirements}
|
197 |
+
|
198 |
+
## Adım Adım Model Geliştirme Planı
|
199 |
+
1. Veri yükleme ve keşifsel analiz
|
200 |
+
2. Veri ön işleme ve özellik mühendisliği
|
201 |
+
3. Veri setini eğitim/test olarak bölme
|
202 |
+
4. Temel model oluşturma ve eğitme
|
203 |
+
5. Model değerlendirme ve hata analizi
|
204 |
+
6. Hiperparametre optimizasyonu
|
205 |
+
7. Model iyileştirme ve yeniden eğitim
|
206 |
+
8. Final model değerlendirmesi
|
207 |
+
9. Model yorumlama ve açıklanabilirlik
|
208 |
+
10. Deployment için hazırlama (gerekirse)
|
209 |
+
|
210 |
+
## Çıktı Formatı
|
211 |
+
- Tam model kodu
|
212 |
+
- Model performans metrikleri
|
213 |
+
- Özellik önem analizi
|
214 |
+
- Model yorumları ve içgörüler
|
215 |
+
- Deployment talimatları (gerekirse)
|
216 |
+
|
217 |
+
## Ek Notlar
|
218 |
+
{additional_notes}
|
219 |
+
|
220 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, kod örnekleri ve görselleştirmeler sağla.
|
221 |
+
"""
|
222 |
+
|
223 |
+
# Derin öğrenme modeli geliştirme için prompt şablonu
|
224 |
+
DEEP_LEARNING_TEMPLATE = """
|
225 |
+
# Derin Öğrenme Uzmanı Prompt
|
226 |
+
|
227 |
+
## Proje Tanımı
|
228 |
+
{project_description}
|
229 |
+
|
230 |
+
## Veri ve Problem Bilgileri
|
231 |
+
- **Problem Türü**: {problem_type} (Görüntü Sınıflandırma/Nesne Tespiti/NLP/vb.)
|
232 |
+
- **Veri Seti Özellikleri**: {dataset_features}
|
233 |
+
- **Veri Boyutu**: {data_size}
|
234 |
+
- **Değerlendirme Metrikleri**: {evaluation_metrics}
|
235 |
+
|
236 |
+
## Model Gereksinimleri
|
237 |
+
{model_requirements}
|
238 |
+
|
239 |
+
## Adım Adım Model Geliştirme Planı
|
240 |
+
1. Veri yükleme ve ön işleme
|
241 |
+
2. Veri artırma (augmentation) stratejileri
|
242 |
+
3. Model mimarisini tasarlama
|
243 |
+
4. Model eğitimi için hiperparametreleri ayarlama
|
244 |
+
5. Model eğitimi ve validasyon
|
245 |
+
6. Model değerlendirme ve hata analizi
|
246 |
+
7. Model optimizasyonu ve fine-tuning
|
247 |
+
8. Final model değerlendirmesi
|
248 |
+
9. Model yorumlama ve görselleştirme
|
249 |
+
10. Deployment için model dönüştürme (gerekirse)
|
250 |
+
|
251 |
+
## Çıktı Formatı
|
252 |
+
- Tam model kodu (TensorFlow/PyTorch/vb.)
|
253 |
+
- Model mimarisi şeması
|
254 |
+
- Eğitim ve validasyon grafikleri
|
255 |
+
- Model performans metrikleri
|
256 |
+
- Deployment talimatları (gerekirse)
|
257 |
+
|
258 |
+
## Ek Notlar
|
259 |
+
{additional_notes}
|
260 |
+
|
261 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, kod örnekleri ve görselleştirmeler sağla.
|
262 |
+
"""
|
263 |
+
|
264 |
+
# İçerik oluşturma için prompt şablonu
|
265 |
+
CONTENT_CREATION_TEMPLATE = """
|
266 |
+
# İçerik Oluşturma Uzmanı Prompt
|
267 |
+
|
268 |
+
## İçerik Tanımı
|
269 |
+
{content_description}
|
270 |
+
|
271 |
+
## İçerik Türü
|
272 |
+
- **Format**: {content_format} (Blog yazısı/Sosyal medya/E-posta/vb.)
|
273 |
+
- **Uzunluk**: {content_length}
|
274 |
+
- **Ton**: {tone} (Resmi/Samimi/Bilgilendirici/İkna edici/vb.)
|
275 |
+
- **Hedef Kitle**: {target_audience}
|
276 |
+
|
277 |
+
## İçerik Hedefleri
|
278 |
+
{content_goals}
|
279 |
+
|
280 |
+
## Anahtar Noktalar
|
281 |
+
{key_points}
|
282 |
+
|
283 |
+
## SEO Gereksinimleri (varsa)
|
284 |
+
- **Anahtar Kelimeler**: {keywords}
|
285 |
+
- **Meta Açıklama**: {meta_description}
|
286 |
+
|
287 |
+
## İçerik Yapısı
|
288 |
+
1. Başlık
|
289 |
+
2. Giriş
|
290 |
+
3. Ana bölümler
|
291 |
+
4. Alt başlıklar
|
292 |
+
5. Sonuç
|
293 |
+
6. Çağrı aksiyonu (CTA)
|
294 |
+
|
295 |
+
## Referanslar ve Kaynaklar
|
296 |
+
{references}
|
297 |
+
|
298 |
+
## Ek Notlar
|
299 |
+
{additional_notes}
|
300 |
+
|
301 |
+
Lütfen belirtilen gereksinimlere uygun, özgün ve etkileyici bir içerik oluştur.
|
302 |
+
"""
|
303 |
+
|
304 |
+
# Oyun geliştirme için prompt şablonu
|
305 |
+
GAME_DEVELOPMENT_TEMPLATE = """
|
306 |
+
# Oyun Geliştirme Uzmanı Prompt
|
307 |
+
|
308 |
+
## Proje Tanımı
|
309 |
+
{project_description}
|
310 |
+
|
311 |
+
## Teknik Gereksinimler
|
312 |
+
- **Oyun Türü**: {game_type}
|
313 |
+
- **Platform**: {platform} (PC/Mobil/Konsol/Web)
|
314 |
+
- **Oyun Motoru**: {game_engine}
|
315 |
+
- **Grafik Stili**: {graphic_style}
|
316 |
+
- **Hedef Kitle**: {target_audience}
|
317 |
+
|
318 |
+
## Oyun Mekanikleri
|
319 |
+
{game_mechanics}
|
320 |
+
|
321 |
+
## Karakter ve Dünya Tasarımı
|
322 |
+
{character_world_design}
|
323 |
+
|
324 |
+
## Adım Adım Geliştirme Planı
|
325 |
+
1. Oyun konsepti ve tasarım dokümanı oluşturma
|
326 |
+
2. Temel oyun mekaniklerini prototipleme
|
327 |
+
3. Karakter ve dünya varlıklarını oluşturma
|
328 |
+
4. Temel oynanış döngüsünü geliştirme
|
329 |
+
5. Kullanıcı arayüzü tasarımı ve implementasyonu
|
330 |
+
6. Ses ve müzik entegrasyonu
|
331 |
+
7. Seviye tasarımı ve içerik oluşturma
|
332 |
+
8. Test etme ve hata ayıklama
|
333 |
+
9. Performans optimizasyonu
|
334 |
+
10. Dağıtım için hazırlama
|
335 |
+
|
336 |
+
## Çıktı Formatı
|
337 |
+
- Tam oyun kodu
|
338 |
+
- Varlık dosyaları (grafikler, sesler, vb.)
|
339 |
+
- Kurulum ve çalıştırma talimatları
|
340 |
+
- Oyun tasarım dokümanı
|
341 |
+
- Test senaryoları
|
342 |
+
|
343 |
+
## Ek Notlar
|
344 |
+
{additional_notes}
|
345 |
+
|
346 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
347 |
+
"""
|
348 |
+
|
349 |
+
# Eğitim içeriği oluşturma için prompt şablonu
|
350 |
+
EDUCATION_TEMPLATE = """
|
351 |
+
# Eğitim İçeriği Uzmanı Prompt
|
352 |
+
|
353 |
+
## Proje Tanımı
|
354 |
+
{project_description}
|
355 |
+
|
356 |
+
## Eğitim Bilgileri
|
357 |
+
- **Konu**: {subject}
|
358 |
+
- **Hedef Kitle**: {target_audience}
|
359 |
+
- **Zorluk Seviyesi**: {difficulty_level}
|
360 |
+
- **Format**: {format} (Video/Metin/İnteraktif/vb.)
|
361 |
+
- **Süre/Uzunluk**: {duration_length}
|
362 |
+
|
363 |
+
## Öğrenme Hedefleri
|
364 |
+
{learning_objectives}
|
365 |
+
|
366 |
+
## İçerik Yapısı
|
367 |
+
{content_structure}
|
368 |
+
|
369 |
+
## Adım Adım Geliştirme Planı
|
370 |
+
1. Konu araştırması ve kaynak toplama
|
371 |
+
2. İçerik taslağı oluşturma
|
372 |
+
3. Temel içeriği geliştirme
|
373 |
+
4. Örnekler ve alıştırmalar ekleme
|
374 |
+
5. Görsel ve multimedya öğeleri hazırlama
|
375 |
+
6. Değerlendirme ve ölçme araçları oluşturma
|
376 |
+
7. İçeriği gözden geçirme ve düzenleme
|
377 |
+
8. Final içeriği hazırlama
|
378 |
+
|
379 |
+
## Çıktı Formatı
|
380 |
+
- Tam eğitim içeriği
|
381 |
+
- Görsel ve multimedya dosyaları
|
382 |
+
- Alıştırmalar ve çözümleri
|
383 |
+
- Değerlendirme araçları
|
384 |
+
- Kaynakça
|
385 |
+
|
386 |
+
## Ek Notlar
|
387 |
+
{additional_notes}
|
388 |
+
|
389 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve örnekler sağla.
|
390 |
+
"""
|
391 |
+
|
392 |
+
# Finans analizi için prompt şablonu
|
393 |
+
FINANCE_TEMPLATE = """
|
394 |
+
# Finans Analizi Uzmanı Prompt
|
395 |
+
|
396 |
+
## Proje Tanımı
|
397 |
+
{project_description}
|
398 |
+
|
399 |
+
## Finansal Veri Bilgileri
|
400 |
+
- **Veri Türü**: {data_type} (Hisse Senedi/Finansal Tablolar/Ekonomik Göstergeler/vb.)
|
401 |
+
- **Veri Kaynağı**: {data_source}
|
402 |
+
- **Zaman Aralığı**: {time_range}
|
403 |
+
- **Analiz Kapsamı**: {analysis_scope}
|
404 |
+
|
405 |
+
## Analiz Hedefleri
|
406 |
+
{analysis_objectives}
|
407 |
+
|
408 |
+
## İstenen Analizler
|
409 |
+
{required_analyses}
|
410 |
+
|
411 |
+
## Adım Adım Analiz Planı
|
412 |
+
1. Veri toplama ve hazırlama
|
413 |
+
2. Temel finansal analiz
|
414 |
+
3. Trend ve patern analizi
|
415 |
+
4. Risk değerlendirmesi
|
416 |
+
5. Tahmin modelleri oluşturma (gerekirse)
|
417 |
+
6. Senaryo analizi
|
418 |
+
7. Bulguları yorumlama
|
419 |
+
8. Sonuçları raporlama ve öneriler sunma
|
420 |
+
|
421 |
+
## Çıktı Formatı
|
422 |
+
- Tam analiz raporu
|
423 |
+
- Finansal tablolar ve grafikler
|
424 |
+
- Risk değerlendirmesi
|
425 |
+
- Tahmin modelleri (gerekirse)
|
426 |
+
- Yatırım veya finansal stratejiler
|
427 |
+
|
428 |
+
## Ek Notlar
|
429 |
+
{additional_notes}
|
430 |
+
|
431 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar, hesaplamalar ve görselleştirmeler sağla.
|
432 |
+
"""
|
433 |
+
|
434 |
+
# Otomasyon için prompt şablonu
|
435 |
+
AUTOMATION_TEMPLATE = """
|
436 |
+
# Otomasyon Uzmanı Prompt
|
437 |
+
|
438 |
+
## Proje Tanımı
|
439 |
+
{project_description}
|
440 |
+
|
441 |
+
## Otomasyon Gereksinimleri
|
442 |
+
- **Otomasyon Türü**: {automation_type} (İş Akışı/Veri İşleme/Test/vb.)
|
443 |
+
- **Mevcut Sistemler**: {existing_systems}
|
444 |
+
- **Hedef Platformlar**: {target_platforms}
|
445 |
+
- **Kullanıcı Etkileşimi**: {user_interaction} (Tam Otomatik/Yarı Otomatik)
|
446 |
+
|
447 |
+
## Otomasyon Hedefleri
|
448 |
+
{automation_objectives}
|
449 |
+
|
450 |
+
## İş Akışı veya Süreç Detayları
|
451 |
+
{workflow_details}
|
452 |
+
|
453 |
+
## Adım Adım Geliştirme Planı
|
454 |
+
1. Mevcut süreçleri analiz etme
|
455 |
+
2. Otomasyon stratejisi geliştirme
|
456 |
+
3. Gerekli araçları ve teknolojileri seçme
|
457 |
+
4. Otomasyon senaryolarını tasarlama
|
458 |
+
5. Otomasyon kodunu veya betiklerini geliştirme
|
459 |
+
6. Hata yönetimi ve istisna işleme mekanizmaları ekleme
|
460 |
+
7. Test etme ve doğrulama
|
461 |
+
8. Dokümantasyon ve kullanım talimatları hazırlama
|
462 |
+
|
463 |
+
## Çıktı Formatı
|
464 |
+
- Tam otomasyon kodu veya betikleri
|
465 |
+
- Kurulum ve yapılandırma talimatları
|
466 |
+
- Kullanım kılavuzu
|
467 |
+
- Test senaryoları ve sonuçları
|
468 |
+
- Bakım ve sorun giderme rehberi
|
469 |
+
|
470 |
+
## Ek Notlar
|
471 |
+
{additional_notes}
|
472 |
+
|
473 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
474 |
+
"""
|
475 |
+
|
476 |
+
# Siber güvenlik için prompt şablonu
|
477 |
+
CYBERSECURITY_TEMPLATE = """
|
478 |
+
# Siber Güvenlik Uzmanı Prompt
|
479 |
+
|
480 |
+
## Proje Tanımı
|
481 |
+
{project_description}
|
482 |
+
|
483 |
+
## Güvenlik Gereksinimleri
|
484 |
+
- **Güvenlik Alanı**: {security_domain} (Ağ Güvenliği/Uygulama Güvenliği/vb.)
|
485 |
+
- **Hedef Sistemler**: {target_systems}
|
486 |
+
- **Tehdit Modeli**: {threat_model}
|
487 |
+
- **Uyumluluk Gereksinimleri**: {compliance_requirements}
|
488 |
+
|
489 |
+
## Güvenlik Hedefleri
|
490 |
+
{security_objectives}
|
491 |
+
|
492 |
+
## Mevcut Güvenlik Durumu
|
493 |
+
{current_security_state}
|
494 |
+
|
495 |
+
## Adım Adım Güvenlik Planı
|
496 |
+
1. Güvenlik değerlendirmesi ve risk analizi
|
497 |
+
2. Güvenlik açıklarını belirleme
|
498 |
+
3. Güvenlik stratejisi ve kontrolleri geliştirme
|
499 |
+
4. Güvenlik çözümlerini uygulama
|
500 |
+
5. Güvenlik testleri ve doğrulama
|
501 |
+
6. İzleme ve tespit mekanizmaları kurma
|
502 |
+
7. Olay müdahale planı oluşturma
|
503 |
+
8. Dokümantasyon ve eğitim materyalleri hazırlama
|
504 |
+
|
505 |
+
## Çıktı Formatı
|
506 |
+
- Güvenlik değerlendirme raporu
|
507 |
+
- Güvenlik kontrolleri ve çözümleri
|
508 |
+
- Test sonuçları ve kanıtları
|
509 |
+
- İzleme ve olay müdahale prosedürleri
|
510 |
+
- Güvenlik politikaları ve kılavuzları
|
511 |
+
|
512 |
+
## Ek Notlar
|
513 |
+
{additional_notes}
|
514 |
+
|
515 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve örnekler sağla.
|
516 |
+
"""
|
517 |
+
|
518 |
+
# DevOps için prompt şablonu
|
519 |
+
DEVOPS_TEMPLATE = """
|
520 |
+
# DevOps Uzmanı Prompt
|
521 |
+
|
522 |
+
## Proje Tanımı
|
523 |
+
{project_description}
|
524 |
+
|
525 |
+
## DevOps Gereksinimleri
|
526 |
+
- **Altyapı Türü**: {infrastructure_type} (On-premise/Cloud/Hybrid)
|
527 |
+
- **Teknoloji Yığını**: {technology_stack}
|
528 |
+
- **Ölçeklendirme Gereksinimleri**: {scaling_requirements}
|
529 |
+
- **CI/CD Gereksinimleri**: {cicd_requirements}
|
530 |
+
|
531 |
+
## DevOps Hedefleri
|
532 |
+
{devops_objectives}
|
533 |
+
|
534 |
+
## Mevcut Altyapı ve Süreçler
|
535 |
+
{current_infrastructure}
|
536 |
+
|
537 |
+
## Adım Adım DevOps Planı
|
538 |
+
1. Mevcut altyapı ve süreçleri değerlendirme
|
539 |
+
2. DevOps stratejisi ve araçları belirleme
|
540 |
+
3. Altyapı otomasyonu (IaC) geliştirme
|
541 |
+
4. CI/CD pipeline'ları oluşturma
|
542 |
+
5. İzleme ve günlük kaydı çözümleri uygulama
|
543 |
+
6. Güvenlik entegrasyonu
|
544 |
+
7. Otomasyon testleri ve doğrulama
|
545 |
+
8. Dokümantasyon ve ekip eğitimi
|
546 |
+
|
547 |
+
## Çıktı Formatı
|
548 |
+
- Altyapı kodu (Terraform, CloudFormation, vb.)
|
549 |
+
- CI/CD pipeline yapılandırmaları
|
550 |
+
- İzleme ve günlük kaydı çözümleri
|
551 |
+
- Otomasyon betikleri
|
552 |
+
- Dokümantasyon ve kılavuzlar
|
553 |
+
|
554 |
+
## Ek Notlar
|
555 |
+
{additional_notes}
|
556 |
+
|
557 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
558 |
+
"""
|
559 |
+
|
560 |
+
# IoT için prompt şablonu
|
561 |
+
IOT_TEMPLATE = """
|
562 |
+
# IoT Uzmanı Prompt
|
563 |
+
|
564 |
+
## Proje Tanımı
|
565 |
+
{project_description}
|
566 |
+
|
567 |
+
## IoT Gereksinimleri
|
568 |
+
- **Cihaz Türleri**: {device_types}
|
569 |
+
- **Bağlantı Gereksinimleri**: {connectivity_requirements}
|
570 |
+
- **Veri İşleme Gereksinimleri**: {data_processing_requirements}
|
571 |
+
- **Güvenlik Gereksinimleri**: {security_requirements}
|
572 |
+
|
573 |
+
## IoT Hedefleri
|
574 |
+
{iot_objectives}
|
575 |
+
|
576 |
+
## Sistem Mimarisi
|
577 |
+
{system_architecture}
|
578 |
+
|
579 |
+
## Adım Adım Geliştirme Planı
|
580 |
+
1. IoT sistem mimarisini tasarlama
|
581 |
+
2. Cihaz yazılımı geliştirme
|
582 |
+
3. Bulut altyapısını kurma
|
583 |
+
4. Veri toplama ve işleme pipeline'ları oluşturma
|
584 |
+
5. Kullanıcı arayüzü veya dashboard geliştirme
|
585 |
+
6. Güvenlik önlemlerini uygulama
|
586 |
+
7. Test etme ve doğrulama
|
587 |
+
8. Deployment ve bakım planı hazırlama
|
588 |
+
|
589 |
+
## Çıktı Formatı
|
590 |
+
- Cihaz yazılımı kodu
|
591 |
+
- Bulut altyapısı kodu
|
592 |
+
- Veri işleme pipeline'ları
|
593 |
+
- Kullanıcı arayüzü veya dashboard
|
594 |
+
- Dokümantasyon ve kılavuzlar
|
595 |
+
|
596 |
+
## Ek Notlar
|
597 |
+
{additional_notes}
|
598 |
+
|
599 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
600 |
+
"""
|
601 |
+
|
602 |
+
# Bulut bilişim için prompt şablonu
|
603 |
+
CLOUD_COMPUTING_TEMPLATE = """
|
604 |
+
# Bulut Bilişim Uzmanı Prompt
|
605 |
+
|
606 |
+
## Proje Tanımı
|
607 |
+
{project_description}
|
608 |
+
|
609 |
+
## Bulut Gereksinimleri
|
610 |
+
- **Bulut Sağlayıcısı**: {cloud_provider} (AWS/Azure/GCP/vb.)
|
611 |
+
- **Hizmet Modeli**: {service_model} (IaaS/PaaS/SaaS/Serverless)
|
612 |
+
- **Ölçeklendirme Gereksinimleri**: {scaling_requirements}
|
613 |
+
- **Bütçe Kısıtlamaları**: {budget_constraints}
|
614 |
+
|
615 |
+
## Bulut Hedefleri
|
616 |
+
{cloud_objectives}
|
617 |
+
|
618 |
+
## Mevcut Altyapı
|
619 |
+
{current_infrastructure}
|
620 |
+
|
621 |
+
## Adım Adım Bulut Planı
|
622 |
+
1. Bulut stratejisi ve mimarisi tasarlama
|
623 |
+
2. Bulut kaynaklarını tanımlama (IaC)
|
624 |
+
3. Ağ ve güvenlik yapılandırması
|
625 |
+
4. Veritabanı ve depolama çözümleri
|
626 |
+
5. Uygulama deployment stratejisi
|
627 |
+
6. İzleme ve günlük kaydı çözümleri
|
628 |
+
7. Maliyet optimizasyonu
|
629 |
+
8. Felaket kurtarma ve yedekleme stratejisi
|
630 |
+
|
631 |
+
## Çıktı Formatı
|
632 |
+
- Bulut mimarisi şeması
|
633 |
+
- Altyapı kodu (Terraform, CloudFormation, vb.)
|
634 |
+
- Güvenlik yapılandırmaları
|
635 |
+
- Deployment betikleri
|
636 |
+
- Maliyet tahminleri ve optimizasyon önerileri
|
637 |
+
|
638 |
+
## Ek Notlar
|
639 |
+
{additional_notes}
|
640 |
+
|
641 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
642 |
+
"""
|
643 |
+
|
644 |
+
# Blockchain için prompt şablonu
|
645 |
+
BLOCKCHAIN_TEMPLATE = """
|
646 |
+
# Blockchain Uzmanı Prompt
|
647 |
+
|
648 |
+
## Proje Tanımı
|
649 |
+
{project_description}
|
650 |
+
|
651 |
+
## Blockchain Gereksinimleri
|
652 |
+
- **Blockchain Türü**: {blockchain_type} (Public/Private/Hybrid)
|
653 |
+
- **Konsensüs Mekanizması**: {consensus_mechanism}
|
654 |
+
- **Akıllı Sözleşme Gereksinimleri**: {smart_contract_requirements}
|
655 |
+
- **Ölçeklendirme Gereksinimleri**: {scaling_requirements}
|
656 |
+
|
657 |
+
## Blockchain Hedefleri
|
658 |
+
{blockchain_objectives}
|
659 |
+
|
660 |
+
## Kullanım Senaryoları
|
661 |
+
{use_cases}
|
662 |
+
|
663 |
+
## Adım Adım Geliştirme Planı
|
664 |
+
1. Blockchain mimarisi tasarlama
|
665 |
+
2. Ağ altyapısını kurma
|
666 |
+
3. Akıllı sözleşmeleri geliştirme
|
667 |
+
4. Kullanıcı arayüzü veya API'ler oluşturma
|
668 |
+
5. Güvenlik denetimi ve test etme
|
669 |
+
6. Performans optimizasyonu
|
670 |
+
7. Deployment ve yönetim stratejisi
|
671 |
+
8. Dokümantasyon ve kullanım kılavuzları hazırlama
|
672 |
+
|
673 |
+
## Çıktı Formatı
|
674 |
+
- Blockchain konfigürasyonu
|
675 |
+
- Akıllı sözleşme kodu
|
676 |
+
- API veya kullanıcı arayüzü
|
677 |
+
- Güvenlik denetim raporu
|
678 |
+
- Dokümantasyon ve kılavuzlar
|
679 |
+
|
680 |
+
## Ek Notlar
|
681 |
+
{additional_notes}
|
682 |
+
|
683 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve kod örnekleri sağla.
|
684 |
+
"""
|
685 |
+
|
686 |
+
# Yapay zeka araştırmaları için prompt şablonu
|
687 |
+
AI_RESEARCH_TEMPLATE = """
|
688 |
+
# Yapay Zeka Araştırma Uzmanı Prompt
|
689 |
+
|
690 |
+
## Araştırma Tanımı
|
691 |
+
{research_description}
|
692 |
+
|
693 |
+
## Araştırma Alanı
|
694 |
+
- **AI Alt Alanı**: {ai_subfield} (NLP/CV/RL/vb.)
|
695 |
+
- **Araştırma Türü**: {research_type} (Teorik/Uygulamalı/Deneysel)
|
696 |
+
- **Mevcut Literatür Durumu**: {literature_state}
|
697 |
+
- **Araştırma Soruları**: {research_questions}
|
698 |
+
|
699 |
+
## Araştırma Hedefleri
|
700 |
+
{research_objectives}
|
701 |
+
|
702 |
+
## Metodoloji
|
703 |
+
{methodology}
|
704 |
+
|
705 |
+
## Adım Adım Araştırma Planı
|
706 |
+
1. Literatür taraması ve mevcut ��alışmaları inceleme
|
707 |
+
2. Araştırma hipotezlerini formüle etme
|
708 |
+
3. Deneysel tasarım veya teorik çerçeve oluşturma
|
709 |
+
4. Veri toplama veya model geliştirme
|
710 |
+
5. Deneyleri yürütme veya teorik analiz yapma
|
711 |
+
6. Sonuçları analiz etme ve yorumlama
|
712 |
+
7. Bulguları literatürle karşılaştırma
|
713 |
+
8. Araştırma makalesi veya raporu yazma
|
714 |
+
|
715 |
+
## Çıktı Formatı
|
716 |
+
- Araştırma raporu veya makale
|
717 |
+
- Deneysel sonuçlar ve analizler
|
718 |
+
- Kod veya model (uygulamalı araştırma için)
|
719 |
+
- Literatür özeti
|
720 |
+
- Gelecek çalışmalar için öneriler
|
721 |
+
|
722 |
+
## Ek Notlar
|
723 |
+
{additional_notes}
|
724 |
+
|
725 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve analizler sağla.
|
726 |
+
"""
|
727 |
+
|
728 |
+
# SEO için prompt şablonu
|
729 |
+
SEO_TEMPLATE = """
|
730 |
+
# SEO Uzmanı Prompt
|
731 |
+
|
732 |
+
## Proje Tanımı
|
733 |
+
{project_description}
|
734 |
+
|
735 |
+
## SEO Gereksinimleri
|
736 |
+
- **Web Sitesi Türü**: {website_type}
|
737 |
+
- **Hedef Anahtar Kelimeler**: {target_keywords}
|
738 |
+
- **Hedef Pazar/Bölge**: {target_market}
|
739 |
+
- **Rekabet Analizi**: {competition_analysis}
|
740 |
+
|
741 |
+
## SEO Hedefleri
|
742 |
+
{seo_objectives}
|
743 |
+
|
744 |
+
## Mevcut SEO Durumu
|
745 |
+
{current_seo_state}
|
746 |
+
|
747 |
+
## Adım Adım SEO Planı
|
748 |
+
1. Kapsamlı SEO denetimi yapma
|
749 |
+
2. Anahtar kelime araştırması ve analizi
|
750 |
+
3. On-page SEO optimizasyonları
|
751 |
+
4. Teknik SEO iyileştirmeleri
|
752 |
+
5. İçerik stratejisi geliştirme
|
753 |
+
6. Off-page SEO ve bağlantı kurma stratejisi
|
754 |
+
7. Yerel SEO optimizasyonu (gerekirse)
|
755 |
+
8. İzleme ve raporlama sistemi kurma
|
756 |
+
|
757 |
+
## Çıktı Formatı
|
758 |
+
- SEO denetim raporu
|
759 |
+
- Anahtar kelime araştırma sonuçları
|
760 |
+
- On-page ve teknik SEO önerileri
|
761 |
+
- İçerik planı ve önerileri
|
762 |
+
- Bağlantı kurma stratejisi
|
763 |
+
- İzleme ve raporlama planı
|
764 |
+
|
765 |
+
## Ek Notlar
|
766 |
+
{additional_notes}
|
767 |
+
|
768 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve öneriler sağla.
|
769 |
+
"""
|
770 |
+
|
771 |
+
# Sosyal medya için prompt şablonu
|
772 |
+
SOCIAL_MEDIA_TEMPLATE = """
|
773 |
+
# Sosyal Medya Uzmanı Prompt
|
774 |
+
|
775 |
+
## Proje Tanımı
|
776 |
+
{project_description}
|
777 |
+
|
778 |
+
## Sosyal Medya Gereksinimleri
|
779 |
+
- **Platformlar**: {platforms} (Instagram/Twitter/Facebook/LinkedIn/TikTok/vb.)
|
780 |
+
- **Hedef Kitle**: {target_audience}
|
781 |
+
- **Marka Sesi**: {brand_voice}
|
782 |
+
- **İçerik Türleri**: {content_types}
|
783 |
+
|
784 |
+
## Sosyal Medya Hedefleri
|
785 |
+
{social_media_objectives}
|
786 |
+
|
787 |
+
## Mevcut Sosyal Medya Varlığı
|
788 |
+
{current_social_media_presence}
|
789 |
+
|
790 |
+
## Adım Adım Sosyal Medya Planı
|
791 |
+
1. Sosyal medya denetimi yapma
|
792 |
+
2. Hedef kitle analizi
|
793 |
+
3. İçerik stratejisi geliştirme
|
794 |
+
4. İçerik takvimi oluşturma
|
795 |
+
5. İçerik üretimi için kılavuzlar hazırlama
|
796 |
+
6. Etkileşim ve topluluk yönetimi stratejisi
|
797 |
+
7. Reklam ve tanıtım stratejisi (gerekirse)
|
798 |
+
8. Analiz ve raporlama sistemi kurma
|
799 |
+
|
800 |
+
## Çıktı Formatı
|
801 |
+
- Sosyal medya stratejisi
|
802 |
+
- İçerik takvimi
|
803 |
+
- İçerik örnekleri ve şablonları
|
804 |
+
- Topluluk yönetimi kılavuzu
|
805 |
+
- Analiz ve performans metrikleri
|
806 |
+
|
807 |
+
## Ek Notlar
|
808 |
+
{additional_notes}
|
809 |
+
|
810 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve örnekler sağla.
|
811 |
+
"""
|
812 |
+
|
813 |
+
# E-ticaret için prompt şablonu
|
814 |
+
E_COMMERCE_TEMPLATE = """
|
815 |
+
# E-Ticaret Uzmanı Prompt
|
816 |
+
|
817 |
+
## Proje Tanımı
|
818 |
+
{project_description}
|
819 |
+
|
820 |
+
## E-Ticaret Gereksinimleri
|
821 |
+
- **Platform**: {platform} (Shopify/WooCommerce/Magento/vb.)
|
822 |
+
- **Ürün Türleri**: {product_types}
|
823 |
+
- **Ödeme Yöntemleri**: {payment_methods}
|
824 |
+
- **Lojistik Gereksinimleri**: {logistics_requirements}
|
825 |
+
|
826 |
+
## E-Ticaret Hedefleri
|
827 |
+
{ecommerce_objectives}
|
828 |
+
|
829 |
+
## Mevcut E-Ticaret Durumu
|
830 |
+
{current_ecommerce_state}
|
831 |
+
|
832 |
+
## Adım Adım E-Ticaret Planı
|
833 |
+
1. E-ticaret platformu seçimi ve kurulumu
|
834 |
+
2. Ürün kataloğu ve içerik oluşturma
|
835 |
+
3. Ödeme ve lojistik entegrasyonları
|
836 |
+
4. Kullanıcı deneyimi optimizasyonu
|
837 |
+
5. SEO ve pazarlama stratejisi
|
838 |
+
6. Güvenlik ve uyumluluk kontrolleri
|
839 |
+
7. Test etme ve lansman hazırlığı
|
840 |
+
8. Analiz ve optimizasyon planı
|
841 |
+
|
842 |
+
## Çıktı Formatı
|
843 |
+
- E-ticaret platform kurulum ve yapılandırması
|
844 |
+
- Ürün kataloğu ve içerik stratejisi
|
845 |
+
- Ödeme ve lojistik entegrasyonları
|
846 |
+
- SEO ve pazarlama planı
|
847 |
+
- Analiz ve raporlama sistemi
|
848 |
+
|
849 |
+
## Ek Notlar
|
850 |
+
{additional_notes}
|
851 |
+
|
852 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve öneriler sağla.
|
853 |
+
"""
|
854 |
+
|
855 |
+
# Dijital pazarlama için prompt şablonu
|
856 |
+
DIGITAL_MARKETING_TEMPLATE = """
|
857 |
+
# Dijital Pazarlama Uzmanı Prompt
|
858 |
+
|
859 |
+
## Proje Tanımı
|
860 |
+
{project_description}
|
861 |
+
|
862 |
+
## Pazarlama Gereksinimleri
|
863 |
+
- **Pazarlama Kanalları**: {marketing_channels}
|
864 |
+
- **Hedef Kitle**: {target_audience}
|
865 |
+
- **Bütçe**: {budget}
|
866 |
+
- **Kampanya Süresi**: {campaign_duration}
|
867 |
+
|
868 |
+
## Pazarlama Hedefleri
|
869 |
+
{marketing_objectives}
|
870 |
+
|
871 |
+
## Mevcut Pazarlama Durumu
|
872 |
+
{current_marketing_state}
|
873 |
+
|
874 |
+
## Adım Adım Pazarlama Planı
|
875 |
+
1. Pazar ve rekabet analizi
|
876 |
+
2. Hedef kitle segmentasyonu
|
877 |
+
3. Pazarlama stratejisi geliştirme
|
878 |
+
4. Kanal bazlı taktikler oluşturma
|
879 |
+
5. İçerik ve yaratıcı stratejisi
|
880 |
+
6. Kampanya takvimi hazırlama
|
881 |
+
7. Bütçe dağılımı ve ROI tahminleri
|
882 |
+
8. İzleme ve optimizasyon planı
|
883 |
+
|
884 |
+
## Çıktı Formatı
|
885 |
+
- Dijital pazarlama stratejisi
|
886 |
+
- Kanal bazlı taktik planları
|
887 |
+
- İçerik ve yaratıcı örnekleri
|
888 |
+
- Kampanya takvimi
|
889 |
+
- Bütçe planı ve ROI tahminleri
|
890 |
+
|
891 |
+
## Ek Notlar
|
892 |
+
{additional_notes}
|
893 |
+
|
894 |
+
Lütfen adım adım ilerle ve her aşamada detaylı açıklamalar ve öneriler sağla.
|
895 |
+
"""
|
896 |
+
|
897 |
+
# Genel amaçlı prompt şablonu
|
898 |
+
GENERAL_TEMPLATE = """
|
899 |
+
# Uzman Prompt
|
900 |
+
|
901 |
+
## Görev Tanımı
|
902 |
+
{task_description}
|
903 |
+
|
904 |
+
## Gereksinimler
|
905 |
+
{requirements}
|
906 |
+
|
907 |
+
## Beklenen Çıktı
|
908 |
+
{expected_output}
|
909 |
+
|
910 |
+
## Kısıtlamalar
|
911 |
+
{constraints}
|
912 |
+
|
913 |
+
## Adım Adım Yaklaşım
|
914 |
+
1. {step_1}
|
915 |
+
2. {step_2}
|
916 |
+
3. {step_3}
|
917 |
+
...
|
918 |
+
|
919 |
+
## Ek Bilgiler
|
920 |
+
{additional_info}
|
921 |
+
|
922 |
+
Lütfen belirtilen gereksinimlere uygun, detaylı ve kapsamlı bir çözüm sağla.
|
923 |
+
"""
|
924 |
+
|
925 |
+
# Script yazımı için prompt şablonu
|
926 |
+
SCRIPT_TEMPLATE = """
|
927 |
+
# Senaryo Yazım Uzmanı Prompt
|
928 |
+
|
929 |
+
## Proje Tanımı
|
930 |
+
{project_description}
|
931 |
+
|
932 |
+
## Senaryo Türü
|
933 |
+
- **Format**: {script_format} (Film/Dizi/Reklam/YouTube/Podcast/Eğitim Videosu)
|
934 |
+
- **Süre/Uzunluk**: {duration}
|
935 |
+
- **Hedef Kitle**: {target_audience}
|
936 |
+
- **Ton**: {tone} (Komedi/Drama/Aksiyon/Bilgilendirici/İkna Edici/vb.)
|
937 |
+
|
938 |
+
## Senaryo Hedefleri
|
939 |
+
{script_objectives}
|
940 |
+
|
941 |
+
## İçerik Gereksinimleri
|
942 |
+
{content_requirements}
|
943 |
+
|
944 |
+
## Karakter Bilgileri
|
945 |
+
{character_details}
|
946 |
+
|
947 |
+
## Sahne Yapısı
|
948 |
+
1. Giriş/Tanıtım
|
949 |
+
2. Ana bölüm/Gelişme
|
950 |
+
3. Sonuç/Kapanış
|
951 |
+
4. Çağrı aksiyonu (CTA) (gerekirse)
|
952 |
+
|
953 |
+
## Teknik Gereksinimler
|
954 |
+
{technical_requirements}
|
955 |
+
|
956 |
+
## Referanslar ve İlham Kaynakları
|
957 |
+
{references}
|
958 |
+
|
959 |
+
## Ek Notlar
|
960 |
+
{additional_notes}
|
961 |
+
|
962 |
+
Lütfen belirtilen gereksinimlere uygun, etkileyici ve hedef kitleye hitap eden bir senaryo oluştur. Diyalogları, sahne açıklamalarını ve gerekli yönergeleri standart senaryo formatında sunmalısın.
|
963 |
+
"""
|
964 |
+
|
965 |
+
# Tüm prompt şablonlarını içeren sözlük
|
966 |
+
PROMPT_TEMPLATES = {
|
967 |
+
"web_development": WEB_DEVELOPMENT_TEMPLATE,
|
968 |
+
"mobile_app": MOBILE_APP_TEMPLATE,
|
969 |
+
"data_analysis": DATA_ANALYSIS_TEMPLATE,
|
970 |
+
"data_visualization": DATA_VISUALIZATION_TEMPLATE,
|
971 |
+
"ml_model": ML_MODEL_TEMPLATE,
|
972 |
+
"deep_learning": DEEP_LEARNING_TEMPLATE,
|
973 |
+
"content_creation": CONTENT_CREATION_TEMPLATE,
|
974 |
+
"game_development": GAME_DEVELOPMENT_TEMPLATE,
|
975 |
+
"education": EDUCATION_TEMPLATE,
|
976 |
+
"finance": FINANCE_TEMPLATE,
|
977 |
+
"automation": AUTOMATION_TEMPLATE,
|
978 |
+
"cybersecurity": CYBERSECURITY_TEMPLATE,
|
979 |
+
"devops": DEVOPS_TEMPLATE,
|
980 |
+
"iot": IOT_TEMPLATE,
|
981 |
+
"cloud_computing": CLOUD_COMPUTING_TEMPLATE,
|
982 |
+
"blockchain": BLOCKCHAIN_TEMPLATE,
|
983 |
+
"ai_research": AI_RESEARCH_TEMPLATE,
|
984 |
+
"seo": SEO_TEMPLATE,
|
985 |
+
"social_media": SOCIAL_MEDIA_TEMPLATE,
|
986 |
+
"e_commerce": E_COMMERCE_TEMPLATE,
|
987 |
+
"digital_marketing": DIGITAL_MARKETING_TEMPLATE,
|
988 |
+
"general": GENERAL_TEMPLATE
|
989 |
+
}
|
990 |
+
|
991 |
+
# Prompt kategorileri ve açıklamaları
|
992 |
+
PROMPT_CATEGORIES = {
|
993 |
+
"web_development": "Web sitesi geliştirme projeleri için",
|
994 |
+
"mobile_app": "Mobil uygulama geliştirme projeleri için",
|
995 |
+
"data_analysis": "Veri analizi ve işleme projeleri için",
|
996 |
+
"data_visualization": "Veri görselleştirme ve dashboard projeleri için",
|
997 |
+
"ml_model": "Makine öğrenmesi modeli geliştirme projeleri için",
|
998 |
+
"deep_learning": "Derin öğrenme ve sinir ağları projeleri için",
|
999 |
+
"content_creation": "Blog yazısı, sosyal medya içeriği vb. oluşturma için",
|
1000 |
+
"game_development": "Oyun geliştirme ve tasarım projeleri için",
|
1001 |
+
"education": "Eğitim içeriği ve materyal geliştirme için",
|
1002 |
+
"finance": "Finansal analiz ve planlama projeleri için",
|
1003 |
+
"automation": "İş süreçleri ve görev otomasyonu için",
|
1004 |
+
"cybersecurity": "Siber güvenlik ve risk yönetimi için",
|
1005 |
+
"devops": "DevOps ve sürekli entegrasyon/dağıtım için",
|
1006 |
+
"iot": "Nesnelerin İnterneti (IoT) projeleri için",
|
1007 |
+
"cloud_computing": "Bulut bilişim ve altyapı projeleri için",
|
1008 |
+
"blockchain": "Blockchain ve dağıtık sistemler için",
|
1009 |
+
"ai_research": "Yapay zeka araştırma ve geliştirme projeleri için",
|
1010 |
+
"seo": "Arama motoru optimizasyonu stratejileri için",
|
1011 |
+
"social_media": "Sosyal medya stratejisi ve içerik planlaması için",
|
1012 |
+
"e_commerce": "E-ticaret platformu ve stratejisi geliştirme için",
|
1013 |
+
"digital_marketing": "Dijital pazarlama kampanyaları ve stratejileri için",
|
1014 |
+
"general": "Genel amaçlı görevler için"
|
1015 |
+
}
|
1016 |
+
|
1017 |
+
# OpenAI modelleri
|
1018 |
+
OPENAI_MODELS = [
|
1019 |
+
"gpt-4o",
|
1020 |
+
"gpt-4o-mini",
|
1021 |
+
"gpt-4-turbo",
|
1022 |
+
"gpt-4",
|
1023 |
+
"gpt-4-32k",
|
1024 |
+
"gpt-3.5-turbo",
|
1025 |
+
"gpt-3.5-turbo-16k"
|
1026 |
+
]
|
1027 |
+
|
1028 |
+
# Gemini modelleri
|
1029 |
+
GEMINI_MODELS = [
|
1030 |
+
"gemini-2.5-pro-preview-03-25",
|
1031 |
+
"gemini-2.0-flash",
|
1032 |
+
"gemini-2.0-flash-lite",
|
1033 |
+
"gemini-1.5-flash",
|
1034 |
+
"gemini-1.5-flash-8b",
|
1035 |
+
"gemini-1.5-pro",
|
1036 |
+
"gemini-embedding-exp",
|
1037 |
+
"imagen-3.0-generate-002",
|
1038 |
+
"veo-2.0-generate-001",
|
1039 |
+
"gemini-2.0-flash-live-001",
|
1040 |
+
"gemini-1.0-pro",
|
1041 |
+
"gemini-1.0-pro-vision",
|
1042 |
+
"gemini-1.0-pro-latest",
|
1043 |
+
"gemini-1.0-pro-vision-latest"
|
1044 |
+
]
|
1045 |
+
|
1046 |
+
# OpenRouter modelleri
|
1047 |
+
OPENROUTER_MODELS = [
|
1048 |
+
# OpenAI modelleri
|
1049 |
+
"openai/gpt-4o",
|
1050 |
+
"openai/gpt-4o-mini",
|
1051 |
+
"openai/gpt-4-turbo",
|
1052 |
+
"openai/gpt-4",
|
1053 |
+
"openai/gpt-4-32k",
|
1054 |
+
"openai/gpt-3.5-turbo",
|
1055 |
+
"openai/gpt-3.5-turbo-16k",
|
1056 |
+
|
1057 |
+
# Anthropic modelleri
|
1058 |
+
"anthropic/claude-3.7-sonnet",
|
1059 |
+
"anthropic/claude-3.5-sonnet",
|
1060 |
+
"anthropic/claude-3-opus",
|
1061 |
+
"anthropic/claude-3-sonnet",
|
1062 |
+
"anthropic/claude-3-haiku",
|
1063 |
+
"anthropic/claude-2.1",
|
1064 |
+
"anthropic/claude-2",
|
1065 |
+
"anthropic/claude-instant-1.2",
|
1066 |
+
|
1067 |
+
# Google modelleri
|
1068 |
+
"google/gemini-2.5-pro-preview-03-25",
|
1069 |
+
"google/gemini-2.0-flash",
|
1070 |
+
"google/gemini-2.0-flash-lite",
|
1071 |
+
"google/gemini-1.5-flash",
|
1072 |
+
"google/gemini-1.5-flash-8b",
|
1073 |
+
"google/gemini-1.5-pro",
|
1074 |
+
"google/gemini-1.0-pro",
|
1075 |
+
|
1076 |
+
# Meta modelleri
|
1077 |
+
"meta-llama/llama-3-70b-instruct",
|
1078 |
+
"meta-llama/llama-3-8b-instruct",
|
1079 |
+
"meta-llama/llama-3.1-405b-instruct",
|
1080 |
+
"meta-llama/llama-3.1-70b-instruct",
|
1081 |
+
"meta-llama/llama-3.1-8b-instruct",
|
1082 |
+
"meta-llama/llama-2-70b-chat",
|
1083 |
+
"meta-llama/llama-2-13b-chat",
|
1084 |
+
"meta-llama/llama-2-7b-chat",
|
1085 |
+
|
1086 |
+
# Mistral modelleri
|
1087 |
+
"mistral/mistral-large-2",
|
1088 |
+
"mistral/mistral-large",
|
1089 |
+
"mistral/mistral-medium",
|
1090 |
+
"mistral/mistral-small",
|
1091 |
+
"mistral/mistral-7b-instruct",
|
1092 |
+
|
1093 |
+
# xAI modelleri
|
1094 |
+
"x-ai/grok-3-beta",
|
1095 |
+
"x-ai/grok-3-mini-beta",
|
1096 |
+
"x-ai/grok-2",
|
1097 |
+
"x-ai/grok-1.5-pro",
|
1098 |
+
"x-ai/grok-1",
|
1099 |
+
|
1100 |
+
# Cohere modelleri
|
1101 |
+
"cohere/command-r-plus",
|
1102 |
+
"cohere/command-r",
|
1103 |
+
|
1104 |
+
# Perplexity modelleri
|
1105 |
+
"perplexity/sonar-small-online",
|
1106 |
+
"perplexity/sonar-medium-online",
|
1107 |
+
"perplexity/sonar-medium-chat",
|
1108 |
+
|
1109 |
+
# NVIDIA modelleri
|
1110 |
+
"nvidia/llama-3.1-nemotron-ultra-253b-v1",
|
1111 |
+
"nvidia/llama-3.3-nemotron-super-49b-v1",
|
1112 |
+
"nvidia/llama-3.1-nemotron-nano-8b-v1",
|
1113 |
+
|
1114 |
+
# Moonshot AI modelleri
|
1115 |
+
"moonshotai/kimi-vl-a3b-thinking",
|
1116 |
+
|
1117 |
+
# Optimus modelleri
|
1118 |
+
"openrouter/optimus-alpha",
|
1119 |
+
|
1120 |
+
# Swallow modelleri
|
1121 |
+
"tokyotech-llm/llama-3.1-swallow-8b-instruct-v0.3",
|
1122 |
+
|
1123 |
+
# Meta Llama 4 modelleri
|
1124 |
+
"meta-llama/llama-4-maverick",
|
1125 |
+
|
1126 |
+
# Qwen modelleri
|
1127 |
+
"qwen/qwen-2-72b-instruct",
|
1128 |
+
"qwen/qwen-2-7b-instruct",
|
1129 |
+
|
1130 |
+
# Deepseek modelleri
|
1131 |
+
"deepseek/deepseek-coder-v2",
|
1132 |
+
"deepseek/deepseek-v2",
|
1133 |
+
|
1134 |
+
# Aleph Alpha modelleri
|
1135 |
+
"aleph-alpha/luminous-supreme",
|
1136 |
+
"aleph-alpha/luminous-base",
|
1137 |
+
|
1138 |
+
# Databricks modelleri
|
1139 |
+
"databricks/dbrx-instruct",
|
1140 |
+
|
1141 |
+
# Nous modelleri
|
1142 |
+
"nous/nous-hermes-2-mixtral-8x7b-dpo",
|
1143 |
+
"nous/nous-hermes-2-yi-34b",
|
1144 |
+
|
1145 |
+
# Jais modelleri
|
1146 |
+
"jais/jais-30b-chat",
|
1147 |
+
"jais/jais-13b-chat",
|
1148 |
+
|
1149 |
+
# Snowflake modelleri
|
1150 |
+
"snowflake/arctic",
|
1151 |
+
|
1152 |
+
# Adept modelleri
|
1153 |
+
"adept/fuyu-8b",
|
1154 |
+
|
1155 |
+
# Anyscale modelleri
|
1156 |
+
"anyscale/mistral-7b-instruct",
|
1157 |
+
|
1158 |
+
# Stability AI modelleri
|
1159 |
+
"stability/stable-code-3b",
|
1160 |
+
|
1161 |
+
# Fireworks modelleri
|
1162 |
+
"fireworks/firefunction-v2",
|
1163 |
+
"fireworks/firellava-13b",
|
1164 |
+
|
1165 |
+
# Voyage modelleri
|
1166 |
+
"voyage/voyage-2",
|
1167 |
+
"voyage/voyage-lite-2",
|
1168 |
+
|
1169 |
+
# Groq modelleri
|
1170 |
+
"groq/llama-3-70b-8192",
|
1171 |
+
"groq/mixtral-8x7b-32768",
|
1172 |
+
|
1173 |
+
# Reka modelleri
|
1174 |
+
"reka/reka-core",
|
1175 |
+
"reka/reka-flash",
|
1176 |
+
|
1177 |
+
# Quasar modelleri
|
1178 |
+
"quasar/quasar-alpha",
|
1179 |
+
|
1180 |
+
# Zypher modelleri
|
1181 |
+
"zypher/zypher-7b-beta",
|
1182 |
+
|
1183 |
+
# Inflection modelleri
|
1184 |
+
"inflection/inflection-2",
|
1185 |
+
|
1186 |
+
# Cloudflare modelleri
|
1187 |
+
"cloudflare/workers-ai-mistral-7b",
|
1188 |
+
|
1189 |
+
# Hugging Face modelleri
|
1190 |
+
"huggingface/zephyr-7b-beta",
|
1191 |
+
|
1192 |
+
# Replicate modelleri
|
1193 |
+
"replicate/llama-2-70b-chat",
|
1194 |
+
|
1195 |
+
# Together AI modelleri
|
1196 |
+
"together/yi-34b-chat",
|
1197 |
+
"together/llama-2-7b-chat",
|
1198 |
+
|
1199 |
+
# Phind modelleri
|
1200 |
+
"phind/phind-codellama-34b",
|
1201 |
+
|
1202 |
+
# Teknium modelleri
|
1203 |
+
"teknium/openhermes-2.5-mistral-7b",
|
1204 |
+
|
1205 |
+
# Gryphe modelleri
|
1206 |
+
"gryphe/mythomist-7b",
|
1207 |
+
|
1208 |
+
# Neversleep modelleri
|
1209 |
+
"neversleep/llama-2-13b-chat-hf",
|
1210 |
+
|
1211 |
+
# Mancer modelleri
|
1212 |
+
"mancer/weaver",
|
1213 |
+
|
1214 |
+
# Openchat modelleri
|
1215 |
+
"openchat/openchat-7b",
|
1216 |
+
|
1217 |
+
# Cognitivecomputations modelleri
|
1218 |
+
"cognitivecomputations/dolphin-2.5-mixtral-8x7b",
|
1219 |
+
|
1220 |
+
# Nousresearch modelleri
|
1221 |
+
"nousresearch/nous-hermes-llama2-13b",
|
1222 |
+
|
1223 |
+
# Lizpreciatior modelleri
|
1224 |
+
"lizpreciatior/lzlv-70b-fp16-hf",
|
1225 |
+
|
1226 |
+
# Pygmalionai modelleri
|
1227 |
+
"pygmalionai/mythalion-13b",
|
1228 |
+
|
1229 |
+
# Undi95 modelleri
|
1230 |
+
"undi95/remm-slerp-l2-13b",
|
1231 |
+
|
1232 |
+
# Jondurbin modelleri
|
1233 |
+
"jondurbin/airoboros-l2-70b-gpt4-1.4.1",
|
1234 |
+
|
1235 |
+
# Migtissera modelleri
|
1236 |
+
"migtissera/synthia-70b",
|
1237 |
+
|
1238 |
+
# Alpindale modelleri
|
1239 |
+
"alpindale/goliath-120b",
|
1240 |
+
|
1241 |
+
# Koboldai modelleri
|
1242 |
+
"koboldai/psyfighter-13b-2",
|
1243 |
+
|
1244 |
+
# Ehartford modelleri
|
1245 |
+
"ehartford/samantha-1.2-mistral-7b",
|
1246 |
+
|
1247 |
+
# Austism modelleri
|
1248 |
+
"austism/chronos-hermes-13b",
|
1249 |
+
|
1250 |
+
# Openaccess-ai-collective modelleri
|
1251 |
+
"openaccess-ai-collective/manticore-13b-chat",
|
1252 |
+
|
1253 |
+
# Lmsys modelleri
|
1254 |
+
"lmsys/vicuna-13b-v1.5",
|
1255 |
+
|
1256 |
+
# Databricks modelleri
|
1257 |
+
"databricks/dolly-v2-12b",
|
1258 |
+
|
1259 |
+
# Stabilityai modelleri
|
1260 |
+
"stabilityai/stablelm-tuned-alpha-7b",
|
1261 |
+
|
1262 |
+
# Togethercomputer modelleri
|
1263 |
+
"togethercomputer/redpajama-incite-7b-chat",
|
1264 |
+
|
1265 |
+
# Rwkv modelleri
|
1266 |
+
"rwkv/rwkv-4-raven-14b",
|
1267 |
+
|
1268 |
+
# Cerebras modelleri
|
1269 |
+
"cerebras/cerebras-gpt-13b",
|
1270 |
+
|
1271 |
+
# Mosaicml modelleri
|
1272 |
+
"mosaicml/mpt-7b-chat",
|
1273 |
+
|
1274 |
+
# Bigscience modelleri
|
1275 |
+
"bigscience/bloom-7b1",
|
1276 |
+
|
1277 |
+
# Eleutherai modelleri
|
1278 |
+
"eleutherai/gpt-neox-20b",
|
1279 |
+
|
1280 |
+
# Tiiuae modelleri
|
1281 |
+
"tiiuae/falcon-7b-instruct",
|
1282 |
+
|
1283 |
+
# Writer modelleri
|
1284 |
+
"writer/palmyra-e",
|
1285 |
+
|
1286 |
+
# Alibaba modelleri
|
1287 |
+
"alibaba/qwen-7b-chat",
|
1288 |
+
|
1289 |
+
# 01-ai modelleri
|
1290 |
+
"01-ai/yi-6b-chat",
|
1291 |
+
|
1292 |
+
# Baichuan modelleri
|
1293 |
+
"baichuan/baichuan-13b-chat",
|
1294 |
+
|
1295 |
+
# Internlm modelleri
|
1296 |
+
"internlm/internlm-7b",
|
1297 |
+
|
1298 |
+
# Chatglm modelleri
|
1299 |
+
"chatglm/chatglm2-6b",
|
1300 |
+
|
1301 |
+
# Thudm modelleri
|
1302 |
+
"thudm/chatglm-6b",
|
1303 |
+
|
1304 |
+
# Zhipu modelleri
|
1305 |
+
"zhipu/chatglm3-6b",
|
1306 |
+
|
1307 |
+
# Moonshot modelleri
|
1308 |
+
"moonshot/moonshot-v1-8k",
|
1309 |
+
|
1310 |
+
# Deepinfra modelleri
|
1311 |
+
"deepinfra/mistral-7b",
|
1312 |
+
|
1313 |
+
# Deepseek modelleri
|
1314 |
+
"deepseek/deepseek-llm-7b-chat",
|
1315 |
+
|
1316 |
+
# Upstage modelleri
|
1317 |
+
"upstage/solar-10.7b-instruct",
|
1318 |
+
|
1319 |
+
# Snorkelai modelleri
|
1320 |
+
"snorkelai/snorkel-mistral-7b",
|
1321 |
+
|
1322 |
+
# Recursal modelleri
|
1323 |
+
"recursal/rwkv-5-3b-ai-town",
|
1324 |
+
|
1325 |
+
# Allenai modelleri
|
1326 |
+
"allenai/tulu-2-dpo-7b",
|
1327 |
+
|
1328 |
+
# Databricks modelleri
|
1329 |
+
"databricks/dbrx-instruct",
|
1330 |
+
|
1331 |
+
# Snowflake modelleri
|
1332 |
+
"snowflake/arctic",
|
1333 |
+
|
1334 |
+
# Adept modelleri
|
1335 |
+
"adept/persimmon-8b-base",
|
1336 |
+
|
1337 |
+
# Anyscale modelleri
|
1338 |
+
"anyscale/mistral-7b-instruct",
|
1339 |
+
|
1340 |
+
# Stability AI modelleri
|
1341 |
+
"stability/stable-code-3b",
|
1342 |
+
|
1343 |
+
# Fireworks modelleri
|
1344 |
+
"fireworks/firefunction-v1",
|
1345 |
+
|
1346 |
+
# Voyage modelleri
|
1347 |
+
"voyage/voyage-2",
|
1348 |
+
|
1349 |
+
# Groq modelleri
|
1350 |
+
"groq/llama-3-70b-8192",
|
1351 |
+
|
1352 |
+
# Reka modelleri
|
1353 |
+
"reka/reka-core",
|
1354 |
+
|
1355 |
+
# Quasar modelleri
|
1356 |
+
"quasar/quasar-alpha",
|
1357 |
+
|
1358 |
+
# Zypher modelleri
|
1359 |
+
"zypher/zypher-7b-beta",
|
1360 |
+
|
1361 |
+
# Inflection modelleri
|
1362 |
+
"inflection/inflection-2",
|
1363 |
+
|
1364 |
+
# Cloudflare modelleri
|
1365 |
+
"cloudflare/workers-ai-mistral-7b",
|
1366 |
+
|
1367 |
+
# Hugging Face modelleri
|
1368 |
+
"huggingface/zephyr-7b-beta",
|
1369 |
+
|
1370 |
+
# Replicate modelleri
|
1371 |
+
"replicate/llama-2-70b-chat",
|
1372 |
+
|
1373 |
+
# Together AI modelleri
|
1374 |
+
"together/yi-34b-chat",
|
1375 |
+
|
1376 |
+
# Phind modelleri
|
1377 |
+
"phind/phind-codellama-34b",
|
1378 |
+
|
1379 |
+
# Teknium modelleri
|
1380 |
+
"teknium/openhermes-2.5-mistral-7b",
|
1381 |
+
|
1382 |
+
# Gryphe modelleri
|
1383 |
+
"gryphe/mythomist-7b",
|
1384 |
+
|
1385 |
+
# Neversleep modelleri
|
1386 |
+
"neversleep/llama-2-13b-chat-hf",
|
1387 |
+
|
1388 |
+
# Mancer modelleri
|
1389 |
+
"mancer/weaver",
|
1390 |
+
|
1391 |
+
# Openchat modelleri
|
1392 |
+
"openchat/openchat-7b",
|
1393 |
+
|
1394 |
+
# Cognitivecomputations modelleri
|
1395 |
+
"cognitivecomputations/dolphin-2.5-mixtral-8x7b",
|
1396 |
+
|
1397 |
+
# Nousresearch modelleri
|
1398 |
+
"nousresearch/nous-hermes-llama2-13b",
|
1399 |
+
|
1400 |
+
# Lizpreciatior modelleri
|
1401 |
+
"lizpreciatior/lzlv-70b-fp16-hf",
|
1402 |
+
|
1403 |
+
# Pygmalionai modelleri
|
1404 |
+
"pygmalionai/mythalion-13b",
|
1405 |
+
|
1406 |
+
# Undi95 modelleri
|
1407 |
+
"undi95/remm-slerp-l2-13b",
|
1408 |
+
|
1409 |
+
# Jondurbin modelleri
|
1410 |
+
"jondurbin/airoboros-l2-70b-gpt4-1.4.1",
|
1411 |
+
|
1412 |
+
# Migtissera modelleri
|
1413 |
+
"migtissera/synthia-70b",
|
1414 |
+
|
1415 |
+
# Alpindale modelleri
|
1416 |
+
"alpindale/goliath-120b",
|
1417 |
+
|
1418 |
+
# Koboldai modelleri
|
1419 |
+
"koboldai/psyfighter-13b-2",
|
1420 |
+
|
1421 |
+
# Ehartford modelleri
|
1422 |
+
"ehartford/samantha-1.2-mistral-7b",
|
1423 |
+
|
1424 |
+
# Austism modelleri
|
1425 |
+
"austism/chronos-hermes-13b",
|
1426 |
+
|
1427 |
+
# Openaccess-ai-collective modelleri
|
1428 |
+
"openaccess-ai-collective/manticore-13b-chat",
|
1429 |
+
|
1430 |
+
# Lmsys modelleri
|
1431 |
+
"lmsys/vicuna-13b-v1.5",
|
1432 |
+
|
1433 |
+
# Databricks modelleri
|
1434 |
+
"databricks/dolly-v2-12b",
|
1435 |
+
|
1436 |
+
# Stabilityai modelleri
|
1437 |
+
"stabilityai/stablelm-tuned-alpha-7b",
|
1438 |
+
|
1439 |
+
# Togethercomputer modelleri
|
1440 |
+
"togethercomputer/redpajama-incite-7b-chat",
|
1441 |
+
|
1442 |
+
# Rwkv modelleri
|
1443 |
+
"rwkv/rwkv-4-raven-14b",
|
1444 |
+
|
1445 |
+
# Cerebras modelleri
|
1446 |
+
"cerebras/cerebras-gpt-13b",
|
1447 |
+
|
1448 |
+
# Mosaicml modelleri
|
1449 |
+
"mosaicml/mpt-7b-chat",
|
1450 |
+
|
1451 |
+
# Bigscience modelleri
|
1452 |
+
"bigscience/bloom-7b1",
|
1453 |
+
|
1454 |
+
# Eleutherai modelleri
|
1455 |
+
"eleutherai/gpt-neox-20b",
|
1456 |
+
|
1457 |
+
# Tiiuae modelleri
|
1458 |
+
"tiiuae/falcon-7b-instruct",
|
1459 |
+
|
1460 |
+
# Writer modelleri
|
1461 |
+
"writer/palmyra-e",
|
1462 |
+
|
1463 |
+
# Alibaba modelleri
|
1464 |
+
"alibaba/qwen-7b-chat",
|
1465 |
+
|
1466 |
+
# 01-ai modelleri
|
1467 |
+
"01-ai/yi-6b-chat",
|
1468 |
+
|
1469 |
+
# Baichuan modelleri
|
1470 |
+
"baichuan/baichuan-13b-chat",
|
1471 |
+
|
1472 |
+
# Internlm modelleri
|
1473 |
+
"internlm/internlm-7b",
|
1474 |
+
|
1475 |
+
# Chatglm modelleri
|
1476 |
+
"chatglm/chatglm2-6b",
|
1477 |
+
|
1478 |
+
# Thudm modelleri
|
1479 |
+
"thudm/chatglm-6b",
|
1480 |
+
|
1481 |
+
# Zhipu modelleri
|
1482 |
+
"zhipu/chatglm3-6b",
|
1483 |
+
|
1484 |
+
# Moonshot modelleri
|
1485 |
+
"moonshot/moonshot-v1-8k"
|
1486 |
+
]
|
1487 |
+
|
1488 |
+
# Prompt oluşturma fonksiyonu
|
1489 |
+
def create_prompt(category, params):
|
1490 |
+
"""
|
1491 |
+
Belirli bir kategori ve parametreler için prompt oluşturur.
|
1492 |
+
|
1493 |
+
Args:
|
1494 |
+
category (str): Prompt kategorisi
|
1495 |
+
params (dict): Prompt parametreleri
|
1496 |
+
|
1497 |
+
Returns:
|
1498 |
+
str: Oluşturulan prompt
|
1499 |
+
"""
|
1500 |
+
if category not in PROMPT_TEMPLATES:
|
1501 |
+
return "Geçersiz kategori. Lütfen geçerli bir kategori seçin."
|
1502 |
+
|
1503 |
+
template = PROMPT_TEMPLATES[category]
|
1504 |
+
|
1505 |
+
# Eksik parametreler için varsayılan değerler
|
1506 |
+
for key in [k for k in params.keys() if params[k] is None or params[k] == ""]:
|
1507 |
+
params[key] = "Belirtilmemiş"
|
1508 |
+
|
1509 |
+
# Format string ile prompt oluştur
|
1510 |
+
try:
|
1511 |
+
prompt = template.format(**params)
|
1512 |
+
return prompt
|
1513 |
+
except KeyError as e:
|
1514 |
+
return f"Eksik parametre: {e}"
|
1515 |
+
except Exception as e:
|
1516 |
+
return f"Prompt oluşturulurken hata oluştu: {e}"
|
1517 |
+
|
1518 |
+
# Prompt kategorisini tahmin etme fonksiyonu
|
1519 |
+
def predict_category(user_input):
|
1520 |
+
"""
|
1521 |
+
Kullanıcı girdisine göre en uygun prompt kategorisini tahmin eder.
|
1522 |
+
|
1523 |
+
Args:
|
1524 |
+
user_input (str): Kullanıcı girdisi
|
1525 |
+
|
1526 |
+
Returns:
|
1527 |
+
str: Tahmini prompt kategorisi
|
1528 |
+
"""
|
1529 |
+
# Basit anahtar kelime tabanlı kategori tahmini
|
1530 |
+
keywords = {
|
1531 |
+
"web_development": ["web", "site", "website", "html", "css", "javascript", "frontend", "backend", "responsive", "sayfa"],
|
1532 |
+
"mobile_app": ["mobil", "uygulama", "app", "android", "ios", "flutter", "react native", "swift", "kotlin"],
|
1533 |
+
"data_analysis": ["veri", "analiz", "data", "analysis", "istatistik", "statistics", "analitik", "analytics"],
|
1534 |
+
"data_visualization": ["görselleştirme", "visualization", "dashboard", "grafik", "chart", "veri görselleştirme", "data viz"],
|
1535 |
+
"ml_model": ["makine öğrenmesi", "machine learning", "model", "yapay zeka", "ai", "artificial intelligence", "tahmin", "prediction", "sınıflandırma", "classification"],
|
1536 |
+
"deep_learning": ["derin öğrenme", "deep learning", "neural network", "sinir ağı", "cnn", "rnn", "lstm", "transformer"],
|
1537 |
+
"content_creation": ["içerik", "yazı", "blog", "makale", "article", "sosyal medya", "social media", "metin", "text", "pazarlama", "marketing"],
|
1538 |
+
"game_development": ["oyun", "game", "unity", "unreal", "2d", "3d", "oyun geliştirme", "game dev"],
|
1539 |
+
"education": ["eğitim", "education", "öğretim", "teaching", "kurs", "course", "öğrenme", "learning"],
|
1540 |
+
"finance": ["finans", "finance", "finansal", "financial", "yatırım", "investment", "bütçe", "budget"],
|
1541 |
+
"automation": ["otomasyon", "automation", "bot", "script", "workflow", "iş akışı"],
|
1542 |
+
"cybersecurity": ["güvenlik", "security", "siber", "cyber", "hack", "sızma", "penetration", "güvenlik duvarı", "firewall"],
|
1543 |
+
"devops": ["devops", "ci/cd", "pipeline", "deployment", "docker", "kubernetes", "container"],
|
1544 |
+
"iot": ["iot", "nesnelerin interneti", "internet of things", "sensör", "sensor", "arduino", "raspberry pi"],
|
1545 |
+
"cloud_computing": ["bulut", "cloud", "aws", "azure", "gcp", "serverless", "saas", "paas", "iaas"],
|
1546 |
+
"blockchain": ["blockchain", "blok zinciri", "crypto", "kripto", "nft", "token", "smart contract", "akıllı sözleşme"],
|
1547 |
+
"ai_research": ["ai research", "yapay zeka araştırması", "ai paper", "research", "araştırma", "paper", "makale"],
|
1548 |
+
"seo": ["seo", "search engine optimization", "arama motoru optimizasyonu", "google", "ranking", "sıralama"],
|
1549 |
+
"social_media": ["sosyal medya", "social media", "instagram", "twitter", "facebook", "linkedin", "tiktok"],
|
1550 |
+
"e_commerce": ["e-ticaret", "ecommerce", "online satış", "online sales", "shopify", "woocommerce", "magento"],
|
1551 |
+
"digital_marketing": ["dijital pazarlama", "digital marketing", "online marketing", "çevrimiçi pazarlama", "ads", "reklamlar"]
|
1552 |
+
}
|
1553 |
+
|
1554 |
+
# Kullanıcı girdisini küçük harfe çevir
|
1555 |
+
user_input_lower = user_input.lower()
|
1556 |
+
|
1557 |
+
# Her kategori için eşleşen anahtar kelime sayısını hesapla
|
1558 |
+
category_scores = {}
|
1559 |
+
for category, category_keywords in keywords.items():
|
1560 |
+
score = sum(1 for keyword in category_keywords if keyword in user_input_lower)
|
1561 |
+
category_scores[category] = score
|
1562 |
+
|
1563 |
+
# En yüksek skora sahip kategoriyi bul
|
1564 |
+
max_score = max(category_scores.values())
|
1565 |
+
if max_score > 0:
|
1566 |
+
for category, score in category_scores.items():
|
1567 |
+
if score == max_score:
|
1568 |
+
return category
|
1569 |
+
|
1570 |
+
# Eşleşme bulunamazsa genel kategoriyi döndür
|
1571 |
+
return "general"
|
1572 |
+
|
1573 |
+
# Kullanıcı girdisinden parametreleri çıkarma fonksiyonu
|
1574 |
+
def extract_parameters(category, user_input):
|
1575 |
+
"""
|
1576 |
+
Kullanıcı girdisinden prompt parametrelerini çıkarır.
|
1577 |
+
|
1578 |
+
Args:
|
1579 |
+
category (str): Prompt kategorisi
|
1580 |
+
user_input (str): Kullanıcı girdisi
|
1581 |
+
|
1582 |
+
Returns:
|
1583 |
+
dict: Çıkarılan parametreler
|
1584 |
+
"""
|
1585 |
+
# Kullanıcı girdisini küçük harfe çevir (arama için)
|
1586 |
+
user_input_lower = user_input.lower()
|
1587 |
+
|
1588 |
+
# Kategori bazlı parametre çıkarma
|
1589 |
+
if category == "web_development":
|
1590 |
+
# Varsayılan frontend teknolojisi
|
1591 |
+
frontend_tech = "HTML, CSS, JavaScript"
|
1592 |
+
|
1593 |
+
# Özel teknolojileri kontrol et
|
1594 |
+
if "bootstrap" in user_input_lower:
|
1595 |
+
frontend_tech += ", Bootstrap"
|
1596 |
+
if "react" in user_input_lower:
|
1597 |
+
frontend_tech += ", React"
|
1598 |
+
if "vue" in user_input_lower:
|
1599 |
+
frontend_tech += ", Vue.js"
|
1600 |
+
if "angular" in user_input_lower:
|
1601 |
+
frontend_tech += ", Angular"
|
1602 |
+
if "tailwind" in user_input_lower:
|
1603 |
+
frontend_tech += ", Tailwind CSS"
|
1604 |
+
|
1605 |
+
# Backend teknolojisini kontrol et
|
1606 |
+
backend_tech = "Belirtilmemiş"
|
1607 |
+
if "node" in user_input_lower or "express" in user_input_lower:
|
1608 |
+
backend_tech = "Node.js/Express.js"
|
1609 |
+
elif "php" in user_input_lower:
|
1610 |
+
backend_tech = "PHP"
|
1611 |
+
elif "python" in user_input_lower or "django" in user_input_lower or "flask" in user_input_lower:
|
1612 |
+
backend_tech = "Python (Django/Flask)"
|
1613 |
+
elif "ruby" in user_input_lower or "rails" in user_input_lower:
|
1614 |
+
backend_tech = "Ruby on Rails"
|
1615 |
+
elif "java" in user_input_lower or "spring" in user_input_lower:
|
1616 |
+
backend_tech = "Java (Spring)"
|
1617 |
+
elif "c#" in user_input_lower or "asp.net" in user_input_lower:
|
1618 |
+
backend_tech = "ASP.NET"
|
1619 |
+
|
1620 |
+
# Veritabanı teknolojisini kontrol et
|
1621 |
+
database = "Belirtilmemiş"
|
1622 |
+
if "mysql" in user_input_lower:
|
1623 |
+
database = "MySQL"
|
1624 |
+
elif "postgresql" in user_input_lower or "postgres" in user_input_lower:
|
1625 |
+
database = "PostgreSQL"
|
1626 |
+
elif "mongodb" in user_input_lower or "mongo" in user_input_lower:
|
1627 |
+
database = "MongoDB"
|
1628 |
+
elif "sql server" in user_input_lower or "sqlserver" in user_input_lower:
|
1629 |
+
database = "SQL Server"
|
1630 |
+
elif "sqlite" in user_input_lower:
|
1631 |
+
database = "SQLite"
|
1632 |
+
elif "firebase" in user_input_lower:
|
1633 |
+
database = "Firebase"
|
1634 |
+
|
1635 |
+
params = {
|
1636 |
+
"project_description": user_input,
|
1637 |
+
"frontend_tech": frontend_tech,
|
1638 |
+
"backend_tech": backend_tech,
|
1639 |
+
"database": database,
|
1640 |
+
"target_devices": "Masaüstü ve Mobil",
|
1641 |
+
"design_preferences": "Modern, kullanıcı dostu arayüz",
|
1642 |
+
"features": "- Kullanıcı dostu arayüz\n- Responsive tasarım\n- Hızlı yükleme süresi",
|
1643 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1644 |
+
}
|
1645 |
+
|
1646 |
+
elif category == "mobile_app":
|
1647 |
+
params = {
|
1648 |
+
"project_description": user_input,
|
1649 |
+
"app_type": "Cross-platform",
|
1650 |
+
"platforms": "iOS ve Android",
|
1651 |
+
"framework": "React Native veya Flutter",
|
1652 |
+
"backend_requirements": "Belirtilmemiş",
|
1653 |
+
"target_audience": "Genel kullanıcılar",
|
1654 |
+
"features": "- Kullanıcı kaydı ve girişi\n- Ana işlevsellik\n- Bildirimler",
|
1655 |
+
"ui_requirements": "Modern ve sezgisel kullanıcı arayüzü",
|
1656 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1657 |
+
}
|
1658 |
+
|
1659 |
+
elif category == "data_analysis":
|
1660 |
+
params = {
|
1661 |
+
"project_description": user_input,
|
1662 |
+
"data_format": "CSV veya Excel",
|
1663 |
+
"data_size": "Belirtilmemiş",
|
1664 |
+
"data_source": "Belirtilmemiş",
|
1665 |
+
"time_range": "Belirtilmemiş",
|
1666 |
+
"analysis_goals": "Veri içindeki temel eğilimleri ve ilişkileri keşfetmek",
|
1667 |
+
"required_analyses": "- Tanımlayıcı istatistikler\n- Korelasyon analizi\n- Zaman serisi analizi (uygunsa)",
|
1668 |
+
"visualization_requirements": "Temel grafikler ve interaktif dashboard",
|
1669 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1670 |
+
}
|
1671 |
+
|
1672 |
+
elif category == "data_visualization":
|
1673 |
+
params = {
|
1674 |
+
"project_description": user_input,
|
1675 |
+
"data_format": "CSV veya Excel",
|
1676 |
+
"data_size": "Belirtilmemiş",
|
1677 |
+
"data_source": "Belirtilmemiş",
|
1678 |
+
"data_type": "Belirtilmemiş",
|
1679 |
+
"visualization_goals": "Veri içindeki temel eğilimleri ve ilişkileri görsel olarak sunmak",
|
1680 |
+
"required_visualizations": "- Çizgi ve çubuk grafikleri\n- Dağılım grafikleri\n- Interaktif dashboard",
|
1681 |
+
"design_requirements": "Sade, anlaşılır ve profesyonel tasarım",
|
1682 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1683 |
+
}
|
1684 |
+
|
1685 |
+
elif category == "ml_model":
|
1686 |
+
params = {
|
1687 |
+
"project_description": user_input,
|
1688 |
+
"problem_type": "Belirtilmemiş",
|
1689 |
+
"dataset_features": "Belirtilmemiş",
|
1690 |
+
"target_variable": "Belirtilmemiş",
|
1691 |
+
"evaluation_metrics": "Belirtilmemiş",
|
1692 |
+
"model_requirements": "Belirtilmemiş",
|
1693 |
+
"preprocessing_steps": "Belirtilmemiş",
|
1694 |
+
"deployment_requirements": "Belirtilmemiş",
|
1695 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1696 |
+
}
|
1697 |
+
|
1698 |
+
elif category == "deep_learning":
|
1699 |
+
params = {
|
1700 |
+
"project_description": user_input,
|
1701 |
+
"problem_type": "Belirtilmemiş",
|
1702 |
+
"dataset_features": "Belirtilmemiş",
|
1703 |
+
"data_size": "Belirtilmemiş",
|
1704 |
+
"evaluation_metrics": "Doğruluk, Kesinlik, Duyarlılık, F1-skoru",
|
1705 |
+
"model_requirements": "- Yüksek doğruluk\n- Verimli eğitim süresi\n- Hızlı çıkarım süresi",
|
1706 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1707 |
+
}
|
1708 |
+
|
1709 |
+
elif category == "content_creation":
|
1710 |
+
params = {
|
1711 |
+
"content_description": user_input,
|
1712 |
+
"content_format": "Blog yazısı",
|
1713 |
+
"content_length": "1000-1500 kelime",
|
1714 |
+
"tone": "Bilgilendirici ve samimi",
|
1715 |
+
"target_audience": "Genel okuyucular",
|
1716 |
+
"content_goals": "Bilgilendirmek ve ilgi çekmek",
|
1717 |
+
"key_points": "Kullanıcı girdisinden çıkarılacak",
|
1718 |
+
"keywords": "Belirtilmemiş",
|
1719 |
+
"meta_description": "Belirtilmemiş",
|
1720 |
+
"references": "Güvenilir kaynaklar kullanılmalıdır",
|
1721 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1722 |
+
}
|
1723 |
+
|
1724 |
+
elif category == "game_development":
|
1725 |
+
params = {
|
1726 |
+
"project_description": user_input,
|
1727 |
+
"game_type": "Belirtilmemiş",
|
1728 |
+
"platform": "PC",
|
1729 |
+
"game_engine": "Unity veya Unreal Engine",
|
1730 |
+
"graphic_style": "Belirtilmemiş",
|
1731 |
+
"target_audience": "Genel oyuncular",
|
1732 |
+
"game_mechanics": "Belirtilmemiş",
|
1733 |
+
"character_world_design": "Belirtilmemiş",
|
1734 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1735 |
+
}
|
1736 |
+
|
1737 |
+
elif category == "education":
|
1738 |
+
params = {
|
1739 |
+
"project_description": user_input,
|
1740 |
+
"subject": "Belirtilmemiş",
|
1741 |
+
"target_audience": "Belirtilmemiş",
|
1742 |
+
"difficulty_level": "Orta",
|
1743 |
+
"format": "Metin ve görsel",
|
1744 |
+
"duration_length": "Belirtilmemiş",
|
1745 |
+
"learning_objectives": "Belirtilmemiş",
|
1746 |
+
"content_structure": "Belirtilmemiş",
|
1747 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1748 |
+
}
|
1749 |
+
|
1750 |
+
elif category == "finance":
|
1751 |
+
params = {
|
1752 |
+
"project_description": user_input,
|
1753 |
+
"data_type": "Belirtilmemiş",
|
1754 |
+
"data_source": "Belirtilmemiş",
|
1755 |
+
"time_range": "Belirtilmemiş",
|
1756 |
+
"analysis_scope": "Belirtilmemiş",
|
1757 |
+
"analysis_objectives": "Belirtilmemiş",
|
1758 |
+
"required_analyses": "Belirtilmemiş",
|
1759 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1760 |
+
}
|
1761 |
+
|
1762 |
+
elif category == "automation":
|
1763 |
+
params = {
|
1764 |
+
"project_description": user_input,
|
1765 |
+
"automation_type": "Belirtilmemiş",
|
1766 |
+
"existing_systems": "Belirtilmemiş",
|
1767 |
+
"target_platforms": "Belirtilmemiş",
|
1768 |
+
"user_interaction": "Belirtilmemiş",
|
1769 |
+
"automation_objectives": "Belirtilmemiş",
|
1770 |
+
"workflow_details": "Belirtilmemiş",
|
1771 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1772 |
+
}
|
1773 |
+
|
1774 |
+
elif category == "cybersecurity":
|
1775 |
+
params = {
|
1776 |
+
"project_description": user_input,
|
1777 |
+
"security_domain": "Belirtilmemiş",
|
1778 |
+
"target_systems": "Belirtilmemiş",
|
1779 |
+
"threat_model": "Belirtilmemiş",
|
1780 |
+
"compliance_requirements": "Belirtilmemiş",
|
1781 |
+
"security_objectives": "Belirtilmemiş",
|
1782 |
+
"current_security_state": "Belirtilmemiş",
|
1783 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1784 |
+
}
|
1785 |
+
|
1786 |
+
elif category == "devops":
|
1787 |
+
params = {
|
1788 |
+
"project_description": user_input,
|
1789 |
+
"infrastructure_type": "Belirtilmemiş",
|
1790 |
+
"technology_stack": "Belirtilmemiş",
|
1791 |
+
"scaling_requirements": "Belirtilmemiş",
|
1792 |
+
"cicd_requirements": "Belirtilmemiş",
|
1793 |
+
"devops_objectives": "Belirtilmemiş",
|
1794 |
+
"current_infrastructure": "Belirtilmemiş",
|
1795 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1796 |
+
}
|
1797 |
+
|
1798 |
+
elif category == "iot":
|
1799 |
+
params = {
|
1800 |
+
"project_description": user_input,
|
1801 |
+
"device_types": "Belirtilmemiş",
|
1802 |
+
"connectivity_requirements": "Belirtilmemiş",
|
1803 |
+
"data_processing_requirements": "Belirtilmemiş",
|
1804 |
+
"security_requirements": "Belirtilmemiş",
|
1805 |
+
"iot_objectives": "Belirtilmemiş",
|
1806 |
+
"system_architecture": "Belirtilmemiş",
|
1807 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1808 |
+
}
|
1809 |
+
|
1810 |
+
elif category == "cloud_computing":
|
1811 |
+
params = {
|
1812 |
+
"project_description": user_input,
|
1813 |
+
"cloud_provider": "Belirtilmemiş",
|
1814 |
+
"service_model": "Belirtilmemiş",
|
1815 |
+
"scaling_requirements": "Belirtilmemiş",
|
1816 |
+
"budget_constraints": "Belirtilmemiş",
|
1817 |
+
"cloud_objectives": "Belirtilmemiş",
|
1818 |
+
"current_infrastructure": "Belirtilmemiş",
|
1819 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1820 |
+
}
|
1821 |
+
|
1822 |
+
elif category == "blockchain":
|
1823 |
+
params = {
|
1824 |
+
"project_description": user_input,
|
1825 |
+
"blockchain_type": "Belirtilmemiş",
|
1826 |
+
"consensus_mechanism": "Belirtilmemiş",
|
1827 |
+
"smart_contract_requirements": "Belirtilmemiş",
|
1828 |
+
"scaling_requirements": "Belirtilmemiş",
|
1829 |
+
"blockchain_objectives": "Belirtilmemiş",
|
1830 |
+
"use_cases": "Belirtilmemiş",
|
1831 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1832 |
+
}
|
1833 |
+
|
1834 |
+
elif category == "ai_research":
|
1835 |
+
params = {
|
1836 |
+
"research_description": user_input,
|
1837 |
+
"ai_subfield": "Belirtilmemiş",
|
1838 |
+
"research_type": "Belirtilmemiş",
|
1839 |
+
"literature_state": "Belirtilmemiş",
|
1840 |
+
"research_questions": "Belirtilmemiş",
|
1841 |
+
"research_objectives": "Belirtilmemiş",
|
1842 |
+
"methodology": "Belirtilmemiş",
|
1843 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1844 |
+
}
|
1845 |
+
|
1846 |
+
elif category == "seo":
|
1847 |
+
params = {
|
1848 |
+
"project_description": user_input,
|
1849 |
+
"website_type": "Belirtilmemiş",
|
1850 |
+
"target_keywords": "Belirtilmemiş",
|
1851 |
+
"target_market": "Belirtilmemiş",
|
1852 |
+
"competition_analysis": "Belirtilmemiş",
|
1853 |
+
"seo_objectives": "Belirtilmemiş",
|
1854 |
+
"current_seo_state": "Belirtilmemiş",
|
1855 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1856 |
+
}
|
1857 |
+
|
1858 |
+
elif category == "social_media":
|
1859 |
+
params = {
|
1860 |
+
"project_description": user_input,
|
1861 |
+
"platforms": "Belirtilmemiş",
|
1862 |
+
"target_audience": "Belirtilmemiş",
|
1863 |
+
"brand_voice": "Belirtilmemiş",
|
1864 |
+
"content_types": "Belirtilmemiş",
|
1865 |
+
"social_media_objectives": "Belirtilmemiş",
|
1866 |
+
"current_social_media_presence": "Belirtilmemiş",
|
1867 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1868 |
+
}
|
1869 |
+
|
1870 |
+
elif category == "e_commerce":
|
1871 |
+
params = {
|
1872 |
+
"project_description": user_input,
|
1873 |
+
"platform": "Belirtilmemiş",
|
1874 |
+
"product_types": "Belirtilmemiş",
|
1875 |
+
"payment_methods": "Belirtilmemiş",
|
1876 |
+
"logistics_requirements": "Belirtilmemiş",
|
1877 |
+
"ecommerce_objectives": "Belirtilmemiş",
|
1878 |
+
"current_ecommerce_state": "Belirtilmemiş",
|
1879 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1880 |
+
}
|
1881 |
+
|
1882 |
+
elif category == "digital_marketing":
|
1883 |
+
params = {
|
1884 |
+
"project_description": user_input,
|
1885 |
+
"marketing_channels": "Belirtilmemiş",
|
1886 |
+
"target_audience": "Belirtilmemiş",
|
1887 |
+
"budget": "Belirtilmemiş",
|
1888 |
+
"campaign_duration": "Belirtilmemiş",
|
1889 |
+
"marketing_objectives": "Belirtilmemiş",
|
1890 |
+
"current_marketing_state": "Belirtilmemiş",
|
1891 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1892 |
+
}
|
1893 |
+
|
1894 |
+
elif category == "script":
|
1895 |
+
# Senaryo formatını kontrol et
|
1896 |
+
script_format = "Belirtilmemiş"
|
1897 |
+
if "film" in user_input_lower:
|
1898 |
+
script_format = "Film"
|
1899 |
+
elif "dizi" in user_input_lower:
|
1900 |
+
script_format = "Dizi"
|
1901 |
+
elif "reklam" in user_input_lower:
|
1902 |
+
script_format = "Reklam"
|
1903 |
+
elif "youtube" in user_input_lower:
|
1904 |
+
script_format = "YouTube"
|
1905 |
+
elif "podcast" in user_input_lower:
|
1906 |
+
script_format = "Podcast"
|
1907 |
+
elif "eğitim" in user_input_lower or "video" in user_input_lower:
|
1908 |
+
script_format = "Eğitim Videosu"
|
1909 |
+
|
1910 |
+
# Tonunu kontrol et
|
1911 |
+
tone = "Bilgilendirici"
|
1912 |
+
if "komedi" in user_input_lower or "komik" in user_input_lower or "eğlenceli" in user_input_lower:
|
1913 |
+
tone = "Komedi"
|
1914 |
+
elif "drama" in user_input_lower or "dramatik" in user_input_lower:
|
1915 |
+
tone = "Drama"
|
1916 |
+
elif "aksiyon" in user_input_lower:
|
1917 |
+
tone = "Aksiyon"
|
1918 |
+
elif "ikna" in user_input_lower:
|
1919 |
+
tone = "İkna Edici"
|
1920 |
+
elif "duygusal" in user_input_lower:
|
1921 |
+
tone = "Duygusal"
|
1922 |
+
|
1923 |
+
params = {
|
1924 |
+
"project_description": user_input,
|
1925 |
+
"script_format": script_format,
|
1926 |
+
"duration": "Belirtilmemiş",
|
1927 |
+
"target_audience": "Genel izleyici",
|
1928 |
+
"tone": tone,
|
1929 |
+
"script_objectives": "İzleyicileri bilgilendirmek ve ilgilerini çekmek",
|
1930 |
+
"content_requirements": "Senaryoda ana konu net bir şekilde açıklanmalı ve hedef kitleye uygun dil kullanılmalıdır.",
|
1931 |
+
"character_details": "Karakterler kullanıcı girdisinden çıkarılacak",
|
1932 |
+
"technical_requirements": "Standart senaryo formatı kullanılmalıdır.",
|
1933 |
+
"references": "Kullanıcı tarafından belirtilmemiştir.",
|
1934 |
+
"additional_notes": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1935 |
+
}
|
1936 |
+
|
1937 |
+
else: # general
|
1938 |
+
params = {
|
1939 |
+
"task_description": user_input,
|
1940 |
+
"requirements": "Kullanıcı girdisinden çıkarılacak",
|
1941 |
+
"expected_output": "Detaylı ve kapsamlı bir çözüm",
|
1942 |
+
"constraints": "Belirtilmemiş",
|
1943 |
+
"step_1": "Problemi analiz et",
|
1944 |
+
"step_2": "Çözüm stratejisi geliştir",
|
1945 |
+
"step_3": "Adım adım uygula",
|
1946 |
+
"additional_info": "Kullanıcı tarafından ek bilgi sağlanmamıştır."
|
1947 |
+
}
|
1948 |
+
|
1949 |
+
return params
|
1950 |
+
|
1951 |
+
# Kullanıcı girdisinden gelişmiş prompt oluşturma
|
1952 |
+
def generate_advanced_prompt(user_input):
|
1953 |
+
"""
|
1954 |
+
Kullanıcı girdisinden gelişmiş bir prompt oluşturur.
|
1955 |
+
|
1956 |
+
Args:
|
1957 |
+
user_input (str): Kullanıcı girdisi
|
1958 |
+
|
1959 |
+
Returns:
|
1960 |
+
str: Oluşturulan gelişmiş prompt
|
1961 |
+
"""
|
1962 |
+
# Kategori tahmini
|
1963 |
+
category = predict_category(user_input)
|
1964 |
+
|
1965 |
+
# Script/senaryo anahtar kelimelerini kontrol et
|
1966 |
+
user_input_lower = user_input.lower()
|
1967 |
+
if "senaryo" in user_input_lower or "script" in user_input_lower or "film" in user_input_lower or "dizi" in user_input_lower or "reklam script" in user_input_lower:
|
1968 |
+
category = "script"
|
1969 |
+
|
1970 |
+
# Parametreleri çıkar
|
1971 |
+
params = extract_parameters(category, user_input)
|
1972 |
+
|
1973 |
+
# Prompt oluştur
|
1974 |
+
prompt = create_prompt(category, params)
|
1975 |
+
|
1976 |
+
return prompt, category, params
|
requirements.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
streamlit==1.44.1
|
2 |
+
openai==1.72.0
|
3 |
+
google-generativeai==0.8.4
|
4 |
+
requests==2.31.0
|
5 |
+
python-dotenv==1.1.0
|
6 |
+
matplotlib==3.8.4
|
streamlit_ui.py
ADDED
@@ -0,0 +1,1418 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Streamlit UI için modül.
|
3 |
+
Bu modül, Streamlit kullanarak web arayüzünü oluşturur.
|
4 |
+
"""
|
5 |
+
|
6 |
+
import streamlit as st
|
7 |
+
import os
|
8 |
+
from typing import Dict, Any, Optional, List
|
9 |
+
import json
|
10 |
+
import pandas as pd
|
11 |
+
import re
|
12 |
+
from pathlib import Path
|
13 |
+
from dotenv import load_dotenv, set_key, find_dotenv
|
14 |
+
import io
|
15 |
+
import time
|
16 |
+
import base64
|
17 |
+
import numpy as np
|
18 |
+
import matplotlib.pyplot as plt
|
19 |
+
|
20 |
+
# Kendi modüllerimizi içe aktar
|
21 |
+
from prompt_templates import PROMPT_CATEGORIES
|
22 |
+
from chatbot_backend import chatbot, ai_interface
|
23 |
+
from api_integrations import (
|
24 |
+
api_manager,
|
25 |
+
openai_handler,
|
26 |
+
gemini_handler,
|
27 |
+
openrouter_handler
|
28 |
+
)
|
29 |
+
|
30 |
+
# API anahtarlarını yönetmek için fonksiyonlar
|
31 |
+
def save_api_keys_to_env(api_keys: Dict[str, str]) -> bool:
|
32 |
+
"""
|
33 |
+
API anahtarlarını .env dosyasına kaydeder.
|
34 |
+
|
35 |
+
Args:
|
36 |
+
api_keys (Dict[str, str]): API anahtarları sözlüğü
|
37 |
+
|
38 |
+
Returns:
|
39 |
+
bool: İşlem başarılıysa True, değilse False
|
40 |
+
"""
|
41 |
+
try:
|
42 |
+
# .env dosyasının yolunu bul
|
43 |
+
dotenv_path = find_dotenv()
|
44 |
+
|
45 |
+
# .env dosyası yoksa, proje dizininde oluştur
|
46 |
+
if not dotenv_path:
|
47 |
+
dotenv_path = os.path.join(os.getcwd(), ".env")
|
48 |
+
# UTF-8 olarak yeni dosya oluştur
|
49 |
+
with open(dotenv_path, "w", encoding="utf-8") as f:
|
50 |
+
f.write("# API Anahtarları\n")
|
51 |
+
|
52 |
+
# Mevcut .env dosyasını oku
|
53 |
+
env_content = {}
|
54 |
+
try:
|
55 |
+
# Varolan dosya varsa içeriğini oku
|
56 |
+
if os.path.exists(dotenv_path):
|
57 |
+
with open(dotenv_path, "r", encoding="utf-8") as f:
|
58 |
+
lines = f.readlines()
|
59 |
+
|
60 |
+
# Mevcut içeriği dictionary'ye dönüştür
|
61 |
+
for line in lines:
|
62 |
+
line = line.strip()
|
63 |
+
if line and not line.startswith("#") and "=" in line:
|
64 |
+
key, value = line.split("=", 1)
|
65 |
+
env_content[key.strip()] = value.strip().strip('"\'')
|
66 |
+
except UnicodeDecodeError:
|
67 |
+
# UTF-8 okunamıyorsa Latin-1 ile dene
|
68 |
+
with open(dotenv_path, "r", encoding="latin-1") as f:
|
69 |
+
lines = f.readlines()
|
70 |
+
|
71 |
+
# Mevcut içeriği dictionary'ye dönüştür
|
72 |
+
for line in lines:
|
73 |
+
line = line.strip()
|
74 |
+
if line and not line.startswith("#") and "=" in line:
|
75 |
+
key, value = line.split("=", 1)
|
76 |
+
env_content[key.strip()] = value.strip().strip('"\'')
|
77 |
+
|
78 |
+
# API anahtarlarını env_content sözlüğüne ekle
|
79 |
+
for key, value in api_keys.items():
|
80 |
+
if key == "openai" and value:
|
81 |
+
env_content["OPENAI_API_KEY"] = value
|
82 |
+
elif key == "gemini" and value:
|
83 |
+
env_content["GEMINI_API_KEY"] = value
|
84 |
+
elif key == "openrouter" and value:
|
85 |
+
env_content["OPENROUTER_API_KEY"] = value
|
86 |
+
|
87 |
+
# .env dosyasını yeniden oluştur
|
88 |
+
with open(dotenv_path, "w", encoding="utf-8") as f:
|
89 |
+
f.write("# API Anahtarları\n")
|
90 |
+
for key, value in env_content.items():
|
91 |
+
f.write(f"{key}={value}\n")
|
92 |
+
|
93 |
+
return True
|
94 |
+
except Exception as e:
|
95 |
+
st.error(f"API anahtarları kaydedilirken hata oluştu: {str(e)}")
|
96 |
+
return False
|
97 |
+
|
98 |
+
def load_api_keys_from_env() -> Dict[str, str]:
|
99 |
+
"""
|
100 |
+
API anahtarlarını .env dosyasından yükler.
|
101 |
+
|
102 |
+
Returns:
|
103 |
+
Dict[str, str]: API anahtarları sözlüğü
|
104 |
+
"""
|
105 |
+
try:
|
106 |
+
# .env dosyasının yolunu bul
|
107 |
+
dotenv_path = find_dotenv()
|
108 |
+
|
109 |
+
# API anahtarlarını içeren sözlük
|
110 |
+
api_keys = {
|
111 |
+
"openai": "",
|
112 |
+
"gemini": "",
|
113 |
+
"openrouter": ""
|
114 |
+
}
|
115 |
+
|
116 |
+
# .env dosyası yoksa boş API anahtarlarını döndür
|
117 |
+
if not dotenv_path or not os.path.exists(dotenv_path):
|
118 |
+
return api_keys
|
119 |
+
|
120 |
+
# .env dosyasını manuel olarak oku
|
121 |
+
try:
|
122 |
+
# Önce UTF-8 ile dene
|
123 |
+
with open(dotenv_path, "r", encoding="utf-8") as f:
|
124 |
+
lines = f.readlines()
|
125 |
+
except UnicodeDecodeError:
|
126 |
+
# UTF-8 çalışmazsa Latin-1 ile dene
|
127 |
+
with open(dotenv_path, "r", encoding="latin-1") as f:
|
128 |
+
lines = f.readlines()
|
129 |
+
|
130 |
+
# Dosya içeriğini işle
|
131 |
+
for line in lines:
|
132 |
+
line = line.strip()
|
133 |
+
if line and not line.startswith("#") and "=" in line:
|
134 |
+
key, value = line.split("=", 1)
|
135 |
+
key = key.strip()
|
136 |
+
value = value.strip().strip('"\'')
|
137 |
+
|
138 |
+
if key == "OPENAI_API_KEY":
|
139 |
+
api_keys["openai"] = value
|
140 |
+
elif key == "GEMINI_API_KEY":
|
141 |
+
api_keys["gemini"] = value
|
142 |
+
elif key == "OPENROUTER_API_KEY":
|
143 |
+
api_keys["openrouter"] = value
|
144 |
+
|
145 |
+
return api_keys
|
146 |
+
except Exception as e:
|
147 |
+
st.error(f"API anahtarları yüklenirken hata oluştu: {str(e)}")
|
148 |
+
return {
|
149 |
+
"openai": "",
|
150 |
+
"gemini": "",
|
151 |
+
"openrouter": ""
|
152 |
+
}
|
153 |
+
|
154 |
+
def load_saved_prompts() -> List[Dict[str, Any]]:
|
155 |
+
"""
|
156 |
+
Kaydedilmiş promptları dosyadan yükler.
|
157 |
+
|
158 |
+
Returns:
|
159 |
+
List[Dict[str, Any]]: Kaydedilmiş promptlar listesi
|
160 |
+
"""
|
161 |
+
save_dir = os.path.join(os.getcwd(), "saved_prompts")
|
162 |
+
|
163 |
+
# Dizin yoksa oluştur
|
164 |
+
if not os.path.exists(save_dir):
|
165 |
+
os.makedirs(save_dir)
|
166 |
+
|
167 |
+
save_path = os.path.join(save_dir, "saved_prompts.json")
|
168 |
+
|
169 |
+
if os.path.exists(save_path):
|
170 |
+
try:
|
171 |
+
with open(save_path, "r", encoding="utf-8") as f:
|
172 |
+
return json.load(f)
|
173 |
+
except:
|
174 |
+
return []
|
175 |
+
return []
|
176 |
+
|
177 |
+
def save_prompt(prompt: str, category: str, params: Dict[str, Any], name: str, tags: List[str] = None) -> bool:
|
178 |
+
"""
|
179 |
+
Bir promptu dosyaya kaydeder.
|
180 |
+
|
181 |
+
Args:
|
182 |
+
prompt (str): Kaydedilecek prompt
|
183 |
+
category (str): Prompt kategorisi
|
184 |
+
params (Dict[str, Any]): Prompt parametreleri
|
185 |
+
name (str): Prompt adı
|
186 |
+
tags (List[str], optional): Prompt etiketleri
|
187 |
+
|
188 |
+
Returns:
|
189 |
+
bool: İşlem başarılıysa True, değilse False
|
190 |
+
"""
|
191 |
+
save_dir = os.path.join(os.getcwd(), "saved_prompts")
|
192 |
+
|
193 |
+
# Dizin yoksa oluştur
|
194 |
+
if not os.path.exists(save_dir):
|
195 |
+
os.makedirs(save_dir)
|
196 |
+
|
197 |
+
save_path = os.path.join(save_dir, "saved_prompts.json")
|
198 |
+
|
199 |
+
# Mevcut kaydedilmiş promptları yükle
|
200 |
+
saved_prompts = []
|
201 |
+
if os.path.exists(save_path):
|
202 |
+
try:
|
203 |
+
with open(save_path, "r", encoding="utf-8") as f:
|
204 |
+
saved_prompts = json.load(f)
|
205 |
+
except:
|
206 |
+
saved_prompts = []
|
207 |
+
|
208 |
+
# Etiketler için varsayılan değer
|
209 |
+
if tags is None:
|
210 |
+
tags = [category]
|
211 |
+
|
212 |
+
# Yeni promptu ekle
|
213 |
+
saved_prompts.append({
|
214 |
+
"name": name,
|
215 |
+
"prompt": prompt,
|
216 |
+
"category": category,
|
217 |
+
"params": params,
|
218 |
+
"tags": tags,
|
219 |
+
"created_at": str(pd.Timestamp.now())
|
220 |
+
})
|
221 |
+
|
222 |
+
# Dosyaya kaydet
|
223 |
+
try:
|
224 |
+
with open(save_path, "w", encoding="utf-8") as f:
|
225 |
+
json.dump(saved_prompts, f, ensure_ascii=False, indent=2)
|
226 |
+
return True
|
227 |
+
except Exception as e:
|
228 |
+
st.error(f"Prompt kaydedilirken hata oluştu: {str(e)}")
|
229 |
+
return False
|
230 |
+
|
231 |
+
def main():
|
232 |
+
"""
|
233 |
+
Ana Streamlit uygulaması.
|
234 |
+
"""
|
235 |
+
# Sayfa yapılandırması
|
236 |
+
st.set_page_config(
|
237 |
+
page_title="Kralkayra taner atmaca tarafından",
|
238 |
+
page_icon="🤖",
|
239 |
+
layout="wide",
|
240 |
+
initial_sidebar_state="expanded"
|
241 |
+
)
|
242 |
+
|
243 |
+
# .env dosyasından API anahtarlarını yükle
|
244 |
+
env_api_keys = load_api_keys_from_env()
|
245 |
+
|
246 |
+
# Session state başlatma
|
247 |
+
if "api_keys" not in st.session_state:
|
248 |
+
st.session_state.api_keys = env_api_keys
|
249 |
+
|
250 |
+
# API anahtarlarını chatbot ve işleyicilere de yükle
|
251 |
+
for provider, key in st.session_state.api_keys.items():
|
252 |
+
if key:
|
253 |
+
api_manager.set_api_key(provider, key)
|
254 |
+
|
255 |
+
if provider == "openai":
|
256 |
+
openai_handler.set_api_key(key)
|
257 |
+
chatbot.ai_generator.set_api_key(provider, key)
|
258 |
+
elif provider == "gemini":
|
259 |
+
gemini_handler.set_api_key(key)
|
260 |
+
chatbot.ai_generator.set_api_key(provider, key)
|
261 |
+
elif provider == "openrouter":
|
262 |
+
openrouter_handler.set_api_key(key)
|
263 |
+
chatbot.ai_generator.set_api_key(provider, key)
|
264 |
+
|
265 |
+
# Gerekli importlar
|
266 |
+
|
267 |
+
# Başlık ve açıklama
|
268 |
+
st.title("Kralkayra taner atmaca tarafından")
|
269 |
+
st.markdown("Bu uygulama, AI modellerine verilecek detaylı promptlar oluşturmanıza yardımcı olur.")
|
270 |
+
|
271 |
+
# Sekmeler
|
272 |
+
tabs = st.tabs(["Ana Sayfa", "Prompt Kütüphanesi", "Prompt Şablonları", "İleri Analiz", "Görsel Prompt Oluşturucu", "Toplu İşlem"])
|
273 |
+
|
274 |
+
# Sidebar - API anahtarları
|
275 |
+
with st.sidebar:
|
276 |
+
st.header("API Anahtarları")
|
277 |
+
|
278 |
+
st.info("API anahtarlarınızı girin ve 'API Anahtarlarını Kaydet' butonuna tıklayarak kalıcı olarak kaydedin.")
|
279 |
+
|
280 |
+
# OpenAI API anahtarı
|
281 |
+
openai_api_key = st.text_input(
|
282 |
+
"OpenAI API Anahtarı",
|
283 |
+
type="password",
|
284 |
+
value=st.session_state.api_keys.get("openai", "")
|
285 |
+
)
|
286 |
+
|
287 |
+
# Google Gemini API anahtarı
|
288 |
+
gemini_api_key = st.text_input(
|
289 |
+
"Google Gemini API Anahtarı",
|
290 |
+
type="password",
|
291 |
+
value=st.session_state.api_keys.get("gemini", "")
|
292 |
+
)
|
293 |
+
|
294 |
+
# OpenRouter API anahtarı
|
295 |
+
openrouter_api_key = st.text_input(
|
296 |
+
"OpenRouter API Anahtarı",
|
297 |
+
type="password",
|
298 |
+
value=st.session_state.api_keys.get("openrouter", "")
|
299 |
+
)
|
300 |
+
|
301 |
+
# API anahtarlarını kaydet
|
302 |
+
if st.button("API Anahtarlarını Kaydet"):
|
303 |
+
# Yeni API anahtarları sözlüğü oluştur
|
304 |
+
new_api_keys = {
|
305 |
+
"openai": openai_api_key,
|
306 |
+
"gemini": gemini_api_key,
|
307 |
+
"openrouter": openrouter_api_key
|
308 |
+
}
|
309 |
+
|
310 |
+
# Session state'e API anahtarlarını kaydet
|
311 |
+
st.session_state.api_keys = new_api_keys
|
312 |
+
|
313 |
+
# API anahtarlarını ayarla
|
314 |
+
api_manager.set_api_key("openai", openai_api_key)
|
315 |
+
api_manager.set_api_key("gemini", gemini_api_key)
|
316 |
+
api_manager.set_api_key("openrouter", openrouter_api_key)
|
317 |
+
|
318 |
+
# API işleyicilerine de anahtarları ayarla
|
319 |
+
openai_handler.set_api_key(openai_api_key)
|
320 |
+
gemini_handler.set_api_key(gemini_api_key)
|
321 |
+
openrouter_handler.set_api_key(openrouter_api_key)
|
322 |
+
|
323 |
+
# Chatbot'un AI prompt generator'ına da anahtarları ayarla
|
324 |
+
chatbot.ai_generator.set_api_key("openai", openai_api_key)
|
325 |
+
chatbot.ai_generator.set_api_key("gemini", gemini_api_key)
|
326 |
+
chatbot.ai_generator.set_api_key("openrouter", openrouter_api_key)
|
327 |
+
|
328 |
+
# API anahtarlarını .env dosyasına kaydet
|
329 |
+
if save_api_keys_to_env(new_api_keys):
|
330 |
+
st.success("API anahtarları başarıyla kaydedildi ve kalıcı olarak saklandı!")
|
331 |
+
else:
|
332 |
+
st.warning("API anahtarları geçici olarak kaydedildi, ancak kalıcı saklama başarısız oldu.")
|
333 |
+
|
334 |
+
# API anahtarlarının durumunu göster
|
335 |
+
with st.expander("API Anahtarı Durumu", expanded=False):
|
336 |
+
openai_status = "✅ Ayarlandı" if st.session_state.api_keys.get("openai") else "❌ Ayarlanmadı"
|
337 |
+
gemini_status = "✅ Ayarlandı" if st.session_state.api_keys.get("gemini") else "❌ Ayarlanmadı"
|
338 |
+
openrouter_status = "✅ Ayarlandı" if st.session_state.api_keys.get("openrouter") else "❌ Ayarlanmadı"
|
339 |
+
|
340 |
+
st.write(f"OpenAI API: {openai_status}")
|
341 |
+
st.write(f"Gemini API: {gemini_status}")
|
342 |
+
st.write(f"OpenRouter API: {openrouter_status}")
|
343 |
+
|
344 |
+
# AI modeli seçimi
|
345 |
+
st.header("AI Modeli Seçimi")
|
346 |
+
|
347 |
+
# API sağlayıcısı seçimi
|
348 |
+
provider = st.selectbox(
|
349 |
+
"API Sağlayıcısı",
|
350 |
+
["OpenAI", "Google Gemini", "OpenRouter"],
|
351 |
+
index=0
|
352 |
+
)
|
353 |
+
|
354 |
+
# Seçilen sağlayıcıya göre model listesini al
|
355 |
+
provider_key = provider.lower().replace(" ", "_")
|
356 |
+
if provider_key == "google_gemini":
|
357 |
+
provider_key = "gemini"
|
358 |
+
|
359 |
+
# Modelleri al
|
360 |
+
models = []
|
361 |
+
if provider_key == "openai":
|
362 |
+
models = openai_handler.get_available_models()
|
363 |
+
elif provider_key == "gemini":
|
364 |
+
models = gemini_handler.get_available_models()
|
365 |
+
elif provider_key == "openrouter":
|
366 |
+
models = openrouter_handler.get_available_models()
|
367 |
+
|
368 |
+
# Model seçimi
|
369 |
+
selected_model = None
|
370 |
+
if models:
|
371 |
+
selected_model = st.selectbox("Model", models)
|
372 |
+
|
373 |
+
# Ana Sayfa Sekmesi
|
374 |
+
with tabs[0]:
|
375 |
+
# Ana içerik
|
376 |
+
col1, col2 = st.columns([1, 1])
|
377 |
+
|
378 |
+
with col1:
|
379 |
+
st.header("Prompt Oluştur")
|
380 |
+
|
381 |
+
# Kullanıcı girdisi
|
382 |
+
user_input = st.text_area(
|
383 |
+
"Ne yapmak istediğinizi açıklayın:",
|
384 |
+
height=150,
|
385 |
+
placeholder="Örnek: Bir e-ticaret web sitesi yapmak istiyorum. Ürünleri listeleyebilmeli, sepete ekleyebilmeli ve ödeme alabilmeliyim."
|
386 |
+
)
|
387 |
+
|
388 |
+
# AI destekli prompt oluşturma seçeneği
|
389 |
+
if "use_ai_generation" not in st.session_state:
|
390 |
+
st.session_state.use_ai_generation = True
|
391 |
+
|
392 |
+
use_ai_generation = st.checkbox(
|
393 |
+
"AI destekli prompt oluşturma kullan",
|
394 |
+
value=st.session_state.use_ai_generation,
|
395 |
+
key="use_ai_generation_checkbox"
|
396 |
+
)
|
397 |
+
|
398 |
+
# Checkbox değiştiğinde session state'i güncelle
|
399 |
+
st.session_state.use_ai_generation = use_ai_generation
|
400 |
+
|
401 |
+
# API anahtarı kontrolü ve uyarı
|
402 |
+
selected_provider_key = provider.lower().replace(" ", "_")
|
403 |
+
if selected_provider_key == "google_gemini":
|
404 |
+
selected_provider_key = "gemini"
|
405 |
+
|
406 |
+
if use_ai_generation and not st.session_state.api_keys.get(selected_provider_key):
|
407 |
+
st.warning(f"AI destekli prompt oluşturma için {provider} API anahtarı gereklidir. Lütfen API anahtarınızı girin ve 'API Anahtarlarını Kaydet' butonuna tıklayın.")
|
408 |
+
|
409 |
+
# Prompt oluştur butonu
|
410 |
+
if st.button("Prompt Oluştur"):
|
411 |
+
if user_input:
|
412 |
+
with st.spinner("Prompt oluşturuluyor..."):
|
413 |
+
# Prompt oluştur
|
414 |
+
provider_key = provider.lower().replace(" ", "_")
|
415 |
+
if provider_key == "google_gemini":
|
416 |
+
provider_key = "gemini"
|
417 |
+
|
418 |
+
# API anahtarı kontrolü
|
419 |
+
if use_ai_generation and not st.session_state.api_keys.get(provider_key):
|
420 |
+
st.error(f"AI destekli prompt oluşturma için {provider} API anahtarı gereklidir. Lütfen API anahtarınızı girin ve 'API Anahtarlarını Kaydet' butonuna tıklayın.")
|
421 |
+
else:
|
422 |
+
# Debug bilgisi
|
423 |
+
st.session_state.debug_info = {
|
424 |
+
"use_ai_generation": use_ai_generation,
|
425 |
+
"provider": provider_key,
|
426 |
+
"model": selected_model,
|
427 |
+
"api_key_set": bool(st.session_state.api_keys.get(provider_key))
|
428 |
+
}
|
429 |
+
|
430 |
+
try:
|
431 |
+
prompt, category, params = chatbot.process_input(
|
432 |
+
user_input,
|
433 |
+
use_ai_generation=use_ai_generation,
|
434 |
+
provider=provider_key,
|
435 |
+
model=selected_model
|
436 |
+
)
|
437 |
+
|
438 |
+
# Sonuçları session state'e kaydet
|
439 |
+
st.session_state.prompt = prompt
|
440 |
+
st.session_state.category = category
|
441 |
+
st.session_state.params = params
|
442 |
+
except Exception as e:
|
443 |
+
st.error(f"Prompt oluşturma sırasında bir hata oluştu: {str(e)}")
|
444 |
+
st.session_state.prompt = "Prompt oluşturulurken bir hata oluştu. Lütfen tekrar deneyin veya AI destekli prompt oluşturmayı kapatın."
|
445 |
+
st.session_state.category = "error"
|
446 |
+
st.session_state.params = {}
|
447 |
+
|
448 |
+
# Sonuçları göster
|
449 |
+
st.success("Prompt başarıyla oluşturuldu!")
|
450 |
+
else:
|
451 |
+
st.error("Lütfen ne yapmak istediğinizi açıklayın.")
|
452 |
+
|
453 |
+
with col2:
|
454 |
+
st.header("Oluşturulan Prompt")
|
455 |
+
|
456 |
+
# Debug bilgisi (geliştirme aşamasında)
|
457 |
+
if "debug_info" in st.session_state:
|
458 |
+
with st.expander("Debug Bilgisi", expanded=False):
|
459 |
+
st.write(st.session_state.debug_info)
|
460 |
+
|
461 |
+
# Oluşturulan promptu göster
|
462 |
+
if "prompt" in st.session_state:
|
463 |
+
st.subheader(f"Kategori: {st.session_state.category}")
|
464 |
+
|
465 |
+
# Parametreleri göster
|
466 |
+
if st.session_state.params:
|
467 |
+
with st.expander("Parametreler", expanded=False):
|
468 |
+
for key, value in st.session_state.params.items():
|
469 |
+
st.write(f"**{key}:** {value}")
|
470 |
+
|
471 |
+
# Promptu göster
|
472 |
+
st.text_area(
|
473 |
+
"Prompt:",
|
474 |
+
value=st.session_state.prompt,
|
475 |
+
height=400,
|
476 |
+
disabled=True
|
477 |
+
)
|
478 |
+
|
479 |
+
# Promptu kopyala butonu
|
480 |
+
if st.button("Promptu Kopyala"):
|
481 |
+
st.code(st.session_state.prompt)
|
482 |
+
st.info("Yukarıdaki kodu seçip kopyalayabilirsiniz.")
|
483 |
+
|
484 |
+
# AI ile Test Et bölümü
|
485 |
+
st.subheader("AI ile Test Et")
|
486 |
+
|
487 |
+
# Test için API sağlayıcısı seçimi
|
488 |
+
test_provider = st.selectbox(
|
489 |
+
"Test için API Sağlayıcısı",
|
490 |
+
["OpenAI", "Google Gemini", "OpenRouter"],
|
491 |
+
index=0,
|
492 |
+
key="test_provider"
|
493 |
+
)
|
494 |
+
|
495 |
+
# Test için model seçimi
|
496 |
+
test_provider_key = test_provider.lower().replace(" ", "_")
|
497 |
+
if test_provider_key == "google_gemini":
|
498 |
+
test_provider_key = "gemini"
|
499 |
+
|
500 |
+
# Test için modelleri al
|
501 |
+
test_models = []
|
502 |
+
if test_provider_key == "openai":
|
503 |
+
test_models = openai_handler.get_available_models()
|
504 |
+
elif test_provider_key == "gemini":
|
505 |
+
test_models = gemini_handler.get_available_models()
|
506 |
+
elif test_provider_key == "openrouter":
|
507 |
+
test_models = openrouter_handler.get_available_models()
|
508 |
+
|
509 |
+
# Test için model seçimi
|
510 |
+
test_selected_model = None
|
511 |
+
if test_models:
|
512 |
+
test_selected_model = st.selectbox("Test için Model", test_models, key="test_model")
|
513 |
+
|
514 |
+
# Test için API anahtarı giriş alanı
|
515 |
+
st.markdown("### Test için API Anahtarı")
|
516 |
+
st.info("Test için API anahtarını doğrudan buraya girebilirsiniz.")
|
517 |
+
|
518 |
+
test_api_key = st.text_input(
|
519 |
+
f"{test_provider} API Anahtarı (Test için)",
|
520 |
+
type="password",
|
521 |
+
key="test_api_key"
|
522 |
+
)
|
523 |
+
|
524 |
+
# Kod şablonları oluşturma seçeneği
|
525 |
+
generate_code_templates = st.checkbox("Kod şablonları ve dizin yapısı oluştur", value=True, key="generate_code_templates")
|
526 |
+
|
527 |
+
# AI ile Test Et butonu
|
528 |
+
if st.button("AI ile Test Et"):
|
529 |
+
if "prompt" in st.session_state:
|
530 |
+
if not test_api_key:
|
531 |
+
st.error(f"Lütfen test için {test_provider} API anahtarını girin.")
|
532 |
+
else:
|
533 |
+
with st.spinner("AI yanıtı alınıyor..."):
|
534 |
+
if generate_code_templates:
|
535 |
+
# Kod şablonları ile yanıt al
|
536 |
+
result = ai_interface.generate_response_with_code_templates(
|
537 |
+
test_provider_key,
|
538 |
+
st.session_state.prompt,
|
539 |
+
test_selected_model,
|
540 |
+
test_api_key
|
541 |
+
)
|
542 |
+
|
543 |
+
# Yanıtı ve şablonları session state'e kaydet
|
544 |
+
st.session_state.ai_response = result["response"]
|
545 |
+
st.session_state.code_templates = result["templates"]
|
546 |
+
else:
|
547 |
+
# Sadece yanıt al
|
548 |
+
response = ai_interface.generate_response(
|
549 |
+
test_provider_key,
|
550 |
+
st.session_state.prompt,
|
551 |
+
test_selected_model,
|
552 |
+
test_api_key
|
553 |
+
)
|
554 |
+
|
555 |
+
# Yanıtı session state'e kaydet
|
556 |
+
st.session_state.ai_response = response
|
557 |
+
if "code_templates" in st.session_state:
|
558 |
+
del st.session_state.code_templates
|
559 |
+
|
560 |
+
# Yanıtı göster
|
561 |
+
st.success("AI yanıtı başarıyla alındı!")
|
562 |
+
else:
|
563 |
+
st.error("Lütfen önce bir prompt oluşturun.")
|
564 |
+
|
565 |
+
# AI yanıtını göster
|
566 |
+
if "ai_response" in st.session_state:
|
567 |
+
st.subheader("AI Yanıtı")
|
568 |
+
st.text_area(
|
569 |
+
"Yanıt:",
|
570 |
+
value=st.session_state.ai_response,
|
571 |
+
height=400,
|
572 |
+
disabled=True
|
573 |
+
)
|
574 |
+
|
575 |
+
# Kod şablonları ve dizin yapısı varsa göster
|
576 |
+
if "code_templates" in st.session_state:
|
577 |
+
templates = st.session_state.code_templates
|
578 |
+
|
579 |
+
# Dizin yapısı
|
580 |
+
if templates["directory_structure"]:
|
581 |
+
with st.expander("📁 Dizin Yapısı", expanded=True):
|
582 |
+
for structure in templates["directory_structure"]:
|
583 |
+
st.code(structure, language="bash")
|
584 |
+
|
585 |
+
# Kod şablonları
|
586 |
+
if templates["code_templates"]:
|
587 |
+
with st.expander("💻 Kod Şablonları", expanded=True):
|
588 |
+
for template in templates["code_templates"]:
|
589 |
+
st.subheader(f"{template['language'].capitalize()} Dosyası")
|
590 |
+
st.code(template["code"], language=template["language"])
|
591 |
+
|
592 |
+
# Uygulama adımları
|
593 |
+
if templates["implementation_steps"]:
|
594 |
+
with st.expander("📝 Uygulama Adımları", expanded=True):
|
595 |
+
for i, step in enumerate(templates["implementation_steps"]):
|
596 |
+
if not step.startswith(f"{i+1}.") and not step.startswith("##"):
|
597 |
+
st.markdown(f"**Adım {i+1}:** {step}")
|
598 |
+
else:
|
599 |
+
st.markdown(step)
|
600 |
+
|
601 |
+
# Prompt Kaydetme Bölümü
|
602 |
+
if "prompt" in st.session_state:
|
603 |
+
with st.expander("Promptu Kaydet", expanded=False):
|
604 |
+
prompt_name = st.text_input("Prompt Adı", key="save_prompt_name")
|
605 |
+
prompt_tags = st.text_input("Etiketler (virgülle ayırın)", key="save_prompt_tags")
|
606 |
+
|
607 |
+
if st.button("Kaydet"):
|
608 |
+
if prompt_name:
|
609 |
+
tags = [tag.strip() for tag in prompt_tags.split(",")] if prompt_tags else []
|
610 |
+
if save_prompt(
|
611 |
+
st.session_state.prompt,
|
612 |
+
st.session_state.category,
|
613 |
+
st.session_state.params,
|
614 |
+
prompt_name,
|
615 |
+
tags
|
616 |
+
):
|
617 |
+
st.success("Prompt başarıyla kaydedildi!")
|
618 |
+
else:
|
619 |
+
st.error("Lütfen prompt için bir isim girin.")
|
620 |
+
else:
|
621 |
+
st.info("Henüz bir prompt oluşturulmadı. Sol taraftaki formu doldurup 'Prompt Oluştur' butonuna tıklayın.")
|
622 |
+
|
623 |
+
# Prompt Kütüphanesi Sekmesi
|
624 |
+
with tabs[1]:
|
625 |
+
st.header("Kaydedilmiş Promptlar Kütüphanesi")
|
626 |
+
|
627 |
+
# Kaydedilmiş promptları yükle
|
628 |
+
saved_prompts = load_saved_prompts()
|
629 |
+
|
630 |
+
if not saved_prompts:
|
631 |
+
st.info("Henüz kaydedilmiş prompt bulunmuyor. Ana sayfada oluşturduğunuz promptları kaydedebilirsiniz.")
|
632 |
+
else:
|
633 |
+
# Filtreler
|
634 |
+
col1, col2 = st.columns(2)
|
635 |
+
|
636 |
+
with col1:
|
637 |
+
# Kategori filtresi
|
638 |
+
categories = list(set([p["category"] for p in saved_prompts]))
|
639 |
+
selected_category = st.selectbox("Kategori Filtresi", ["Tümü"] + categories, key="library_category_filter")
|
640 |
+
|
641 |
+
with col2:
|
642 |
+
# Etiket filtresi
|
643 |
+
all_tags = []
|
644 |
+
for p in saved_prompts:
|
645 |
+
all_tags.extend(p.get("tags", []))
|
646 |
+
unique_tags = list(set(all_tags))
|
647 |
+
selected_tag = st.selectbox("Etiket Filtresi", ["Tümü"] + unique_tags, key="library_tag_filter")
|
648 |
+
|
649 |
+
# Arama
|
650 |
+
search_query = st.text_input("Prompt Ara", key="library_search")
|
651 |
+
|
652 |
+
# Filtreleme
|
653 |
+
filtered_prompts = saved_prompts
|
654 |
+
|
655 |
+
if selected_category != "Tümü":
|
656 |
+
filtered_prompts = [p for p in filtered_prompts if p["category"] == selected_category]
|
657 |
+
|
658 |
+
if selected_tag != "Tümü":
|
659 |
+
filtered_prompts = [p for p in filtered_prompts if selected_tag in p.get("tags", [])]
|
660 |
+
|
661 |
+
if search_query:
|
662 |
+
search_lower = search_query.lower()
|
663 |
+
filtered_prompts = [p for p in filtered_prompts if
|
664 |
+
search_lower in p["name"].lower() or
|
665 |
+
search_lower in p["prompt"].lower()]
|
666 |
+
|
667 |
+
# Prompt listesi
|
668 |
+
if not filtered_prompts:
|
669 |
+
st.warning("Filtrelere uygun kayıtlı prompt bulunamadı.")
|
670 |
+
else:
|
671 |
+
for i, prompt_data in enumerate(filtered_prompts):
|
672 |
+
with st.expander(f"{prompt_data['name']} ({prompt_data['category']})", expanded=False):
|
673 |
+
st.text_area(
|
674 |
+
"Prompt:",
|
675 |
+
value=prompt_data["prompt"],
|
676 |
+
height=200,
|
677 |
+
disabled=True,
|
678 |
+
key=f"saved_prompt_{i}"
|
679 |
+
)
|
680 |
+
|
681 |
+
# Etiketler
|
682 |
+
st.write("**Etiketler:** " + ", ".join(prompt_data.get("tags", [])))
|
683 |
+
|
684 |
+
# Parametreler
|
685 |
+
if prompt_data.get("params"):
|
686 |
+
st.write("**Parametreler:**")
|
687 |
+
for key, value in prompt_data["params"].items():
|
688 |
+
st.write(f"- {key}: {value}")
|
689 |
+
|
690 |
+
# Oluşturulma tarihi
|
691 |
+
if "created_at" in prompt_data:
|
692 |
+
st.write(f"**Oluşturulma Tarihi:** {prompt_data['created_at']}")
|
693 |
+
|
694 |
+
# Prompt'u düzenleme ekranına yükle butonu
|
695 |
+
if st.button("Bu Prompt'u Düzenle", key=f"edit_prompt_{i}"):
|
696 |
+
st.session_state.prompt = prompt_data["prompt"]
|
697 |
+
st.session_state.category = prompt_data["category"]
|
698 |
+
st.session_state.params = prompt_data["params"]
|
699 |
+
st.session_state.editing_prompt = True
|
700 |
+
st.info("Prompt ana sayfaya yüklendi! Ana sayfaya geçerek düzenleyebilirsiniz.")
|
701 |
+
|
702 |
+
# Prompt'u sil butonu
|
703 |
+
if st.button("Bu Prompt'u Sil", key=f"delete_prompt_{i}"):
|
704 |
+
# Promptu listeden çıkar
|
705 |
+
saved_prompts.remove(prompt_data)
|
706 |
+
|
707 |
+
# Dosyaya kaydet
|
708 |
+
save_dir = os.path.join(os.getcwd(), "saved_prompts")
|
709 |
+
save_path = os.path.join(save_dir, "saved_prompts.json")
|
710 |
+
|
711 |
+
try:
|
712 |
+
with open(save_path, "w", encoding="utf-8") as f:
|
713 |
+
json.dump(saved_prompts, f, ensure_ascii=False, indent=2)
|
714 |
+
st.success("Prompt başarıyla silindi!")
|
715 |
+
st.rerun() # Sayfayı yeniden yükle
|
716 |
+
except Exception as e:
|
717 |
+
st.error(f"Prompt silinirken hata oluştu: {str(e)}")
|
718 |
+
|
719 |
+
# Prompt Şablonları Sekmesi
|
720 |
+
with tabs[2]:
|
721 |
+
st.header("Prompt Şablonları")
|
722 |
+
|
723 |
+
# Kategori seçimi
|
724 |
+
category = st.selectbox("Kategori", list(PROMPT_CATEGORIES.keys()), key="template_category")
|
725 |
+
|
726 |
+
# Seçilen kategoriye göre şablon göster
|
727 |
+
if category in PROMPT_CATEGORIES:
|
728 |
+
# Kategori açıklaması
|
729 |
+
if isinstance(PROMPT_CATEGORIES[category], dict) and "description" in PROMPT_CATEGORIES[category]:
|
730 |
+
st.write(PROMPT_CATEGORIES[category]["description"])
|
731 |
+
|
732 |
+
# Şablon parametreleri
|
733 |
+
st.subheader("Şablon Parametreleri")
|
734 |
+
|
735 |
+
# Parametreleri dinamik olarak oluştur
|
736 |
+
params = {}
|
737 |
+
|
738 |
+
from prompt_templates import PROMPT_TEMPLATES
|
739 |
+
|
740 |
+
if category in PROMPT_TEMPLATES:
|
741 |
+
template = PROMPT_TEMPLATES[category]
|
742 |
+
|
743 |
+
# Şablon parametrelerini regex ile bul
|
744 |
+
pattern = r'{(\w+)}'
|
745 |
+
params_keys = re.findall(pattern, template)
|
746 |
+
|
747 |
+
# Her parametre için input alanı oluştur
|
748 |
+
for param in params_keys:
|
749 |
+
params[param] = st.text_area(f"{param}:", height=100, key=f"template_param_{param}")
|
750 |
+
|
751 |
+
# Şablonu oluştur butonu
|
752 |
+
if st.button("Şablonu Oluştur"):
|
753 |
+
from prompt_templates import create_prompt
|
754 |
+
prompt = create_prompt(category, params)
|
755 |
+
|
756 |
+
# Promptu session state'e ekle
|
757 |
+
st.session_state.prompt = prompt
|
758 |
+
st.session_state.category = category
|
759 |
+
st.session_state.params = params
|
760 |
+
|
761 |
+
# Oluşturulan şablonu göster
|
762 |
+
st.subheader("Oluşturulan Şablon")
|
763 |
+
st.text_area(
|
764 |
+
"Prompt:",
|
765 |
+
value=prompt,
|
766 |
+
height=400,
|
767 |
+
disabled=True
|
768 |
+
)
|
769 |
+
|
770 |
+
# Şablon kullanım bilgisi
|
771 |
+
st.info("Bu şablon ana sayfaya yüklendi. Ana sayfaya geçerek düzenleyebilir veya API ile test edebilirsiniz.")
|
772 |
+
|
773 |
+
# İleri Analiz Sekmesi (Placeholder)
|
774 |
+
with tabs[3]:
|
775 |
+
st.header("İleri AI Analizi")
|
776 |
+
|
777 |
+
# Analiz edilecek prompt
|
778 |
+
analysis_prompt = st.text_area(
|
779 |
+
"Analiz edilecek prompt:",
|
780 |
+
height=200,
|
781 |
+
placeholder="Analiz etmek istediğiniz promptu buraya yapıştırın...",
|
782 |
+
key="analysis_prompt"
|
783 |
+
)
|
784 |
+
|
785 |
+
# Mevcut prompt varsa, onu otomatik olarak ekle
|
786 |
+
if "prompt" in st.session_state and not analysis_prompt:
|
787 |
+
if st.button("Mevcut promptu yükle"):
|
788 |
+
analysis_prompt = st.session_state.prompt
|
789 |
+
st.session_state.analysis_prompt = analysis_prompt
|
790 |
+
st.rerun()
|
791 |
+
|
792 |
+
if analysis_prompt:
|
793 |
+
# Analiz türleri
|
794 |
+
analysis_tabs = st.tabs(["Token Analizi", "Kalite Skorlaması", "Karmaşıklık Analizi"])
|
795 |
+
|
796 |
+
# Token Analizi
|
797 |
+
with analysis_tabs[0]:
|
798 |
+
st.subheader("Token Analizi")
|
799 |
+
|
800 |
+
# Basit token sayacı
|
801 |
+
words = analysis_prompt.split()
|
802 |
+
word_count = len(words)
|
803 |
+
|
804 |
+
# Yaklaşık token sayısı (GPT tokenizasyonu için yaklaşık değer)
|
805 |
+
# GPT tokenizasyonu genellikle kelimelerden daha küçük birimlerdir
|
806 |
+
# Yaklaşık olarak 4 karakter = 1 token olarak hesaplanabilir
|
807 |
+
char_count = len(analysis_prompt)
|
808 |
+
estimated_tokens = char_count // 4
|
809 |
+
|
810 |
+
# Sonuçları göster
|
811 |
+
col1, col2, col3 = st.columns(3)
|
812 |
+
|
813 |
+
with col1:
|
814 |
+
st.metric("Kelime Sayısı", word_count)
|
815 |
+
|
816 |
+
with col2:
|
817 |
+
st.metric("Karakter Sayısı", char_count)
|
818 |
+
|
819 |
+
with col3:
|
820 |
+
st.metric("Tahmini Token Sayısı", estimated_tokens)
|
821 |
+
|
822 |
+
# Token maliyeti tahmini
|
823 |
+
st.subheader("Tahmini Maliyet")
|
824 |
+
|
825 |
+
# Farklı modeller için maliyet tahminleri
|
826 |
+
model_costs = {
|
827 |
+
"gpt-3.5-turbo": {"input": 0.0000015, "output": 0.000002},
|
828 |
+
"gpt-4o": {"input": 0.00001, "output": 0.00003},
|
829 |
+
"gemini-1.5-pro": {"input": 0.000005, "output": 0.000005},
|
830 |
+
}
|
831 |
+
|
832 |
+
# Maliyetleri hesapla ve göster
|
833 |
+
cost_cols = st.columns(len(model_costs))
|
834 |
+
for i, (model, costs) in enumerate(model_costs.items()):
|
835 |
+
input_cost = estimated_tokens * costs["input"]
|
836 |
+
output_cost_1k = 1000 * costs["output"] # 1000 token yanıt için
|
837 |
+
|
838 |
+
with cost_cols[i]:
|
839 |
+
st.metric(f"{model}", f"${input_cost:.6f}")
|
840 |
+
st.caption(f"Prompt maliyeti")
|
841 |
+
st.metric("1000 token yanıt", f"${output_cost_1k:.4f}")
|
842 |
+
|
843 |
+
# Token optimizasyonu önerileri
|
844 |
+
st.subheader("Optimizasyon Önerileri")
|
845 |
+
|
846 |
+
if word_count > 200:
|
847 |
+
st.warning("Bu prompt oldukça uzun. Maliyeti düşürmek için kısaltmayı düşünebilirsiniz.")
|
848 |
+
|
849 |
+
# Optimizasyon önerileri
|
850 |
+
st.markdown("""
|
851 |
+
**Öneriler:**
|
852 |
+
- Gereksiz tekrarları kaldırın
|
853 |
+
- Örnek açıklamaları kısaltın
|
854 |
+
- Açıklama cümlelerini daha özlü hale getirin
|
855 |
+
""")
|
856 |
+
else:
|
857 |
+
st.success("Bu prompt token kullanımı açısından makul görünüyor.")
|
858 |
+
|
859 |
+
# Kalite Skorlaması
|
860 |
+
with analysis_tabs[1]:
|
861 |
+
st.subheader("Prompt Kalite Analizi")
|
862 |
+
|
863 |
+
# Kalite faktörleri
|
864 |
+
quality_factors = [
|
865 |
+
"Açıklık ve Netlik",
|
866 |
+
"Spesifiklik",
|
867 |
+
"Bağlam Sağlama",
|
868 |
+
"Hedef Belirleme",
|
869 |
+
"Örnek İçerme"
|
870 |
+
]
|
871 |
+
|
872 |
+
# Her faktör için puan hesapla (basit algoritmalar)
|
873 |
+
clarity_score = min(10, max(1, 7 + (analysis_prompt.count(".") / max(1, word_count // 20))))
|
874 |
+
specificity_score = min(10, max(1, 5 + (analysis_prompt.count(":") * 2)))
|
875 |
+
context_score = min(10, max(1, 5 + (analysis_prompt.lower().count("örneğin") + analysis_prompt.lower().count("bağlam"))))
|
876 |
+
goal_score = min(10, max(1, 6 + (analysis_prompt.lower().count("hedef") + analysis_prompt.lower().count("amaç"))))
|
877 |
+
example_score = min(10, max(1, 4 + (analysis_prompt.lower().count("örnek") * 2)))
|
878 |
+
|
879 |
+
# Genel skor hesapla
|
880 |
+
overall_score = (clarity_score + specificity_score + context_score + goal_score + example_score) / 5
|
881 |
+
|
882 |
+
# Sonuçları göster
|
883 |
+
col1, col2 = st.columns([1, 2])
|
884 |
+
|
885 |
+
with col1:
|
886 |
+
# Genel skor
|
887 |
+
st.markdown(f"### Genel Skor: {overall_score:.1f}/10")
|
888 |
+
|
889 |
+
if overall_score >= 8:
|
890 |
+
st.success("Bu prompt yüksek kaliteye sahip! Mükemmel bir prompt oluşturdunuz.")
|
891 |
+
elif overall_score >= 6:
|
892 |
+
st.info("Bu prompt iyi görünüyor, ancak geliştirilebilir.")
|
893 |
+
else:
|
894 |
+
st.warning("Bu prompt iyileştirilmeli. Aşağıdaki önerilere göz atın.")
|
895 |
+
|
896 |
+
with col2:
|
897 |
+
# Faktör skorları
|
898 |
+
scores = [clarity_score, specificity_score, context_score, goal_score, example_score]
|
899 |
+
|
900 |
+
# Radar chart oluştur
|
901 |
+
fig = plt.figure(figsize=(4, 4))
|
902 |
+
ax = fig.add_subplot(111, polar=True)
|
903 |
+
|
904 |
+
# Skorlar ve faktörler için veri hazırlığı
|
905 |
+
angles = np.linspace(0, 2*np.pi, len(quality_factors), endpoint=False)
|
906 |
+
scores_for_plot = np.concatenate((scores, [scores[0]]))
|
907 |
+
angles = np.concatenate((angles, [angles[0]]))
|
908 |
+
labels = quality_factors + [quality_factors[0]]
|
909 |
+
|
910 |
+
# Çizim
|
911 |
+
ax.plot(angles, scores_for_plot, 'o-', linewidth=2)
|
912 |
+
ax.fill(angles, scores_for_plot, alpha=0.25)
|
913 |
+
ax.set_thetagrids(angles[:-1] * 180/np.pi, labels[:-1])
|
914 |
+
ax.set_ylim(0, 10)
|
915 |
+
ax.grid(True)
|
916 |
+
|
917 |
+
st.pyplot(fig)
|
918 |
+
|
919 |
+
# İyileştirme önerileri
|
920 |
+
st.subheader("İyileştirme Önerileri")
|
921 |
+
|
922 |
+
if clarity_score < 7:
|
923 |
+
st.markdown("- **Açıklık ve Netlik**: Daha kısa ve öz cümleler kullanın. Her cümle tek bir fikri ifade etmeli.")
|
924 |
+
|
925 |
+
if specificity_score < 7:
|
926 |
+
st.markdown("- **Spesifiklik**: Daha detaylı talimatlar verin. İstediğiniz format, stil ve içeriği açıkça belirtin.")
|
927 |
+
|
928 |
+
if context_score < 7:
|
929 |
+
st.markdown("- **Bağlam Sağlama**: Promptta daha fazla bağlam bilgisi sağlayın. Hedef kitle, amaç ve kullanım senaryosu ekleyin.")
|
930 |
+
|
931 |
+
if goal_score < 7:
|
932 |
+
st.markdown("- **Hedef Belirleme**: Promptun sonunda ne elde etmek istediğinizi net bir şekilde belirtin.")
|
933 |
+
|
934 |
+
if example_score < 7:
|
935 |
+
st.markdown("- **Örnek İçerme**: İstediğiniz çıktı formatına benzer örnekler ekleyin.")
|
936 |
+
|
937 |
+
# Karmaşıklık Analizi
|
938 |
+
with analysis_tabs[2]:
|
939 |
+
st.subheader("Karmaşıklık Analizi")
|
940 |
+
|
941 |
+
# Okunabilirlik skoru (Flesch Reading Ease formülüne yaklaşık bir değer)
|
942 |
+
sentences = analysis_prompt.split('.')
|
943 |
+
sentence_count = max(1, len(sentences) - 1) # Son nokta sonrası boş cümle olabilir
|
944 |
+
|
945 |
+
avg_words_per_sentence = word_count / sentence_count
|
946 |
+
avg_syllables_per_word = char_count / (word_count * 1.5) # Yaklaşık bir değer
|
947 |
+
|
948 |
+
# Flesch Reading Ease skoru (0-100 arası, yüksek değer daha kolay okunabilir)
|
949 |
+
readability_score = 206.835 - (1.015 * avg_words_per_sentence) - (84.6 * avg_syllables_per_word)
|
950 |
+
readability_score = max(0, min(100, readability_score))
|
951 |
+
|
952 |
+
# Karmaşıklık seviyesi
|
953 |
+
if readability_score >= 80:
|
954 |
+
complexity_level = "Çok Kolay"
|
955 |
+
complexity_description = "Çok basit, anlaşılması kolay bir prompt."
|
956 |
+
elif readability_score >= 60:
|
957 |
+
complexity_level = "Kolay"
|
958 |
+
complexity_description = "Anlaşılması kolay, basit bir prompt."
|
959 |
+
elif readability_score >= 40:
|
960 |
+
complexity_level = "Orta"
|
961 |
+
complexity_description = "Orta zorlukta, genel kullanıcılar için uygun."
|
962 |
+
elif readability_score >= 20:
|
963 |
+
complexity_level = "Zor"
|
964 |
+
complexity_description = "Karmaşık, anlaşılması için teknik bilgi gerekebilir."
|
965 |
+
else:
|
966 |
+
complexity_level = "Çok Zor"
|
967 |
+
complexity_description = "Çok karmaşık, sadece uzmanlar için uygun."
|
968 |
+
|
969 |
+
# Sonuçları göster
|
970 |
+
col1, col2 = st.columns(2)
|
971 |
+
|
972 |
+
with col1:
|
973 |
+
st.metric("Okunabilirlik Skoru", f"{readability_score:.1f}/100")
|
974 |
+
st.metric("Cümle Sayısı", sentence_count)
|
975 |
+
st.metric("Cümle Başına Kelime", f"{avg_words_per_sentence:.1f}")
|
976 |
+
|
977 |
+
with col2:
|
978 |
+
st.markdown(f"### Karmaşıklık: {complexity_level}")
|
979 |
+
st.markdown(complexity_description)
|
980 |
+
|
981 |
+
# Öneriler
|
982 |
+
if readability_score < 40:
|
983 |
+
st.warning("Bu promptu basitleştirmek AI'nın daha iyi anlamasını sağlayabilir.")
|
984 |
+
elif readability_score > 80:
|
985 |
+
st.warning("Bu prompt çok basit olabilir. Daha spesifik yönergeler eklemek isteyebilirsiniz.")
|
986 |
+
else:
|
987 |
+
st.success("Bu prompt karmaşıklık açısından iyi dengelenmiş.")
|
988 |
+
|
989 |
+
# Görsel Prompt Oluşturucu Sekmesi
|
990 |
+
with tabs[4]:
|
991 |
+
st.header("Görsel Prompt Oluşturucu")
|
992 |
+
|
993 |
+
# Prompt yapı blokları
|
994 |
+
st.subheader("Prompt Blokları")
|
995 |
+
|
996 |
+
prompt_blocks = {
|
997 |
+
"Giriş Blokları": [
|
998 |
+
"Rolünüzü belirtin: Siz bir [ROL] olarak,",
|
999 |
+
"Aşağıdaki görevde bana yardımcı olun:",
|
1000 |
+
"Ben bir [ROL] ve size [KONU] hakkında danışmak istiyorum.",
|
1001 |
+
"Bir [PROJE TİPİ] oluşturmam gerekiyor."
|
1002 |
+
],
|
1003 |
+
"Görev Blokları": [
|
1004 |
+
"Göreviniz: [GÖREVİ BURAYA YAZIN]",
|
1005 |
+
"Lütfen bana [KONU] hakkında detaylı bilgi verin.",
|
1006 |
+
"Lütfen bu [KODU/METNİ] analiz edin ve iyileştirin.",
|
1007 |
+
"Bana adım adım nasıl [GÖREV] yapacağımı açıklayın."
|
1008 |
+
],
|
1009 |
+
"Format Blokları": [
|
1010 |
+
"Yanıtınızı madde işaretleriyle listeleyin.",
|
1011 |
+
"Yanıtınızı bir tablo formatında düzenleyin.",
|
1012 |
+
"Lütfen yanıtınızı bölümlere ayırın.",
|
1013 |
+
"Lütfen açıklamanızı örneklerle destekleyin."
|
1014 |
+
],
|
1015 |
+
"Spesifikasyon Blokları": [
|
1016 |
+
"Çıktı uzunluğu: [KISACA/DETAYLI/KELİME SAYISI]",
|
1017 |
+
"Hedef kitle: [KİTLE]",
|
1018 |
+
"Kullanılacak ton: [RESMİ/ARKADAŞÇA/TEKNİK/vb.]",
|
1019 |
+
"Teknik seviye: [BAŞLANGIÇ/ORTA/İLERİ]"
|
1020 |
+
],
|
1021 |
+
"Kapanış Blokları": [
|
1022 |
+
"Yanıtınızın sonunda bir özet ekleyin.",
|
1023 |
+
"Sonraki adımlar için önerilerinizi ekleyin.",
|
1024 |
+
"Ek kaynak veya referanslar ekleyin.",
|
1025 |
+
"Konuyla ilgili potansiyel sorunları belirtin."
|
1026 |
+
]
|
1027 |
+
}
|
1028 |
+
|
1029 |
+
# Kullanıcı tarafından seçilen bloklar
|
1030 |
+
if "selected_blocks" not in st.session_state:
|
1031 |
+
st.session_state.selected_blocks = []
|
1032 |
+
|
1033 |
+
if "block_params" not in st.session_state:
|
1034 |
+
st.session_state.block_params = {}
|
1035 |
+
|
1036 |
+
# Kullanılabilir blokları göster
|
1037 |
+
col1, col2 = st.columns([1, 2])
|
1038 |
+
|
1039 |
+
with col1:
|
1040 |
+
# Kategori seçimi
|
1041 |
+
block_category = st.selectbox("Blok Kategorisi", list(prompt_blocks.keys()))
|
1042 |
+
|
1043 |
+
# O kategorideki blokları göster
|
1044 |
+
selected_block = st.selectbox("Kullanılabilir Bloklar", prompt_blocks[block_category])
|
1045 |
+
|
1046 |
+
# Bloğu ekle butonu
|
1047 |
+
if st.button("Bloğu Ekle"):
|
1048 |
+
if selected_block not in st.session_state.selected_blocks:
|
1049 |
+
st.session_state.selected_blocks.append(selected_block)
|
1050 |
+
st.session_state.block_params[selected_block] = {}
|
1051 |
+
|
1052 |
+
with col2:
|
1053 |
+
# Seçilen blokları listele
|
1054 |
+
st.subheader("Seçilen Bloklar")
|
1055 |
+
|
1056 |
+
if not st.session_state.selected_blocks:
|
1057 |
+
st.info("Henüz blok eklenmedi. Sol taraftan blok ekleyin.")
|
1058 |
+
else:
|
1059 |
+
updated_blocks = []
|
1060 |
+
|
1061 |
+
for i, block in enumerate(st.session_state.selected_blocks):
|
1062 |
+
col_block, col_delete = st.columns([5, 1])
|
1063 |
+
|
1064 |
+
with col_block:
|
1065 |
+
# Köşeli parantez içindeki parametreleri bul
|
1066 |
+
params = re.findall(r'\[(.*?)\]', block)
|
1067 |
+
|
1068 |
+
# Parametreleri düzenlemek için giriş alanları oluştur
|
1069 |
+
edited_block = block
|
1070 |
+
|
1071 |
+
if params:
|
1072 |
+
for param in params:
|
1073 |
+
param_key = f"block_{i}_{param}"
|
1074 |
+
|
1075 |
+
# İlk kez için default değeri ayarla
|
1076 |
+
if param not in st.session_state.block_params.get(block, {}):
|
1077 |
+
st.session_state.block_params.setdefault(block, {})[param] = param
|
1078 |
+
|
1079 |
+
# Parametre için input alanı
|
1080 |
+
param_value = st.text_input(
|
1081 |
+
f"**{param}** değeri:",
|
1082 |
+
value=st.session_state.block_params[block].get(param, param),
|
1083 |
+
key=param_key
|
1084 |
+
)
|
1085 |
+
|
1086 |
+
# Parametre değerini güncelle
|
1087 |
+
st.session_state.block_params[block][param] = param_value
|
1088 |
+
|
1089 |
+
# Blok metnini güncelle
|
1090 |
+
edited_block = edited_block.replace(f"[{param}]", param_value)
|
1091 |
+
|
1092 |
+
# Düzenlenen bloğu göster
|
1093 |
+
st.markdown(f"**{i+1}.** {edited_block}")
|
1094 |
+
updated_blocks.append(edited_block)
|
1095 |
+
|
1096 |
+
with col_delete:
|
1097 |
+
# Bloğu sil butonu
|
1098 |
+
if st.button("🗑️", key=f"delete_block_{i}"):
|
1099 |
+
del st.session_state.selected_blocks[i]
|
1100 |
+
st.rerun()
|
1101 |
+
|
1102 |
+
# Blokların sırasını değiştir
|
1103 |
+
col_up, col_down = st.columns(2)
|
1104 |
+
|
1105 |
+
with col_up:
|
1106 |
+
block_to_move_up = st.number_input("Yukarı taşı (blok no)", min_value=0, max_value=len(st.session_state.selected_blocks), value=0, step=1)
|
1107 |
+
if st.button("Yukarı Taşı") and block_to_move_up > 1 and block_to_move_up <= len(st.session_state.selected_blocks):
|
1108 |
+
idx = block_to_move_up - 1
|
1109 |
+
st.session_state.selected_blocks[idx], st.session_state.selected_blocks[idx-1] = st.session_state.selected_blocks[idx-1], st.session_state.selected_blocks[idx]
|
1110 |
+
st.rerun()
|
1111 |
+
|
1112 |
+
with col_down:
|
1113 |
+
block_to_move_down = st.number_input("Aşağı taşı (blok no)", min_value=0, max_value=len(st.session_state.selected_blocks), value=0, step=1)
|
1114 |
+
if st.button("Aşağı Taşı") and block_to_move_down > 0 and block_to_move_down < len(st.session_state.selected_blocks):
|
1115 |
+
idx = block_to_move_down - 1
|
1116 |
+
st.session_state.selected_blocks[idx], st.session_state.selected_blocks[idx+1] = st.session_state.selected_blocks[idx+1], st.session_state.selected_blocks[idx]
|
1117 |
+
st.rerun()
|
1118 |
+
|
1119 |
+
# Tüm blokları temizle
|
1120 |
+
if st.button("Tüm Blokları Temizle"):
|
1121 |
+
st.session_state.selected_blocks = []
|
1122 |
+
st.session_state.block_params = {}
|
1123 |
+
st.rerun()
|
1124 |
+
|
1125 |
+
# Önizleme ve oluşturma
|
1126 |
+
st.subheader("Prompt Önizleme")
|
1127 |
+
|
1128 |
+
if not st.session_state.selected_blocks:
|
1129 |
+
st.info("Blok ekleyerek promptunuzu oluşturmaya başlayın.")
|
1130 |
+
else:
|
1131 |
+
# Blokları birleştir
|
1132 |
+
preview_prompt = "\n\n".join(updated_blocks)
|
1133 |
+
|
1134 |
+
# Önizleme göster
|
1135 |
+
st.text_area("Oluşturulan Prompt:", value=preview_prompt, height=200, disabled=True)
|
1136 |
+
|
1137 |
+
# Promptu ana sayfaya ekle
|
1138 |
+
if st.button("Bu Promptu Kullan"):
|
1139 |
+
# Session state'e promptu kaydet
|
1140 |
+
st.session_state.prompt = preview_prompt
|
1141 |
+
st.session_state.category = "custom"
|
1142 |
+
st.session_state.params = {}
|
1143 |
+
|
1144 |
+
# Başarı mesajı
|
1145 |
+
st.success("Prompt ana sayfaya yüklendi! Ana sayfaya geçerek düzenleyebilir veya API ile test edebilirsiniz.")
|
1146 |
+
|
1147 |
+
# Özel blok ekleme
|
1148 |
+
with st.expander("Özel Blok Ekle", expanded=False):
|
1149 |
+
custom_block = st.text_area("Özel blok metnini girin:",
|
1150 |
+
placeholder="Örnek: Size [KONU] hakkında bir [İÇERİK TİPİ] yazmanızı istiyorum.")
|
1151 |
+
|
1152 |
+
if st.button("Özel Bloğu Ekle") and custom_block:
|
1153 |
+
st.session_state.selected_blocks.append(custom_block)
|
1154 |
+
st.session_state.block_params[custom_block] = {}
|
1155 |
+
st.rerun()
|
1156 |
+
|
1157 |
+
# Toplu İşlem Sekmesi
|
1158 |
+
with tabs[5]:
|
1159 |
+
st.header("Toplu Prompt Oluşturma")
|
1160 |
+
|
1161 |
+
# Toplu işlem türü
|
1162 |
+
batch_tabs = st.tabs(["CSV/Excel ile Toplu Prompt", "Metin Tabanlı Çoklu Prompt", "Gelişmiş"])
|
1163 |
+
|
1164 |
+
# CSV/Excel ile Toplu Prompt
|
1165 |
+
with batch_tabs[0]:
|
1166 |
+
st.subheader("CSV/Excel Dosyası ile Toplu Prompt Oluşturma")
|
1167 |
+
|
1168 |
+
# Açıklama
|
1169 |
+
st.markdown("""
|
1170 |
+
Bu özellik, bir CSV veya Excel dosyası yükleyerek aynı şablona dayalı çoklu prompt oluşturmanıza olanak tanır.
|
1171 |
+
|
1172 |
+
**Dosya formatı:**
|
1173 |
+
- İlk satır sütun başlıkları olmalıdır
|
1174 |
+
- Her satır farklı bir prompt için veri içermelidir
|
1175 |
+
- Şablondaki yer tutucular sütun adlarıyla aynı olmalıdır (ör. `{ürün_adı}`)
|
1176 |
+
""")
|
1177 |
+
|
1178 |
+
# Örnek şablon
|
1179 |
+
template = st.text_area(
|
1180 |
+
"Prompt Şablonu:",
|
1181 |
+
placeholder="Örnek: {ürün_adı} ürünü için {hedef_kitle} hedef kitlesine yönelik {kelime_sayısı} kelimelik bir pazarlama metni yaz.",
|
1182 |
+
height=100,
|
1183 |
+
key="batch_template"
|
1184 |
+
)
|
1185 |
+
|
1186 |
+
# Dosya yükleme
|
1187 |
+
uploaded_file = st.file_uploader("CSV veya Excel Dosyası Yükle", type=["csv", "xlsx", "xls"])
|
1188 |
+
|
1189 |
+
if uploaded_file is not None and template:
|
1190 |
+
try:
|
1191 |
+
# Dosyayı dataframe'e yükle
|
1192 |
+
df = None
|
1193 |
+
if uploaded_file.name.endswith(".csv"):
|
1194 |
+
df = pd.read_csv(uploaded_file)
|
1195 |
+
else:
|
1196 |
+
df = pd.read_excel(uploaded_file)
|
1197 |
+
|
1198 |
+
# İlk 5 satırı göster
|
1199 |
+
st.subheader("Veri Önizleme")
|
1200 |
+
st.dataframe(df.head())
|
1201 |
+
|
1202 |
+
# Şablondaki yer tutucuları bul
|
1203 |
+
placeholders = re.findall(r'{(.*?)}', template)
|
1204 |
+
|
1205 |
+
# Yer tutucular df sütunlarıyla eşleşiyor mu kontrol et
|
1206 |
+
missing_columns = [p for p in placeholders if p not in df.columns]
|
1207 |
+
|
1208 |
+
if missing_columns:
|
1209 |
+
st.error(f"Şablonda belirtilen yer tutucular dosyada bulunamadı: {', '.join(missing_columns)}")
|
1210 |
+
else:
|
1211 |
+
# Promptları oluştur
|
1212 |
+
generated_prompts = []
|
1213 |
+
|
1214 |
+
for _, row in df.iterrows():
|
1215 |
+
# Bu satır için promptu hazırla
|
1216 |
+
prompt = template
|
1217 |
+
|
1218 |
+
# Tüm yer tutucuları değiştir
|
1219 |
+
for placeholder in placeholders:
|
1220 |
+
prompt = prompt.replace(f"{{{placeholder}}}", str(row[placeholder]))
|
1221 |
+
|
1222 |
+
generated_prompts.append(prompt)
|
1223 |
+
|
1224 |
+
# Oluşturulan promptları göster
|
1225 |
+
st.subheader(f"Oluşturulan Promptlar ({len(generated_prompts)})")
|
1226 |
+
|
1227 |
+
# Promptları göstermek için genişletilebilir paneller
|
1228 |
+
for i, prompt in enumerate(generated_prompts):
|
1229 |
+
with st.expander(f"Prompt {i+1}", expanded=i==0):
|
1230 |
+
st.text_area(f"Prompt {i+1}", value=prompt, height=150, disabled=True, key=f"batch_prompt_{i}")
|
1231 |
+
|
1232 |
+
# Tüm promptları indirebilme seçeneği
|
1233 |
+
if st.button("Tüm Promptları TXT Dosyası Olarak İndir"):
|
1234 |
+
# Promptları birleştir
|
1235 |
+
all_prompts = "\n\n---\n\n".join(generated_prompts)
|
1236 |
+
|
1237 |
+
# Promptları download link olarak sun
|
1238 |
+
st.download_button(
|
1239 |
+
label="İndirmeyi Başlat",
|
1240 |
+
data=all_prompts,
|
1241 |
+
file_name="toplu_promptlar.txt",
|
1242 |
+
mime="text/plain"
|
1243 |
+
)
|
1244 |
+
|
1245 |
+
# Promptları dataframe'e ekleyip Excel olarak indirme seçeneği
|
1246 |
+
if st.button("Promptları Excel Dosyası Olarak İndir"):
|
1247 |
+
# Kopya dataframe oluştur
|
1248 |
+
result_df = df.copy()
|
1249 |
+
|
1250 |
+
# Prompt sütunu ekle
|
1251 |
+
result_df["generated_prompt"] = generated_prompts
|
1252 |
+
|
1253 |
+
# Excel dosyası oluştur
|
1254 |
+
output = io.BytesIO()
|
1255 |
+
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
|
1256 |
+
result_df.to_excel(writer, index=False, sheet_name="Promptlar")
|
1257 |
+
|
1258 |
+
# Download butonu oluştur
|
1259 |
+
st.download_button(
|
1260 |
+
label="Excel İndirmeyi Başlat",
|
1261 |
+
data=output.getvalue(),
|
1262 |
+
file_name="prompt_sonuçları.xlsx",
|
1263 |
+
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
1264 |
+
)
|
1265 |
+
|
1266 |
+
except Exception as e:
|
1267 |
+
st.error(f"Dosya işlenirken bir hata oluştu: {str(e)}")
|
1268 |
+
|
1269 |
+
# Örnek dosya indirme
|
1270 |
+
with st.expander("Örnek CSV/Excel Dosyası İndir", expanded=False):
|
1271 |
+
st.markdown("""
|
1272 |
+
Aşağıdaki örnek dosyayı indirip kendi verilerinizle doldurabilirsiniz:
|
1273 |
+
""")
|
1274 |
+
|
1275 |
+
# Örnek veri
|
1276 |
+
example_data = {
|
1277 |
+
"ürün_adı": ["Akıllı Saat", "Kablosuz Kulaklık", "Robot Süpürge"],
|
1278 |
+
"hedef_kitle": ["spor tutkunları", "müzik severler", "yoğun çalışan profesyoneller"],
|
1279 |
+
"kelime_sayısı": [200, 150, 250]
|
1280 |
+
}
|
1281 |
+
|
1282 |
+
example_df = pd.DataFrame(example_data)
|
1283 |
+
|
1284 |
+
# CSV olarak indir
|
1285 |
+
csv_data = example_df.to_csv(index=False)
|
1286 |
+
st.download_button(
|
1287 |
+
label="Örnek CSV İndir",
|
1288 |
+
data=csv_data,
|
1289 |
+
file_name="ornek_veriler.csv",
|
1290 |
+
mime="text/csv"
|
1291 |
+
)
|
1292 |
+
|
1293 |
+
# Excel olarak indir
|
1294 |
+
output = io.BytesIO()
|
1295 |
+
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
|
1296 |
+
example_df.to_excel(writer, index=False)
|
1297 |
+
|
1298 |
+
st.download_button(
|
1299 |
+
label="Örnek Excel İndir",
|
1300 |
+
data=output.getvalue(),
|
1301 |
+
file_name="ornek_veriler.xlsx",
|
1302 |
+
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
1303 |
+
)
|
1304 |
+
|
1305 |
+
# Metin Tabanlı Çoklu Prompt
|
1306 |
+
with batch_tabs[1]:
|
1307 |
+
st.subheader("Metin Tabanlı Çoklu Prompt Oluşturma")
|
1308 |
+
|
1309 |
+
# Açıklama
|
1310 |
+
st.markdown("""
|
1311 |
+
Bu özellik, aynı şablonu kullanarak birden fazla prompt oluşturmanızı sağlar.
|
1312 |
+
Her bir değişken değeri için farklı bir satır ekleyin.
|
1313 |
+
""")
|
1314 |
+
|
1315 |
+
# Prompt şablonu
|
1316 |
+
text_template = st.text_area(
|
1317 |
+
"Prompt Şablonu:",
|
1318 |
+
value="Bir {konu} hakkında {kelime_sayısı} kelimelik bir yazı yaz.",
|
1319 |
+
height=100,
|
1320 |
+
key="text_batch_template"
|
1321 |
+
)
|
1322 |
+
|
1323 |
+
# Şablondaki değişkenleri bul
|
1324 |
+
text_placeholders = re.findall(r'{(.*?)}', text_template)
|
1325 |
+
|
1326 |
+
if text_placeholders:
|
1327 |
+
st.subheader("Değişkenler")
|
1328 |
+
|
1329 |
+
# Her değişken için değer listesi
|
1330 |
+
variable_values = {}
|
1331 |
+
|
1332 |
+
for placeholder in text_placeholders:
|
1333 |
+
values = st.text_area(
|
1334 |
+
f"{placeholder} değerleri (her satıra bir değer):",
|
1335 |
+
height=100,
|
1336 |
+
key=f"variable_{placeholder}"
|
1337 |
+
)
|
1338 |
+
|
1339 |
+
if values:
|
1340 |
+
# Değerleri satırlara ayır
|
1341 |
+
variable_values[placeholder] = [v.strip() for v in values.strip().split("\n") if v.strip()]
|
1342 |
+
|
1343 |
+
# Tüm değişkenler için değer var mı kontrol et
|
1344 |
+
missing_values = [p for p in text_placeholders if p not in variable_values or not variable_values[p]]
|
1345 |
+
|
1346 |
+
if missing_values:
|
1347 |
+
st.warning(f"Lütfen şu değişkenler için değer girin: {', '.join(missing_values)}")
|
1348 |
+
else:
|
1349 |
+
# Tüm kombinasyonları oluştur
|
1350 |
+
import itertools
|
1351 |
+
|
1352 |
+
# Değişkenlerin tüm değer kombinasyonlarını oluştur
|
1353 |
+
combinations = list(itertools.product(*[variable_values[p] for p in text_placeholders]))
|
1354 |
+
|
1355 |
+
# Her kombinasyon için prompt oluştur
|
1356 |
+
text_generated_prompts = []
|
1357 |
+
|
1358 |
+
for combo in combinations:
|
1359 |
+
# Şablondan başla
|
1360 |
+
prompt = text_template
|
1361 |
+
|
1362 |
+
# Her değişkeni değiştir
|
1363 |
+
for i, placeholder in enumerate(text_placeholders):
|
1364 |
+
prompt = prompt.replace(f"{{{placeholder}}}", combo[i])
|
1365 |
+
|
1366 |
+
text_generated_prompts.append(prompt)
|
1367 |
+
|
1368 |
+
# Oluşturulan promptları göster
|
1369 |
+
st.subheader(f"Oluşturulan Promptlar ({len(text_generated_prompts)})")
|
1370 |
+
|
1371 |
+
# Promptları göster
|
1372 |
+
for i, prompt in enumerate(text_generated_prompts):
|
1373 |
+
with st.expander(f"Prompt {i+1}", expanded=i==0):
|
1374 |
+
st.text_area(f"Prompt {i+1}", value=prompt, height=150, disabled=True, key=f"text_batch_prompt_{i}")
|
1375 |
+
|
1376 |
+
# Tüm promptları indir butonu
|
1377 |
+
if st.button("Tüm Promptları İndir"):
|
1378 |
+
# Promptları birleştir
|
1379 |
+
all_prompts = "\n\n---\n\n".join(text_generated_prompts)
|
1380 |
+
|
1381 |
+
# İndirme linki
|
1382 |
+
st.download_button(
|
1383 |
+
label="İndirmeyi Başlat",
|
1384 |
+
data=all_prompts,
|
1385 |
+
file_name="metin_tabanlı_promptlar.txt",
|
1386 |
+
mime="text/plain"
|
1387 |
+
)
|
1388 |
+
|
1389 |
+
# Gelişmiş Toplu İşlem
|
1390 |
+
with batch_tabs[2]:
|
1391 |
+
st.subheader("Gelişmiş Toplu İşlem")
|
1392 |
+
st.info("Bu özellik yakında eklenecektir. API otomasyonu ve programlı prompt üretimi gibi gelişmiş özellikler içerecektir.")
|
1393 |
+
|
1394 |
+
# Kategori bilgileri
|
1395 |
+
st.header("Desteklenen Kategoriler")
|
1396 |
+
|
1397 |
+
# Kategorileri göster
|
1398 |
+
categories_per_row = 3
|
1399 |
+
categories = list(PROMPT_CATEGORIES.keys())
|
1400 |
+
|
1401 |
+
for i in range(0, len(categories), categories_per_row):
|
1402 |
+
cols = st.columns(categories_per_row)
|
1403 |
+
for j in range(categories_per_row):
|
1404 |
+
if i + j < len(categories):
|
1405 |
+
with cols[j]:
|
1406 |
+
category = categories[i + j]
|
1407 |
+
st.subheader(category)
|
1408 |
+
if isinstance(PROMPT_CATEGORIES[category], dict) and "description" in PROMPT_CATEGORIES[category]:
|
1409 |
+
st.write(PROMPT_CATEGORIES[category]["description"])
|
1410 |
+
else:
|
1411 |
+
st.write("Bu kategori için açıklama bulunmuyor.")
|
1412 |
+
|
1413 |
+
# Footer
|
1414 |
+
st.markdown("---")
|
1415 |
+
st.markdown("© 2025 AI Prompt Generator | Tüm hakları saklıdır.| created by Kralkayra Taner Atmaca")
|
1416 |
+
|
1417 |
+
if __name__ == "__main__":
|
1418 |
+
main()
|
test_dynamic_models.py
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
API entegrasyonlarını test etmek için script.
|
3 |
+
Bu script, dinamik model keşfi özelliğini test eder.
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
import time
|
8 |
+
from api_integrations import (
|
9 |
+
api_manager,
|
10 |
+
openai_handler,
|
11 |
+
gemini_handler,
|
12 |
+
openrouter_handler,
|
13 |
+
MODEL_CACHE,
|
14 |
+
load_model_cache,
|
15 |
+
save_model_cache
|
16 |
+
)
|
17 |
+
|
18 |
+
def test_dynamic_model_discovery():
|
19 |
+
"""
|
20 |
+
Dinamik model keşfi özelliğini test eder.
|
21 |
+
"""
|
22 |
+
print("Dinamik Model Keşfi Testi\n" + "="*30)
|
23 |
+
|
24 |
+
# Mevcut önbellek durumunu göster
|
25 |
+
print("\nMevcut Önbellek Durumu:")
|
26 |
+
for provider in MODEL_CACHE:
|
27 |
+
model_count = len(MODEL_CACHE[provider]["models"])
|
28 |
+
last_updated = MODEL_CACHE[provider]["last_updated"]
|
29 |
+
last_updated_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_updated)) if last_updated > 0 else "Hiç güncellenmemiş"
|
30 |
+
|
31 |
+
print(f"{provider.capitalize()}: {model_count} model, Son güncelleme: {last_updated_str}")
|
32 |
+
|
33 |
+
# OpenAI modellerini test et
|
34 |
+
print("\nOpenAI Modelleri Testi:")
|
35 |
+
if openai_handler.api_key:
|
36 |
+
print("API anahtarı mevcut, API'den modelleri çekme...")
|
37 |
+
models = openai_handler.get_available_models(force_refresh=True)
|
38 |
+
print(f"Toplam {len(models)} model bulundu.")
|
39 |
+
print(f"İlk 10 model: {models[:10]}")
|
40 |
+
else:
|
41 |
+
print("API anahtarı mevcut değil, varsayılan modeller kullanılacak.")
|
42 |
+
models = openai_handler.get_available_models()
|
43 |
+
print(f"Toplam {len(models)} model bulundu.")
|
44 |
+
print(f"Modeller: {models}")
|
45 |
+
|
46 |
+
# Gemini modellerini test et
|
47 |
+
print("\nGemini Modelleri Testi:")
|
48 |
+
if gemini_handler.api_key:
|
49 |
+
print("API anahtarı mevcut, API'den modelleri çekme...")
|
50 |
+
models = gemini_handler.get_available_models(force_refresh=True)
|
51 |
+
print(f"Toplam {len(models)} model bulundu.")
|
52 |
+
print(f"Modeller: {models}")
|
53 |
+
else:
|
54 |
+
print("API anahtarı mevcut değil, varsayılan modeller kullanılacak.")
|
55 |
+
models = gemini_handler.get_available_models()
|
56 |
+
print(f"Toplam {len(models)} model bulundu.")
|
57 |
+
print(f"Modeller: {models}")
|
58 |
+
|
59 |
+
# OpenRouter modellerini test et
|
60 |
+
print("\nOpenRouter Modelleri Testi:")
|
61 |
+
if openrouter_handler.api_key:
|
62 |
+
print("API anahtarı mevcut, API'den modelleri çekme...")
|
63 |
+
models = openrouter_handler.get_available_models(force_refresh=True)
|
64 |
+
print(f"Toplam {len(models)} model bulundu.")
|
65 |
+
print(f"İlk 10 model: {models[:10]}")
|
66 |
+
else:
|
67 |
+
print("API anahtarı mevcut değil, varsayılan modeller kullanılacak.")
|
68 |
+
models = openrouter_handler.get_available_models()
|
69 |
+
print(f"Toplam {len(models)} model bulundu.")
|
70 |
+
print(f"İlk 10 model: {models[:10]}")
|
71 |
+
|
72 |
+
# Önbellek dosyasını kontrol et
|
73 |
+
cache_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "model_cache.json")
|
74 |
+
if os.path.exists(cache_file_path):
|
75 |
+
print(f"\nÖnbellek dosyası mevcut: {cache_file_path}")
|
76 |
+
print(f"Dosya boyutu: {os.path.getsize(cache_file_path)} byte")
|
77 |
+
else:
|
78 |
+
print(f"\nÖnbellek dosyası henüz oluşturulmamış: {cache_file_path}")
|
79 |
+
|
80 |
+
# Önbellek yeniden yükleme testi
|
81 |
+
print("\nÖnbellek Yeniden Yükleme Testi:")
|
82 |
+
load_model_cache()
|
83 |
+
for provider in MODEL_CACHE:
|
84 |
+
model_count = len(MODEL_CACHE[provider]["models"])
|
85 |
+
last_updated = MODEL_CACHE[provider]["last_updated"]
|
86 |
+
last_updated_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_updated)) if last_updated > 0 else "Hiç güncellenmemiş"
|
87 |
+
|
88 |
+
print(f"{provider.capitalize()}: {model_count} model, Son güncelleme: {last_updated_str}")
|
89 |
+
|
90 |
+
print("\nTest tamamlandı!")
|
91 |
+
|
92 |
+
if __name__ == "__main__":
|
93 |
+
test_dynamic_model_discovery()
|
todo.md
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Prompt Engineer Chatbot - Yapılacaklar Listesi
|
2 |
+
|
3 |
+
## Gereksinim Analizi
|
4 |
+
- [x] Kullanıcı gereksinimlerini analiz et
|
5 |
+
- [x] Proje kapsamını belirle
|
6 |
+
|
7 |
+
## Geliştirme Ortamı Kurulumu
|
8 |
+
- [x] Proje dizinini oluştur
|
9 |
+
- [x] Gerekli kütüphaneleri belirle
|
10 |
+
- [x] Gerekli kütüphaneleri yükle (streamlit, openai, google-generativeai, vb.)
|
11 |
+
|
12 |
+
## Prompt Mühendisliği Bilgi Tabanı Oluşturma
|
13 |
+
- [x] Farklı kullanım senaryoları için prompt şablonları oluştur
|
14 |
+
- [x] Web sitesi geliştirme için prompt şablonları hazırla
|
15 |
+
- [x] Diğer yaygın senaryolar için prompt şablonları hazırla
|
16 |
+
|
17 |
+
## Chatbot Backend Geliştirme
|
18 |
+
- [x] Prompt işleme mantığını oluştur
|
19 |
+
- [x] Kullanıcı girdisini analiz etme fonksiyonlarını geliştir
|
20 |
+
- [x] Dinamik prompt oluşturma algoritmasını geliştir
|
21 |
+
|
22 |
+
## API Entegrasyonları
|
23 |
+
- [x] OpenAI API entegrasyonu
|
24 |
+
- [x] Google Gemini API entegrasyonu
|
25 |
+
- [x] OpenRouter API entegrasyonu
|
26 |
+
- [x] API anahtarı yönetimi
|
27 |
+
|
28 |
+
## Kullanıcı Arayüzü Tasarımı
|
29 |
+
- [x] Arayüz bileşenlerini belirle
|
30 |
+
- [x] Kullanıcı giriş alanını oluştur
|
31 |
+
- [x] API seçim alanını oluştur
|
32 |
+
- [x] API anahtarı giriş alanını oluştur
|
33 |
+
- [x] Sonuç gösterim alanını oluştur
|
34 |
+
|
35 |
+
## Deployment Dosyaları
|
36 |
+
- [x] app.py dosyasını oluştur
|
37 |
+
- [x] requirements.txt dosyasını oluştur
|
38 |
+
|
39 |
+
## Test
|
40 |
+
- [x] Farklı senaryolarla chatbot'u test et
|
41 |
+
- [x] API entegrasyonlarını test et
|
42 |
+
- [x] Kullanıcı arayüzünü test et
|
43 |
+
|
44 |
+
## Sonlandırma ve Deployment Hazırlığı
|
45 |
+
- [x] Kodu optimize et
|
46 |
+
- [x] Dokümantasyon ekle
|
47 |
+
- [x] Hugging Face deployment için hazırla
|