Context-Engineer / llm_utils.py
therayz1's picture
Upload 6 files
c3e5767 verified
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()