본문 바로가기
IT 전자기기

제미나이가 스스로 코딩하고 에러 찾고 완성 하는 설정

by 다사도 2026. 2. 19.
반응형
pkg install python
pip install google-genai

cat << 'EOF' > autocoder.py
import os
import sys
import subprocess
import time
from google import genai

# --- [설정 및 환경 변수] ---
# 요청하신 API 키와 신규 라이브러리 규격을 적용했습니다.
API_KEY = ""
client = genai.Client(api_key=API_KEY)

# 모델명은 요청하신 gemini-3-flash-preview를 사용합니다.
MODEL_ID = "gemini-3-flash-preview"

TASK_FILE = "p1.txt"
TARGET_FILE = "generated_code.py"
MAX_RETRIES = 30

def read_task():
    if not os.path.exists(TASK_FILE):
        with open(TASK_FILE, "w", encoding="utf-8") as f:
            f.write("print('Hello from Gemini!')")
        print(f"'{TASK_FILE}'이 없어 샘플을 생성했습니다. 내용을 수정하고 다시 실행하세요.")
        sys.exit(0)
    with open(TASK_FILE, "r", encoding="utf-8") as f:
        return f.read()

def ask_gemini(prompt):
    try:
        # 신규 google-genai 라이브러리 호출 방식
        response = client.models.generate_content(
            model=MODEL_ID,
            contents=prompt
        )
        text = response.text
        # 마크다운 코드 블록 제거 로직
        if "```python" in text:
            code = text.split("```python")[1].split("```")[0].strip()
        elif "```" in text:
            code = text.split("```")[1].split("```")[0].strip()
        else:
            code = text.strip()
        return code
    except Exception as e:
        return f"API_ERROR: {str(e)}"

def run_code():
    try:
        result = subprocess.run(
            [sys.executable, TARGET_FILE],
            capture_output=True,
            text=True,
            timeout=300
        )
        return result.returncode, result.stdout, result.stderr
    except subprocess.TimeoutExpired:
        return -1, "", "Execution Timeout (Possible Infinite Loop)"
    except Exception as e:
        return -1, "", str(e)

def main():
    print(f"--- 자동 개발 시스템 가동 (라이브러리: google-genai / 모델: {MODEL_ID}) ---")
    task_description = read_task()
    
    current_attempt = 1
    last_error = ""
    existing_code = ""
    
    if os.path.exists(TARGET_FILE):
        with open(TARGET_FILE, "r", encoding="utf-8") as f:
            existing_code = f.read()

    while current_attempt <= MAX_RETRIES:
        print(f"\n[시도 {current_attempt}/{MAX_RETRIES}] 코드를 생성/수정 중...")
        
        if not last_error and not existing_code:
            prompt = f"다음 요구사항을 구현하는 파이썬 코드를 작성해줘:\n{task_description}\n코드만 출력해."
        else:
            prompt = (
                f"요구사항: {task_description}\n\n"
                f"이전 코드:\n{existing_code}\n\n"
                f"에러 메시지:\n{last_error}\n\n"
                "위 에러를 고쳐서 완성된 전체 코드를 다시 작성해줘. 코드만 출력해."
            )

        generated_code = ask_gemini(prompt)
        
        if "API_ERROR" in generated_code:
            print(f"❌ {generated_code}")
            break

        with open(TARGET_FILE, "w", encoding="utf-8") as f:
            f.write(generated_code)
        existing_code = generated_code
        
        print(f"테스트 실행 중...")
        return_code, stdout, stderr = run_code()

        if return_code == 0:
            print(f"\n✅ 성공! {current_attempt}번 만에 완성되었습니다.")
            print(f"파일명: {TARGET_FILE}")
            print(f"실행 결과:\n{stdout}")
            break
        else:
            last_error = stderr if stderr else stdout
            print(f"❌ 실패 (시도 {current_attempt}): {last_error[:50]}...")
            current_attempt += 1
            time.sleep(1)

    if current_attempt > MAX_RETRIES:
        print("\n최대 횟수 초과로 중단되었습니다.")

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n사용자가 중단했습니다.")
EOF
python autocoder.py

"p1.txt" 파일에 요구사항 입력
추천 p1.txt 전략:

역할: 너는 홍콩 주식 시장 전문 퀀트(Quant) 개발자야.

상황: 현재 네트워크 환경이 불안정할 수 있어.

지시: 단순 크롤링이 안 되면, 제미니 너의 검색 기능을 사용해서라도 종목 번호와 이름을 정확히 알아내서 파일에 기록해.

금기: 절대 빈 칸으로 파일을 만들지 마. 데이터가 없으면 '데이터 수집 실패 이유'를 상세히 적어.

요구사항 : 필요한 프로그램 기능을 여기에 입력.


"generated_code.py" 파일로 만들어짐.
30회 동안 완성 못하면 다시 실행하면 이어서 개선함.
완성되면 위 파일 이름을 알아서 바꿔 줘야함.

 

반응형

댓글