| | """ |
| | Test script to verify Gemini models for legal position generation |
| | """ |
| | import os |
| | import json |
| | from dotenv import load_dotenv |
| | from google import genai |
| | from google.genai import types |
| |
|
| | |
| | load_dotenv() |
| |
|
| | SYSTEM_PROMPT = """Ти - експертний юридичний асистент, який спеціалізується на аналізі судових рішень |
| | та формуванні правових позицій Верховного Суду України.""" |
| |
|
| | def test_gemini_model(model_name: str, test_content: str): |
| | """Test a specific Gemini model""" |
| | print(f"\n{'='*80}") |
| | print(f"Testing model: {model_name}") |
| | print(f"{'='*80}\n") |
| | |
| | try: |
| | client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY")) |
| | |
| | json_instruction = """ |
| | Відповідь ОБОВ'ЯЗКОВО має бути у форматі JSON з такою структурою: |
| | { |
| | "title": "Заголовок правової позиції", |
| | "text": "Текст правової позиції", |
| | "proceeding": "Вид провадження", |
| | "category": "Категорія" |
| | } |
| | """ |
| | full_content = f"{test_content}\n\n{json_instruction}" |
| | |
| | contents = [ |
| | types.Content( |
| | role="user", |
| | parts=[ |
| | types.Part.from_text(text=full_content), |
| | ], |
| | ), |
| | ] |
| | |
| | |
| | config_params = { |
| | "temperature": 0, |
| | "max_output_tokens": 1000, |
| | "system_instruction": [ |
| | types.Part.from_text(text=SYSTEM_PROMPT), |
| | ], |
| | } |
| | |
| | |
| | if not model_name.startswith("gemini-3"): |
| | config_params["response_mime_type"] = "application/json" |
| | print("✓ Using response_mime_type='application/json'") |
| | else: |
| | print("✓ NOT using response_mime_type (Gemini 3 model)") |
| | |
| | generate_content_config = types.GenerateContentConfig(**config_params) |
| | |
| | print(f"Sending request to {model_name}...") |
| | response = client.models.generate_content( |
| | model=model_name, |
| | contents=contents, |
| | config=generate_content_config, |
| | ) |
| | |
| | response_text = response.text |
| | print(f"\n📝 Raw response (first 300 chars):\n{response_text[:300]}...\n") |
| | |
| | |
| | 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__": |
| | |
| | test_content = """ |
| | Проаналізуй це судове рішення та сформуй правову позицію: |
| | |
| | Суд встановив, що позивач звернувся з позовом про стягнення заборгованості по заробітній платі. |
| | Відповідач заперечував проти позову, посилаючись на відсутність трудових відносин. |
| | Суд встановив наявність трудових відносин та задовольнив позов. |
| | """ |
| | |
| | print("="*80) |
| | print("GEMINI MODELS COMPARISON TEST") |
| | print("="*80) |
| | |
| | models = [ |
| | "gemini-2.0-flash-exp", |
| | "gemini-3-flash-preview" |
| | ] |
| | |
| | results = {} |
| | for model in models: |
| | results[model] = test_gemini_model(model, test_content) |
| | |
| | print("\n" + "="*80) |
| | print("SUMMARY") |
| | print("="*80) |
| | for model, success in results.items(): |
| | status = "✅ SUCCESS" if success else "❌ FAILED" |
| | print(f"{model}: {status}") |
| |
|