File size: 8,107 Bytes
8571f1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
"""
Приклад та тест використання GPT-5.3-chat-latest в проєкті Legal Position AI Analyzer

Параметри моделі:
- reasoning_effort: "low", "medium", "high"
- verbosity: "low", "medium", "high"
- store: False (не зберігати в історії OpenAI)
"""

import os
import sys
from openai import OpenAI

# Ініціалізація клієнта OpenAI
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

MODEL_NAME = "gpt-5.3-chat-latest"


def test_basic_connection():
    """Простий тест підключення до моделі."""
    print(f"Тест підключення до {MODEL_NAME}...")

    # NOTE: gpt-5.3-chat-latest supports only reasoning_effort="medium"
    response = client.chat.completions.create(
        model=MODEL_NAME,
        messages=[
            {"role": "developer", "content": "Ти - правовий асистент."},
            {"role": "user", "content": "Дай коротке визначення правової позиції суду (1-2 речення)."}
        ],
        reasoning_effort="medium",
        verbosity="medium",
        store=False,
        max_completion_tokens=256
    )

    content = response.choices[0].message.content
    print(f"Відповідь: {content}")
    print(f"Використано токенів: {response.usage.total_tokens}")
    return content


def generate_legal_position(
    court_decision_text: str,
    reasoning_effort: str = "medium",
    verbosity: str = "medium"
):
    """
    Генерація правової позиції з використанням GPT-5.3-chat-latest

    Args:
        court_decision_text: Текст судового рішення
        reasoning_effort: Рівень reasoning ("low", "medium", "high")
        verbosity: Рівень деталізації відповіді ("low", "medium", "high")

    Returns:
        Згенерована правова позиція у форматі JSON
    """

    system_prompt = """Ти - експерт-правознавець, який аналізує судові рішення
    та формує правові позиції Верховного Суду України."""

    user_prompt = f"""
    Проаналізуй наступне судове рішення та сформуй правову позицію:

    <court_decision>
    {court_decision_text}
    </court_decision>

    Поверни результат у форматі JSON з полями:
    - title: заголовок правової позиції
    - text: текст правової позиції
    - proceeding: тип судочинства
    - category: категорія справи
    """

    response = client.chat.completions.create(
        model=MODEL_NAME,
        messages=[
            {"role": "developer", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ],
        response_format={"type": "json_object"},
        reasoning_effort=reasoning_effort,
        verbosity=verbosity,
        store=False,
        max_completion_tokens=2048
    )

    return response.choices[0].message.content


def analyze_relevance(
    legal_position: dict,
    existing_positions: list,
    reasoning_effort: str = "medium"
):
    """
    Аналіз релевантності існуючих правових позицій з використанням GPT-5.3-chat-latest

    Args:
        legal_position: Згенерована правова позиція
        existing_positions: Список існуючих правових позицій
        reasoning_effort: Рівень reasoning ("low", "medium", "high")

    Returns:
        Аналіз релевантності у форматі JSON
    """

    system_prompt = """Ти - експерт-аналітик правових позицій Верховного Суду України."""

    positions_text = "\n\n".join([
        f"[{i+1}] {pos['title']}: {pos['text']}"
        for i, pos in enumerate(existing_positions)
    ])

    user_prompt = f"""
    Проаналізуй релевантність існуючих правових позицій до нової позиції:

    Нова позиція:
    {legal_position['title']}: {legal_position['text']}

    Існуючі позиції:
    {positions_text}

    Поверни аналіз у форматі JSON з полями:
    - relevant_positions: список релевантних позицій з обґрунтуванням
    """

    response = client.chat.completions.create(
        model=MODEL_NAME,
        messages=[
            {"role": "developer", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ],
        response_format={"type": "json_object"},
        reasoning_effort=reasoning_effort,
        verbosity="medium",
        store=False,
        max_completion_tokens=4000
    )

    return response.choices[0].message.content


# Запуск тестів
if __name__ == "__main__":
    import json

    if not os.getenv("OPENAI_API_KEY"):
        print("ПОМИЛКА: Змінна OPENAI_API_KEY не встановлена.")
        sys.exit(1)

    # Тест 1: базове підключення
    print("=" * 60)
    print(f"ТЕСТ: {MODEL_NAME}")
    print("=" * 60)

    try:
        test_basic_connection()
        print("ТЕСТ 1 (підключення): OK\n")
    except Exception as e:
        print(f"ТЕСТ 1 (підключення): ПОМИЛКА - {e}\n")
        sys.exit(1)

    # Тест 2: генерація правової позиції
    test_decision = """
    ПОСТАНОВА ІМЕНЕМ УКРАЇНИ

    Верховний Суд у складі колегії суддів Касаційного цивільного суду
    розглянув у порядку письмового провадження справу за позовом фізичної особи
    до банку про захист прав споживача.

    Суд встановив, що банк нараховував комісію за обслуговування кредиту,
    яка не була передбачена кредитним договором, що є порушенням прав споживача
    відповідно до Закону України "Про захист прав споживачів".
    """

    # NOTE: gpt-5.3-chat-latest підтримує лише reasoning_effort="medium"
    print("Тест 2: Генерація правової позиції (reasoning_effort=medium)...")
    try:
        result = generate_legal_position(
            court_decision_text=test_decision,
            reasoning_effort="medium",
            verbosity="medium"
        )
        parsed = json.loads(result)
        print(f"Title: {parsed.get('title', 'N/A')}")
        print(f"Category: {parsed.get('category', 'N/A')}")
        print("ТЕСТ 2 (генерація): OK\n")
    except Exception as e:
        print(f"ТЕСТ 2 (генерація): ПОМИЛКА - {e}\n")
        sys.exit(1)

    # Тест 3: аналіз релевантності
    print("Тест 3: Аналіз релевантності...")
    existing = [
        {
            "title": "Про нарахування незаконних комісій банком",
            "text": "Банк не має права нараховувати комісії, не передбачені договором."
        }
    ]
    try:
        analysis = analyze_relevance(
            legal_position=parsed,
            existing_positions=existing,
            reasoning_effort="medium"
        )
        print(f"Аналіз: {analysis[:200]}...")
        print("ТЕСТ 3 (аналіз): OK\n")
    except Exception as e:
        print(f"ТЕСТ 3 (аналіз): ПОМИЛКА - {e}\n")
        sys.exit(1)

    print("=" * 60)
    print("Всі тести пройшли успішно!")