| | """ |
| | Test script to verify Claude 4.5 models with thinking mode |
| | """ |
| | import os |
| | from dotenv import load_dotenv |
| | from anthropic import Anthropic |
| |
|
| | |
| | load_dotenv() |
| |
|
| | SYSTEM_PROMPT = """Ти - експертний юридичний асистент, який спеціалізується на аналізі судових рішень |
| | та формуванні правових позицій Верховного Суду України.""" |
| |
|
| | def test_claude_model(model_name: str, with_thinking: bool = False): |
| | """Test a specific Claude model""" |
| | print(f"\n{'='*80}") |
| | print(f"Testing model: {model_name}") |
| | print(f"Thinking mode: {'ENABLED' if with_thinking else 'DISABLED'}") |
| | print(f"{'='*80}\n") |
| | |
| | try: |
| | client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) |
| | |
| | content = """ |
| | Проаналізуй це судове рішення та сформуй правову позицію у форматі JSON: |
| | { |
| | "title": "Заголовок", |
| | "text": "Текст позиції", |
| | "proceeding": "Вид провадження", |
| | "category": "Категорія" |
| | } |
| | |
| | Судове рішення: |
| | Суд встановив, що позивач звернувся з позовом про стягнення заборгованості по заробітній платі. |
| | Відповідач заперечував проти позову, посилаючись на відсутність трудових відносин. |
| | Суд встановив наявність трудових відносин та задовольнив позов. |
| | """ |
| | |
| | messages = [{ |
| | "role": "user", |
| | "content": f"{SYSTEM_PROMPT}\n\n{content}" |
| | }] |
| | |
| | |
| | message_params = { |
| | "model": model_name, |
| | "max_tokens": 10000, |
| | "messages": messages, |
| | "temperature": 0 |
| | } |
| | |
| | |
| | if with_thinking: |
| | message_params["thinking"] = { |
| | "type": "enabled", |
| | "budget_tokens": 5000 |
| | } |
| | print("✓ Thinking enabled with 5000 tokens budget") |
| | |
| | print(f"Sending request to {model_name}...") |
| | response = client.messages.create(**message_params) |
| | |
| | |
| | response_text = "" |
| | for block in response.content: |
| | if hasattr(block, 'text'): |
| | response_text += block.text |
| | print(f"📝 Block type: {block.type}") |
| | |
| | print(f"\n📄 Response (first 500 chars):\n{response_text[:500]}...\n") |
| | |
| | |
| | import json |
| | text_to_parse = response_text.strip() |
| | |
| | |
| | if text_to_parse.startswith("```json"): |
| | text_to_parse = text_to_parse[7:] |
| | print("✓ Removed ```json wrapper") |
| | elif text_to_parse.startswith("```"): |
| | text_to_parse = text_to_parse[3:] |
| | print("✓ Removed ``` wrapper") |
| | |
| | if text_to_parse.endswith("```"): |
| | text_to_parse = text_to_parse[:-3] |
| | print("✓ Removed trailing ```") |
| | |
| | text_to_parse = text_to_parse.strip() |
| | |
| | |
| | start_idx = text_to_parse.find('{') |
| | end_idx = text_to_parse.rfind('}') |
| | |
| | if start_idx != -1 and end_idx != -1: |
| | text_to_parse = text_to_parse[start_idx:end_idx + 1] |
| | print(f"✓ Extracted JSON from position {start_idx} to {end_idx}") |
| | |
| | json_response = json.loads(text_to_parse) |
| | |
| | print(f"\n✅ Successfully parsed JSON!") |
| | print(f"📋 Parsed response:") |
| | print(json.dumps(json_response, ensure_ascii=False, indent=2)) |
| | |
| | |
| | required_fields = ["title", "text", "proceeding", "category"] |
| | missing_fields = [field for field in required_fields if field not in json_response] |
| | |
| | if missing_fields: |
| | print(f"\n⚠️ Missing fields: {missing_fields}") |
| | else: |
| | print(f"\n✅ All required fields present!") |
| | |
| | return True |
| | |
| | except json.JSONDecodeError as e: |
| | print(f"\n❌ JSON parsing error: {str(e)}") |
| | print(f"Failed to parse: {text_to_parse[:200]}...") |
| | return False |
| | except Exception as e: |
| | print(f"\n❌ Error: {str(e)}") |
| | import traceback |
| | traceback.print_exc() |
| | return False |
| |
|
| |
|
| | if __name__ == "__main__": |
| | print("="*80) |
| | print("CLAUDE 4.5 MODELS TEST") |
| | print("="*80) |
| | |
| | models = [ |
| | "claude-sonnet-4-5-20250929", |
| | "claude-haiku-4-5-20251001", |
| | "claude-opus-4-5-20251101" |
| | ] |
| | |
| | results = {} |
| | |
| | |
| | for model in models: |
| | results[f"{model} (no thinking)"] = test_claude_model(model, with_thinking=False) |
| | |
| | |
| | results[f"{models[0]} (with thinking)"] = test_claude_model(models[0], with_thinking=True) |
| | |
| | print("\n" + "="*80) |
| | print("SUMMARY") |
| | print("="*80) |
| | for model, success in results.items(): |
| | status = "✅ SUCCESS" if success else "❌ FAILED" |
| | print(f"{model}: {status}") |
| |
|