A minimalistic framework for building reliable AI agents
Project description
SmartPup
A minimalistic framework for building reliable AI agents (pups) that do exactly what you tell them to do, without extra magic.
Why?
The existing agent frameworks feel too complex and bloated. Maybe they are right for some use cases, but my feeble brain needed something simpler. All this talk of "agents" is tricky because you can't really rely on an LLM to do what you want it to do. Not yet anyway. So I really want is not smart agents that will figure things out, but simply smart functions - that I can call with a system prompt and a bunch of tools and they will reliably do the one thing they are supposed to do. And if they can't - they will fail, ideally explaining why.
So less like superintelligent "agents" and more like well trained puppies. You tell them what to do and they do it, bringing back exactly what you needed in the form you needed. Maybe in the future there is some pavlovian conditioning and training. But for now they are just like your average well trained dog: excitable, reliable, and not very smart.
Features
- Simple, predictable agents that do run off and do one thing at a time and if they can't - they don't invent shit. They fail clearly and explain why.
- Uses OpenRouter to support multiple LLM providers (OpenAI, Anthropic, Google, etc.)
- Built-in tool system with auto-discovery
- No conversation history - each request is independent
- Optional memory system for persistence when needed (built as a tool)
- Uses Pydantic for type safety
Installation
pip install smartpup
Quick Start
import asyncio
from smartpup import Pup, ToolRegistry
async def main():
# Initialize tools
registry = ToolRegistry()
registry.discover_tools()
# Create a weather pup
weather_pup = Pup(
system_prompt="You are a weather assistant. Check the weather and report it as a short poem.",
tools=registry.get_tools(["get_current_weather"])
)
# Get weather
response = await weather_pup.run("What's the weather in Amsterdam?")
print(response)
if __name__ == "__main__":
asyncio.run(main())
Environment Setup
Create a .env file:
OPENROUTER_API_KEY=your-api-key
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
Built-in Tools
- Weather: Get current weather for any location
- DateTime: Get current date/time in various formats
- Memory: Simple key-value storage for persistence
- Translate: Text translation between languages
Creating Custom Tools
from smartpup import BaseTool
class CalculatorTool(BaseTool):
name = "calculator"
description = "Perform basic arithmetic operations"
async def execute(
self,
operation: str,
a: float,
b: float
) -> str:
"""
Perform basic arithmetic
Args:
operation: One of 'add', 'subtract', 'multiply', 'divide'
a: First number
b: Second number
"""
if operation == "add":
return f"Result: {a + b}"
# ... other operations ...
# Register and use the tool
registry = ToolRegistry()
registry.register_tool(CalculatorTool)
Examples
Check the examples directory for more usage examples:
- Basic weather reporting
- Translation service
- Memory usage
- Custom calculator tool
Configuration
Optional global configuration:
from smartpup import configure
configure(
default_model="openai/gpt-4o-mini", # Default LLM to use
max_iterations=10, # Max tool call iterations
memory_file="memory.json" # For memory tools. alternatively you can set the environment variable MEMORY_FILE
)
Development
For development:
git clone https://github.com/georgestrakhov/smartpup.git
cd smartpup
pip install -e ".[dev]"
pytest # Run tests
Philosophy
SmartPup is built on these principles:
- One Task at a Time: Each pup does one specific thing
- No Magic: Clear, predictable behavior without hidden complexity
- Tool-First: Tools provide clear interfaces for agent capabilities
- Independent Requests: No conversation history or context bleeding
License
MIT License - see LICENSE for details.
Project details
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 smartpup-0.1.0.tar.gz.
File metadata
- Download URL: smartpup-0.1.0.tar.gz
- Upload date:
- Size: 275.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
391c7986254bf87cda40f02ab881c47961fa94b404ea00bd38c23e5b3fa1ff90
|
|
| MD5 |
0b8e6396ee81e97c541f24203e457e3d
|
|
| BLAKE2b-256 |
f28fa8d465e97ad912b9abe8793d50a6bc176e6e1d64ba96bf470d3053053b3a
|
File details
Details for the file smartpup-0.1.0-py3-none-any.whl.
File metadata
- Download URL: smartpup-0.1.0-py3-none-any.whl
- Upload date:
- Size: 21.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76921a7fa1edcd19618587b994d464f1dda85dba36e2e98d4dbe56895e88f558
|
|
| MD5 |
4784422ab73a80368378c5dc09f5e40c
|
|
| BLAKE2b-256 |
0525ddb942575b3bd674c3eccccd7f9e2b01700334eccaa41c77b878b8349621
|