From 0079d5a6bfe1f7a59d367ea0e6e70aa7a0061bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B2=BD=EB=AF=BC?= Date: Thu, 19 Mar 2026 09:16:53 +0900 Subject: [PATCH] Upload handlers/common.py --- 03.Code/업로드용/handlers/common.py | 84 +++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 03.Code/업로드용/handlers/common.py diff --git a/03.Code/업로드용/handlers/common.py b/03.Code/업로드용/handlers/common.py new file mode 100644 index 0000000..8ff6b9e --- /dev/null +++ b/03.Code/업로드용/handlers/common.py @@ -0,0 +1,84 @@ +from dotenv import load_dotenv +load_dotenv() +# -*- coding: utf-8 -*- +""" +공통 핸들러 유틸리티 +- JSON/HTML 추출 +""" + + +import os +import re +import json +import anthropic + +# Claude API 클라이언트 +client = anthropic.Anthropic( + api_key=os.environ.get("ANTHROPIC_API_KEY") +) + + +def call_claude(system_prompt: str, user_message: str, max_tokens: int = 8000) -> str: + """Claude API 호출""" + response = client.messages.create( + model="claude-sonnet-4-20250514", + max_tokens=max_tokens, + system=system_prompt, + messages=[{"role": "user", "content": user_message}] + ) + return response.content[0].text + + +def extract_json(text: str) -> dict: + """텍스트에서 JSON 추출""" + # 코드 블록 제거 + if '```json' in text: + text = text.split('```json')[1].split('```')[0] + elif '```' in text: + text = text.split('```')[1].split('```')[0] + + text = text.strip() + + # JSON 데이터 파싱 + try: + return json.loads(text) + except json.JSONDecodeError: + # JSON 부분만 추출 시도 + match = re.search(r'\{[\s\S]*\}', text) + if match: + try: + return json.loads(match.group()) + except: + pass + return None + + +def extract_html(text: str) -> str: + """텍스트에서 HTML 추출""" + # 코드 블록 제거 + if '```html' in text: + text = text.split('```html')[1].split('```')[0] + elif '```' in text: + parts = text.split('```') + if len(parts) >= 2: + text = parts[1] + + text = text.strip() + + # )', text, re.IGNORECASE) + if match: + text = match.group(1) + + return text + + +def load_prompt(prompts_dir: str, filename: str) -> str: + """프롬프트 파일 로드""" + prompt_path = os.path.join(prompts_dir, filename) + try: + with open(prompt_path, 'r', encoding='utf-8') as f: + return f.read() + except FileNotFoundError: + return None