Atualiza a estrutura do projeto Evo AI, adicionando novos scripts de seeders para criar dados iniciais, incluindo usuários, agentes, clientes e ferramentas. Implementa rotas de autenticação e auditoria, além de configurar o middleware JWT. Atualiza as configurações de ambiente e o README para refletir as mudanças. Adiciona novas dependências para autenticação e envio de e-mails.
This commit is contained in:
79
scripts/seeders/admin_seeder.py
Normal file
79
scripts/seeders/admin_seeder.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""
|
||||
Script para criar um usuário administrador inicial:
|
||||
- Email: admin@evoai.com
|
||||
- Senha: definida nas variáveis de ambiente ADMIN_INITIAL_PASSWORD
|
||||
- is_admin: True
|
||||
- is_active: True
|
||||
- email_verified: True
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from dotenv import load_dotenv
|
||||
from src.models.models import User
|
||||
from src.utils.security import get_password_hash
|
||||
|
||||
# Configurar logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def create_admin_user():
|
||||
"""Cria um usuário administrador inicial no sistema"""
|
||||
try:
|
||||
# Carregar variáveis de ambiente
|
||||
load_dotenv()
|
||||
|
||||
# Obter configurações do banco de dados
|
||||
db_url = os.getenv("POSTGRES_CONNECTION_STRING")
|
||||
if not db_url:
|
||||
logger.error("Variável de ambiente POSTGRES_CONNECTION_STRING não definida")
|
||||
return False
|
||||
|
||||
# Obter senha do administrador
|
||||
admin_password = os.getenv("ADMIN_INITIAL_PASSWORD")
|
||||
if not admin_password:
|
||||
logger.error("Variável de ambiente ADMIN_INITIAL_PASSWORD não definida")
|
||||
return False
|
||||
|
||||
# Configuração do email do admin
|
||||
admin_email = os.getenv("ADMIN_EMAIL", "admin@evoai.com")
|
||||
|
||||
# Conectar ao banco de dados
|
||||
engine = create_engine(db_url)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
# Verificar se o administrador já existe
|
||||
existing_admin = session.query(User).filter(User.email == admin_email).first()
|
||||
if existing_admin:
|
||||
logger.info(f"Administrador com email {admin_email} já existe")
|
||||
return True
|
||||
|
||||
# Criar administrador
|
||||
admin_user = User(
|
||||
email=admin_email,
|
||||
password_hash=get_password_hash(admin_password),
|
||||
is_admin=True,
|
||||
is_active=True,
|
||||
email_verified=True
|
||||
)
|
||||
|
||||
# Adicionar e comitar
|
||||
session.add(admin_user)
|
||||
session.commit()
|
||||
|
||||
logger.info(f"Administrador criado com sucesso: {admin_email}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erro ao criar administrador: {str(e)}")
|
||||
return False
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = create_admin_user()
|
||||
sys.exit(0 if success else 1)
|
||||
158
scripts/seeders/agent_seeder.py
Normal file
158
scripts/seeders/agent_seeder.py
Normal file
@@ -0,0 +1,158 @@
|
||||
"""
|
||||
Script para criar agentes de exemplo para o cliente demo:
|
||||
- Agente Atendimento: configurado para responder perguntas gerais
|
||||
- Agente Vendas: configurado para responder sobre produtos
|
||||
- Agente FAQ: configurado para responder perguntas frequentes
|
||||
Cada agente com instruções e configurações pré-definidas
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import uuid
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from dotenv import load_dotenv
|
||||
from src.models.models import Agent, Client, User
|
||||
|
||||
# Configurar logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def create_demo_agents():
|
||||
"""Cria agentes de exemplo para o cliente demo"""
|
||||
try:
|
||||
# Carregar variáveis de ambiente
|
||||
load_dotenv()
|
||||
|
||||
# Obter configurações do banco de dados
|
||||
db_url = os.getenv("POSTGRES_CONNECTION_STRING")
|
||||
if not db_url:
|
||||
logger.error("Variável de ambiente POSTGRES_CONNECTION_STRING não definida")
|
||||
return False
|
||||
|
||||
# Conectar ao banco de dados
|
||||
engine = create_engine(db_url)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
# Obter o cliente demo pelo email do usuário
|
||||
demo_email = os.getenv("DEMO_EMAIL", "demo@exemplo.com")
|
||||
demo_user = session.query(User).filter(User.email == demo_email).first()
|
||||
|
||||
if not demo_user or not demo_user.client_id:
|
||||
logger.error(f"Usuário demo não encontrado ou não associado a um cliente: {demo_email}")
|
||||
return False
|
||||
|
||||
client_id = demo_user.client_id
|
||||
|
||||
# Verificar se já existem agentes para este cliente
|
||||
existing_agents = session.query(Agent).filter(Agent.client_id == client_id).all()
|
||||
if existing_agents:
|
||||
logger.info(f"Já existem {len(existing_agents)} agentes para o cliente {client_id}")
|
||||
return True
|
||||
|
||||
# Definições dos agentes de exemplo
|
||||
agents = [
|
||||
{
|
||||
"name": "Atendimento_Geral",
|
||||
"description": "Agente para atendimento geral e dúvidas básicas",
|
||||
"type": "llm",
|
||||
"model": "gpt-3.5-turbo",
|
||||
"api_key": "${OPENAI_API_KEY}", # Será substituído pela variável de ambiente
|
||||
"instruction": """
|
||||
Você é um assistente de atendimento ao cliente da empresa.
|
||||
Seja cordial, objetivo e eficiente. Responda às dúvidas dos clientes
|
||||
de forma clara e sucinta. Se não souber a resposta, informe que irá
|
||||
consultar um especialista e retornará em breve.
|
||||
""",
|
||||
"config": {
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 500,
|
||||
"tools": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Vendas_Produtos",
|
||||
"description": "Agente especializado em vendas e informações sobre produtos",
|
||||
"type": "llm",
|
||||
"model": "claude-3-sonnet-20240229",
|
||||
"api_key": "${ANTHROPIC_API_KEY}", # Será substituído pela variável de ambiente
|
||||
"instruction": """
|
||||
Você é um especialista em vendas da empresa.
|
||||
Seu objetivo é fornecer informações detalhadas sobre produtos,
|
||||
comparar diferentes opções, destacar benefícios e vantagens competitivas.
|
||||
Use uma linguagem persuasiva mas honesta, e sempre busque entender
|
||||
as necessidades do cliente antes de recomendar um produto.
|
||||
""",
|
||||
"config": {
|
||||
"temperature": 0.8,
|
||||
"max_tokens": 800,
|
||||
"tools": ["web_search"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "FAQ_Bot",
|
||||
"description": "Agente para responder perguntas frequentes",
|
||||
"type": "llm",
|
||||
"model": "gemini-pro",
|
||||
"api_key": "${GOOGLE_API_KEY}", # Será substituído pela variável de ambiente
|
||||
"instruction": """
|
||||
Você é um assistente especializado em responder perguntas frequentes.
|
||||
Suas respostas devem ser diretas, objetivas e baseadas nas informações
|
||||
da empresa. Utilize uma linguagem simples e acessível. Se a pergunta
|
||||
não estiver relacionada às FAQs disponíveis, direcione o cliente para
|
||||
o canal de atendimento adequado.
|
||||
""",
|
||||
"config": {
|
||||
"temperature": 0.5,
|
||||
"max_tokens": 400,
|
||||
"tools": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
# Criar os agentes
|
||||
for agent_data in agents:
|
||||
# Substituir placeholders de API Keys por variáveis de ambiente quando disponíveis
|
||||
if "${OPENAI_API_KEY}" in agent_data["api_key"]:
|
||||
agent_data["api_key"] = os.getenv("OPENAI_API_KEY", "")
|
||||
elif "${ANTHROPIC_API_KEY}" in agent_data["api_key"]:
|
||||
agent_data["api_key"] = os.getenv("ANTHROPIC_API_KEY", "")
|
||||
elif "${GOOGLE_API_KEY}" in agent_data["api_key"]:
|
||||
agent_data["api_key"] = os.getenv("GOOGLE_API_KEY", "")
|
||||
|
||||
agent = Agent(
|
||||
client_id=client_id,
|
||||
name=agent_data["name"],
|
||||
description=agent_data["description"],
|
||||
type=agent_data["type"],
|
||||
model=agent_data["model"],
|
||||
api_key=agent_data["api_key"],
|
||||
instruction=agent_data["instruction"].strip(),
|
||||
config=agent_data["config"]
|
||||
)
|
||||
|
||||
session.add(agent)
|
||||
logger.info(f"Agente '{agent_data['name']}' criado para o cliente {client_id}")
|
||||
|
||||
session.commit()
|
||||
logger.info(f"Todos os agentes de exemplo foram criados com sucesso para o cliente {client_id}")
|
||||
return True
|
||||
|
||||
except SQLAlchemyError as e:
|
||||
session.rollback()
|
||||
logger.error(f"Erro de banco de dados ao criar agentes de exemplo: {str(e)}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erro ao criar agentes de exemplo: {str(e)}")
|
||||
return False
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = create_demo_agents()
|
||||
sys.exit(0 if success else 1)
|
||||
93
scripts/seeders/client_seeder.py
Normal file
93
scripts/seeders/client_seeder.py
Normal file
@@ -0,0 +1,93 @@
|
||||
"""
|
||||
Script para criar um cliente de exemplo:
|
||||
- Nome: Cliente Demo
|
||||
- Com usuário associado:
|
||||
- Email: demo@exemplo.com
|
||||
- Senha: demo123 (ou definida em variável de ambiente)
|
||||
- is_admin: False
|
||||
- is_active: True
|
||||
- email_verified: True
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from dotenv import load_dotenv
|
||||
from src.models.models import User, Client
|
||||
from src.utils.security import get_password_hash
|
||||
|
||||
# Configurar logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def create_demo_client_and_user():
|
||||
"""Cria um cliente e usuário de demonstração no sistema"""
|
||||
try:
|
||||
# Carregar variáveis de ambiente
|
||||
load_dotenv()
|
||||
|
||||
# Obter configurações do banco de dados
|
||||
db_url = os.getenv("POSTGRES_CONNECTION_STRING")
|
||||
if not db_url:
|
||||
logger.error("Variável de ambiente POSTGRES_CONNECTION_STRING não definida")
|
||||
return False
|
||||
|
||||
# Obter senha do usuário demo (ou usar padrão)
|
||||
demo_password = os.getenv("DEMO_PASSWORD", "demo123")
|
||||
|
||||
# Configurações do cliente e usuário demo
|
||||
demo_client_name = os.getenv("DEMO_CLIENT_NAME", "Cliente Demo")
|
||||
demo_email = os.getenv("DEMO_EMAIL", "demo@exemplo.com")
|
||||
|
||||
# Conectar ao banco de dados
|
||||
engine = create_engine(db_url)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
# Verificar se o usuário já existe
|
||||
existing_user = session.query(User).filter(User.email == demo_email).first()
|
||||
if existing_user:
|
||||
logger.info(f"Usuário demo com email {demo_email} já existe")
|
||||
return True
|
||||
|
||||
# Criar cliente demo
|
||||
demo_client = Client(name=demo_client_name)
|
||||
session.add(demo_client)
|
||||
session.flush() # Obter o ID do cliente
|
||||
|
||||
# Criar usuário demo associado ao cliente
|
||||
demo_user = User(
|
||||
email=demo_email,
|
||||
password_hash=get_password_hash(demo_password),
|
||||
client_id=demo_client.id,
|
||||
is_admin=False,
|
||||
is_active=True,
|
||||
email_verified=True
|
||||
)
|
||||
|
||||
# Adicionar e comitar
|
||||
session.add(demo_user)
|
||||
session.commit()
|
||||
|
||||
logger.info(f"Cliente demo '{demo_client_name}' criado com sucesso")
|
||||
logger.info(f"Usuário demo criado com sucesso: {demo_email}")
|
||||
return True
|
||||
|
||||
except SQLAlchemyError as e:
|
||||
session.rollback()
|
||||
logger.error(f"Erro de banco de dados ao criar cliente/usuário demo: {str(e)}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erro ao criar cliente/usuário demo: {str(e)}")
|
||||
return False
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = create_demo_client_and_user()
|
||||
sys.exit(0 if success else 1)
|
||||
184
scripts/seeders/contact_seeder.py
Normal file
184
scripts/seeders/contact_seeder.py
Normal file
@@ -0,0 +1,184 @@
|
||||
"""
|
||||
Script para criar contatos de exemplo para o cliente demo:
|
||||
- Contatos com histórico de conversas
|
||||
- Diferentes perfis de cliente
|
||||
- Dados fictícios para demonstração
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import json
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from dotenv import load_dotenv
|
||||
from src.models.models import Contact, User, Client
|
||||
|
||||
# Configurar logging
|
||||
logging.basicConfig(
|
||||
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def create_demo_contacts():
|
||||
"""Cria contatos de exemplo para o cliente demo"""
|
||||
try:
|
||||
# Carregar variáveis de ambiente
|
||||
load_dotenv()
|
||||
|
||||
# Obter configurações do banco de dados
|
||||
db_url = os.getenv("POSTGRES_CONNECTION_STRING")
|
||||
if not db_url:
|
||||
logger.error("Variável de ambiente POSTGRES_CONNECTION_STRING não definida")
|
||||
return False
|
||||
|
||||
# Conectar ao banco de dados
|
||||
engine = create_engine(db_url)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
# Obter o cliente demo pelo email do usuário
|
||||
demo_email = os.getenv("DEMO_EMAIL", "demo@exemplo.com")
|
||||
demo_user = session.query(User).filter(User.email == demo_email).first()
|
||||
|
||||
if not demo_user or not demo_user.client_id:
|
||||
logger.error(
|
||||
f"Usuário demo não encontrado ou não associado a um cliente: {demo_email}"
|
||||
)
|
||||
return False
|
||||
|
||||
client_id = demo_user.client_id
|
||||
|
||||
# Verificar se já existem contatos para este cliente
|
||||
existing_contacts = (
|
||||
session.query(Contact).filter(Contact.client_id == client_id).all()
|
||||
)
|
||||
if existing_contacts:
|
||||
logger.info(
|
||||
f"Já existem {len(existing_contacts)} contatos para o cliente {client_id}"
|
||||
)
|
||||
return True
|
||||
|
||||
# Definições dos contatos de exemplo
|
||||
contacts = [
|
||||
{
|
||||
"name": "Maria Silva",
|
||||
"ext_id": "5511999998888",
|
||||
"meta": {
|
||||
"source": "whatsapp",
|
||||
"tags": ["cliente_vip", "suporte_premium"],
|
||||
"location": "São Paulo, SP",
|
||||
"last_contact": "2023-08-15T14:30:00Z",
|
||||
"account_details": {
|
||||
"customer_since": "2020-03-10",
|
||||
"plan": "Enterprise",
|
||||
"payment_status": "active",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "João Santos",
|
||||
"ext_id": "5511988887777",
|
||||
"meta": {
|
||||
"source": "whatsapp",
|
||||
"tags": ["prospecção", "demo_solicitada"],
|
||||
"location": "Rio de Janeiro, RJ",
|
||||
"last_contact": "2023-09-20T10:15:00Z",
|
||||
"interests": ["automação", "marketing", "chatbots"],
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "Ana Oliveira",
|
||||
"ext_id": "5511977776666",
|
||||
"meta": {
|
||||
"source": "telegram",
|
||||
"tags": ["suporte_técnico", "problema_resolvido"],
|
||||
"location": "Belo Horizonte, MG",
|
||||
"last_contact": "2023-09-25T16:45:00Z",
|
||||
"support_cases": [
|
||||
{
|
||||
"id": "SUP-2023-1234",
|
||||
"status": "closed",
|
||||
"priority": "high",
|
||||
},
|
||||
{
|
||||
"id": "SUP-2023-1567",
|
||||
"status": "open",
|
||||
"priority": "medium",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "Carlos Pereira",
|
||||
"ext_id": "5511966665555",
|
||||
"meta": {
|
||||
"source": "whatsapp",
|
||||
"tags": ["cancelamento", "retenção"],
|
||||
"location": "Porto Alegre, RS",
|
||||
"last_contact": "2023-09-10T09:30:00Z",
|
||||
"account_details": {
|
||||
"customer_since": "2019-05-22",
|
||||
"plan": "Professional",
|
||||
"payment_status": "overdue",
|
||||
"invoice_pending": True,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "Fernanda Lima",
|
||||
"ext_id": "5511955554444",
|
||||
"meta": {
|
||||
"source": "telegram",
|
||||
"tags": ["parceiro", "integrador"],
|
||||
"location": "Curitiba, PR",
|
||||
"last_contact": "2023-09-18T14:00:00Z",
|
||||
"partner_details": {
|
||||
"company": "TechSolutions Ltda",
|
||||
"partner_level": "Gold",
|
||||
"certified": True,
|
||||
},
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
# Criar os contatos
|
||||
for contact_data in contacts:
|
||||
contact = Contact(
|
||||
client_id=client_id,
|
||||
name=contact_data["name"],
|
||||
ext_id=contact_data["ext_id"],
|
||||
meta=contact_data["meta"],
|
||||
)
|
||||
|
||||
session.add(contact)
|
||||
logger.info(
|
||||
f"Contato '{contact_data['name']}' criado para o cliente {client_id}"
|
||||
)
|
||||
|
||||
session.commit()
|
||||
logger.info(
|
||||
f"Todos os contatos de exemplo foram criados com sucesso para o cliente {client_id}"
|
||||
)
|
||||
return True
|
||||
|
||||
except SQLAlchemyError as e:
|
||||
session.rollback()
|
||||
logger.error(
|
||||
f"Erro de banco de dados ao criar contatos de exemplo: {str(e)}"
|
||||
)
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erro ao criar contatos de exemplo: {str(e)}")
|
||||
return False
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = create_demo_contacts()
|
||||
sys.exit(0 if success else 1)
|
||||
150
scripts/seeders/mcp_server_seeder.py
Normal file
150
scripts/seeders/mcp_server_seeder.py
Normal file
@@ -0,0 +1,150 @@
|
||||
"""
|
||||
Script para criar servidores MCP padrão:
|
||||
- Servidor Anthropic Claude
|
||||
- Servidor OpenAI GPT
|
||||
- Servidor Google Gemini
|
||||
- Servidor Ollama (local)
|
||||
Cada um com configurações padrão para produção
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from dotenv import load_dotenv
|
||||
from src.models.models import MCPServer
|
||||
|
||||
# Configurar logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def create_mcp_servers():
|
||||
"""Cria servidores MCP padrão no sistema"""
|
||||
try:
|
||||
# Carregar variáveis de ambiente
|
||||
load_dotenv()
|
||||
|
||||
# Obter configurações do banco de dados
|
||||
db_url = os.getenv("POSTGRES_CONNECTION_STRING")
|
||||
if not db_url:
|
||||
logger.error("Variável de ambiente POSTGRES_CONNECTION_STRING não definida")
|
||||
return False
|
||||
|
||||
# Conectar ao banco de dados
|
||||
engine = create_engine(db_url)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
# Verificar se já existem servidores MCP
|
||||
existing_servers = session.query(MCPServer).all()
|
||||
if existing_servers:
|
||||
logger.info(f"Já existem {len(existing_servers)} servidores MCP cadastrados")
|
||||
return True
|
||||
|
||||
# Definições dos servidores MCP
|
||||
mcp_servers = [
|
||||
{
|
||||
"name": "Anthropic Claude",
|
||||
"description": "Servidor para modelos Claude da Anthropic",
|
||||
"config_json": {
|
||||
"provider": "anthropic",
|
||||
"models": ["claude-3-sonnet-20240229", "claude-3-opus-20240229", "claude-3-haiku-20240307"],
|
||||
"api_base": "https://api.anthropic.com/v1",
|
||||
"api_key_env": "ANTHROPIC_API_KEY"
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": True,
|
||||
"staging": True
|
||||
},
|
||||
"tools": ["function_calling", "web_search"],
|
||||
"type": "official"
|
||||
},
|
||||
{
|
||||
"name": "OpenAI GPT",
|
||||
"description": "Servidor para modelos GPT da OpenAI",
|
||||
"config_json": {
|
||||
"provider": "openai",
|
||||
"models": ["gpt-4", "gpt-4-turbo", "gpt-3.5-turbo"],
|
||||
"api_base": "https://api.openai.com/v1",
|
||||
"api_key_env": "OPENAI_API_KEY"
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": True,
|
||||
"staging": True
|
||||
},
|
||||
"tools": ["function_calling", "web_search", "image_generation"],
|
||||
"type": "official"
|
||||
},
|
||||
{
|
||||
"name": "Google Gemini",
|
||||
"description": "Servidor para modelos Gemini do Google",
|
||||
"config_json": {
|
||||
"provider": "google",
|
||||
"models": ["gemini-pro", "gemini-ultra"],
|
||||
"api_base": "https://generativelanguage.googleapis.com/v1",
|
||||
"api_key_env": "GOOGLE_API_KEY"
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": True,
|
||||
"staging": True
|
||||
},
|
||||
"tools": ["function_calling", "web_search"],
|
||||
"type": "official"
|
||||
},
|
||||
{
|
||||
"name": "Ollama Local",
|
||||
"description": "Servidor para modelos locais via Ollama",
|
||||
"config_json": {
|
||||
"provider": "ollama",
|
||||
"models": ["llama3", "mistral", "mixtral"],
|
||||
"api_base": "http://localhost:11434",
|
||||
"api_key_env": None
|
||||
},
|
||||
"environments": {
|
||||
"production": False,
|
||||
"development": True,
|
||||
"staging": False
|
||||
},
|
||||
"tools": [],
|
||||
"type": "community"
|
||||
}
|
||||
]
|
||||
|
||||
# Criar os servidores MCP
|
||||
for server_data in mcp_servers:
|
||||
server = MCPServer(
|
||||
name=server_data["name"],
|
||||
description=server_data["description"],
|
||||
config_json=server_data["config_json"],
|
||||
environments=server_data["environments"],
|
||||
tools=server_data["tools"],
|
||||
type=server_data["type"]
|
||||
)
|
||||
|
||||
session.add(server)
|
||||
logger.info(f"Servidor MCP '{server_data['name']}' criado com sucesso")
|
||||
|
||||
session.commit()
|
||||
logger.info("Todos os servidores MCP foram criados com sucesso")
|
||||
return True
|
||||
|
||||
except SQLAlchemyError as e:
|
||||
session.rollback()
|
||||
logger.error(f"Erro de banco de dados ao criar servidores MCP: {str(e)}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erro ao criar servidores MCP: {str(e)}")
|
||||
return False
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = create_mcp_servers()
|
||||
sys.exit(0 if success else 1)
|
||||
183
scripts/seeders/tool_seeder.py
Normal file
183
scripts/seeders/tool_seeder.py
Normal file
@@ -0,0 +1,183 @@
|
||||
"""
|
||||
Script para criar ferramentas padrão:
|
||||
- Pesquisa Web
|
||||
- Consulta a Documentos
|
||||
- Consulta a Base de Conhecimento
|
||||
- Integração WhatsApp/Telegram
|
||||
Cada uma com configurações básicas para demonstração
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from dotenv import load_dotenv
|
||||
from src.models.models import Tool
|
||||
|
||||
# Configurar logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def create_tools():
|
||||
"""Cria ferramentas padrão no sistema"""
|
||||
try:
|
||||
# Carregar variáveis de ambiente
|
||||
load_dotenv()
|
||||
|
||||
# Obter configurações do banco de dados
|
||||
db_url = os.getenv("POSTGRES_CONNECTION_STRING")
|
||||
if not db_url:
|
||||
logger.error("Variável de ambiente POSTGRES_CONNECTION_STRING não definida")
|
||||
return False
|
||||
|
||||
# Conectar ao banco de dados
|
||||
engine = create_engine(db_url)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
# Verificar se já existem ferramentas
|
||||
existing_tools = session.query(Tool).all()
|
||||
if existing_tools:
|
||||
logger.info(f"Já existem {len(existing_tools)} ferramentas cadastradas")
|
||||
return True
|
||||
|
||||
# Definições das ferramentas
|
||||
tools = [
|
||||
{
|
||||
"name": "web_search",
|
||||
"description": "Pesquisa na web para obter informações atualizadas",
|
||||
"config_json": {
|
||||
"provider": "brave",
|
||||
"api_base": "https://api.search.brave.com/res/v1/web/search",
|
||||
"api_key_env": "BRAVE_API_KEY",
|
||||
"max_results": 5,
|
||||
"safe_search": "moderate"
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": True,
|
||||
"staging": True
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "document_query",
|
||||
"description": "Consulta documentos internos para obter informações específicas",
|
||||
"config_json": {
|
||||
"provider": "internal",
|
||||
"api_base": "${KNOWLEDGE_API_URL}/documents",
|
||||
"api_key_env": "KNOWLEDGE_API_KEY",
|
||||
"embeddings_model": "text-embedding-3-small",
|
||||
"max_chunks": 10,
|
||||
"similarity_threshold": 0.75
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": True,
|
||||
"staging": True
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "knowledge_base",
|
||||
"description": "Consulta base de conhecimento para solução de problemas",
|
||||
"config_json": {
|
||||
"provider": "internal",
|
||||
"api_base": "${KNOWLEDGE_API_URL}/kb",
|
||||
"api_key_env": "KNOWLEDGE_API_KEY",
|
||||
"max_results": 3,
|
||||
"categories": ["support", "faq", "troubleshooting"]
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": True,
|
||||
"staging": True
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "whatsapp_integration",
|
||||
"description": "Integração com WhatsApp para envio e recebimento de mensagens",
|
||||
"config_json": {
|
||||
"provider": "meta",
|
||||
"api_base": "https://graph.facebook.com/v17.0",
|
||||
"api_key_env": "WHATSAPP_API_KEY",
|
||||
"phone_number_id": "${WHATSAPP_PHONE_ID}",
|
||||
"webhook_verify_token": "${WHATSAPP_VERIFY_TOKEN}",
|
||||
"templates_enabled": True
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": False,
|
||||
"staging": True
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "telegram_integration",
|
||||
"description": "Integração com Telegram para envio e recebimento de mensagens",
|
||||
"config_json": {
|
||||
"provider": "telegram",
|
||||
"api_base": "https://api.telegram.org",
|
||||
"api_key_env": "TELEGRAM_BOT_TOKEN",
|
||||
"webhook_url": "${APP_URL}/webhook/telegram",
|
||||
"allowed_updates": ["message", "callback_query"]
|
||||
},
|
||||
"environments": {
|
||||
"production": True,
|
||||
"development": False,
|
||||
"staging": True
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
# Criar as ferramentas
|
||||
for tool_data in tools:
|
||||
# Substituir placeholders por variáveis de ambiente quando disponíveis
|
||||
if "api_base" in tool_data["config_json"]:
|
||||
if "${KNOWLEDGE_API_URL}" in tool_data["config_json"]["api_base"]:
|
||||
tool_data["config_json"]["api_base"] = tool_data["config_json"]["api_base"].replace(
|
||||
"${KNOWLEDGE_API_URL}", os.getenv("KNOWLEDGE_API_URL", "http://localhost:5540")
|
||||
)
|
||||
|
||||
if "webhook_url" in tool_data["config_json"]:
|
||||
if "${APP_URL}" in tool_data["config_json"]["webhook_url"]:
|
||||
tool_data["config_json"]["webhook_url"] = tool_data["config_json"]["webhook_url"].replace(
|
||||
"${APP_URL}", os.getenv("APP_URL", "http://localhost:8000")
|
||||
)
|
||||
|
||||
if "phone_number_id" in tool_data["config_json"]:
|
||||
if "${WHATSAPP_PHONE_ID}" in tool_data["config_json"]["phone_number_id"]:
|
||||
tool_data["config_json"]["phone_number_id"] = os.getenv("WHATSAPP_PHONE_ID", "")
|
||||
|
||||
if "webhook_verify_token" in tool_data["config_json"]:
|
||||
if "${WHATSAPP_VERIFY_TOKEN}" in tool_data["config_json"]["webhook_verify_token"]:
|
||||
tool_data["config_json"]["webhook_verify_token"] = os.getenv("WHATSAPP_VERIFY_TOKEN", "")
|
||||
|
||||
tool = Tool(
|
||||
name=tool_data["name"],
|
||||
description=tool_data["description"],
|
||||
config_json=tool_data["config_json"],
|
||||
environments=tool_data["environments"]
|
||||
)
|
||||
|
||||
session.add(tool)
|
||||
logger.info(f"Ferramenta '{tool_data['name']}' criada com sucesso")
|
||||
|
||||
session.commit()
|
||||
logger.info("Todas as ferramentas foram criadas com sucesso")
|
||||
return True
|
||||
|
||||
except SQLAlchemyError as e:
|
||||
session.rollback()
|
||||
logger.error(f"Erro de banco de dados ao criar ferramentas: {str(e)}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erro ao criar ferramentas: {str(e)}")
|
||||
return False
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = create_tools()
|
||||
sys.exit(0 if success else 1)
|
||||
Reference in New Issue
Block a user