Initial Commit
This commit is contained in:
6
.github/prompts/pdfExtractor.prompt.md
vendored
Normal file
6
.github/prompts/pdfExtractor.prompt.md
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Extrator de pdf
|
||||||
|
|
||||||
|
O extrator é um agente de IA construído com o langchain em python, seguindo as seguintes instruções:
|
||||||
|
Dentro de um PDF deve extrair as seguintes informações:
|
||||||
|
- Os índices dos capítulos retornando as linhas de início e do fim
|
||||||
|
- Separar cada capítulo, criando um PDF diferente para cada um
|
||||||
8
.github/prompts/projeto.prompt.md
vendored
Normal file
8
.github/prompts/projeto.prompt.md
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Escopo do projeto:
|
||||||
|
|
||||||
|
Vai consumir um modelo llm para realizar consultas em um banco de dados, possuindo as seguintes características:
|
||||||
|
- Agnóstico de banco de dados, podendo ser usado para qualquer tipo
|
||||||
|
- A resposta retorna a lógica do que foi feito junto com o resultado do seu sql exceto:
|
||||||
|
- Caso altere qualquer tipo de dado no banco, retorne apenas o sql para o próprio usuário executar
|
||||||
|
- Caso sela apenas consulta realize a consulta, retorne qual foi o sql e o resultado da consulta
|
||||||
|
- Usará llm local, com o llama cpp e suporte a vulkan
|
||||||
11
.vscode/settings.json
vendored
Normal file
11
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"python.testing.unittestArgs": [
|
||||||
|
"-v",
|
||||||
|
"-s",
|
||||||
|
"./test",
|
||||||
|
"-p",
|
||||||
|
"test_*.py"
|
||||||
|
],
|
||||||
|
"python.testing.pytestEnabled": false,
|
||||||
|
"python.testing.unittestEnabled": true
|
||||||
|
}
|
||||||
3
agentsConfig.ini
Normal file
3
agentsConfig.ini
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[PDFAgent]
|
||||||
|
model = qwen2.5:1.5b
|
||||||
|
modelProvider = ollama
|
||||||
1
src/__init__.py
Normal file
1
src/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Este arquivo transforma o diretório em um pacote Python
|
||||||
23
src/interfaces/agents/agent.py
Normal file
23
src/interfaces/agents/agent.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from typing import List, Dict, Any
|
||||||
|
|
||||||
|
class Agent(ABC):
|
||||||
|
@abstractmethod
|
||||||
|
def get_agent_tools(self) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Get the tools available for the agent.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[Dict[str, Any]]: A list of dictionaries representing the tools.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_agent_details(self) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Get the details of the agent.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dict[str, Any]: A dictionary containing agent details.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
16
src/interfaces/models/modelInference.py
Normal file
16
src/interfaces/models/modelInference.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from ast import Dict
|
||||||
|
from typing import List, Dict, Any, Optional
|
||||||
|
|
||||||
|
|
||||||
|
class ModelManager(ABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_available_models(self) -> List[Dict[str, Any]]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_model_details(self, model_name: str) -> Optional[Dict[str, Any]]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
9
src/main.py
Normal file
9
src/main.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from service.ollama.ollamaModelManager import OllamaModelManager
|
||||||
|
|
||||||
|
# Utilizando nossa classe para obter os modelos
|
||||||
|
ollama_manager = OllamaModelManager()
|
||||||
|
models = ollama_manager.get_available_models()
|
||||||
|
# print(models)
|
||||||
|
|
||||||
|
details = ollama_manager.get_model_details("qwen2.5:1.5b")
|
||||||
|
print(details)
|
||||||
33
src/modules/pdf/pdfAgent.py
Normal file
33
src/modules/pdf/pdfAgent.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
from langchain.agents import AgentExecutor
|
||||||
|
from langchain_community.tools import BaseTool
|
||||||
|
|
||||||
|
import fitz
|
||||||
|
import os
|
||||||
|
|
||||||
|
from src.interfaces.agents.agent import Agent
|
||||||
|
|
||||||
|
|
||||||
|
class PDFAgent(Agent):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
"""
|
||||||
|
Initialize a PDF agent.
|
||||||
|
This initializes the PDF agent which handles operations related to PDF documents.
|
||||||
|
The agent attribute needs to be set with an appropriate agent implementation
|
||||||
|
during instantiation.
|
||||||
|
Attributes:
|
||||||
|
agent: The agent implementation for PDF operations.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
self.agent
|
||||||
|
|
||||||
|
def get_agent_details(self):
|
||||||
|
return super().get_agent_details()
|
||||||
|
|
||||||
|
def get_agent_tools(self):
|
||||||
|
return super().get_agent_tools()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
15
src/modules/pdf/tools/metadata.pdf.tool.py
Normal file
15
src/modules/pdf/tools/metadata.pdf.tool.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import fitz
|
||||||
|
from langchain_community.tools import BaseTool
|
||||||
|
|
||||||
|
class PDFMetadataTool(BaseTool):
|
||||||
|
name="pdf_metadata"
|
||||||
|
description="Extract metadata from PDF file"
|
||||||
|
|
||||||
|
def _run(self, path: str):
|
||||||
|
try:
|
||||||
|
with fitz.open(path) as doc:
|
||||||
|
metadata = {
|
||||||
|
"páginas": len(doc)
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
return f"Error: {e}"
|
||||||
10
src/modules/pdf/tools/textExtract.pdf.tool.py
Normal file
10
src/modules/pdf/tools/textExtract.pdf.tool.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from langchain_community.tools import BaseTool
|
||||||
|
|
||||||
|
|
||||||
|
class PDFextractTextTool(BaseTool):
|
||||||
|
name="pdf_text_extract"
|
||||||
|
description="Extract text from PDF file"
|
||||||
|
|
||||||
|
def _run(self, path: str):
|
||||||
|
try:
|
||||||
|
|
||||||
18
src/modules/pdf/utils.py
Normal file
18
src/modules/pdf/utils.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import fitz
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class PDFUtils:
|
||||||
|
@staticmethod
|
||||||
|
def get_total_lines(pdf_path: str):
|
||||||
|
pdf = fitz.open(pdf_path)
|
||||||
|
return len(pdf)
|
||||||
|
|
||||||
|
|
||||||
|
# Get the user's home directory and construct the path to the PDF
|
||||||
|
home_dir = os.path.expanduser("~")
|
||||||
|
pdf_path = os.path.join(home_dir, "Downloads", "Manuais.pdf")
|
||||||
|
|
||||||
|
# Call the method with the full path
|
||||||
|
total_pages = PDFUtils.get_total_lines(pdf_path)
|
||||||
|
print(f"Total pages in PDF: {total_pages}")
|
||||||
46
src/service/ollama/ollamaModelManager.py
Normal file
46
src/service/ollama/ollamaModelManager.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import requests
|
||||||
|
|
||||||
|
from src.interfaces.models.modelInference import ModelManager
|
||||||
|
|
||||||
|
|
||||||
|
class OllamaModelManager(ModelManager):
|
||||||
|
def __init__(self, base_url = "http://localhost:11434"):
|
||||||
|
self.base_url = base_url
|
||||||
|
|
||||||
|
def get_available_models(self):
|
||||||
|
try:
|
||||||
|
print(requests.__file__)
|
||||||
|
print(self.base_url)
|
||||||
|
response = requests.get(f"{self.base_url}/api/tags")
|
||||||
|
data = response.json()
|
||||||
|
return data.get('models', [])
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Erro ao obter modelos: {e}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
def get_model_details(self, model_name):
|
||||||
|
try:
|
||||||
|
|
||||||
|
# Obter detalhes completos do modelo via API
|
||||||
|
response = requests.post(
|
||||||
|
f"{self.base_url}/api/show",
|
||||||
|
json={"name": model_name}
|
||||||
|
)
|
||||||
|
model_details = response.json()
|
||||||
|
|
||||||
|
# O tamanho do contexto geralmente está disponível em model_details['parameters']['context_length']
|
||||||
|
# ou em outro campo similar dependendo do modelo
|
||||||
|
context_size = model_details.get('parameters', {}).get('context_length', 'Não disponível')
|
||||||
|
|
||||||
|
# Podemos adicionar outros detalhes relevantes
|
||||||
|
details = {
|
||||||
|
"name": model_name,
|
||||||
|
"context_size": context_size,
|
||||||
|
"model_type": model_details.get('modelfile', {}).get('parameter', 'Não disponível'),
|
||||||
|
"license": model_details.get('license', 'Não disponível')
|
||||||
|
}
|
||||||
|
|
||||||
|
return details
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error getting model details: {e}")
|
||||||
|
return {"name": model_name, "error": str(e)}
|
||||||
1
src/utils/__init__.py
Normal file
1
src/utils/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Este arquivo transforma o diretório em um pacote Python
|
||||||
9
src/utils/getModels.py
Normal file
9
src/utils/getModels.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
from service.ollama.ollamaModelManager import OllamaModelManager
|
||||||
|
|
||||||
|
|
||||||
|
ollama_service = OllamaModelManager()
|
||||||
|
models = ollama_service.get_available_models()
|
||||||
|
|
||||||
|
print(models)
|
||||||
0
test/__init__.py
Normal file
0
test/__init__.py
Normal file
81
test/test_ollamaModelManager.py
Normal file
81
test/test_ollamaModelManager.py
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import unittest
|
||||||
|
from unittest.mock import patch, MagicMock
|
||||||
|
|
||||||
|
from src.service.ollama.ollamaModelManager import OllamaModelManager
|
||||||
|
|
||||||
|
class TestOllamaModelManager(unittest.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.model_manager = OllamaModelManager()
|
||||||
|
self.model_manager.base_url = "http://test-url:11434"
|
||||||
|
|
||||||
|
@patch('service.ollama.ollamaModelManager.requests.get')
|
||||||
|
def test_get_available_models_success(self, mock_get):
|
||||||
|
# Setup mock response
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.json.return_value = {
|
||||||
|
'models': [
|
||||||
|
{'name': 'model1'},
|
||||||
|
{'name': 'model2'}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
mock_get.return_value = mock_response
|
||||||
|
|
||||||
|
# Call method
|
||||||
|
result = self.model_manager.get_available_models()
|
||||||
|
|
||||||
|
# Assertions
|
||||||
|
mock_get.assert_called_once_with("http://test-url:11434/api/tags")
|
||||||
|
self.assertEqual(len(result), 2)
|
||||||
|
self.assertEqual(result, [{'name': 'model1'}, {'name': 'model2'}])
|
||||||
|
|
||||||
|
@patch('service.ollama.ollamaModelManager.requests.get')
|
||||||
|
def test_get_available_models_exception(self, mock_get):
|
||||||
|
# Setup mock to raise exception
|
||||||
|
mock_get.side_effect = Exception("Connection error")
|
||||||
|
|
||||||
|
# Call method
|
||||||
|
result = self.model_manager.get_available_models()
|
||||||
|
|
||||||
|
# Assertions
|
||||||
|
self.assertEqual(result, [])
|
||||||
|
|
||||||
|
@patch('service.ollama.ollamaModelManager.requests.post')
|
||||||
|
def test_get_model_details_success(self, mock_post):
|
||||||
|
# Setup mock response
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.json.return_value = {
|
||||||
|
'parameters': {'context_length': 4096},
|
||||||
|
'modelfile': {'parameter': 'llama2'},
|
||||||
|
'license': 'Apache 2.0'
|
||||||
|
}
|
||||||
|
mock_post.return_value = mock_response
|
||||||
|
|
||||||
|
# Call method
|
||||||
|
result = self.model_manager.get_model_details('llama2')
|
||||||
|
|
||||||
|
# Assertions
|
||||||
|
mock_post.assert_called_once_with(
|
||||||
|
"http://test-url:11434/api/show",
|
||||||
|
json={"name": "llama2"}
|
||||||
|
)
|
||||||
|
self.assertEqual(result['name'], 'llama2')
|
||||||
|
self.assertEqual(result['context_size'], 4096)
|
||||||
|
self.assertEqual(result['license'], 'Apache 2.0')
|
||||||
|
|
||||||
|
@patch('service.ollama.ollamaModelManager.requests.post')
|
||||||
|
def test_get_model_details_exception(self, mock_post):
|
||||||
|
# Setup mock to raise exception
|
||||||
|
mock_post.side_effect = Exception("API error")
|
||||||
|
|
||||||
|
# Call method
|
||||||
|
result = self.model_manager.get_model_details('unknown_model')
|
||||||
|
|
||||||
|
# Assertions
|
||||||
|
self.assertEqual(result['name'], 'unknown_model')
|
||||||
|
self.assertTrue('error' in result)
|
||||||
|
self.assertEqual(result['error'], 'API error')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user