From b51bc2093b19cd925debc11c7f34ac0cc1ca4386 Mon Sep 17 00:00:00 2001
From: Kye Gomez
Date: Wed, 5 Nov 2025 15:23:59 -0800
Subject: [PATCH 01/21] cleanup
---
tests/structs/test_agent_router.py | 1 -
tests/structs/test_concurrent_workflow.py | 4 ++--
tests/structs/test_hierarchical_swarm.py | 4 ++--
tests/structs/test_majority_voting.py | 6 +++---
4 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/tests/structs/test_agent_router.py b/tests/structs/test_agent_router.py
index 80d9d214..0e5fcfaa 100644
--- a/tests/structs/test_agent_router.py
+++ b/tests/structs/test_agent_router.py
@@ -1,4 +1,3 @@
-
# from unittest.mock import Mock, patch
from swarms.structs.agent_router import AgentRouter
diff --git a/tests/structs/test_concurrent_workflow.py b/tests/structs/test_concurrent_workflow.py
index a7ba4eae..0179ed3c 100644
--- a/tests/structs/test_concurrent_workflow.py
+++ b/tests/structs/test_concurrent_workflow.py
@@ -159,7 +159,7 @@ def test_concurrent_workflow_error_handling():
"""Test ConcurrentWorkflow error handling and validation"""
# Test with empty agents list
try:
- workflow = ConcurrentWorkflow(agents=[])
+ ConcurrentWorkflow(agents=[])
assert (
False
), "Should have raised ValueError for empty agents list"
@@ -168,7 +168,7 @@ def test_concurrent_workflow_error_handling():
# Test with None agents
try:
- workflow = ConcurrentWorkflow(agents=None)
+ ConcurrentWorkflow(agents=None)
assert False, "Should have raised ValueError for None agents"
except ValueError as e:
assert "No agents provided" in str(e)
diff --git a/tests/structs/test_hierarchical_swarm.py b/tests/structs/test_hierarchical_swarm.py
index 565d332d..9e1fcf69 100644
--- a/tests/structs/test_hierarchical_swarm.py
+++ b/tests/structs/test_hierarchical_swarm.py
@@ -210,7 +210,7 @@ def test_hierarchical_swarm_error_handling():
"""Test HierarchicalSwarm error handling"""
# Test with empty agents list
try:
- swarm = HierarchicalSwarm(agents=[])
+ HierarchicalSwarm(agents=[])
assert (
False
), "Should have raised ValueError for empty agents list"
@@ -228,7 +228,7 @@ def test_hierarchical_swarm_error_handling():
)
try:
- swarm = HierarchicalSwarm(agents=[researcher], max_loops=0)
+ HierarchicalSwarm(agents=[researcher], max_loops=0)
assert (
False
), "Should have raised ValueError for invalid max_loops"
diff --git a/tests/structs/test_majority_voting.py b/tests/structs/test_majority_voting.py
index e36e94a0..86cef9b3 100644
--- a/tests/structs/test_majority_voting.py
+++ b/tests/structs/test_majority_voting.py
@@ -178,21 +178,21 @@ def test_majority_voting_error_handling():
def test_majority_voting_different_output_types():
"""Test MajorityVoting with different output types"""
# Create agents for technical analysis
- security_expert = Agent(
+ Agent(
agent_name="Security-Expert",
agent_description="Cybersecurity and data protection specialist",
model_name="gpt-4o",
max_loops=1,
)
- compliance_officer = Agent(
+ Agent(
agent_name="Compliance-Officer",
agent_description="Regulatory compliance and legal specialist",
model_name="gpt-4o",
max_loops=1,
)
- privacy_advocate = Agent(
+ Agent(
agent_name="Privacy-Advocate",
agent_description="Privacy protection and data rights specialist",
model_name="gpt-4o",
From d1851804303586e34c998137dd774054818b7d24 Mon Sep 17 00:00:00 2001
From: Steve-Dusty
Date: Thu, 6 Nov 2025 23:51:33 -0800
Subject: [PATCH 02/21] removed vllm
---
README.md | 1 -
docs/examples/index.md | 1 -
.../examples/custom_base_url_example.md | 2 +-
docs/swarms/examples/llama4.md | 14 +-
docs/swarms/examples/model_providers.md | 4 +-
docs/swarms/examples/vllm.md | 429 ------------------
docs/swarms/examples/vllm_integration.md | 194 --------
examples/README.md | 2 +-
examples/demos/README.md | 1 -
examples/demos/finance/swarms_of_vllm.py | 214 ---------
test.py | 13 +
11 files changed, 22 insertions(+), 853 deletions(-)
delete mode 100644 docs/swarms/examples/vllm.md
delete mode 100644 docs/swarms/examples/vllm_integration.md
delete mode 100644 examples/demos/finance/swarms_of_vllm.py
create mode 100644 test.py
diff --git a/README.md b/README.md
index dd3de49d..3ae1559b 100644
--- a/README.md
+++ b/README.md
@@ -829,7 +829,6 @@ Explore comprehensive examples and tutorials to learn how to use Swarms effectiv
| **Model Providers** | Ollama | Local Ollama model integration | [Ollama Examples](https://docs.swarms.world/en/latest/swarms/examples/ollama/) |
| **Model Providers** | OpenRouter | OpenRouter model integration | [OpenRouter Examples](https://docs.swarms.world/en/latest/swarms/examples/openrouter/) |
| **Model Providers** | XAI | XAI model integration | [XAI Examples](https://docs.swarms.world/en/latest/swarms/examples/xai/) |
-| **Model Providers** | VLLM | VLLM integration | [VLLM Examples](https://docs.swarms.world/en/latest/swarms/examples/vllm_integration/) |
| **Model Providers** | Llama4 | Llama4 model integration | [Llama4 Examples](https://docs.swarms.world/en/latest/swarms/examples/llama4/) |
| **Multi-Agent Architecture** | HierarchicalSwarm | Hierarchical agent orchestration | [HierarchicalSwarm Examples](https://docs.swarms.world/en/latest/swarms/examples/hierarchical_swarm_example/) |
| **Multi-Agent Architecture** | Hybrid Hierarchical-Cluster Swarm | Advanced hierarchical patterns | [HHCS Examples](https://docs.swarms.world/en/latest/swarms/examples/hhcs_examples/) |
diff --git a/docs/examples/index.md b/docs/examples/index.md
index bb1ed712..789e4d33 100644
--- a/docs/examples/index.md
+++ b/docs/examples/index.md
@@ -58,7 +58,6 @@ This index organizes **100+ production-ready examples** from our [Swarms Example
| Claude | [Claude 4 Example](https://github.com/kyegomez/swarms/blob/master/examples/models/claude_4_example.py) | Anthropic Claude 4 model integration for advanced reasoning capabilities |
| Swarms Claude | [Swarms Claude Example](https://github.com/kyegomez/swarms/blob/master/examples/models/swarms_claude_example.py) | Optimized Claude integration within the Swarms framework |
| Lumo | [Lumo Example](https://github.com/kyegomez/swarms/blob/master/examples/models/lumo_example.py) | Lumo AI model integration for specialized tasks |
-| VLLM | [VLLM Example](https://github.com/kyegomez/swarms/blob/master/examples/models/vllm_example.py) | High-performance inference using VLLM for large language models |
| Llama4 | [LiteLLM Example](https://github.com/kyegomez/swarms/blob/master/examples/models/llama4_examples/litellm_example.py) | Llama4 model integration using LiteLLM for efficient inference |
### Tools and Function Calling
diff --git a/docs/swarms/examples/custom_base_url_example.md b/docs/swarms/examples/custom_base_url_example.md
index c7c32947..4d48bba7 100644
--- a/docs/swarms/examples/custom_base_url_example.md
+++ b/docs/swarms/examples/custom_base_url_example.md
@@ -130,7 +130,7 @@ hf_agent = Agent(
### 4. Custom Local Endpoint
```python
-# Using a local model server (e.g., vLLM, Ollama, etc.)
+# Using a local model server (e.g., Ollama, etc.)
local_agent = Agent(
agent_name="Local-Agent",
agent_description="Agent using local model endpoint",
diff --git a/docs/swarms/examples/llama4.md b/docs/swarms/examples/llama4.md
index 1e2b9e77..a59be80b 100644
--- a/docs/swarms/examples/llama4.md
+++ b/docs/swarms/examples/llama4.md
@@ -13,10 +13,11 @@ Here's a simple example of integrating Llama4 model for crypto risk analysis:
```python
from dotenv import load_dotenv
from swarms import Agent
-from swarms.utils.vllm_wrapper import VLLM
load_dotenv()
-model = VLLM(model_name="meta-llama/Llama-4-Maverick-17B-128E")
+
+# Initialize your model here using your preferred inference method
+# For example, using litellm or another compatible wrapper
```
## Available Models
@@ -88,9 +89,7 @@ agent = Agent(
```python
from dotenv import load_dotenv
-
from swarms import Agent
-from swarms.utils.vllm_wrapper import VLLM
load_dotenv()
@@ -126,15 +125,14 @@ Provide detailed, balanced analysis with both risks and potential mitigations.
Base your analysis on established crypto market principles and current market conditions.
"""
-model = VLLM(model_name="meta-llama/Llama-4-Maverick-17B-128E")
-
# Initialize the agent with custom prompt
+# Note: Use your preferred model provider (OpenAI, Anthropic, Groq, etc.)
agent = Agent(
agent_name="Crypto-Risk-Analysis-Agent",
agent_description="Agent for analyzing risks in cryptocurrency investments",
system_prompt=CRYPTO_RISK_ANALYSIS_PROMPT,
+ model_name="gpt-4o-mini", # or any other supported model
max_loops=1,
- llm=model,
)
print(
@@ -153,7 +151,7 @@ print(
The `max_loops` parameter determines how many times the agent will iterate through its thinking process. In this example, it's set to 1 for a single pass analysis.
??? question "Can I use a different model?"
- Yes, you can replace the VLLM wrapper with other compatible models. Just ensure you update the model initialization accordingly.
+ Yes, you can use any supported model provider (OpenAI, Anthropic, Groq, etc.). Just ensure you set the appropriate `model_name` parameter.
??? question "How do I customize the system prompt?"
You can modify the `CRYPTO_RISK_ANALYSIS_PROMPT` string to match your specific use case while maintaining the structured format.
diff --git a/docs/swarms/examples/model_providers.md b/docs/swarms/examples/model_providers.md
index c3b64fdb..95ebde89 100644
--- a/docs/swarms/examples/model_providers.md
+++ b/docs/swarms/examples/model_providers.md
@@ -14,7 +14,6 @@ Swarms supports a vast array of model providers, giving you the flexibility to c
| **Ollama** | Local model deployment platform allowing you to run open-source models on your own infrastructure. No API keys required. | [Ollama Integration](ollama.md) |
| **OpenRouter** | Unified API gateway providing access to hundreds of models from various providers through a single interface. | [OpenRouter Integration](openrouter.md) |
| **XAI** | xAI's Grok models offering unique capabilities for research, analysis, and creative tasks with advanced reasoning abilities. | [XAI Integration](xai.md) |
-| **vLLM** | High-performance inference library for serving large language models with optimized memory usage and throughput. | [vLLM Integration](vllm_integration.md) |
| **Llama4** | Meta's latest open-source language models including Llama-4-Maverick and Llama-4-Scout variants with expert routing capabilities. | [Llama4 Integration](llama4.md) |
| **Azure OpenAI** | Enterprise-grade OpenAI models through Microsoft's cloud infrastructure with enhanced security, compliance, and enterprise features. | [Azure Integration](azure.md) |
@@ -63,7 +62,6 @@ response = agent.run("Your query here")
- **Groq**: Ultra-fast inference
-- **vLLM**: Optimized for high throughput
### For Specialized Tasks
@@ -106,7 +104,7 @@ AZURE_API_VERSION=2024-02-15-preview
```
!!! note "No API Key Required"
- Ollama and vLLM can be run locally without API keys, making them perfect for development and testing.
+ Ollama can be run locally without API keys, making it perfect for development and testing.
## Advanced Features
diff --git a/docs/swarms/examples/vllm.md b/docs/swarms/examples/vllm.md
deleted file mode 100644
index 11df0aab..00000000
--- a/docs/swarms/examples/vllm.md
+++ /dev/null
@@ -1,429 +0,0 @@
-# VLLM Swarm Agents
-
-!!! tip "Quick Summary"
- This guide demonstrates how to create a sophisticated multi-agent system using VLLM and Swarms for comprehensive stock market analysis. You'll learn how to configure and orchestrate multiple AI agents working together to provide deep market insights.
-
-## Overview
-
-The example showcases how to build a stock analysis system with 5 specialized agents:
-
-- Technical Analysis Agent
-- Fundamental Analysis Agent
-- Market Sentiment Agent
-- Quantitative Strategy Agent
-- Portfolio Strategy Agent
-
-Each agent has specific expertise and works collaboratively through a concurrent workflow.
-
-## Prerequisites
-
-!!! warning "Requirements"
- Before starting, ensure you have:
-
- - Python 3.7 or higher
- - The Swarms package installed
- - Access to VLLM compatible models
- - Sufficient compute resources for running VLLM
-
-## Installation
-
-!!! example "Setup Steps"
-
- 1. Install the Swarms package:
- ```bash
- pip install swarms
- ```
-
- 2. Install VLLM dependencies (if not already installed):
- ```bash
- pip install vllm
- ```
-
-## Basic Usage
-
-Here's a complete example of setting up the stock analysis swarm:
-
-```python
-from swarms import Agent, ConcurrentWorkflow
-from swarms.utils.vllm_wrapper import VLLMWrapper
-
-# Initialize the VLLM wrapper
-vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-7b-chat-hf",
- system_prompt="You are a helpful assistant.",
-)
-```
-
-!!! note "Model Selection"
- The example uses Llama-2-7b-chat, but you can use any VLLM-compatible model. Make sure you have the necessary permissions and resources to run your chosen model.
-
-## Agent Configuration
-
-### Technical Analysis Agent
-
-```python
-technical_analyst = Agent(
- agent_name="Technical-Analysis-Agent",
- agent_description="Expert in technical analysis and chart patterns",
- system_prompt="""You are an expert Technical Analysis Agent specializing in market technicals and chart patterns. Your responsibilities include:
-
-1. PRICE ACTION ANALYSIS
-- Identify key support and resistance levels
-- Analyze price trends and momentum
-- Detect chart patterns (e.g., head & shoulders, triangles, flags)
-- Evaluate volume patterns and their implications
-
-2. TECHNICAL INDICATORS
-- Calculate and interpret moving averages (SMA, EMA)
-- Analyze momentum indicators (RSI, MACD, Stochastic)
-- Evaluate volume indicators (OBV, Volume Profile)
-- Monitor volatility indicators (Bollinger Bands, ATR)
-
-3. TRADING SIGNALS
-- Generate clear buy/sell signals based on technical criteria
-- Identify potential entry and exit points
-- Set appropriate stop-loss and take-profit levels
-- Calculate position sizing recommendations
-
-4. RISK MANAGEMENT
-- Assess market volatility and trend strength
-- Identify potential reversal points
-- Calculate risk/reward ratios for trades
-- Suggest position sizing based on risk parameters
-
-Your analysis should be data-driven, precise, and actionable. Always include specific price levels, time frames, and risk parameters in your recommendations.""",
- max_loops=1,
- llm=vllm,
-)
-```
-
-!!! tip "Agent Customization"
- Each agent can be customized with different:
-
- - System prompts
-
- - Temperature settings
-
- - Max token limits
-
- - Response formats
-
-## Running the Swarm
-
-To execute the swarm analysis:
-
-```python
-swarm = ConcurrentWorkflow(
- name="Stock-Analysis-Swarm",
- description="A swarm of agents that analyze stocks and provide comprehensive analysis.",
- agents=stock_analysis_agents,
-)
-
-# Run the analysis
-response = swarm.run("Analyze the best etfs for gold and other similar commodities in volatile markets")
-```
-
-
-
-## Full Code Example
-
-```python
-from swarms import Agent, ConcurrentWorkflow
-from swarms.utils.vllm_wrapper import VLLMWrapper
-
-# Initialize the VLLM wrapper
-vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-7b-chat-hf",
- system_prompt="You are a helpful assistant.",
-)
-
-# Technical Analysis Agent
-technical_analyst = Agent(
- agent_name="Technical-Analysis-Agent",
- agent_description="Expert in technical analysis and chart patterns",
- system_prompt="""You are an expert Technical Analysis Agent specializing in market technicals and chart patterns. Your responsibilities include:
-
-1. PRICE ACTION ANALYSIS
-- Identify key support and resistance levels
-- Analyze price trends and momentum
-- Detect chart patterns (e.g., head & shoulders, triangles, flags)
-- Evaluate volume patterns and their implications
-
-2. TECHNICAL INDICATORS
-- Calculate and interpret moving averages (SMA, EMA)
-- Analyze momentum indicators (RSI, MACD, Stochastic)
-- Evaluate volume indicators (OBV, Volume Profile)
-- Monitor volatility indicators (Bollinger Bands, ATR)
-
-3. TRADING SIGNALS
-- Generate clear buy/sell signals based on technical criteria
-- Identify potential entry and exit points
-- Set appropriate stop-loss and take-profit levels
-- Calculate position sizing recommendations
-
-4. RISK MANAGEMENT
-- Assess market volatility and trend strength
-- Identify potential reversal points
-- Calculate risk/reward ratios for trades
-- Suggest position sizing based on risk parameters
-
-Your analysis should be data-driven, precise, and actionable. Always include specific price levels, time frames, and risk parameters in your recommendations.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Fundamental Analysis Agent
-fundamental_analyst = Agent(
- agent_name="Fundamental-Analysis-Agent",
- agent_description="Expert in company fundamentals and valuation",
- system_prompt="""You are an expert Fundamental Analysis Agent specializing in company valuation and financial metrics. Your core responsibilities include:
-
-1. FINANCIAL STATEMENT ANALYSIS
-- Analyze income statements, balance sheets, and cash flow statements
-- Calculate and interpret key financial ratios
-- Evaluate revenue growth and profit margins
-- Assess company's debt levels and cash position
-
-2. VALUATION METRICS
-- Calculate fair value using multiple valuation methods:
- * Discounted Cash Flow (DCF)
- * Price-to-Earnings (P/E)
- * Price-to-Book (P/B)
- * Enterprise Value/EBITDA
-- Compare valuations against industry peers
-
-3. BUSINESS MODEL ASSESSMENT
-- Evaluate competitive advantages and market position
-- Analyze industry dynamics and market share
-- Assess management quality and corporate governance
-- Identify potential risks and growth opportunities
-
-4. ECONOMIC CONTEXT
-- Consider macroeconomic factors affecting the company
-- Analyze industry cycles and trends
-- Evaluate regulatory environment and compliance
-- Assess global market conditions
-
-Your analysis should be comprehensive, focusing on both quantitative metrics and qualitative factors that impact long-term value.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Market Sentiment Agent
-sentiment_analyst = Agent(
- agent_name="Market-Sentiment-Agent",
- agent_description="Expert in market psychology and sentiment analysis",
- system_prompt="""You are an expert Market Sentiment Agent specializing in analyzing market psychology and investor behavior. Your key responsibilities include:
-
-1. SENTIMENT INDICATORS
-- Monitor and interpret market sentiment indicators:
- * VIX (Fear Index)
- * Put/Call Ratio
- * Market Breadth
- * Investor Surveys
-- Track institutional vs retail investor behavior
-
-2. NEWS AND SOCIAL MEDIA ANALYSIS
-- Analyze news flow and media sentiment
-- Monitor social media trends and discussions
-- Track analyst recommendations and changes
-- Evaluate corporate insider trading patterns
-
-3. MARKET POSITIONING
-- Assess hedge fund positioning and exposure
-- Monitor short interest and short squeeze potential
-- Track fund flows and asset allocation trends
-- Analyze options market sentiment
-
-4. CONTRARIAN SIGNALS
-- Identify extreme sentiment readings
-- Detect potential market turning points
-- Analyze historical sentiment patterns
-- Provide contrarian trading opportunities
-
-Your analysis should combine quantitative sentiment metrics with qualitative assessment of market psychology and crowd behavior.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Quantitative Strategy Agent
-quant_analyst = Agent(
- agent_name="Quantitative-Strategy-Agent",
- agent_description="Expert in quantitative analysis and algorithmic strategies",
- system_prompt="""You are an expert Quantitative Strategy Agent specializing in data-driven investment strategies. Your primary responsibilities include:
-
-1. FACTOR ANALYSIS
-- Analyze and monitor factor performance:
- * Value
- * Momentum
- * Quality
- * Size
- * Low Volatility
-- Calculate factor exposures and correlations
-
-2. STATISTICAL ANALYSIS
-- Perform statistical arbitrage analysis
-- Calculate and monitor pair trading opportunities
-- Analyze market anomalies and inefficiencies
-- Develop mean reversion strategies
-
-3. RISK MODELING
-- Build and maintain risk models
-- Calculate portfolio optimization metrics
-- Monitor correlation matrices
-- Analyze tail risk and stress scenarios
-
-4. ALGORITHMIC STRATEGIES
-- Develop systematic trading strategies
-- Backtest and validate trading algorithms
-- Monitor strategy performance metrics
-- Optimize execution algorithms
-
-Your analysis should be purely quantitative, based on statistical evidence and mathematical models rather than subjective opinions.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Portfolio Strategy Agent
-portfolio_strategist = Agent(
- agent_name="Portfolio-Strategy-Agent",
- agent_description="Expert in portfolio management and asset allocation",
- system_prompt="""You are an expert Portfolio Strategy Agent specializing in portfolio construction and management. Your core responsibilities include:
-
-1. ASSET ALLOCATION
-- Develop strategic asset allocation frameworks
-- Recommend tactical asset allocation shifts
-- Optimize portfolio weightings
-- Balance risk and return objectives
-
-2. PORTFOLIO ANALYSIS
-- Calculate portfolio risk metrics
-- Monitor sector and factor exposures
-- Analyze portfolio correlation matrix
-- Track performance attribution
-
-3. RISK MANAGEMENT
-- Implement portfolio hedging strategies
-- Monitor and adjust position sizing
-- Set stop-loss and rebalancing rules
-- Develop drawdown protection strategies
-
-4. PORTFOLIO OPTIMIZATION
-- Calculate efficient frontier analysis
-- Optimize for various objectives:
- * Maximum Sharpe Ratio
- * Minimum Volatility
- * Maximum Diversification
-- Consider transaction costs and taxes
-
-Your recommendations should focus on portfolio-level decisions that optimize risk-adjusted returns while meeting specific investment objectives.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Create a list of all agents
-stock_analysis_agents = [
- technical_analyst,
- fundamental_analyst,
- sentiment_analyst,
- quant_analyst,
- portfolio_strategist
-]
-
-swarm = ConcurrentWorkflow(
- name="Stock-Analysis-Swarm",
- description="A swarm of agents that analyze stocks and provide a comprehensive analysis of the current trends and opportunities.",
- agents=stock_analysis_agents,
-)
-
-swarm.run("Analyze the best etfs for gold and other similiar commodities in volatile markets")
-```
-
-## Best Practices
-
-!!! success "Optimization Tips"
- 1. **Agent Design**
- - Keep system prompts focused and specific
-
- - Use clear role definitions
-
- - Include error handling guidelines
-
- 2. **Resource Management**
-
- - Monitor memory usage with large models
-
- - Implement proper cleanup procedures
-
- - Use batching for multiple queries
-
- 3. **Output Handling**
-
- - Implement proper logging
-
- - Format outputs consistently
-
- - Include error checking
-
-## Common Issues and Solutions
-
-!!! warning "Troubleshooting"
- Common issues you might encounter:
-
- 1. **Memory Issues**
-
- - *Problem*: VLLM consuming too much memory
-
- - *Solution*: Adjust batch sizes and model parameters
-
- 2. **Agent Coordination**
-
- - *Problem*: Agents providing conflicting information
-
- - *Solution*: Implement consensus mechanisms or priority rules
-
- 3. **Performance**
-
- - *Problem*: Slow response times
-
- - *Solution*: Use proper batching and optimize model loading
-
-## FAQ
-
-??? question "Can I use different models for different agents?"
- Yes, you can initialize multiple VLLM wrappers with different models for each agent. However, be mindful of memory usage.
-
-??? question "How many agents can run concurrently?"
- The number depends on your hardware resources. Start with 3-5 agents and scale based on performance.
-
-??? question "Can I customize agent communication patterns?"
- Yes, you can modify the ConcurrentWorkflow class or create custom workflows for specific communication patterns.
-
-## Advanced Configuration
-
-!!! example "Extended Settings"
- ```python
- vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-7b-chat-hf",
- system_prompt="You are a helpful assistant.",
- temperature=0.7,
- max_tokens=2048,
- top_p=0.95,
- )
- ```
-
-## Contributing
-
-!!! info "Get Involved"
- We welcome contributions! Here's how you can help:
-
- 1. Report bugs and issues
- 2. Submit feature requests
- 3. Contribute to documentation
- 4. Share example use cases
-
-## Resources
-
-!!! abstract "Additional Reading"
- - [VLLM Documentation](https://docs.vllm.ai/en/latest/)
-
\ No newline at end of file
diff --git a/docs/swarms/examples/vllm_integration.md b/docs/swarms/examples/vllm_integration.md
deleted file mode 100644
index c270e954..00000000
--- a/docs/swarms/examples/vllm_integration.md
+++ /dev/null
@@ -1,194 +0,0 @@
-
-
-# vLLM Integration Guide
-
-!!! info "Overview"
- vLLM is a high-performance and easy-to-use library for LLM inference and serving. This guide explains how to integrate vLLM with Swarms for efficient, production-grade language model deployment.
-
-
-## Installation
-
-!!! note "Prerequisites"
- Before you begin, make sure you have Python 3.8+ installed on your system.
-
-=== "pip"
- ```bash
- pip install -U vllm swarms
- ```
-
-=== "poetry"
- ```bash
- poetry add vllm swarms
- ```
-
-## Basic Usage
-
-Here's a simple example of how to use vLLM with Swarms:
-
-```python title="basic_usage.py"
-from swarms.utils.vllm_wrapper import VLLMWrapper
-
-# Initialize the vLLM wrapper
-vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-7b-chat-hf",
- system_prompt="You are a helpful assistant.",
- temperature=0.7,
- max_tokens=4000
-)
-
-# Run inference
-response = vllm.run("What is the capital of France?")
-print(response)
-```
-
-## VLLMWrapper Class
-
-!!! abstract "Class Overview"
- The `VLLMWrapper` class provides a convenient interface for working with vLLM models.
-
-### Key Parameters
-
-| Parameter | Type | Description | Default |
-|-----------|------|-------------|---------|
-| `model_name` | str | Name of the model to use | "meta-llama/Llama-2-7b-chat-hf" |
-| `system_prompt` | str | System prompt to use | None |
-| `stream` | bool | Whether to stream the output | False |
-| `temperature` | float | Sampling temperature | 0.5 |
-| `max_tokens` | int | Maximum number of tokens to generate | 4000 |
-
-### Example with Custom Parameters
-
-```python title="custom_parameters.py"
-vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-13b-chat-hf",
- system_prompt="You are an expert in artificial intelligence.",
- temperature=0.8,
- max_tokens=2000
-)
-```
-
-## Integration with Agents
-
-You can easily integrate vLLM with Swarms agents for more complex workflows:
-
-```python title="agent_integration.py"
-from swarms import Agent
-from swarms.utils.vllm_wrapper import VLLMWrapper
-
-# Initialize vLLM
-vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-7b-chat-hf",
- system_prompt="You are a helpful assistant."
-)
-
-# Create an agent with vLLM
-agent = Agent(
- agent_name="Research-Agent",
- agent_description="Expert in conducting research and analysis",
- system_prompt="""You are an expert research agent. Your tasks include:
- 1. Analyzing complex topics
- 2. Providing detailed summaries
- 3. Making data-driven recommendations""",
- llm=vllm,
- max_loops=1
-)
-
-# Run the agent
-response = agent.run("Research the impact of AI on healthcare")
-```
-
-## Advanced Features
-
-### Batch Processing
-
-!!! tip "Performance Optimization"
- Use batch processing for efficient handling of multiple tasks simultaneously.
-
-```python title="batch_processing.py"
-tasks = [
- "What is machine learning?",
- "Explain neural networks",
- "Describe deep learning"
-]
-
-results = vllm.batched_run(tasks, batch_size=3)
-```
-
-### Error Handling
-
-!!! warning "Error Management"
- Always implement proper error handling in production environments.
-
-```python title="error_handling.py"
-from loguru import logger
-
-try:
- response = vllm.run("Complex task")
-except Exception as error:
- logger.error(f"Error occurred: {error}")
-```
-
-## Best Practices
-
-!!! success "Recommended Practices"
- === "Model Selection"
- - Choose appropriate model sizes based on your requirements
- - Consider the trade-off between model size and inference speed
-
- === "System Resources"
- - Ensure sufficient GPU memory for your chosen model
- - Monitor resource usage during batch processing
-
- === "Prompt Engineering"
- - Use clear and specific system prompts
- - Structure user prompts for optimal results
-
- === "Error Handling"
- - Implement proper error handling and logging
- - Set up monitoring for production deployments
-
- === "Performance"
- - Use batch processing for multiple tasks
- - Adjust max_tokens based on your use case
- - Fine-tune temperature for optimal output quality
-
-## Example: Multi-Agent System
-
-Here's an example of creating a multi-agent system using vLLM:
-
-```python title="multi_agent_system.py"
-from swarms import Agent, ConcurrentWorkflow
-from swarms.utils.vllm_wrapper import VLLMWrapper
-
-# Initialize vLLM
-vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-7b-chat-hf",
- system_prompt="You are a helpful assistant."
-)
-
-# Create specialized agents
-research_agent = Agent(
- agent_name="Research-Agent",
- agent_description="Expert in research",
- system_prompt="You are a research expert.",
- llm=vllm
-)
-
-analysis_agent = Agent(
- agent_name="Analysis-Agent",
- agent_description="Expert in analysis",
- system_prompt="You are an analysis expert.",
- llm=vllm
-)
-
-# Create a workflow
-agents = [research_agent, analysis_agent]
-workflow = ConcurrentWorkflow(
- name="Research-Analysis-Workflow",
- description="Comprehensive research and analysis workflow",
- agents=agents
-)
-
-# Run the workflow
-result = workflow.run("Analyze the impact of renewable energy")
-```
\ No newline at end of file
diff --git a/examples/README.md b/examples/README.md
index b595dc76..27845e5e 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -18,7 +18,7 @@ This directory contains comprehensive examples demonstrating various capabilitie
### Model Integrations
-- **[models/](models/)** - Various model integrations including Cerebras, GPT-5, GPT-OSS, Llama 4, Lumo, Ollama, and VLLM implementations with concurrent processing examples and provider-specific configurations.
+- **[models/](models/)** - Various model integrations including Cerebras, GPT-5, GPT-OSS, Llama 4, Lumo, and Ollama implementations with concurrent processing examples and provider-specific configurations.
### API & Protocols
diff --git a/examples/demos/README.md b/examples/demos/README.md
index 1fbccc7d..360b6f3a 100644
--- a/examples/demos/README.md
+++ b/examples/demos/README.md
@@ -20,7 +20,6 @@ This directory contains comprehensive demonstration examples showcasing various
## Finance
- [sentiment_news_analysis.py](finance/sentiment_news_analysis.py) - Financial sentiment analysis
-- [swarms_of_vllm.py](finance/swarms_of_vllm.py) - VLLM-based financial swarms
## Hackathon Examples
- [fraud.py](hackathon_feb16/fraud.py) - Fraud detection system
diff --git a/examples/demos/finance/swarms_of_vllm.py b/examples/demos/finance/swarms_of_vllm.py
deleted file mode 100644
index 89191ab0..00000000
--- a/examples/demos/finance/swarms_of_vllm.py
+++ /dev/null
@@ -1,214 +0,0 @@
-from swarms import Agent, ConcurrentWorkflow
-from swarms.utils.vllm_wrapper import VLLMWrapper
-from dotenv import load_dotenv
-
-load_dotenv()
-
-# Initialize the VLLM wrapper
-vllm = VLLMWrapper(
- model_name="meta-llama/Llama-2-7b-chat-hf",
- system_prompt="You are a helpful assistant.",
-)
-
-# Technical Analysis Agent
-technical_analyst = Agent(
- agent_name="Technical-Analysis-Agent",
- agent_description="Expert in technical analysis and chart patterns",
- system_prompt="""You are an expert Technical Analysis Agent specializing in market technicals and chart patterns. Your responsibilities include:
-
-1. PRICE ACTION ANALYSIS
-- Identify key support and resistance levels
-- Analyze price trends and momentum
-- Detect chart patterns (e.g., head & shoulders, triangles, flags)
-- Evaluate volume patterns and their implications
-
-2. TECHNICAL INDICATORS
-- Calculate and interpret moving averages (SMA, EMA)
-- Analyze momentum indicators (RSI, MACD, Stochastic)
-- Evaluate volume indicators (OBV, Volume Profile)
-- Monitor volatility indicators (Bollinger Bands, ATR)
-
-3. TRADING SIGNALS
-- Generate clear buy/sell signals based on technical criteria
-- Identify potential entry and exit points
-- Set appropriate stop-loss and take-profit levels
-- Calculate position sizing recommendations
-
-4. RISK MANAGEMENT
-- Assess market volatility and trend strength
-- Identify potential reversal points
-- Calculate risk/reward ratios for trades
-- Suggest position sizing based on risk parameters
-
-Your analysis should be data-driven, precise, and actionable. Always include specific price levels, time frames, and risk parameters in your recommendations.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Fundamental Analysis Agent
-fundamental_analyst = Agent(
- agent_name="Fundamental-Analysis-Agent",
- agent_description="Expert in company fundamentals and valuation",
- system_prompt="""You are an expert Fundamental Analysis Agent specializing in company valuation and financial metrics. Your core responsibilities include:
-
-1. FINANCIAL STATEMENT ANALYSIS
-- Analyze income statements, balance sheets, and cash flow statements
-- Calculate and interpret key financial ratios
-- Evaluate revenue growth and profit margins
-- Assess company's debt levels and cash position
-
-2. VALUATION METRICS
-- Calculate fair value using multiple valuation methods:
- * Discounted Cash Flow (DCF)
- * Price-to-Earnings (P/E)
- * Price-to-Book (P/B)
- * Enterprise Value/EBITDA
-- Compare valuations against industry peers
-
-3. BUSINESS MODEL ASSESSMENT
-- Evaluate competitive advantages and market position
-- Analyze industry dynamics and market share
-- Assess management quality and corporate governance
-- Identify potential risks and growth opportunities
-
-4. ECONOMIC CONTEXT
-- Consider macroeconomic factors affecting the company
-- Analyze industry cycles and trends
-- Evaluate regulatory environment and compliance
-- Assess global market conditions
-
-Your analysis should be comprehensive, focusing on both quantitative metrics and qualitative factors that impact long-term value.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Market Sentiment Agent
-sentiment_analyst = Agent(
- agent_name="Market-Sentiment-Agent",
- agent_description="Expert in market psychology and sentiment analysis",
- system_prompt="""You are an expert Market Sentiment Agent specializing in analyzing market psychology and investor behavior. Your key responsibilities include:
-
-1. SENTIMENT INDICATORS
-- Monitor and interpret market sentiment indicators:
- * VIX (Fear Index)
- * Put/Call Ratio
- * Market Breadth
- * Investor Surveys
-- Track institutional vs retail investor behavior
-
-2. NEWS AND SOCIAL MEDIA ANALYSIS
-- Analyze news flow and media sentiment
-- Monitor social media trends and discussions
-- Track analyst recommendations and changes
-- Evaluate corporate insider trading patterns
-
-3. MARKET POSITIONING
-- Assess hedge fund positioning and exposure
-- Monitor short interest and short squeeze potential
-- Track fund flows and asset allocation trends
-- Analyze options market sentiment
-
-4. CONTRARIAN SIGNALS
-- Identify extreme sentiment readings
-- Detect potential market turning points
-- Analyze historical sentiment patterns
-- Provide contrarian trading opportunities
-
-Your analysis should combine quantitative sentiment metrics with qualitative assessment of market psychology and crowd behavior.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Quantitative Strategy Agent
-quant_analyst = Agent(
- agent_name="Quantitative-Strategy-Agent",
- agent_description="Expert in quantitative analysis and algorithmic strategies",
- system_prompt="""You are an expert Quantitative Strategy Agent specializing in data-driven investment strategies. Your primary responsibilities include:
-
-1. FACTOR ANALYSIS
-- Analyze and monitor factor performance:
- * Value
- * Momentum
- * Quality
- * Size
- * Low Volatility
-- Calculate factor exposures and correlations
-
-2. STATISTICAL ANALYSIS
-- Perform statistical arbitrage analysis
-- Calculate and monitor pair trading opportunities
-- Analyze market anomalies and inefficiencies
-- Develop mean reversion strategies
-
-3. RISK MODELING
-- Build and maintain risk models
-- Calculate portfolio optimization metrics
-- Monitor correlation matrices
-- Analyze tail risk and stress scenarios
-
-4. ALGORITHMIC STRATEGIES
-- Develop systematic trading strategies
-- Backtest and validate trading algorithms
-- Monitor strategy performance metrics
-- Optimize execution algorithms
-
-Your analysis should be purely quantitative, based on statistical evidence and mathematical models rather than subjective opinions.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Portfolio Strategy Agent
-portfolio_strategist = Agent(
- agent_name="Portfolio-Strategy-Agent",
- agent_description="Expert in portfolio management and asset allocation",
- system_prompt="""You are an expert Portfolio Strategy Agent specializing in portfolio construction and management. Your core responsibilities include:
-
-1. ASSET ALLOCATION
-- Develop strategic asset allocation frameworks
-- Recommend tactical asset allocation shifts
-- Optimize portfolio weightings
-- Balance risk and return objectives
-
-2. PORTFOLIO ANALYSIS
-- Calculate portfolio risk metrics
-- Monitor sector and factor exposures
-- Analyze portfolio correlation matrix
-- Track performance attribution
-
-3. RISK MANAGEMENT
-- Implement portfolio hedging strategies
-- Monitor and adjust position sizing
-- Set stop-loss and rebalancing rules
-- Develop drawdown protection strategies
-
-4. PORTFOLIO OPTIMIZATION
-- Calculate efficient frontier analysis
-- Optimize for various objectives:
- * Maximum Sharpe Ratio
- * Minimum Volatility
- * Maximum Diversification
-- Consider transaction costs and taxes
-
-Your recommendations should focus on portfolio-level decisions that optimize risk-adjusted returns while meeting specific investment objectives.""",
- max_loops=1,
- llm=vllm,
-)
-
-# Create a list of all agents
-stock_analysis_agents = [
- technical_analyst,
- fundamental_analyst,
- sentiment_analyst,
- quant_analyst,
- portfolio_strategist,
-]
-
-swarm = ConcurrentWorkflow(
- name="Stock-Analysis-Swarm",
- description="A swarm of agents that analyze stocks and provide a comprehensive analysis of the current trends and opportunities.",
- agents=stock_analysis_agents,
-)
-
-swarm.run(
- "Analyze the best etfs for gold and other similiar commodities in volatile markets"
-)
diff --git a/test.py b/test.py
new file mode 100644
index 00000000..4def8642
--- /dev/null
+++ b/test.py
@@ -0,0 +1,13 @@
+from swarms.utils.vllm_wrapper import VLLMWrapper
+
+# Initialize the vLLM wrapper
+vllm = VLLMWrapper(
+ model_name="gpt-4o-mini",
+ system_prompt="You are a helpful assistant.",
+ temperature=0.7,
+ max_tokens=4000
+)
+
+# Run inference
+response = vllm.run("What is the capital of France?")
+print(response)
\ No newline at end of file
From 2d4a5e4dcacf62bd057bd303e70a191d3d8d95e9 Mon Sep 17 00:00:00 2001
From: Steve-Dusty
Date: Thu, 6 Nov 2025 23:58:14 -0800
Subject: [PATCH 03/21] removed vllm from sidebar
---
docs/mkdocs.yml | 2 --
1 file changed, 2 deletions(-)
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index fbdd766e..b2b95c8d 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -384,7 +384,6 @@ nav:
- OpenRouter: "swarms/examples/openrouter.md"
- XAI: "swarms/examples/xai.md"
- Azure OpenAI: "swarms/examples/azure.md"
- - VLLM: "swarms/examples/vllm_integration.md"
- Llama4: "swarms/examples/llama4.md"
- Custom Base URL & API Keys: "swarms/examples/custom_base_url_example.md"
@@ -409,7 +408,6 @@ nav:
- Advanced BatchedGridWorkflow: "swarms/examples/batched_grid_advanced_example.md"
- Applications:
- Swarms of Browser Agents: "swarms/examples/swarms_of_browser_agents.md"
- - ConcurrentWorkflow with VLLM Agents: "swarms/examples/vllm.md"
- Hiearchical Marketing Team: "examples/marketing_team.md"
- Gold ETF Research with HeavySwarm: "examples/gold_etf_research.md"
- Hiring Swarm: "examples/hiring_swarm.md"
From 8f170f44632aafac949237a48abb6ad17dd13a65 Mon Sep 17 00:00:00 2001
From: Kye Gomez
Date: Mon, 10 Nov 2025 00:11:17 -0800
Subject: [PATCH 04/21] [README Update] [AOP][Improved server metadata
discovery]
---
README.md | 96 +++++---------------------------------
docs/swarms/structs/aop.md | 11 +++--
swarms/structs/aop.py | 64 ++++++++++++++++++++++++-
3 files changed, 82 insertions(+), 89 deletions(-)
diff --git a/README.md b/README.md
index dd3de49d..0428f8eb 100644
--- a/README.md
+++ b/README.md
@@ -7,43 +7,22 @@
The Enterprise-Grade Production-Ready Multi-Agent Orchestration Framework
+
-
-
-
-
-
-
-
-
-
-
+
+ š Swarms Website
+ ā¢
+ š Documentation
+ ā¢
+ š Swarms Marketplace
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
@@ -52,16 +31,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -74,49 +43,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- š Swarms Website
- ā¢
- š Documentation
- ā¢
- š Swarms Marketplace
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
## ⨠Features
diff --git a/docs/swarms/structs/aop.md b/docs/swarms/structs/aop.md
index 8062503a..0d62ce43 100644
--- a/docs/swarms/structs/aop.md
+++ b/docs/swarms/structs/aop.md
@@ -199,9 +199,14 @@ Run the MCP server (alias for start_server).
##### get_server_info()
-Get information about the MCP server and registered tools.
-
-**Returns:** `Dict[str, Any]` - Server information
+Get comprehensive information about the MCP server and registered tools, including metadata, configuration, tool details, queue stats, and network status.
+
+**Returns:** `Dict[str, Any]` - Server information including:
+- Server metadata (name, description, creation time, uptime)
+- Configuration (host, port, transport, log level)
+- Agent information (total count, names, detailed tool info)
+- Queue configuration and statistics (if queue enabled)
+- Persistence and network status
##### _register_tool()
diff --git a/swarms/structs/aop.py b/swarms/structs/aop.py
index b95acb77..bd556f17 100644
--- a/swarms/structs/aop.py
+++ b/swarms/structs/aop.py
@@ -659,6 +659,9 @@ class AOP:
self._last_network_error = None
self._network_connected = True
+ # Server creation timestamp
+ self._created_at = time.time()
+
self.agents: Dict[str, Agent] = {}
self.tool_configs: Dict[str, AgentToolConfig] = {}
self.task_queues: Dict[str, TaskQueue] = {}
@@ -1980,6 +1983,53 @@ class AOP:
"matching_agents": [],
}
+ @self.mcp_server.tool(
+ name="get_server_info",
+ description="Get comprehensive server information including metadata, configuration, tool details, queue stats, and network status.",
+ )
+ def get_server_info_tool() -> Dict[str, Any]:
+ """
+ Get comprehensive information about the MCP server and registered tools.
+
+ Returns:
+ Dict containing server information with the following fields:
+ - server_name: Name of the server
+ - description: Server description
+ - total_tools/total_agents: Total number of agents registered
+ - tools/agent_names: List of all agent names
+ - created_at: Unix timestamp when server was created
+ - created_at_iso: ISO formatted creation time
+ - uptime_seconds: Server uptime in seconds
+ - host: Server host address
+ - port: Server port number
+ - transport: Transport protocol used
+ - log_level: Logging level
+ - queue_enabled: Whether queue system is enabled
+ - persistence_enabled: Whether persistence mode is enabled
+ - network_monitoring_enabled: Whether network monitoring is enabled
+ - persistence: Detailed persistence status
+ - network: Detailed network status
+ - tool_details: Detailed information about each agent tool
+ - queue_config: Queue configuration (if queue enabled)
+ - queue_stats: Queue statistics for each agent (if queue enabled)
+ """
+ try:
+ server_info = self.get_server_info()
+ return {
+ "success": True,
+ "server_info": server_info,
+ }
+ except Exception as e:
+ error_msg = str(e)
+ logger.error(
+ f"Error in get_server_info tool: {error_msg}"
+ )
+ return {
+ "success": False,
+ "error": error_msg,
+ "server_info": None,
+ }
+
def _register_queue_management_tools(self) -> None:
"""
Register queue management tools for the MCP server.
@@ -2699,18 +2749,30 @@ class AOP:
Get information about the MCP server and registered tools.
Returns:
- Dict containing server information
+ Dict containing server information including metadata, configuration,
+ and tool details
"""
info = {
"server_name": self.server_name,
"description": self.description,
"total_tools": len(self.agents),
+ "total_agents": len(self.agents), # Alias for compatibility
"tools": self.list_agents(),
+ "agent_names": self.list_agents(), # Alias for compatibility
+ "created_at": self._created_at,
+ "created_at_iso": time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime(self._created_at)
+ ),
+ "uptime_seconds": time.time() - self._created_at,
"verbose": self.verbose,
"traceback_enabled": self.traceback_enabled,
"log_level": self.log_level,
"transport": self.transport,
+ "host": self.host,
+ "port": self.port,
"queue_enabled": self.queue_enabled,
+ "persistence_enabled": self._persistence_enabled, # Top-level for compatibility
+ "network_monitoring_enabled": self.network_monitoring, # Top-level for compatibility
"persistence": self.get_persistence_status(),
"network": self.get_network_status(),
"tool_details": {
From 4d8b5a6616186cf48ffb68a7579e62d06863994a Mon Sep 17 00:00:00 2001
From: Kye Gomez
Date: Mon, 10 Nov 2025 00:14:43 -0800
Subject: [PATCH 05/21] new logo
---
README.md | 6 +++---
.../b74ace74-8e49-42af-87ab-051d7fdab62a.png | Bin 1765197 -> 0 bytes
images/new_logo.png | Bin 0 -> 36473 bytes
3 files changed, 3 insertions(+), 3 deletions(-)
delete mode 100644 images/b74ace74-8e49-42af-87ab-051d7fdab62a.png
create mode 100644 images/new_logo.png
diff --git a/README.md b/README.md
index 0428f8eb..255ab84b 100644
--- a/README.md
+++ b/README.md
@@ -25,10 +25,10 @@
-
+
-
-
+
+
diff --git a/images/b74ace74-8e49-42af-87ab-051d7fdab62a.png b/images/b74ace74-8e49-42af-87ab-051d7fdab62a.png
deleted file mode 100644
index fd0572bda9e3fa9bcb130f2ea17e49332d691196..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1765197
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