Agente LLM com execução de funções, histórico persistente, suporte a arquivos e orquestração de múltiplos agentes.
Project description
🤖 Tyr Agent
TyrAgent é uma biblioteca para criação de agentes inteligentes com histórico, function-calling, suporte a arquivos e orquestração de múltiplos agentes. Ideal para aplicações com modelos generativos como Gemini, GPT e similares.
- 💬 Conversas com ou sem
streaming - 🧠
Memóriapersistente de interações (por agente), com controle total de uso e armazenamento - 📊 Sistema de
scorepor interação para qualificar e filtrar o histórico - ⚙️ Execução de funções python durante a conversa, com suporte a
function calling - 🧑🏻💼
Orquestraçãode múltiplos agentes com roteamento automático de mensagens - 🖼️ Interpretação de múltiplos tipos de
arquivo - 🧩 Estrutura modular e extensível
📦 Instalação via PyPI
pip install tyr-agent
🔒 Lembre-se de configurar sua variável
GEMINI_KEYno.env
🧩 Estrutura do projeto
tyr_agent/
├── core/
│ ├── agent.py # SimpleAgent, ComplexAgent e ManagerAgent
│ └── ai_config.py # configure_gemini
└── storage/
└── interaction_history.py # InteractionHistory
💡 Exemplos de uso
📘 Criando um agente simples
import asyncio
import google.generativeai as genai
from tyr_agent import SimpleAgent, configure_gemini
configure_gemini()
agent = SimpleAgent(
prompt_build="Você é um assistente de clima.",
agent_name="WeatherAgent",
model=genai.GenerativeModel("gemini-2.5-flash-preview-04-17"),
use_history=True, # É um parâmetro opicional e pode ser True ou False.
use_score=True, # É um parâmetro opicional e pode ser True ou False.,
score_average=3 # É um parâmetro opicional e pode variar de 0 a 5.,
)
# O parâmetro "save_history" também é opicional e pode ser True ou False.
response = asyncio.run(agent.chat("Qual o clima em Salvador?", save_history=True))
⚙️ Criando um agente com funções
import asyncio
import google.generativeai as genai
from tyr_agent import ComplexAgent, configure_gemini
def somar(a: float, b: float): return a + b
def pegar_clima(cidade: str): return f"Clima em {cidade}: Ensolarado 28°C"
configure_gemini()
agent = ComplexAgent(
prompt_build="Você pode fazer cálculos e responder sobre o clima.",
agent_name="WeatherSumBot",
model=genai.GenerativeModel("gemini-2.5-flash-preview-04-17"),
functions={"somar": somar, "pegar_clima": pegar_clima},
use_history=False, # É um parâmetro opicional e pode ser True ou False.
use_score=False, # É um parâmetro opicional e pode ser True ou False.,
score_average=1 # É um parâmetro opicional e pode variar de 0 a 5.,
)
# O parâmetro "save_history" também é opicional e pode ser True ou False.
response = asyncio.run(agent.chat("Me diga quanto é 10+5 e o clima de São Paulo", save_history=False))
🧑🏻💼 Criando um orquestrador de agentes
import asyncio
import google.generativeai as genai
from tyr_agent import ManagerAgent, ComplexAgent, SimpleAgent, configure_gemini
configure_gemini()
model = genai.GenerativeModel("gemini-2.5-flash-preview-04-17")
weather_agent = SimpleAgent(
prompt_build="Você é um assistente de clima.",
agent_name="WeatherAgent",
model=model
)
def somar(a: float, b: float): return a + b
def subtrair(a: float, b: float): return a - b
math_agent = ComplexAgent(
prompt_build="Você pode fazer cálculos matemáticos.",
agent_name="MathAgent",
model=model,
functions={"somar": somar, "subtrair": subtrair}
)
configure_gemini()
manager_agent = ManagerAgent(
agent_name="ManagerAgent",
model=model,
agents={"weather": weather_agent, "math": math_agent},
use_history=True, # É um parâmetro opicional e pode ser True ou False.,
use_score=True, # É um parâmetro opicional e pode ser True ou False.,
score_average=4 # É um parâmetro opicional e pode variar de 0 a 5.,
)
# O parâmetro "save_history" também é opicional e pode ser True ou False.
response = asyncio.run(manager_agent.chat("Me diga clima de São Paulo e quanto é 10+5", save_history=False))
🧠 Principais recursos
SimpleAgent: Conversa com contexto e histórico;ComplexAgent: Capaz de sugerir e executar funções, processar os resultados e entregar uma resposta final;ManagerAgent: Orquestra múltiplos agentes e delega tarefas automaticamente;InteractionHistory: Armazena o histórico individual de cada agente em JSON;- Suporte a múltiplos tipos de arquivo via path, base64 ou BytesIO;
- Sistema de score por interação (0 a 5) com média configurável (
score_average) para decidir o que deve ou não ser utlizado no histórico; - Histórico totalmente gerenciável com métodos para criar, remover, limpar ou apagar os dados persistidos;
- Estrutura modular e extensível para expansão futura (benchmark, visão computacional, execução de código etc.).
📄 Licença
Este repositório está licenciado sob os termos da MIT License.
📬 Contato
Criado por Witor Oliveira
🔗 LinkedIn
📫 Contato por e-mail
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tyr_agent-0.0.6.tar.gz.
File metadata
- Download URL: tyr_agent-0.0.6.tar.gz
- Upload date:
- Size: 15.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
857feb16495ff202a30799ece1cfd849df4fcf1a327d0e2c037e6c82d16fdb08
|
|
| MD5 |
dc5253fe224758a185b8d866441bc7a8
|
|
| BLAKE2b-256 |
7fcfcd83cc9f2ce9e4430389dda611ab260b9c626e9a67c84c559f48a35e0a23
|
File details
Details for the file tyr_agent-0.0.6-py3-none-any.whl.
File metadata
- Download URL: tyr_agent-0.0.6-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a311aceb87d4ef71b3f24084a2826f9c3370e529256eff0e49027e7671edc232
|
|
| MD5 |
49fcaf38b6491561bd1bb4aae8261666
|
|
| BLAKE2b-256 |
2ef489ad83db30c4ab5c65eb747aa5c3b1acbfc5465dce361841ecc4372e2b1f
|