File size: 6,374 Bytes
716ba45
1a11491
50c782f
d911a45
716ba45
1c9032d
1a11491
 
 
 
 
 
61d1412
 
 
 
 
 
 
 
92f52a0
 
61d1412
23b1f8d
 
 
61d1412
514bb86
61d1412
 
 
 
23b1f8d
 
 
61d1412
23b1f8d
61d1412
514bb86
61d1412
 
 
514bb86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61d1412
d911a45
61d1412
 
 
 
 
 
1a11491
d911a45
 
 
50c782f
d911a45
61d1412
d911a45
 
c660ad9
d911a45
 
9b1e761
23b1f8d
3a67a8e
d911a45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92f52a0
61d1412
d911a45
61d1412
d911a45
 
c660ad9
23b1f8d
d911a45
 
 
 
 
 
 
 
 
 
 
61d1412
d911a45
23b1f8d
 
 
61d1412
 
23b1f8d
61d1412
23b1f8d
d911a45
 
 
 
 
 
 
 
 
 
 
 
23b1f8d
61d1412
d911a45
 
 
 
 
 
 
 
3a67a8e
d911a45
 
 
 
 
92f52a0
d911a45
 
 
 
c660ad9
d911a45
50c782f
 
716ba45
d911a45
c660ad9
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
import gradio as gr
from datetime import datetime
from huggingface_hub import InferenceClient
import os

class DefenseGenerator:
    def __init__(self):
        self.api_key = os.getenv("HF_API_KEY")
        if not self.api_key:
            raise EnvironmentError("HF_API_KEY não configurada")
        self.client = InferenceClient(api_key=self.api_key)
        
        self.document_types = {
            "resposta_acusacao": "Resposta à Acusação",
            "habeas_corpus": "Habeas Corpus",
            "revogacao_preventiva": "Revogação de Prisão Preventiva",
            "liberdade_provisoria": "Liberdade Provisória",
            "relaxamento_prisao": "Relaxamento de Prisão",
            "apelacao": "Recurso de Apelação",
            "embargos": "Embargos de Declaração"
        }

    def generate_content(self, prompt: str) -> str:
        try:
            response = self.client.chat.completions.create(
                model="mistralai/Mistral-7B-Instruct-v0.3",
                messages=[
                    {"role": "system", "content": "Você é um advogado criminalista experiente. Gere peças sem usar asteriscos ou marcadores. Use numeração romana para seções principais (I, II, III...) e números arábicos para subitens (1, 2, 3...). Mantenha formatação consistente e profissional."},
                    {"role": "user", "content": prompt}
                ],
                max_tokens=2000,
                temperature=0.7
            )
            return response.choices[0].message["content"]
        except Exception as e:
            return f"Erro na geração: {str(e)}"

    def gerar_documento(self, tipo: str, fatos: str, dados_basicos: dict) -> str:
        prompt = f"""Gere uma peça de {self.document_types[tipo]} completa, formatada e sem asteriscos, com base nos seguintes fatos:

{fatos}

A peça deve seguir este formato:

EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) [AUTORIDADE]

[Título da Peça em Maiúsculas]

I - QUALIFICAÇÃO DAS PARTES
[Nome e dados completos]

II - FUNDAMENTOS JURÍDICOS
1. [Primeiro fundamento]
2. [Segundo fundamento]
[...]

III - JURISPRUDÊNCIA APLICÁVEL
1. [Primeira jurisprudência]
2. [Segunda jurisprudência]
[...]

IV - DOUTRINA APLICÁVEL
[Citações doutrinárias relevantes]

V - PRELIMINARES
1. [Primeira preliminar]
2. [Segunda preliminar]
[...]

VI - MÉRITO
[Desenvolvimento dos argumentos]

VII - PEDIDOS
1. [Primeiro pedido]
2. [Segundo pedido]
[...]

Local, Data.

[Advogado]
OAB/[Estado] [Número]

Dados para formatação:
Comarca: {dados_basicos['comarca']}
Vara: {dados_basicos['vara']}
Cliente: {dados_basicos['cliente']}
OAB: {dados_basicos['oab']}"""

        return self.generate_content(prompt)

def create_interface():
    with gr.Blocks(theme=gr.themes.Soft()) as demo:
        gr.Markdown("# Sistema Criminal.AI", elem_classes="text-center text-2xl font-bold mb-4")
        
        with gr.Group():
            tipo = gr.Dropdown(
                choices=list(DefenseGenerator().document_types.keys()),
                value="resposta_acusacao",
                label="Tipo de Peça",
                container=False,
                scale=1
            )
        
        with gr.Row():
            with gr.Column(scale=1):
                comarca = gr.Textbox(
                    label="Comarca",
                    placeholder="Ex: São Paulo",
                    container=False
                )
                vara = gr.Textbox(
                    label="Vara",
                    placeholder="Ex: 1ª",
                    container=False
                )
            
            with gr.Column(scale=1):
                cliente = gr.Textbox(
                    label="Nome do Cliente",
                    placeholder="Ex: João da Silva",
                    container=False
                )
                oab = gr.Textbox(
                    label="OAB",
                    placeholder="Ex: SP123456",
                    container=False
                )
        
        fatos = gr.Textbox(
            label="Descreva os fatos",
            placeholder="Descreva a situação do cliente e o que precisa ser argumentado...",
            lines=5,
            container=False
        )
        
        with gr.Row():
            gerar_btn = gr.Button("Gerar Peça", variant="primary", scale=2)
            limpar_btn = gr.Button("Limpar", scale=1)
            
        output = gr.TextArea(
            label="Documento Gerado",
            lines=20,
            show_copy_button=True,
            container=False
        )

        def process(tipo, fatos, comarca, vara, cliente, oab):
            gerador = DefenseGenerator()
            dados = {
                "comarca": comarca,
                "vara": vara,
                "cliente": cliente,
                "oab": oab
            }
            return gerador.gerar_documento(tipo, fatos, dados)
            
        def clear():
            return {
                tipo: "resposta_acusacao",
                comarca: "",
                vara: "",
                cliente: "",
                oab: "",
                fatos: "",
                output: ""
            }
            
        gerar_btn.click(
            fn=process,
            inputs=[tipo, fatos, comarca, vara, cliente, oab],
            outputs=output,
            api_name="gerar_peca"
        )
        
        limpar_btn.click(
            fn=clear,
            outputs=[tipo, comarca, vara, cliente, oab, fatos, output],
            api_name="limpar"
        )

        exemplos = [
            ["resposta_acusacao", "Cliente preso em flagrante por furto de celular iPhone 13 da vítima Maria em 10/01/2024. É primário, tem residência fixa e trabalho. A vítima não reconheceu com certeza.", "São Paulo", "1ª", "João Silva", "SP123456"],
            ["habeas_corpus", "Cliente preso preventivamente há 90 dias por tráfico. Apreendidas 10g de maconha, é primário, tem residência e trabalho fixos. Não foram apreendidos outros materiais típicos de tráfico.", "São Paulo", "2ª", "Pedro Santos", "SP654321"]
        ]
        
        gr.Examples(
            examples=exemplos,
            inputs=[tipo, fatos, comarca, vara, cliente, oab],
            label="Exemplos de Uso"
        )

    return demo

if __name__ == "__main__":
    demo = create_interface()
    demo.launch()