Spaces:
Sleeping
Sleeping
| import os | |
| import google.generativeai as genai | |
| from openai import OpenAI | |
| from anthropic import Anthropic | |
| import httpx | |
| # Desteklenen LLM Sağlayıcıları ve Modelleri | |
| LLM_PROVIDERS = { | |
| "Gemini": { | |
| "models": [ | |
| "gemini-pro", | |
| "gemini-1.5-pro-latest", | |
| "gemini-1.5-flash-latest" | |
| ], | |
| "api_key_env": "GEMINI_API_KEY" | |
| }, | |
| "OpenAI": { | |
| "models": [], # Dinamik olarak çekilecek | |
| "api_key_env": "OPENAI_API_KEY" | |
| }, | |
| "Anthropic": { | |
| "models": [], # Dinamik olarak çekilecek | |
| "api_key_env": "ANTHROPIC_API_KEY" | |
| }, | |
| "OpenRouter": { | |
| "models": [], # Dinamik olarak çekilecek | |
| "api_key_env": "OPENROUTER_API_KEY" | |
| } | |
| } | |
| def get_llm_models(provider_name, api_key): | |
| """Seçilen sağlayıcının modellerini dinamik olarak çeker.""" | |
| models = [] | |
| if provider_name == "Gemini": | |
| # Gemini modelleri statik olarak tanımlanmıştır, API'den çekmeye gerek yok | |
| models = LLM_PROVIDERS["Gemini"]["models"] | |
| elif provider_name == "OpenAI": | |
| try: | |
| client = OpenAI(api_key=api_key) | |
| response = client.models.list() | |
| 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] | |
| models.sort() | |
| except Exception as e: | |
| print(f"OpenAI modelleri çekilirken hata oluştu: {e}") | |
| models = [] | |
| elif provider_name == "Anthropic": | |
| try: | |
| client = Anthropic(api_key=api_key) | |
| # Anthropic API'sinde modelleri listeleme endpoint'i yok, bilinenleri manuel ekle | |
| models = [ | |
| "claude-3-opus-20240229", | |
| "claude-3-sonnet-20240229", | |
| "claude-3-haiku-20240307" | |
| ] | |
| except Exception as e: | |
| print(f"Anthropic modelleri çekilirken hata oluştu: {e}") | |
| models = [] | |
| elif provider_name == "OpenRouter": | |
| try: | |
| # OpenRouter API'sinden modelleri çek | |
| headers = {"Authorization": f"Bearer {api_key}"} | |
| response = httpx.get("https://openrouter.ai/api/v1/models", headers=headers) | |
| response.raise_for_status() | |
| data = response.json() | |
| models = [model["id"] for model in data["data"]] | |
| models.sort() | |
| except Exception as e: | |
| print(f"OpenRouter modelleri çekilirken hata oluştu: {e}") | |
| models = [] | |
| return models | |
| def validate_api_key(provider_name, api_key): | |
| """Seçilen sağlayıcının API anahtarını doğrular.""" | |
| if not api_key: | |
| return False, "API Anahtarı boş olamaz." | |
| try: | |
| if provider_name == "Gemini": | |
| genai.configure(api_key=api_key) | |
| # Küçük bir model çağrısı ile anahtarı doğrula | |
| model = genai.GenerativeModel('gemini-pro') | |
| model.generate_content("test") | |
| return True, "API Anahtarı Geçerli!" | |
| elif provider_name == "OpenAI": | |
| client = OpenAI(api_key=api_key) | |
| client.models.list() # Modelleri listelemek anahtarı doğrular | |
| return True, "API Anahtarı Geçerli!" | |
| elif provider_name == "Anthropic": | |
| client = Anthropic(api_key=api_key) | |
| client.messages.create( | |
| model="claude-3-haiku-20240307", # En küçük model | |
| max_tokens=1, | |
| messages=[{"role": "user", "content": "hi"}] | |
| ) | |
| return True, "API Anahtarı Geçerli!" | |
| elif provider_name == "OpenRouter": | |
| headers = {"Authorization": f"Bearer {api_key}"} | |
| response = httpx.get("https://openrouter.ai/api/v1/models", headers=headers) | |
| response.raise_for_status() # HTTP 2xx dışında bir durum kodu hata fırlatır | |
| return True, "API Anahtarı Geçerli!" | |
| else: | |
| return False, "Bilinmeyen sağlayıcı." | |
| except Exception as e: | |
| return False, f"API Anahtarı Geçersiz veya Bir Hata Oluştu: {e}" | |
| def call_llm(provider_name, model_name, api_key, prompt): | |
| """Seçilen LLM sağlayıcısını kullanarak bir çağrı yapar.""" | |
| try: | |
| if provider_name == "Gemini": | |
| genai.configure(api_key=api_key) | |
| model = genai.GenerativeModel(model_name) | |
| response = model.generate_content(prompt) | |
| return response.text | |
| elif provider_name == "OpenAI": | |
| client = OpenAI(api_key=api_key) | |
| response = client.chat.completions.create( | |
| model=model_name, | |
| messages=[ | |
| {"role": "user", "content": prompt} | |
| ] | |
| ) | |
| return response.choices[0].message.content | |
| elif provider_name == "Anthropic": | |
| client = Anthropic(api_key=api_key) | |
| response = client.messages.create( | |
| model=model_name, | |
| max_tokens=4000, # Yeterli token sağlamak için | |
| messages=[ | |
| {"role": "user", "content": prompt} | |
| ] | |
| ) | |
| return response.content[0].text | |
| elif provider_name == "OpenRouter": | |
| headers = { | |
| "Authorization": f"Bearer {api_key}", | |
| "Content-Type": "application/json" | |
| } | |
| data = { | |
| "model": model_name, | |
| "messages": [ | |
| {"role": "user", "content": prompt} | |
| ] | |
| } | |
| response = httpx.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=data) | |
| response.raise_for_status() | |
| return response.json()["choices"][0]["message"]["content"] | |
| else: | |
| return "Bilinmeyen LLM sağlayıcısı." | |
| except Exception as e: | |
| return f"LLM çağrısı sırasında hata oluştu: {e}" | |
| import re | |
| import zipfile | |
| import io | |
| def parse_llm_output(llm_output): | |
| """LLM çıktısını dosya yolları ve içerikleri olarak ayrıştırır.""" | |
| files = {} | |
| # Her bir dosya başlığını yakalamak için regex | |
| # Başlıklar: # context/01_persona.md, # context/02_project_overview.md vb. | |
| # İçerik, bir sonraki başlığa veya string'in sonuna kadar devam eder. | |
| matches = re.finditer(r'^#\s*(context/[\w\d_\-]+\.md)\s*\n', llm_output, re.MULTILINE) | |
| last_end = 0 | |
| last_file_path = None | |
| for match in matches: | |
| current_file_path = match.group(1).strip() | |
| current_start = match.end() | |
| if last_file_path: | |
| # Önceki dosyanın içeriğini al | |
| content = llm_output[last_end:match.start()].strip() | |
| files[last_file_path] = content | |
| last_file_path = current_file_path | |
| last_end = current_start | |
| # Son dosyanın içeriğini ekle | |
| if last_file_path: | |
| content = llm_output[last_end:].strip() | |
| files[last_file_path] = content | |
| return files | |
| def create_zip_from_files(files_dict): | |
| """Bir dosya sözlüğünden (yol:içerik) bir ZIP dosyası oluşturur ve baytlarını döndürür.""" | |
| zip_buffer = io.BytesIO() | |
| with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED, False) as zip_file: | |
| for file_path, content in files_dict.items(): | |
| # ZIP içinde klasör yapısını korumak için | |
| zip_file.writestr(file_path, content.encode("utf-8")) | |
| zip_buffer.seek(0) | |
| return zip_buffer.getvalue() | |