from dotenv import load_dotenv load_dotenv() # -*- coding: utf-8 -*- """ 공통 핸들러 함수 - Claude API 호출 - 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