MuratKomurcu commited on
Commit
3bed7bc
·
verified ·
1 Parent(s): 524889c

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -310
app.py DELETED
@@ -1,310 +0,0 @@
1
- import streamlit as st
2
- import openai
3
- from dotenv import load_dotenv
4
- import os
5
- from docx import Document
6
- from fpdf import FPDF
7
- from io import BytesIO
8
- import pyrebase
9
- import requests
10
- import json
11
- st.title("🔐 AI Content Factory")
12
- st.write("Test - App çalışıyor!")
13
-
14
- if st.button("Test"):
15
- st.success("✅ Butona basıldı!")
16
- load_dotenv()
17
-
18
- # ✅ Multiple AI Provider Support
19
- AI_PROVIDERS = {
20
- "OpenAI": {
21
- "api_key": os.getenv("OPENAI_API_KEY"),
22
- "available": bool(os.getenv("OPENAI_API_KEY"))
23
- },
24
- "Hugging Face (FREE)": {
25
- "api_key": os.getenv("HUGGINGFACE_API_KEY"),
26
- "available": True # Ücretsiz tier var
27
- },
28
- "Groq (FREE)": {
29
- "api_key": os.getenv("GROQ_API_KEY"),
30
- "available": True # Ücretsiz tier var
31
- }
32
- }
33
-
34
- # OpenAI client (eğer varsa)
35
- if AI_PROVIDERS["OpenAI"]["available"]:
36
- openai.api_key = os.getenv("OPENAI_API_KEY")
37
- client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
38
- else:
39
- client = None
40
-
41
- # ✅ Firebase Config
42
- firebaseConfig = {
43
- "apiKey": "AIzaSyB9tHRV1jgMKwtwewOhPT555Lh1Lh-31Pc",
44
- "authDomain": "blogcraftt.firebaseapp.com",
45
- "projectId": "blogcraftt",
46
- "storageBucket": "blogcraftt.appspot.com",
47
- "messagingSenderId": "708843280683",
48
- "appId": "1:708843280683:web:1ab9d956168b5ad5b89d6e",
49
- "databaseURL": ""
50
- }
51
-
52
- firebase = pyrebase.initialize_app(firebaseConfig)
53
- auth = firebase.auth()
54
-
55
- # ✅ Prompt Library Tanımlaması
56
- prompt_library = {
57
- "📝 Blog Yazısı": "Sen profesyonel bir Türk blog yazarı ve içerik üreticisisin. Türkçe olarak başlangıç, gelişme ve sonuç yapısıyla en az 1000 kelimelik özgün ve SEO uyumlu bir blog yaz. Başlıklar kullan ve düzenli bir yapıda sun. Yanıtını tamamen Türkçe ver.",
58
-
59
- "🔗 LinkedIn Post": """Sen LinkedIn'de başarılı bir Türk profesyonel içerik üreticisisin. Türkçe olarak etkili LinkedIn postları yazarsın. Kuralların:
60
- 1. İlgi çekici bir Türkçe hook ile başla
61
- 2. Değerli bilgi ver
62
- 3. Paragraflar kısa olsun (2-3 cümle max)
63
- 4. Emojiler kullan ama abartma
64
- 5. Sonunda engaging bir Türkçe soru sor
65
- 6. İlgili Türkçe hashtagleri ekle
66
- 7. Profesyonel ama samimi bir Türkçe ton kullan
67
- 8. 150-200 kelime arasında tut
68
- Yanıtını tamamen Türkçe ver.""",
69
-
70
- "🐦 Tweet": "Sen yaratıcı bir Türk içerik üreticisisin. 280 karakteri geçmeyen, kısa, vurucu ve etkileyici bir Türkçe tweet hazırla. Türkçe hashtag kullan ve viral olabilecek şekilde yaz. Yanıtını tamamen Türkçe ver.",
71
-
72
- "🛍 Ürün Tanıtımı": "Türk pazarlama uzmanı gibi Türkçe ürün tanıtımı yap. Sorun-çözüm odaklı Türkçe yaz. Ürünün faydalarını vurgula ve satış odaklı Türkçe içerik üret. Yanıtını tamamen Türkçe ver.",
73
-
74
- "📧 Email Marketing": "Profesyonel Türk email pazarlama uzmanısın. Türkçe konu başlığından başlayarak, açılış oranı yüksek, dönüşüm odaklı Türkçe email içeriği yaz. Yanıtını tamamen Türkçe ver.",
75
-
76
- "🎥 Video Script": "Türk video içerik üreticisisin. Hook, içerik ve call-to-action yapısıyla Türkçe video script'i hazırla. Dakika başına 150 kelime hesabıyla Türkçe yaz. Yanıtını tamamen Türkçe ver."
77
- }
78
-
79
- st.set_page_config(page_title="AI Content Factory - Login", layout="wide")
80
- st.title("🔐 AI Content Factory")
81
-
82
- # Kullanıcı oturumu
83
- if 'user' not in st.session_state:
84
- st.session_state['user'] = None
85
-
86
- # Email & Şifre Inputları
87
- st.sidebar.header("User Authentication")
88
- email = st.sidebar.text_input("📧 Email")
89
- password = st.sidebar.text_input("🔑 Password", type="password")
90
-
91
- col1, col2 = st.sidebar.columns(2)
92
-
93
- with col1:
94
- if st.sidebar.button("Login"):
95
- try:
96
- user = auth.sign_in_with_email_and_password(email, password)
97
- st.session_state['user'] = user
98
- st.sidebar.success(f"✅ Welcome {email}")
99
- except:
100
- st.sidebar.error("❌ Invalid email or password")
101
-
102
- with col2:
103
- if st.sidebar.button("Sign Up"):
104
- try:
105
- user = auth.create_user_with_email_and_password(email, password)
106
- st.sidebar.success("✅ Account created successfully! Please log in.")
107
- except:
108
- st.sidebar.error("❌ Failed to register. Email may already be in use or password is weak.")
109
-
110
- # Oturum varsa logout göster
111
- if st.session_state['user']:
112
- if st.sidebar.button("Logout"):
113
- st.session_state['user'] = None
114
- st.sidebar.success("✅ Logged out successfully")
115
-
116
- # Content Generation Section
117
- if st.session_state['user']:
118
- st.subheader("✨ Welcome to AI Content Generation")
119
-
120
- # ✅ Prompt Library Seçici
121
- st.sidebar.title("📚 Prompt Library")
122
- selected_prompt_category = st.sidebar.selectbox("Kategori Seç", list(prompt_library.keys()))
123
- default_prompt = prompt_library[selected_prompt_category]
124
- custom_prompt = st.sidebar.text_area("✏️ Promptu Düzenle veya Yaz", value=default_prompt, height=150)
125
-
126
- # ✅ Prompt Kaydetme (Demo)
127
- if st.sidebar.button("💾 Promptu Kaydet (Demo)"):
128
- st.sidebar.success("✅ Prompt kaydedildi (demo)")
129
-
130
- st.sidebar.markdown("---")
131
-
132
- # Blog Detail Inputs
133
- st.sidebar.title("Input your Blog Detail")
134
- st.sidebar.subheader("Enter details of the Blog You want to generate")
135
-
136
- # Blog title
137
- blog_title = st.sidebar.text_input("Blog Title")
138
-
139
- # Keywords input
140
- keywords = st.sidebar.text_area("Keywords (comma-seperated)")
141
-
142
- num_words = st.sidebar.slider("Number of words", min_value=250, max_value=1000, step=250)
143
-
144
- submit_button = st.sidebar.button("Generate")
145
-
146
- # Ana içerik üretimi
147
- if submit_button and keywords:
148
-
149
- # Seçilen promptu al
150
- final_prompt = custom_prompt.strip()
151
-
152
- # Öncelik sırası: Groq > Hugging Face (backend'de saklı key'ler)
153
- current_groq_key = os.getenv("GROQ_API_KEY", "")
154
- current_hf_key = os.getenv("HUGGINGFACE_API_KEY", "")
155
-
156
- selected_service = None
157
- if current_groq_key:
158
- selected_service = "Groq"
159
- elif current_hf_key:
160
- selected_service = "Hugging Face"
161
- else:
162
- st.error("⚠️ Sistem yapılandırması eksik. Lütfen yönetici ile iletişime geçin.")
163
- st.stop()
164
-
165
- st.info(f"🤖 {selected_service} servisi kullanılıyor...")
166
-
167
- # API Çağrısı yapacak fonksiyon
168
- def make_ai_request(prompt, user_message, max_tokens=2048):
169
- if selected_service == "Groq":
170
- try:
171
- url = "https://api.groq.com/openai/v1/chat/completions"
172
- headers = {
173
- "Authorization": f"Bearer {current_groq_key}",
174
- "Content-Type": "application/json"
175
- }
176
-
177
- data = {
178
- "model": "llama3-8b-8192",
179
- "messages": [
180
- {"role": "system", "content": prompt},
181
- {"role": "user", "content": user_message}
182
- ],
183
- "max_tokens": min(max_tokens, 2048),
184
- "temperature": 0.7
185
- }
186
-
187
- response = requests.post(url, headers=headers, json=data)
188
- if response.status_code == 200:
189
- result = response.json()
190
- return result['choices'][0]['message']['content']
191
- else:
192
- st.warning(f"Groq API hatası, Hugging Face'e geçiliyor...")
193
- return fallback_to_hf(prompt, user_message)
194
- except Exception as e:
195
- st.warning(f"Groq bağlantı hatası, Hugging Face'e geçiliyor...")
196
- return fallback_to_hf(prompt, user_message)
197
-
198
- elif selected_service == "Hugging Face":
199
- return fallback_to_hf(prompt, user_message)
200
-
201
- return None
202
-
203
- def fallback_to_hf(prompt, user_message):
204
- try:
205
- API_URL = "https://api-inference.huggingface.co/models/meta-llama/Llama-2-7b-chat-hf"
206
- headers = {"Authorization": f"Bearer {current_hf_key}"}
207
-
208
- full_prompt = f"{prompt}\n\nUser: {user_message}\nAssistant: Türkçe olarak yanıtlayacağım:"
209
- payload = {"inputs": full_prompt[:1000], "parameters": {"max_new_tokens": 500}}
210
-
211
- response = requests.post(API_URL, headers=headers, json=payload)
212
-
213
- if response.status_code == 200:
214
- result = response.json()
215
- if isinstance(result, list) and len(result) > 0:
216
- generated_text = result[0].get('generated_text', '')
217
- if "Assistant:" in generated_text:
218
- return generated_text.split("Assistant:")[-1].strip()
219
- return generated_text
220
- return f"HuggingFace ile basit Türkçe içerik: {user_message[:100]}..."
221
- else:
222
- return f"📝 Template içerik: {keywords} konusunda {selected_prompt_category} formatında profesyonel Türkçe içerik."
223
- except Exception as e:
224
- return f"📝 Template içerik: {keywords} konusunda {selected_prompt_category} formatında profesyonel Türkçe içerik."
225
-
226
- # Kategoriye göre içerik üretimi
227
- content_for_download = ""
228
-
229
- if "Blog" in selected_prompt_category:
230
- with st.spinner(f"🤖 {selected_service} ile Türkçe blog yazısı oluşturuluyor..."):
231
- user_message = f"Konu: {keywords}. Yaklaşık {num_words} kelime uzunluğunda, '{blog_title}' başlıklı Türkçe blog yazısı yaz. Yanıtını tamamen Türkçe ver."
232
- blog_content = make_ai_request(final_prompt, user_message, 4096)
233
-
234
- if blog_content:
235
- st.subheader("📝 Oluşturulan Blog Yazısı")
236
- st.write(blog_content)
237
- content_for_download = blog_content
238
- else:
239
- content_for_download = f"Blog yazısı: {keywords} konusunda içerik oluşturulamadı."
240
-
241
- elif "LinkedIn" in selected_prompt_category:
242
- with st.spinner(f"🤖 {selected_service} ile Türkçe LinkedIn postu oluşturuluyor..."):
243
- user_message = f"Bu konular hakkında profesyonel bir Türkçe LinkedIn postu yaz: {keywords}. Yanıtını tamamen Türkçe ver."
244
- linkedin_content = make_ai_request(final_prompt, user_message, 600)
245
-
246
- if linkedin_content:
247
- st.subheader("📝 Oluşturulan LinkedIn Postu")
248
- st.write(linkedin_content)
249
- content_for_download = linkedin_content
250
- else:
251
- content_for_download = f"LinkedIn Post: {keywords} hakkında profesyonel bir paylaşım oluşturulamadı."
252
-
253
- elif "Tweet" in selected_prompt_category:
254
- with st.spinner(f"🤖 {selected_service} ile Türkçe tweet oluşturuluyor..."):
255
- user_message = f"Bu konular hakkında Türkçe tweet yaz: {keywords}. Yanıtını tamamen Türkçe ver."
256
- tweet_content = make_ai_request(final_prompt, user_message, 100)
257
-
258
- if tweet_content:
259
- st.subheader("📝 Oluşturulan Tweet")
260
- st.write(tweet_content)
261
- content_for_download = tweet_content
262
- else:
263
- content_for_download = f"Tweet: {keywords} hakkında kısa bir paylaşım oluşturulamadı."
264
-
265
- else:
266
- with st.spinner(f"🤖 {selected_service} ile Türkçe {selected_prompt_category} oluşturuluyor..."):
267
- user_message = f"Bu konular hakkında Türkçe içerik yaz: {keywords}. Yanıtını tamamen Türkçe ver."
268
- general_content = make_ai_request(final_prompt, user_message, 2048)
269
-
270
- if general_content:
271
- st.subheader(f"📝 Oluşturulan {selected_prompt_category}")
272
- st.write(general_content)
273
- content_for_download = general_content
274
- else:
275
- content_for_download = f"{selected_prompt_category}: {keywords} konusunda içerik oluşturulamadı."
276
-
277
- # DOCX İndirme
278
- full_content = f"""
279
- {selected_prompt_category} İçeriği
280
- Başlık: {blog_title}
281
- Anahtar Kelimeler: {keywords}
282
- Kullanılan AI Servisi: {selected_service}
283
- Kullanılan Prompt: {final_prompt}
284
-
285
- --- İÇERİK ---
286
- {content_for_download}
287
- """
288
-
289
- def generate_docx(content):
290
- buffer = BytesIO()
291
- doc = Document()
292
- doc.add_paragraph(content)
293
- doc.save(buffer)
294
- buffer.seek(0)
295
- return buffer
296
-
297
- docx_file = generate_docx(full_content)
298
-
299
- st.download_button(
300
- label="📄 Download as DOCX",
301
- data=docx_file,
302
- file_name=f"{selected_prompt_category.replace('🔗', '').replace('📝', '').replace('🐦', '').replace('🛍', '').strip()}_output.docx",
303
- mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
304
- )
305
-
306
- elif submit_button and not keywords:
307
- st.warning("⚠️ Lütfen keywords girin!")
308
-
309
- else:
310
- st.warning("⚠️ Lütfen giriş yapın veya kayıt olun.")