SPADE-LLM
Extension for SPADE that integrates Large Language Models into multi-agent systems. Build intelligent, collaborative agents that can communicate, reason, and take actions in complex distributed environments.
Table of Contents
- Key Features
- Quick Start
- Installation
- Architecture
- Documentation
- Examples
- Requirements
- Contributing
- License
Key Features
- Multi-Provider Support - OpenAI, Ollama, LM Studio, vLLM integration
- Tool System - Function calling with async execution
- Context Management - Multi-conversation support with automatic cleanup
- Memory Extensions - Agent-based and agent-thread memory for persistent state
- Message Routing - Conditional routing based on LLM responses
- Guardrails System - Content filtering and safety controls for input/output
- MCP Integration - Model Context Protocol server support
- Human-in-the-Loop - Web interface for human expert consultation
Quick Start
import spade
from spade_llm import LLMAgent, LLMProvider
async def main():
provider = LLMProvider.create_openai(
api_key="your-api-key",
model="gpt-4o-mini"
)
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
system_prompt="You are a helpful assistant"
)
await agent.start()
if __name__ == "__main__":
spade.run(main())
Installation
⚠️ Warning:
spade_llmis not yet available on PyPI. It will be published in the coming days. Stay tuned!
pip install spade_llm
Examples
Multi-Provider Support
# OpenAI
provider = LLMProvider.create_openai(api_key="key", model="gpt-4o-mini")
# Ollama (local)
provider = LLMProvider.create_ollama(model="llama3.1:8b")
# LM Studio (local)
provider = LLMProvider.create_lm_studio(model="local-model")
Tools and Function Calling
from spade_llm import LLMTool
async def get_weather(city: str) -> str:
return f"Weather in {city}: 22°C, sunny"
weather_tool = LLMTool(
name="get_weather",
description="Get weather for a city",
parameters={
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
},
func=get_weather
)
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
tools=[weather_tool]
)
Content Safety with Guardrails
from spade_llm.guardrails import KeywordGuardrail, GuardrailAction
# Block harmful content
safety_filter = KeywordGuardrail(
name="safety_filter",
blocked_keywords=["hack", "exploit", "malware"],
action=GuardrailAction.BLOCK,
blocked_message="I cannot help with potentially harmful activities."
)
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
input_guardrails=[safety_filter] # Filter incoming messages
)
Message Routing
def router(msg, response, context):
if "technical" in response.lower():
return "tech-support@example.com"
return str(msg.sender)
agent = LLMAgent(
jid="router@example.com",
password="password",
provider=provider,
routing_function=router
)
Interactive Chat
from spade_llm import ChatAgent
# Create chat interface
chat_agent = ChatAgent(
jid="human@example.com",
password="password",
target_agent_jid="assistant@example.com"
)
await chat_agent.start()
await chat_agent.run_interactive() # Start interactive chat
Memory Extensions
# Agent-based memory: Single shared memory per agent
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
agent_base_memory=(True, "./memory.db") # Enabled with custom path
)
# Agent-thread memory: Separate memory per conversation
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
agent_thread_memory=(True, "./thread_memory.db") # Enabled with custom path
)
# Default memory paths (if path not specified)
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
agent_base_memory=(True, None) # Uses default path
)
Context Management
from spade_llm.context import SmartWindowSizeContext, FixedWindowSizeContext
# Smart context: Dynamic window sizing based on content
smart_context = SmartWindowSizeContext(
max_tokens=4000,
include_system_prompt=True,
preserve_last_k_messages=5
)
# Fixed context: Traditional sliding window
fixed_context = FixedWindowSizeContext(
max_messages=20,
include_system_prompt=True
)
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
context_manager=smart_context
)
Human-in-the-Loop
from spade_llm import HumanInTheLoopTool
# Create tool for human consultation
human_tool = HumanInTheLoopTool(
human_expert_jid="expert@example.com",
timeout=300.0 # 5 minutes
)
agent = LLMAgent(
jid="assistant@example.com",
password="password",
provider=provider,
tools=[human_tool] # Pass tools in constructor
)
# Start web interface for human expert
# python -m spade_llm.human_interface.web_server
# Open http://localhost:8080 and connect as expert
Architecture
graph LR
A[LLMAgent] --> C[ContextManager]
A --> D[LLMProvider]
A --> E[LLMTool]
A --> G[Guardrails]
A --> M[Memory]
D --> F[OpenAI/Ollama/etc]
G --> H[Input/Output Filtering]
E --> I[Human-in-the-Loop]
E --> J[MCP]
E --> P[CustomTool/LangchainTool]
J --> K[STDIO]
J --> L[HTTP Streaming]
M --> N[Agent-based]
M --> O[Agent-thread]
Documentation
- Installation - Setup and requirements
- Quick Start - Basic usage examples
- Providers - LLM provider configuration
- Tools - Function calling system
- Guardrails - Content filtering and safety
- API Reference - Complete API documentation
Examples Directory
The /examples directory contains complete working examples:
multi_provider_chat_example.py- Chat with different LLM providersollama_with_tools_example.py- Local models with tool callinglangchain_tools_example.py- LangChain tool integrationguardrails_example.py- Content filtering and safety controlshuman_in_the_loop_example.py- Human expert consultation via web interfacevalencia_multiagent_trip_planner.py- Multi-agent workflow
Requirements
- Python 3.10+
- SPADE 3.3.0+
Contributing
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Submit a pull request
See Contributing Guide for details.
License
MIT License
Metadata
Release files for spade-llm 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| spade_llm-0.1.0.tar.gz | 5.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| spade_llm-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 5.3 MB
Release files / spade_llm-0.1.0.tar.gz
| Download URL | spade_llm-0.1.0.tar.gz |
|---|---|
| Size | 5.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
510f70c767484c3af33d465302faec0c934330e98f5307b822993b514be66441
|
|
BLAKE2b-256 checksum How to use checksums |
1771ad427089321d870657c161a7b485d21942e0365b5badf31457c755180ad5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.11.9
|
Release files / spade_llm-0.1.0-py3-none-any.whl
| Download URL | spade_llm-0.1.0-py3-none-any.whl |
|---|---|
| Size | 73.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
de24a935fbf68770b5c5d4d0addef3498a7cc954c144fdf687c9ae9010248ff4
|
|
BLAKE2b-256 checksum How to use checksums |
f1d8ef88ab6935e7d93ddb115e6469ff1e167efd24b569297ed059df2c091fa4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.11.9
|