codebridge-ai
Version:
Complete fullstack AI coding platform with AST-based code integration and local LLM support. Now with comprehensive web technology support (HTML/CSS/JS) plus JavaScript, Python, Rust, and C++.
200 lines (166 loc) • 6.4 kB
JavaScript
/**
* 수정된 Python 테스트 - 전처리기 문제 해결
*/
const fs = require('fs').promises;
const path = require('path');
const OllamaCodeBridge = require('../integrations/ollama-integration');
// 개선된 다중 언어 전처리기
function enhancedPreprocessor(response, language = 'javascript') {
console.log(`🔧 언어별 전처리 시작: ${language}`);
// 1. 언어별 코드 블록 패턴
const languagePatterns = {
javascript: [
/```(?:javascript|js|jsx|typescript|ts)?\n?([\s\S]*?)```/g,
/```\n?([\s\S]*?)```/g
],
python: [
/```(?:python|py)?\n?([\s\S]*?)```/g,
/```\n?([\s\S]*?)```/g
],
rust: [
/```(?:rust|rs)?\n?([\s\S]*?)```/g,
/```\n?([\s\S]*?)```/g
],
cpp: [
/```(?:cpp|c\+\+|c)?\n?([\s\S]*?)```/g,
/```\n?([\s\S]*?)```/g
]
};
const patterns = languagePatterns[language] || languagePatterns.javascript;
// 2. 코드 블록 추출
for (const pattern of patterns) {
const matches = [...response.matchAll(pattern)];
if (matches.length > 0) {
const longestMatch = matches.reduce((prev, current) =>
current[1].length > prev[1].length ? current : prev
);
let extracted = longestMatch[1].trim();
console.log(`✅ 코드 블록 추출 성공 (${extracted.length} 문자)`);
// 3. 언어별 키워드 검증
const languageKeywords = {
python: /\b(def|class|import|from|if|for|while|return|raise|try|except)\b/,
javascript: /\b(function|class|const|let|var|if|for|while|return|throw|try|catch)\b/,
rust: /\b(fn|struct|impl|use|if|for|while|return|match|pub|mod)\b/,
cpp: /\b(class|struct|int|void|if|for|while|return|throw|try|catch|#include)\b/
};
const keywordPattern = languageKeywords[language];
if (keywordPattern && keywordPattern.test(extracted)) {
console.log(`✅ ${language} 키워드 검증 통과`);
return extracted;
}
return extracted;
}
}
// 4. 코드 블록이 없다면 직접 추출 시도 (언어별)
console.log('⚠️ 코드 블록 없음, 직접 추출 시도');
const lines = response.split('\n');
const codeLines = [];
let inCode = false;
if (language === 'python') {
for (const line of lines) {
const trimmed = line.trim();
// Python 코드 시작 감지
if (!inCode && (
trimmed.startsWith('def ') ||
trimmed.startsWith('class ') ||
trimmed.startsWith('from ') ||
trimmed.startsWith('import ') ||
/^[a-zA-Z_][a-zA-Z0-9_]*\s*=/.test(trimmed)
)) {
inCode = true;
codeLines.push(line);
}
// 코드 계속
else if (inCode) {
codeLines.push(line);
// 연속 빈 줄로 끝 감지
if (trimmed === '' && codeLines[codeLines.length - 2]?.trim() === '') {
break;
}
}
}
}
const extracted = codeLines.join('\n').trim();
console.log(`📏 직접 추출 결과: ${extracted.length} 문자`);
return extracted;
}
async function testFixedPythonProcessing() {
console.log('🐍 수정된 Python 처리 테스트\n');
const pythonCode = `
def calculate_average(numbers):
total = sum(numbers)
return total / len(numbers)`;
const task = "Add type hints, docstring, and error handling for empty list";
const ollamaCodeBridge = new OllamaCodeBridge({
model: 'deepseek-coder:6.7b',
temperature: 0.3
});
try {
console.log('🔍 1단계: 원본 Python 코드');
console.log('---');
console.log(pythonCode);
console.log('---\n');
console.log('🔍 2단계: LLM 응답 생성');
const prompt = `Original Python code:
\`\`\`python
${pythonCode}
\`\`\`
Task: ${task}
Return only the improved Python code with type hints, docstring, and error handling. Use proper Python syntax.`;
const rawResponse = await ollamaCodeBridge.callOllama(prompt);
console.log('원본 LLM 응답:');
console.log('---');
console.log(rawResponse);
console.log('---\n');
console.log('🔍 3단계: 개선된 전처리기 적용');
const improvedCode = enhancedPreprocessor(rawResponse, 'python');
console.log('전처리 결과:');
console.log('---');
console.log(improvedCode);
console.log('---\n');
console.log('🔍 4단계: Python 코드 품질 분석');
const hasTypeHints = improvedCode.includes('->') || improvedCode.includes(': ');
const hasDocstring = improvedCode.includes('"""') || improvedCode.includes("'''");
const hasErrorHandling = improvedCode.includes('raise') || improvedCode.includes('except');
const hasImports = improvedCode.includes('import') || improvedCode.includes('from');
console.log('품질 메트릭:');
console.log(` 타입 힌트: ${hasTypeHints ? '✅' : '❌'}`);
console.log(` 독스트링: ${hasDocstring ? '✅' : '❌'}`);
console.log(` 에러 처리: ${hasErrorHandling ? '✅' : '❌'}`);
console.log(` 임포트: ${hasImports ? '✅' : '❌'}`);
const qualityScore = [hasTypeHints, hasDocstring, hasErrorHandling, hasImports]
.filter(Boolean).length;
console.log(`\\n품질 점수: ${qualityScore}/4 (${(qualityScore/4*100).toFixed(1)}%)`);
// 결과 저장
const result = {
timestamp: new Date().toISOString(),
originalCode: pythonCode,
task,
rawResponse,
improvedCode,
qualityMetrics: {
hasTypeHints,
hasDocstring,
hasErrorHandling,
hasImports
},
qualityScore: qualityScore / 4,
success: improvedCode.length > 0 && qualityScore >= 2
};
const logFile = path.join(__dirname, 'fixed-python-test-result.json');
await fs.writeFile(logFile, JSON.stringify(result, null, 2));
console.log(`\\n💾 결과 저장: ${logFile}`);
if (result.success) {
console.log('\\n🎉 Python 처리 성공! 전처리기 문제 해결됨');
} else {
console.log('\\n⚠️ 아직 개선이 필요함');
}
} catch (error) {
console.error('테스트 실행 오류:', error.message);
}
}
// 실행
if (require.main === module) {
testFixedPythonProcessing().catch(console.error);
}
module.exports = { enhancedPreprocessor, testFixedPythonProcessing };