""" CRANE AI - Kod Yazım Modülü """ import re from typing import Dict, Any from core.base_module import BaseMicroModule import logging logger = logging.getLogger(__name__) class CodeModule(BaseMicroModule): """Kod yazımı için özelleşmiş modül""" def __init__(self, config: Dict[str, Any]): super().__init__( model_id="deepseek-ai/deepseek-coder-1.3b-instruct", config=config ) # Kod kelime anahtar kelimeleri self.code_keywords = { "function", "class", "def", "import", "from", "return", "if", "else", "for", "while", "try", "except", "with", "python", "javascript", "java", "c++", "html", "css", "kod", "kodu", "script", "fonksiyon", "sınıf", "algoritma", "program", "yazılım", "debug", "hata", "fix", "düzelt" } # Programlama dilleri self.programming_languages = { "python", "javascript", "java", "c++", "c#", "php", "ruby", "go", "rust", "kotlin", "swift", "typescript", "html", "css", "sql", "bash", "powershell", "r", "matlab", "scala" } def can_handle(self, query: str, context: Dict[str, Any]) -> float: """Kod yazımı sorguları için uygunluk skoru""" query_lower = query.lower() # Kod anahtar kelimelerini kontrol et code_score = 0 for keyword in self.code_keywords: if keyword in query_lower: code_score += 0.15 # Programlama dili belirtilmişse for lang in self.programming_languages: if lang in query_lower: code_score += 0.3 # Kod yazımı action kelimeleri action_keywords = ["yaz", "oluştur", "geliştir", "kur", "hazırla", "tasarla"] for action in action_keywords: if action in query_lower: code_score += 0.2 # Kod karakteristik işaretlerini kontrol et if any(char in query for char in ["()", "{}", "[]", "==", "!=", "<=", ">="]): code_score += 0.15 # Kod blokları varsa if "```" in query or "def " in query or "class " in query: code_score += 0.3 # Spesifik kod türleri code_types = ["hesap", "makinesi", "calculator", "app", "uygulama", "website", "site"] for code_type in code_types: if code_type in query_lower: code_score += 0.25 # Maksimum 1.0 skor return min(code_score, 1.0) async def process(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]: """Kod yazımı işlemi""" try: # Kod yazımı için özel prompt prompt = self._build_code_prompt(query, context) # Kod üretimi response = await self.generate_response( prompt, max_tokens=self.config.get("max_tokens", 2048), temperature=0.1 # Kod için düşük temperature ) # Kod bloklarını ayıkla code_blocks = self._extract_code_blocks(response) return { "response": response, "code_blocks": code_blocks, "language": self._detect_language(query), "module": "code_module", "confidence": self.can_handle(query, context) } except Exception as e: logger.error(f"Code processing error: {str(e)}") return { "error": str(e), "module": "code_module" } def _build_code_prompt(self, query: str, context: Dict[str, Any]) -> str: """Kod yazımı için prompt hazırlar""" # Dil tespiti language = self._detect_language(query) # Temel prompt prompt = f"""Sen bir uzman programcısın. Kullanıcının sorusunu anla ve en iyi kodu yaz. Kullanıcı sorusu: {query} Lütfen: 1. Temiz, okunabilir kod yaz 2. Kod açıklamalarını Türkçe yap 3. En iyi pratikleri kullan 4. Gerekirse örnek kullanımı göster """ # Dil özelinde ekleme if language: prompt += f"Programlama dili: {language}\n" # Bağlam varsa ekle if context.get("history"): prompt += f"Önceki konuşma: {context['history'][-1]}\n" return prompt def _detect_language(self, query: str) -> str: """Sorgudan programlama dilini tespit eder""" query_lower = query.lower() for lang in self.programming_languages: if lang in query_lower: return lang # Varsayılan dil return "python" def _extract_code_blocks(self, response: str) -> list: """Yanıttan kod bloklarını ayıklar""" code_blocks = [] # Markdown kod blokları pattern = r'```(\w+)?\n(.*?)\n```' matches = re.findall(pattern, response, re.DOTALL) for match in matches: lang, code = match code_blocks.append({ "language": lang or "text", "code": code.strip() }) # Tek satır kod blokları inline_pattern = r'`([^`]+)`' inline_matches = re.findall(inline_pattern, response) for code in inline_matches: if len(code) > 5: # Çok kısa olanları atla code_blocks.append({ "language": "inline", "code": code.strip() }) return code_blocks