therayz1 commited on
Commit
1fa6d0c
·
verified ·
1 Parent(s): 3e26f66

Upload 6 files

Browse files
Files changed (6) hide show
  1. .gitignore +30 -0
  2. README.md +32 -0
  3. app.py +240 -0
  4. llm_utils.py +229 -0
  5. project_types.py +56 -0
  6. requirements.txt +130 -0
.gitignore ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ env/
8
+ venv/
9
+ ENV/
10
+ VENV/
11
+ .env
12
+
13
+ # IDE
14
+ .vscode/
15
+ .idea/
16
+ *.swp
17
+ *.swo
18
+
19
+ # OS
20
+ .DS_Store
21
+ Thumbs.db
22
+
23
+ # Project specific
24
+ *.zip
25
+ context_structure.zip
26
+ *.log
27
+
28
+ # API Keys
29
+ api_keys.txt
30
+ .env.local
README.md ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Context Engineer Chatbot
3
+ emoji: 🤖
4
+ colorFrom: purple
5
+ colorTo: pink
6
+ sdk: gradio
7
+ sdk_version: 5.37.0
8
+ app_file: app.py
9
+ pinned: false
10
+ license: mit
11
+ ---
12
+
13
+ # Context Engineer Chatbot
14
+
15
+ A dynamic and detailed context engineering structure generator for AI projects.
16
+
17
+ ## Features
18
+
19
+ - Support for multiple LLM providers (OpenAI, Anthropic, Google Gemini, OpenRouter)
20
+ - 50+ different project types
21
+ - Generates comprehensive context structures
22
+ - Downloads as ZIP file with organized markdown files
23
+
24
+ ## Usage
25
+
26
+ 1. Select your LLM provider
27
+ 2. Enter your API key
28
+ 3. Choose project type
29
+ 4. Describe your project idea
30
+ 5. Generate context structure
31
+
32
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from llm_utils import LLM_PROVIDERS, get_llm_models, validate_api_key, call_llm, parse_llm_output, create_zip_from_files
3
+ from project_types import PROJECT_TYPES
4
+
5
+ # LLM Prompt Şablonu
6
+ LLM_PROMPT_TEMPLATE = """
7
+ Sen, bir Context Engineer olarak, kullanıcının belirttiği proje türü ve fikri için kapsamlı ve detaylı bir bağlam mühendisliği yapısı oluşturacaksın. Bu yapı üç ana klasörden oluşacak: context, commands ve prompts. Her bir dosyanın içeriğini Markdown formatında, ilgili başlıklar ve alt başlıklar halinde sunacaksın.
8
+
9
+ --- BAŞLANGIÇ ---
10
+
11
+ Kullanıcının Proje Türü: {project_type}
12
+
13
+ Kullanıcının Proje Fikri:
14
+ ```
15
+ {project_idea}
16
+ ```
17
+
18
+ --- GEREKLİ ÇIKTI FORMATI ---
19
+
20
+ Çıktın, aşağıdaki her bir dosyanın içeriğini ayrı ayrı Markdown başlıkları altında içermelidir. Her dosya içeriği, ilgili proje türüne özgü ve son derece detaylı olmalıdır.
21
+
22
+ ## CONTEXT KLASÖRÜ
23
+
24
+ Dosya isimleri ve sıralaması aşağıdaki gibi olmalıdır:
25
+
26
+ # context/01_persona.md
27
+
28
+ ## Ajanın Kimliği ve Rolü
29
+
30
+ [Proje türüne özel olarak ajanın rolünü, uzmanlık alanlarını, misyonunu, iletişim tonunu, davranış biçimini ve kısıtlamalarını detaylandır. Örneğin, mobil uygulama için mobil uygulama geliştiricisi persona'sı gibi.]
31
+
32
+ # context/02_project_overview.md
33
+
34
+ ## Projeye Genel Bakış
35
+
36
+ [Kullanıcının proje fikrine ve türüne göre projenin misyonunu, vizyonunu, iş hedeflerini, hedef kitlesini, MVP (Minimum Viable Product) temel özelliklerini ve başarı kriterlerini (KPIs) detaylandır.]
37
+
38
+ # context/03_rules.md
39
+
40
+ ## Genel Davranış Kuralları ve Kısıtlamalar
41
+
42
+ [Proje türüne özel olarak genel prensipleri, kod kalitesi ve sürdürülebilirlik kurallarını (Clean Code, TypeScript/Python/C# kullanımı vb.), güvenlik protokollerini (API anahtarı yönetimi, veri güvenliği, XSS/SQL Injection önleme), performans optimizasyonu prensiplerini (bellek yönetimi, hız optimizasyonu) ve etik/yasal hususları son derece detaylı bir şekilde açıkla. Yapılmaması gerekenleri (hardcoded değerler, gereksiz loglar vb.) net bir şekilde belirt.]
43
+
44
+ # context/04_app_structure.md / context/04_site_structure.md / context/04_data_description.md (Proje türüne göre uygun olanı seç)
45
+
46
+ ## Uygulama/Site Yapısı veya Veri Seti Açıklaması
47
+
48
+ [Proje türüne göre uygun olan başlığı seç. Eğer mobil/web uygulaması ise ekran/site yapısını, gezinme akışını ve her ekranın/sayfanın temel işlevlerini detaylandır. Eğer veri bilimi/ML projesi ise veri setinin yapısını, özelliklerini ve her bir özelliğin anlamını (veri sözlüğü) detaylandır.]
49
+
50
+ # context/05_tech_stack.md
51
+
52
+ ## Proje Teknoloji Yığını (Tech Stack)
53
+
54
+ [Proje türüne ve kullanıcının proje fikrine göre kullanılacak programlama dillerini, frameworkleri, kütüphaneleri, araçları ve platformları (örn: React Native, Expo, Python, Gradio, Scikit-learn, Unity, Unreal Engine, AWS, Azure, Docker, Kubernetes vb.) detaylı bir şekilde listele. Her bir seçimin nedenini ve alternatiflerini açıkla.]
55
+
56
+ # context/06_software_architecture.md / context/06_project_workflow.md (Proje türüne göre uygun olanı seç)
57
+
58
+ ## Yazılım Mimarisi ve Bileşen Yapısı / Proje İş Akışı ve Metodolojisi
59
+
60
+ [Proje türüne göre uygun olan başlığı seç. Eğer yazılım geliştirme projesi ise yazılım mimarisini (örn: Katmanlı Mimari, Mikroservisler, Monolit), bileşen yapısını (örn: Atomic Design), durum yönetimi akışını, veri akışını ve hata yönetimi prensiplerini detaylandır. Eğer veri bilimi/ML projesi ise veri bilimi yaşam döngüsünü (veri toplama, EDA, ön işleme, modelleme, değerlendirme, dağıtım) adım adım detaylandır.]
61
+
62
+ # context/07_testing_strategy.md / context/07_evaluation_metrics.md (Proje türüne göre uygun olanı seç)
63
+
64
+ ## Test Stratejisi ve Kalite Güvencesi / Model Değerlendirme Metrikleri
65
+
66
+ [Proje türüne göre uygun olan başlığı seç. Eğer yazılım geliştirme projesi ise test piramidi yaklaşımını, birim, entegrasyon ve E2E testlerini, kullanılacak araçları ve test süreçlerini detaylandır. Eğer veri bilimi/ML projesi ise modelin başarısını ölçmek için kullanılacak metrikleri (RMSE, MAE, R², F1-Score, Precision, Recall vb.) ve bunların önemini açıkla.]
67
+
68
+ # context/08_api_integration.md / context/08_reporting_guidelines.md (Proje türüne göre uygun olanı seç)
69
+
70
+ ## API Entegrasyonu ve Veri Akışı / Raporlama ve Sunum Kılavuzu
71
+
72
+ [Proje türüne göre uygun olan başlığı seç. Eğer uygulama geliştirme projesi ise backend API ile nasıl iletişim kurulacağını, veri alışverişi prensiplerini, kimlik doğrulama mekanizmalarını (JWT, OAuth) ve hata yönetimini detaylandır. Eğer veri bilimi/ML projesi ise projenin tüm aşamalarının, bulgularının, model performansının ve içgörülerinin nasıl raporlanacağına ve sunulacağına dair standartları belirle.]
73
+
74
+ # context/09_performance_optimization.md / context/09_deployment_guidelines.md (Proje türüne göre uygun olanı seç)
75
+
76
+ ## Performans Optimizasyonu Kılavuzu / Dağıtım (Deployment) ve Yayınlama Kılavuzu
77
+
78
+ [Proje türüne göre uygun olan başlığı seç. Eğer uygulama geliştirme projesi ise uygulamanın performansını en üst düzeye çıkarmak için uygulanacak stratejileri (bileşen optimizasyonu, bellek yönetimi, ağ istekleri) detaylandır. Eğer dağıtım kılavuzu ise uygulamanın veya modelin nasıl deploy edileceğini, CI/CD süreçlerini, bulut platformlarını ve mağaza yayınlama adımlarını detaylandır.]
79
+
80
+ # context/10_security_guidelines.md / context/10_future_enhancements.md (Proje türüne göre uygun olanı seç)
81
+
82
+ ## Güvenlik Kılavuzu / Gelecek Geliştirmeler ve Yol Haritası
83
+
84
+ [Proje türüne göre uygun olan başlığı seç. Eğer güvenlik kılavuzu ise projenin güvenlik duruşunu güçlendirmek için alınacak ek önlemleri, güvenlik denetimlerini ve zafiyet yönetimini detaylandır. Eğer gelecek geliştirmeler ise projenin potansiyel büyüme alanlarını, yeni özellik fikirlerini ve uzun vadeli yol haritasını açıkla.]
85
+
86
+ ## COMMANDS KLASÖRÜ
87
+
88
+ Proje türüne göre uygun komut dosyalarını oluştur. Her komut dosyası, projenin belirli bir aşamasını yürütmek için kullanılacak yönergeleri içermelidir:
89
+
90
+ # commands/01_setup_environment.txt
91
+
92
+ ## Geliştirme Ortamını Kurma Komutu
93
+
94
+ [Proje türüne göre geliştirme ortamını kurma komutunu detaylandır. Gerekli bağımlılıkları, araçları ve klasör yapısını oluşturma adımlarını açıkla. Yürütme talimatı, beklenen çıktı ve sonraki adım bilgilerini ekle.]
95
+
96
+ # commands/02_generate_tasks.txt
97
+
98
+ ## Detaylı Görev Listesi Oluşturma Komutu
99
+
100
+ [Projenin tüm adımlarını içeren detaylı bir görev listesi oluşturma komutunu açıkla. Context dosyalarını referans alarak yapılması gereken işleri sıralı ve detaylı şekilde listelemesi gerektiğini belirt.]
101
+
102
+ # commands/03_execute_tasks.txt
103
+
104
+ ## Görevleri Yürütme Komutu
105
+
106
+ [Görev listesindeki adımları sırayla yürütme komutunu detayandır. Her görevin nasıl gerçekleştirileceği, hangi dosyaların oluşturulacağı ve sonuçların nereye kaydedileceği hakkında bilgi ver.]
107
+
108
+ # commands/04_refine_model.txt
109
+
110
+ ## Model/Proje İyileştirme Komutu (Proje türüne göre uyarla)
111
+
112
+ [Proje türüne göre iyileştirme adımlarını açıkla. ML projesi için model iyileştirme, web projesi için performans optimizasyonu, mobil uygulama için UX iyileştirmeleri vb.]
113
+
114
+ # commands/05_generate_report.txt
115
+
116
+ ## Nihai Proje Raporu Oluşturma Komutu
117
+
118
+ [Projenin sonuçlarını, bulgularını ve önerilerini içeren kapsamlı bir rapor oluşturma komutunu detayandır. Raporun formatı, içeriği ve hedef kitlesi hakkında bilgi ver.]
119
+
120
+ ## PROMPTS KLASÖRÜ
121
+
122
+ Proje türüne göre uygun prompt şablonlarını oluştur. Her prompt şablonu, komutları yürütmek için AI ajanlarına verilecek yönergeleri içermelidir:
123
+
124
+ # prompts/setup_environment.tpl
125
+
126
+ ## Geliştirme Ortamı Kurulumu İçin Prompt Şablonu
127
+
128
+ [Proje türüne uygun ortam kurulumu için AI ajanına verilecek prompt şablonunu oluştur. Referans dosyalar, ek talimatlar ve beklenen çıktıları detaylı şekilde belirt.]
129
+
130
+ # prompts/generate_tasklist.tpl
131
+
132
+ ## Detaylı Görev Listesi Oluşturma İçin Prompt Şablonu
133
+
134
+ [Görev listesi oluşturmak için AI ajanına verilecek prompt şablonunu detayandır. Tüm context dosyalarını referans alması ve projeye özel görevleri sıralaması gerektiğini belirt.]
135
+
136
+ # prompts/execute_task.tpl
137
+
138
+ ## Tek Bir Görevi Yürütme İçin Prompt Şablonu
139
+
140
+ [Belirli bir görevi yürütmek için AI ajanına verilecek prompt şablonunu oluştur. Görevin adı, açıklaması ve nasıl gerçekleştirileceği hakkında detaylı yönergeler içermeli.]
141
+
142
+ # prompts/refine_model.tpl
143
+
144
+ ## Model/Proje İyileştirme İçin Prompt Şablonu
145
+
146
+ [Proje türüne göre iyileştirme adımları için AI ajanına verilecek prompt şablonunu detayandır.]
147
+
148
+ # prompts/generate_report.tpl
149
+
150
+ ## Nihai Proje Raporu Oluşturma İçin Prompt Şablonu
151
+
152
+ [Kapsamlı proje raporu oluşturmak için AI ajanına verilecek prompt şablonunu oluştur. Raporun yapısı, içeriği ve formatı hakkında detaylı yönergeler içermeli.]
153
+
154
+ --- SON ---
155
+
156
+ Bu formatı ve detay seviyesini koruyarak, kullanıcının proje fikrine özel bir bağlam mühendisliği yapısı oluştur. Her bir dosya içeriği, ilgili proje türünün en iyi pratiklerini ve özel gereksinimlerini yansıtmalıdır. Çıktı sadece istenen Markdown formatında olmalı, ek açıklama veya giriş/çıkış metni içermemelidir."""
157
+
158
+ def update_models_dropdown(provider):
159
+ if provider in LLM_PROVIDERS:
160
+ return gr.Dropdown(choices=LLM_PROVIDERS[provider].get("models", []), label=f"{provider} Modeli Seçin", interactive=True)
161
+ return gr.Dropdown(choices=[], label="Model Seçin", interactive=False)
162
+
163
+ def test_api_key(provider, api_key):
164
+ is_valid, message = validate_api_key(provider, api_key)
165
+ if is_valid:
166
+ models = get_llm_models(provider, api_key)
167
+ return gr.Markdown(f"<p style=\'color:green;\'>{message}</p>"), gr.Dropdown(choices=models, label=f"{provider} Modeli Seçin", interactive=True)
168
+ else:
169
+ return gr.Markdown(f"<p style=\'color:red;\'>{message}</p>"), gr.Dropdown(choices=[], label="Model Seçin", interactive=False)
170
+
171
+ def generate_context_structure(provider, model, api_key, project_type, project_idea):
172
+ if not provider:
173
+ return gr.Markdown("<p style='color:red;'>Lütfen bir LLM sağlayıcısı seçin.</p>"), None
174
+ if not api_key:
175
+ return gr.Markdown("<p style='color:red;'>Lütfen API anahtarınızı girin.</p>"), None
176
+ if not model:
177
+ return gr.Markdown("<p style='color:red;'>Lütfen bir model seçin.</p>"), None
178
+ if not project_type:
179
+ return gr.Markdown("<p style='color:red;'>Lütfen proje türünü seçin.</p>"), None
180
+ if not project_idea:
181
+ return gr.Markdown("<p style='color:red;'>Lütfen proje fikrinizi yazın.</p>"), None
182
+
183
+ full_prompt = LLM_PROMPT_TEMPLATE.format(project_type=project_type, project_idea=project_idea)
184
+
185
+ try:
186
+ # Progress göster
187
+ progress_msg = f"<p style='color:blue;'>LLM çağrısı yapılıyor... (Sağlayıcı: {provider}, Model: {model})</p>"
188
+
189
+ llm_response = call_llm(provider, model, api_key, full_prompt)
190
+
191
+ if not llm_response or "hata" in llm_response.lower():
192
+ return gr.Markdown(f"<p style='color:red;'>LLM yanıtı alınamadı veya hata içeriyor: {llm_response}</p>"), None
193
+
194
+ # LLM çıktısını ayrıştır
195
+ parsed_files = parse_llm_output(llm_response)
196
+
197
+ if not parsed_files:
198
+ return gr.Markdown(f"<p style='color:red;'>LLM çıktısı ayrıştırılamadı. Çıktı formatı hatalı olabilir.</p>"), None
199
+
200
+ # ZIP dosyası oluştur
201
+ zip_data = create_zip_from_files(parsed_files)
202
+
203
+ # Geçici bir dosya olarak kaydet
204
+ zip_file_path = "./context_structure.zip"
205
+ with open(zip_file_path, "wb") as f:
206
+ f.write(zip_data)
207
+
208
+ return gr.Markdown(llm_response), gr.File(value=zip_file_path, label="Bağlam Yapısını İndir", visible=True)
209
+ except Exception as e:
210
+ import traceback
211
+ error_detail = traceback.format_exc()
212
+ return gr.Markdown(f"<p style='color:red;'>Bağlam yapısı oluşturulurken hata oluştu:<br>{str(e)}<br><small>{error_detail}</small></p>"), None
213
+
214
+ with gr.Blocks() as demo:
215
+ gr.Markdown("## 🤖 Context Engineer Chatbot")
216
+ gr.Markdown("Yapay zeka projeniz için dinamik ve detaylı bağlam mühendisliği yapıları oluşturun.")
217
+
218
+ with gr.Row():
219
+ llm_provider = gr.Dropdown(choices=list(LLM_PROVIDERS.keys()), label="LLM Sağlayıcısı Seçin")
220
+ llm_model = gr.Dropdown(choices=[], label="Model Seçin", interactive=False)
221
+
222
+ api_key_input = gr.Textbox(label="API Anahtarınızı Girin", type="password")
223
+ validate_button = gr.Button("API Anahtarını Doğrula")
224
+ validation_status = gr.Markdown()
225
+
226
+ gr.Markdown("### Proje Bilgileri")
227
+ project_type = gr.Dropdown(choices=PROJECT_TYPES, label="Proje Türünü Seçin")
228
+ project_idea_input = gr.Textbox(label="Proje Fikrinizi Detaylıca Anlatın", lines=10)
229
+
230
+ generate_button = gr.Button("Bağlam Yapısı Oluştur")
231
+ context_output_display = gr.Markdown()
232
+ download_button = gr.File(label="Bağlam Yapısını İndir", visible=False)
233
+
234
+ # Event Handlers
235
+ llm_provider.change(fn=update_models_dropdown, inputs=llm_provider, outputs=llm_model)
236
+ validate_button.click(fn=test_api_key, inputs=[llm_provider, api_key_input], outputs=[validation_status, llm_model])
237
+ generate_button.click(fn=generate_context_structure, inputs=[llm_provider, llm_model, api_key_input, project_type, project_idea_input], outputs=[context_output_display, download_button])
238
+
239
+ demo.launch(debug=True, share=False)
240
+
llm_utils.py ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import google.generativeai as genai
3
+ from openai import OpenAI
4
+ from anthropic import Anthropic
5
+ import httpx
6
+
7
+ # Desteklenen LLM Sağlayıcıları ve Modelleri
8
+ LLM_PROVIDERS = {
9
+ "Gemini": {
10
+ "models": [
11
+ "gemini-2.5-pro",
12
+ "gemini-2.5-flash",
13
+ "gemini-2.5-flash-lite-preview-06-17",
14
+ "gemini-2.5-flash-preview-native-audio-dialog",
15
+ "gemini-2.5-flash-exp-native-audio-thinking-dialog",
16
+ "gemini-2.5-flash-preview-tts",
17
+ "gemini-2.5-pro-preview-tts",
18
+ "gemini-2.0-flash",
19
+ "gemini-2.0-flash-preview-image-generation",
20
+ "gemini-2.0-flash-lite",
21
+ "gemini-2.0-flash-live-001",
22
+ "gemini-live-2.5-flash-preview",
23
+ "gemini-1.5-flash",
24
+ "gemini-1.5-flash-8b",
25
+ "gemini-1.5-pro"
26
+ ],
27
+ "api_key_env": "GEMINI_API_KEY"
28
+ },
29
+ "OpenAI": {
30
+ "models": [], # Dinamik olarak çekilecek
31
+ "api_key_env": "OPENAI_API_KEY"
32
+ },
33
+ "Anthropic": {
34
+ "models": [], # Dinamik olarak çekilecek
35
+ "api_key_env": "ANTHROPIC_API_KEY"
36
+ },
37
+ "OpenRouter": {
38
+ "models": [], # Dinamik olarak çekilecek
39
+ "api_key_env": "OPENROUTER_API_KEY"
40
+ }
41
+ }
42
+
43
+ def get_llm_models(provider_name, api_key):
44
+ """Seçilen sağlayıcının modellerini dinamik olarak çeker."""
45
+ models = []
46
+ if provider_name == "Gemini":
47
+ # Gemini modelleri statik olarak tanımlanmıştır, API'den çekmeye gerek yok
48
+ models = LLM_PROVIDERS["Gemini"]["models"]
49
+ elif provider_name == "OpenAI":
50
+ try:
51
+ client = OpenAI(api_key=api_key)
52
+ response = client.models.list()
53
+ models = [model.id for model in response.data if "gpt" in model.id and "vision" not in model.id and "instruct" not in model.id]
54
+ models.sort()
55
+ except Exception as e:
56
+ print(f"OpenAI modelleri çekilirken hata oluştu: {e}")
57
+ models = []
58
+ elif provider_name == "Anthropic":
59
+ try:
60
+ client = Anthropic(api_key=api_key)
61
+ # Anthropic API'sinde modelleri listeleme endpoint'i yok, bilinenleri manuel ekle
62
+ models = [
63
+ "claude-3-opus-20240229",
64
+ "claude-3-sonnet-20240229",
65
+ "claude-3-haiku-20240307"
66
+ ]
67
+ except Exception as e:
68
+ print(f"Anthropic modelleri çekilirken hata oluştu: {e}")
69
+ models = []
70
+ elif provider_name == "OpenRouter":
71
+ try:
72
+ # OpenRouter API'sinden modelleri çek
73
+ headers = {"Authorization": f"Bearer {api_key}"}
74
+ response = httpx.get("https://openrouter.ai/api/v1/models", headers=headers)
75
+ response.raise_for_status()
76
+ data = response.json()
77
+ models = [model["id"] for model in data["data"]]
78
+ models.sort()
79
+ except Exception as e:
80
+ print(f"OpenRouter modelleri çekilirken hata oluştu: {e}")
81
+ models = []
82
+ return models
83
+
84
+ def validate_api_key(provider_name, api_key):
85
+ """Seçilen sağlayıcının API anahtarını doğrular."""
86
+ if not api_key:
87
+ return False, "API Anahtarı boş olamaz."
88
+
89
+ try:
90
+ if provider_name == "Gemini":
91
+ genai.configure(api_key=api_key)
92
+ # Küçük bir model çağrısı ile anahtarı doğrula
93
+ test_models = ['gemini-1.5-flash', 'gemini-2.0-flash', 'gemini-pro']
94
+ last_error = None
95
+
96
+ for model_name in test_models:
97
+ try:
98
+ model = genai.GenerativeModel(model_name)
99
+ response = model.generate_content("test")
100
+ return True, f"API Anahtarı Geçerli! (Test modeli: {model_name})"
101
+ except Exception as e:
102
+ last_error = e
103
+ continue
104
+
105
+ # Hiçbir model çalışmadıysa son hatayı göster
106
+ if last_error:
107
+ raise last_error
108
+ else:
109
+ raise Exception("Gemini API ile bağlantı kurulamadı.")
110
+ elif provider_name == "OpenAI":
111
+ client = OpenAI(api_key=api_key)
112
+ client.models.list() # Modelleri listelemek anahtarı doğrular
113
+ return True, "API Anahtarı Geçerli!"
114
+ elif provider_name == "Anthropic":
115
+ client = Anthropic(api_key=api_key)
116
+ client.messages.create(
117
+ model="claude-3-haiku-20240307", # En küçük model
118
+ max_tokens=1,
119
+ messages=[{"role": "user", "content": "hi"}]
120
+ )
121
+ return True, "API Anahtarı Geçerli!"
122
+ elif provider_name == "OpenRouter":
123
+ headers = {"Authorization": f"Bearer {api_key}"}
124
+ response = httpx.get("https://openrouter.ai/api/v1/models", headers=headers)
125
+ response.raise_for_status() # HTTP 2xx dışında bir durum kodu hata fırlatır
126
+ return True, "API Anahtarı Geçerli!"
127
+ else:
128
+ return False, "Bilinmeyen sağlayıcı."
129
+ except Exception as e:
130
+ return False, f"API Anahtarı Geçersiz veya Bir Hata Oluştu: {e}"
131
+
132
+
133
+
134
+
135
+
136
+ def call_llm(provider_name, model_name, api_key, prompt):
137
+ """Seçilen LLM sağlayıcısını kullanarak bir çağrı yapar."""
138
+ try:
139
+ if provider_name == "Gemini":
140
+ genai.configure(api_key=api_key)
141
+ model = genai.GenerativeModel(model_name)
142
+ response = model.generate_content(prompt)
143
+ return response.text
144
+ elif provider_name == "OpenAI":
145
+ client = OpenAI(api_key=api_key)
146
+ response = client.chat.completions.create(
147
+ model=model_name,
148
+ messages=[
149
+ {"role": "user", "content": prompt}
150
+ ]
151
+ )
152
+ return response.choices[0].message.content
153
+ elif provider_name == "Anthropic":
154
+ client = Anthropic(api_key=api_key)
155
+ response = client.messages.create(
156
+ model=model_name,
157
+ max_tokens=4000, # Yeterli token sağlamak için
158
+ messages=[
159
+ {"role": "user", "content": prompt}
160
+ ]
161
+ )
162
+ return response.content[0].text
163
+ elif provider_name == "OpenRouter":
164
+ headers = {
165
+ "Authorization": f"Bearer {api_key}",
166
+ "Content-Type": "application/json"
167
+ }
168
+ data = {
169
+ "model": model_name,
170
+ "messages": [
171
+ {"role": "user", "content": prompt}
172
+ ]
173
+ }
174
+ response = httpx.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=data)
175
+ response.raise_for_status()
176
+ return response.json()["choices"][0]["message"]["content"]
177
+ else:
178
+ return "Bilinmeyen LLM sağlayıcısı."
179
+ except Exception as e:
180
+ return f"LLM çağrısı sırasında hata oluştu: {e}"
181
+
182
+
183
+
184
+
185
+ import re
186
+ import zipfile
187
+ import io
188
+
189
+ def parse_llm_output(llm_output):
190
+ """LLM çıktısını dosya yolları ve içerikleri olarak ayrıştırır."""
191
+ files = {}
192
+ # Her bir dosya başlığını yakalamak için regex
193
+ # Başlıklar: # context/01_persona.md, # context/02_project_overview.md vb.
194
+ # İçerik, bir sonraki başlığa veya string'in sonuna kadar devam eder.
195
+ matches = re.finditer(r'^#\s*(context/[\w\d_\-]+\.md)\s*\n', llm_output, re.MULTILINE)
196
+
197
+ last_end = 0
198
+ last_file_path = None
199
+
200
+ for match in matches:
201
+ current_file_path = match.group(1).strip()
202
+ current_start = match.end()
203
+
204
+ if last_file_path:
205
+ # Önceki dosyanın içeriğini al
206
+ content = llm_output[last_end:match.start()].strip()
207
+ files[last_file_path] = content
208
+
209
+ last_file_path = current_file_path
210
+ last_end = current_start
211
+
212
+ # Son dosyanın içeriğini ekle
213
+ if last_file_path:
214
+ content = llm_output[last_end:].strip()
215
+ files[last_file_path] = content
216
+
217
+ return files
218
+
219
+ def create_zip_from_files(files_dict):
220
+ """Bir dosya sözlüğünden (yol:içerik) bir ZIP dosyası oluşturur ve baytlarını döndürür."""
221
+ zip_buffer = io.BytesIO()
222
+ with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED, False) as zip_file:
223
+ for file_path, content in files_dict.items():
224
+ # ZIP içinde klasör yapısını korumak için
225
+ zip_file.writestr(file_path, content.encode("utf-8"))
226
+ zip_buffer.seek(0)
227
+ return zip_buffer.getvalue()
228
+
229
+
project_types.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ PROJECT_TYPES = [
2
+ "Makine Öğrenmesi Projesi (Regresyon)",
3
+ "Makine Öğrenmesi Projesi (Sınıflandırma)",
4
+ "Makine Öğrenmesi Projesi (NLP)",
5
+ "Makine Öğrenmesi Projesi (Bilgisayar Görüsü)",
6
+ "Mobil Uygulama Geliştirme (iOS)",
7
+ "Mobil Uygulama Geliştirme (Android)",
8
+ "Mobil Uygulama Geliştirme (Cross-Platform - React Native)",
9
+ "Mobil Uygulama Geliştirme (Cross-Platform - Flutter)",
10
+ "Web Geliştirme (Frontend - React)",
11
+ "Web Geliştirme (Frontend - Angular)",
12
+ "Web Geliştirme (Frontend - Vue)",
13
+ "Web Geliştirme (Backend - Node.js)",
14
+ "Web Geliştirme (Backend - Python/Django/Flask)",
15
+ "Web Geliştirme (Backend - Go)",
16
+ "Web Geliştirme (Fullstack)",
17
+ "Oyun Geliştirme (Unity)",
18
+ "Oyun Geliştirme (Unreal Engine)",
19
+ "Oyun Geliştirme (2D)",
20
+ "Oyun Geliştirme (3D)",
21
+ "Veri Bilimi ve Analiz Projesi",
22
+ "Siber Güvenlik Projesi",
23
+ "DevOps ve Otomasyon Projesi",
24
+ "Blockchain ve Web3 Projesi",
25
+ "Gömülü Sistemler Projesi",
26
+ "Robotik Projesi",
27
+ "Donanım Geliştirme Projesi",
28
+ "UX/UI Tasarım Projesi",
29
+ "Veritabanı Tasarım Projesi",
30
+ "Bulut Bilişim Projesi (AWS)",
31
+ "Bulut Bilişim Projesi (Azure)",
32
+ "Bulut Bilişim Projesi (GCP)",
33
+ "Büyük Veri (Big Data) Projesi",
34
+ "Yapay Zeka Araştırma Projesi",
35
+ "Sistem Programlama Projesi",
36
+ "Test Otomasyon Projesi",
37
+ "E-ticaret Platformu",
38
+ "Sosyal Medya Uygulaması",
39
+ "Eğitim Platformu",
40
+ "Sağlık Uygulaması",
41
+ "Finans Uygulaması",
42
+ "IoT Projesi",
43
+ "API Geliştirme",
44
+ "Mikroservis Mimarisi",
45
+ "Veri Görselleştirme Projesi",
46
+ "NLP Uygulaması (Chatbot)",
47
+ "NLP Uygulaması (Duygu Analizi)",
48
+ "Bilgisayar Görüsü Uygulaması (Nesne Tanıma)",
49
+ "Bilgisayar Görüsü Uygulaması (Yüz Tanıma)",
50
+ "Pekiştirmeli Öğrenme Uygulaması",
51
+ "Otonom Sistemler Projesi",
52
+ "SaaS (Software as a Service) Ürünü",
53
+ "PaaS (Platform as a Service) Ürünü",
54
+ "IaaS (Infrastructure as a Service) Ürünü"
55
+ ]
56
+
requirements.txt ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiofiles==24.1.0
2
+ annotated-types==0.7.0
3
+ anthropic==0.57.1
4
+ anyio==4.9.0
5
+ arabic-reshaper==3.0.0
6
+ asn1crypto==1.5.1
7
+ beautifulsoup4==4.13.4
8
+ blinker==1.9.0
9
+ Brotli==1.1.0
10
+ cachetools==5.5.2
11
+ certifi==2025.7.9
12
+ cffi==1.17.1
13
+ charset-normalizer==3.4.2
14
+ click==8.2.1
15
+ contourpy==1.3.2
16
+ cryptography==45.0.5
17
+ cssselect2==0.8.0
18
+ cycler==0.12.1
19
+ defusedxml==0.7.1
20
+ distro==1.7.0
21
+ et_xmlfile==2.0.0
22
+ fastapi==0.116.0
23
+ ffmpy==0.6.0
24
+ filelock==3.18.0
25
+ Flask==3.1.1
26
+ fonttools==4.58.5
27
+ fpdf==1.7.2
28
+ fpdf2==2.8.3
29
+ fsspec==2024.6.1
30
+ google-ai-generativelanguage==0.6.15
31
+ google-api-core==2.25.1
32
+ google-api-python-client==2.176.0
33
+ google-auth==2.40.3
34
+ google-auth-httplib2==0.2.0
35
+ google-generativeai==0.8.5
36
+ googleapis-common-protos==1.70.0
37
+ gradio==5.37.0
38
+ gradio_client==1.10.4
39
+ greenlet==3.2.3
40
+ groovy==0.1.2
41
+ grpcio==1.73.1
42
+ grpcio-status==1.71.2
43
+ h11==0.16.0
44
+ hf-xet==1.1.5
45
+ html5lib==1.1
46
+ httpcore==1.0.9
47
+ httplib2==0.22.0
48
+ httpx==0.28.1
49
+ huggingface-hub==0.33.4
50
+ idna==3.10
51
+ itsdangerous==2.2.0
52
+ Jinja2==3.1.6
53
+ jiter==0.10.0
54
+ kiwisolver==1.4.8
55
+ lxml==6.0.0
56
+ Markdown==3.8.2
57
+ markdown-it-py==3.0.0
58
+ MarkupSafe==3.0.2
59
+ matplotlib==3.10.3
60
+ mdurl==0.1.2
61
+ narwhals==1.46.0
62
+ numpy==1.26.4
63
+ openai==1.95.1
64
+ openpyxl==3.1.5
65
+ openrouter==1.0
66
+ orjson==3.10.18
67
+ oscrypto==1.3.0
68
+ packaging==25.0
69
+ pandas==2.1.4
70
+ pdf2image==1.17.0
71
+ pillow==11.3.0
72
+ playwright==1.53.0
73
+ plotly==6.2.0
74
+ proto-plus==1.26.1
75
+ protobuf==5.29.5
76
+ pyasn1==0.6.1
77
+ pyasn1_modules==0.4.2
78
+ pycparser==2.22
79
+ pydantic==2.11.7
80
+ pydantic_core==2.33.2
81
+ pydub==0.25.1
82
+ pydyf==0.11.0
83
+ pyee==13.0.0
84
+ Pygments==2.19.2
85
+ pyHanko==0.29.1
86
+ pyhanko-certvalidator==0.27.0
87
+ pyparsing==3.2.3
88
+ pypdf==5.7.0
89
+ pyphen==0.17.2
90
+ python-bidi==0.6.6
91
+ python-dateutil==2.9.0.post0
92
+ python-multipart==0.0.20
93
+ pytz==2025.2
94
+ PyYAML==6.0.2
95
+ reportlab==4.4.2
96
+ requests==2.32.4
97
+ rich==14.0.0
98
+ rsa==4.9.1
99
+ ruff==0.12.3
100
+ safehttpx==0.1.6
101
+ seaborn==0.13.2
102
+ semantic-version==2.10.0
103
+ shellingham==1.5.4
104
+ six==1.17.0
105
+ sniffio==1.3.1
106
+ soupsieve==2.7
107
+ ssh-import-id==5.11
108
+ starlette==0.46.2
109
+ supervisor==4.2.1
110
+ svglib==1.5.1
111
+ tabulate==0.9.0
112
+ tinycss2==1.4.0
113
+ tinyhtml5==2.0.0
114
+ tomlkit==0.13.3
115
+ tqdm==4.67.1
116
+ typer==0.16.0
117
+ typing-inspection==0.4.1
118
+ typing_extensions==4.14.1
119
+ tzdata==2025.2
120
+ tzlocal==5.2
121
+ uritemplate==4.2.0
122
+ uritools==5.0.0
123
+ urllib3==2.5.0
124
+ uvicorn==0.35.0
125
+ weasyprint==65.1
126
+ webencodings==0.5.1
127
+ websockets==15.0.1
128
+ Werkzeug==3.1.3
129
+ xhtml2pdf==0.2.17
130
+ zopfli==0.2.3.post1