DeepRead.Monkai 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- deepread_monkai-2.0.1/DeepRead.Monkai.egg-info/PKG-INFO +360 -0
- deepread_monkai-2.0.1/DeepRead.Monkai.egg-info/SOURCES.txt +21 -0
- deepread_monkai-2.0.1/DeepRead.Monkai.egg-info/dependency_links.txt +1 -0
- deepread_monkai-2.0.1/DeepRead.Monkai.egg-info/requires.txt +22 -0
- deepread_monkai-2.0.1/DeepRead.Monkai.egg-info/top_level.txt +1 -0
- deepread_monkai-2.0.1/PKG-INFO +360 -0
- deepread_monkai-2.0.1/README.md +317 -0
- deepread_monkai-2.0.1/deepread/__init__.py +63 -0
- deepread_monkai-2.0.1/deepread/auth/__init__.py +18 -0
- deepread_monkai-2.0.1/deepread/auth/exceptions.py +28 -0
- deepread_monkai-2.0.1/deepread/auth/token.py +232 -0
- deepread_monkai-2.0.1/deepread/config.py +79 -0
- deepread_monkai-2.0.1/deepread/exceptions.py +26 -0
- deepread_monkai-2.0.1/deepread/models/__init__.py +65 -0
- deepread_monkai-2.0.1/deepread/models/classification.py +65 -0
- deepread_monkai-2.0.1/deepread/models/question.py +212 -0
- deepread_monkai-2.0.1/deepread/models/result.py +116 -0
- deepread_monkai-2.0.1/deepread/models/schemas.py +195 -0
- deepread_monkai-2.0.1/deepread/ocr.py +165 -0
- deepread_monkai-2.0.1/deepread/reader.py +551 -0
- deepread_monkai-2.0.1/deepread/utils.py +171 -0
- deepread_monkai-2.0.1/pyproject.toml +76 -0
- deepread_monkai-2.0.1/setup.cfg +4 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: DeepRead.Monkai
|
|
3
|
+
Version: 2.0.1
|
|
4
|
+
Summary: Biblioteca para extração inteligente de documentos PDF com IA
|
|
5
|
+
Author-email: Monkai <contato@monkai.com.br>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/BeMonkAI/deepread
|
|
8
|
+
Project-URL: Documentation, https://github.com/BeMonkAI/deepread#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/BeMonkAI/deepread
|
|
10
|
+
Project-URL: Issues, https://github.com/BeMonkAI/deepread/issues
|
|
11
|
+
Keywords: pdf,extraction,ai,ocr,document,llm,openai
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Classifier: Topic :: Text Processing :: General
|
|
22
|
+
Requires-Python: >=3.9
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
Requires-Dist: pydantic>=2.0.0
|
|
25
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
26
|
+
Requires-Dist: openai>=1.0.0
|
|
27
|
+
Requires-Dist: tiktoken>=0.5.0
|
|
28
|
+
Requires-Dist: llama-index-readers-file>=0.1.0
|
|
29
|
+
Requires-Dist: llama-index-core>=0.10.0
|
|
30
|
+
Requires-Dist: pypdf>=4.0.0
|
|
31
|
+
Requires-Dist: PyMuPDF>=1.24.0
|
|
32
|
+
Requires-Dist: requests>=2.28.0
|
|
33
|
+
Provides-Extra: ocr
|
|
34
|
+
Requires-Dist: azure-ai-vision-imageanalysis>=1.0.0; extra == "ocr"
|
|
35
|
+
Requires-Dist: Pillow>=10.0.0; extra == "ocr"
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
39
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
40
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
41
|
+
Provides-Extra: all
|
|
42
|
+
Requires-Dist: deepread[dev,ocr]; extra == "all"
|
|
43
|
+
|
|
44
|
+
# 📚 DeepRead
|
|
45
|
+
|
|
46
|
+
**Biblioteca Python para extração inteligente de documentos PDF com IA**
|
|
47
|
+
|
|
48
|
+
[](https://www.python.org/downloads/)
|
|
49
|
+
[](https://opensource.org/licenses/MIT)
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## ✨ Características
|
|
54
|
+
|
|
55
|
+
- 🔐 **Autenticação por Token** - Sistema seguro de autenticação
|
|
56
|
+
- 📄 **Extração Inteligente** - Extrai informações de PDFs usando LLMs
|
|
57
|
+
- 🔍 **OCR Automático** - Detecta e processa documentos baseados em imagem
|
|
58
|
+
- 📊 **Structured Output** - Respostas tipadas com Pydantic
|
|
59
|
+
- ⚡ **Modular** - Configure perguntas e classificações dinamicamente
|
|
60
|
+
- 💰 **Tracking de Custos** - Monitore tokens e custos por requisição
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 🚀 Instalação
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pip install deepread
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Ou instale do source:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
git clone https://github.com/BeMonkAI/deepread.git
|
|
74
|
+
cd deepread
|
|
75
|
+
pip install -e .
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Para suporte a OCR (Azure):
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install deepread[ocr]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 📖 Uso Rápido
|
|
87
|
+
|
|
88
|
+
### 1. Gerar Token de Autenticação
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
from deepread.auth import generate_token
|
|
92
|
+
|
|
93
|
+
# Gerar token para um usuário
|
|
94
|
+
token = generate_token(
|
|
95
|
+
user_id="user_123",
|
|
96
|
+
permissions=["read", "process"],
|
|
97
|
+
expires_in_days=30
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
print(f"Token: {token.token}")
|
|
101
|
+
# dr_eyJ1c2VyX2lkIjog...
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 2. Configurar e Processar Documentos
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
from deepread import DeepRead, Question, QuestionConfig
|
|
108
|
+
from pydantic import BaseModel, Field
|
|
109
|
+
|
|
110
|
+
# Definir modelo de resposta estruturada
|
|
111
|
+
class ExtractionResponse(BaseModel):
|
|
112
|
+
valor: str = Field(description="Valor extraído")
|
|
113
|
+
unidade: str = Field(default="", description="Unidade de medida")
|
|
114
|
+
confianca: float = Field(default=1.0, ge=0, le=1)
|
|
115
|
+
|
|
116
|
+
# Criar pergunta
|
|
117
|
+
question = Question(
|
|
118
|
+
config=QuestionConfig(
|
|
119
|
+
id="quantidade",
|
|
120
|
+
name="Extração de Quantidade",
|
|
121
|
+
description="Extrai quantidade do documento"
|
|
122
|
+
),
|
|
123
|
+
system_prompt="Você é um especialista em extração de dados de documentos.",
|
|
124
|
+
user_prompt="""
|
|
125
|
+
Analise o texto e extraia a quantidade mencionada.
|
|
126
|
+
|
|
127
|
+
Texto:
|
|
128
|
+
{texto}
|
|
129
|
+
""",
|
|
130
|
+
keywords=["quantidade", "litros", "volume", "total"],
|
|
131
|
+
response_model=ExtractionResponse
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# Inicializar DeepRead
|
|
135
|
+
dr = DeepRead(
|
|
136
|
+
api_token="dr_seu_token_aqui",
|
|
137
|
+
openai_api_key="sk-sua_key_aqui", # ou use OPENAI_API_KEY env
|
|
138
|
+
model="gpt-5.1", # opcional
|
|
139
|
+
verbose=True
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Adicionar pergunta
|
|
143
|
+
dr.add_question(question)
|
|
144
|
+
|
|
145
|
+
# Processar documento
|
|
146
|
+
result = dr.process("documento.pdf")
|
|
147
|
+
|
|
148
|
+
# Acessar resultados
|
|
149
|
+
print(f"Resposta: {result.get_answer('quantidade')}")
|
|
150
|
+
print(f"Tokens: {result.total_metrics.tokens}")
|
|
151
|
+
print(f"Custo: ${result.total_metrics.cost_usd:.4f}")
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 3. Múltiplas Perguntas
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
# Adicionar várias perguntas de uma vez
|
|
158
|
+
dr.add_questions([
|
|
159
|
+
Question(
|
|
160
|
+
config=QuestionConfig(id="preco", name="Preço"),
|
|
161
|
+
user_prompt="Extraia o preço: {texto}",
|
|
162
|
+
keywords=["preço", "valor", "R$"]
|
|
163
|
+
),
|
|
164
|
+
Question(
|
|
165
|
+
config=QuestionConfig(id="data", name="Data"),
|
|
166
|
+
user_prompt="Extraia a data: {texto}",
|
|
167
|
+
keywords=["data", "prazo", "vigência"]
|
|
168
|
+
),
|
|
169
|
+
])
|
|
170
|
+
|
|
171
|
+
# Processar todas as perguntas
|
|
172
|
+
result = dr.process("documento.pdf")
|
|
173
|
+
|
|
174
|
+
# Acessar cada resposta
|
|
175
|
+
for r in result.results:
|
|
176
|
+
print(f"{r.question_name}: {r.answer}")
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 4. Classificação de Documentos
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
from deepread import Classification
|
|
183
|
+
from typing import Literal
|
|
184
|
+
|
|
185
|
+
class ClassificacaoDoc(BaseModel):
|
|
186
|
+
classificacao: Literal["APROVADO", "REPROVADO", "REVISAR"]
|
|
187
|
+
justificativa: str
|
|
188
|
+
confianca: float = Field(ge=0, le=1)
|
|
189
|
+
|
|
190
|
+
# Configurar classificação
|
|
191
|
+
classification = Classification(
|
|
192
|
+
system_prompt="Você é um classificador de documentos.",
|
|
193
|
+
user_prompt="""
|
|
194
|
+
Baseado nos dados extraídos, classifique o documento:
|
|
195
|
+
|
|
196
|
+
{dados}
|
|
197
|
+
""",
|
|
198
|
+
response_model=ClassificacaoDoc
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
dr.set_classification(classification)
|
|
202
|
+
|
|
203
|
+
# Processar com classificação
|
|
204
|
+
result = dr.process("documento.pdf", classify=True)
|
|
205
|
+
print(f"Classificação: {result.classification}")
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 5. Processamento em Lote
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
from pathlib import Path
|
|
212
|
+
|
|
213
|
+
# Listar documentos
|
|
214
|
+
docs = list(Path("documentos/").glob("*.pdf"))
|
|
215
|
+
|
|
216
|
+
# Processar todos
|
|
217
|
+
results = dr.process_batch(docs, classify=True)
|
|
218
|
+
|
|
219
|
+
# Exportar para CSV
|
|
220
|
+
import csv
|
|
221
|
+
|
|
222
|
+
with open("resultados.csv", "w", newline="") as f:
|
|
223
|
+
writer = csv.DictWriter(f, fieldnames=results[0].to_flat_dict().keys())
|
|
224
|
+
writer.writeheader()
|
|
225
|
+
for r in results:
|
|
226
|
+
writer.writerow(r.to_flat_dict())
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 🔐 Sistema de Autenticação
|
|
232
|
+
|
|
233
|
+
O DeepRead usa tokens JWT-like para autenticação:
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
from deepread.auth import generate_token, validate_token
|
|
237
|
+
|
|
238
|
+
# Gerar token
|
|
239
|
+
token = generate_token(
|
|
240
|
+
user_id="user_123",
|
|
241
|
+
permissions=["read", "process", "classify"],
|
|
242
|
+
expires_in_days=30,
|
|
243
|
+
metadata={"company": "Acme Corp"}
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
# Validar token
|
|
247
|
+
try:
|
|
248
|
+
auth = validate_token(token.token)
|
|
249
|
+
print(f"Usuário: {auth.user_id}")
|
|
250
|
+
print(f"Permissões: {auth.permissions}")
|
|
251
|
+
except InvalidTokenError:
|
|
252
|
+
print("Token inválido!")
|
|
253
|
+
except ExpiredTokenError:
|
|
254
|
+
print("Token expirado!")
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Variáveis de Ambiente
|
|
258
|
+
|
|
259
|
+
Configure a chave secreta para produção:
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
export DEEPREAD_SECRET_KEY="sua_chave_secreta_muito_segura"
|
|
263
|
+
export OPENAI_API_KEY="sk-..."
|
|
264
|
+
export AZURE_AI_VISION_KEY="..." # Para OCR
|
|
265
|
+
export AZURE_AI_VISION_ENDPOINT="https://..."
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 📊 Modelos Disponíveis
|
|
271
|
+
|
|
272
|
+
```python
|
|
273
|
+
from deepread import DeepRead
|
|
274
|
+
|
|
275
|
+
# Listar modelos
|
|
276
|
+
print(DeepRead.available_models())
|
|
277
|
+
# {
|
|
278
|
+
# "fast": "gpt-4.1",
|
|
279
|
+
# "balanced": "gpt-5.1",
|
|
280
|
+
# "complete": "gpt-5-2025-08-07",
|
|
281
|
+
# "economic": "gpt-5-mini-2025-08-07"
|
|
282
|
+
# }
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 🛠️ API Reference
|
|
288
|
+
|
|
289
|
+
### `DeepRead`
|
|
290
|
+
|
|
291
|
+
| Método | Descrição |
|
|
292
|
+
|--------|-----------|
|
|
293
|
+
| `add_question(question)` | Adiciona uma pergunta |
|
|
294
|
+
| `add_questions(questions)` | Adiciona múltiplas perguntas |
|
|
295
|
+
| `remove_question(id)` | Remove uma pergunta |
|
|
296
|
+
| `set_classification(config)` | Configura classificação |
|
|
297
|
+
| `process(document)` | Processa um documento |
|
|
298
|
+
| `process_batch(documents)` | Processa múltiplos documentos |
|
|
299
|
+
|
|
300
|
+
### `Question`
|
|
301
|
+
|
|
302
|
+
| Campo | Tipo | Descrição |
|
|
303
|
+
|-------|------|-----------|
|
|
304
|
+
| `config` | `QuestionConfig` | Configuração básica |
|
|
305
|
+
| `system_prompt` | `str` | Prompt de sistema |
|
|
306
|
+
| `user_prompt` | `str` | Template do prompt (use `{texto}`) |
|
|
307
|
+
| `keywords` | `list[str]` | Keywords para filtrar páginas |
|
|
308
|
+
| `response_model` | `BaseModel` | Modelo Pydantic (opcional) |
|
|
309
|
+
|
|
310
|
+
### `ProcessingResult`
|
|
311
|
+
|
|
312
|
+
| Campo | Tipo | Descrição |
|
|
313
|
+
|-------|------|-----------|
|
|
314
|
+
| `document` | `DocumentMetadata` | Metadados do documento |
|
|
315
|
+
| `results` | `list[Result]` | Resultados por pergunta |
|
|
316
|
+
| `classification` | `dict` | Classificação (se aplicável) |
|
|
317
|
+
| `total_metrics` | `ProcessingMetrics` | Métricas totais |
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## 📁 Estrutura do Projeto
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
deepread/
|
|
325
|
+
├── __init__.py # Exports principais
|
|
326
|
+
├── reader.py # Classe DeepRead
|
|
327
|
+
├── config.py # Configurações
|
|
328
|
+
├── utils.py # Utilitários
|
|
329
|
+
├── ocr.py # Módulo OCR
|
|
330
|
+
├── exceptions.py # Exceções
|
|
331
|
+
├── auth/
|
|
332
|
+
│ ├── __init__.py
|
|
333
|
+
│ ├── token.py # Gestão de tokens
|
|
334
|
+
│ └── exceptions.py # Exceções de auth
|
|
335
|
+
└── models/
|
|
336
|
+
├── __init__.py
|
|
337
|
+
├── question.py # Modelo Question
|
|
338
|
+
├── result.py # Modelos de resultado
|
|
339
|
+
└── classification.py # Modelo Classification
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## 🤝 Contribuindo
|
|
345
|
+
|
|
346
|
+
1. Fork o repositório
|
|
347
|
+
2. Crie uma branch (`git checkout -b feature/nova-feature`)
|
|
348
|
+
3. Commit suas mudanças (`git commit -am 'Add nova feature'`)
|
|
349
|
+
4. Push para a branch (`git push origin feature/nova-feature`)
|
|
350
|
+
5. Abra um Pull Request
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## 📄 Licença
|
|
355
|
+
|
|
356
|
+
MIT License - veja [LICENSE](LICENSE) para detalhes.
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
**Desenvolvido por [Monkai](https://www.monkai.com.br)** 🐵
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
DeepRead.Monkai.egg-info/PKG-INFO
|
|
4
|
+
DeepRead.Monkai.egg-info/SOURCES.txt
|
|
5
|
+
DeepRead.Monkai.egg-info/dependency_links.txt
|
|
6
|
+
DeepRead.Monkai.egg-info/requires.txt
|
|
7
|
+
DeepRead.Monkai.egg-info/top_level.txt
|
|
8
|
+
deepread/__init__.py
|
|
9
|
+
deepread/config.py
|
|
10
|
+
deepread/exceptions.py
|
|
11
|
+
deepread/ocr.py
|
|
12
|
+
deepread/reader.py
|
|
13
|
+
deepread/utils.py
|
|
14
|
+
deepread/auth/__init__.py
|
|
15
|
+
deepread/auth/exceptions.py
|
|
16
|
+
deepread/auth/token.py
|
|
17
|
+
deepread/models/__init__.py
|
|
18
|
+
deepread/models/classification.py
|
|
19
|
+
deepread/models/question.py
|
|
20
|
+
deepread/models/result.py
|
|
21
|
+
deepread/models/schemas.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
pydantic>=2.0.0
|
|
2
|
+
python-dotenv>=1.0.0
|
|
3
|
+
openai>=1.0.0
|
|
4
|
+
tiktoken>=0.5.0
|
|
5
|
+
llama-index-readers-file>=0.1.0
|
|
6
|
+
llama-index-core>=0.10.0
|
|
7
|
+
pypdf>=4.0.0
|
|
8
|
+
PyMuPDF>=1.24.0
|
|
9
|
+
requests>=2.28.0
|
|
10
|
+
|
|
11
|
+
[all]
|
|
12
|
+
deepread[dev,ocr]
|
|
13
|
+
|
|
14
|
+
[dev]
|
|
15
|
+
pytest>=7.0.0
|
|
16
|
+
pytest-cov>=4.0.0
|
|
17
|
+
black>=23.0.0
|
|
18
|
+
ruff>=0.1.0
|
|
19
|
+
|
|
20
|
+
[ocr]
|
|
21
|
+
azure-ai-vision-imageanalysis>=1.0.0
|
|
22
|
+
Pillow>=10.0.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
deepread
|