Compare commits

...
12 Commits
Author SHA1 Message Date
Mervin Praison b59675eeb4 Release v3.5.0 2026-01-08 19:55:06 +00:00
Mervin Praison 7e0739c6c4 Fix test_api.py to mock urllib.request.urlopen instead of subprocess.run 2026-01-08 16:14:35 +00:00
Mervin Praison 7519bc85d2 Fix test_api.py mock setup for stderr.read() 2026-01-08 16:03:38 +00:00
Mervin Praison c7471092d0 Update test_typer_cli.py: chat is now a Typer command, not legacy 2026-01-08 15:52:35 +00:00
Mervin Praison c344ee1bad Update test_chat_flag.py to not require deprecated chat_mode flag 2026-01-08 15:42:12 +00:00
Mervin Praison 77bbf1ae66 Fix test_approval_system.py to handle tuple return from parse_args() 2026-01-08 15:33:37 +00:00
Mervin Praison 695d4d8843 Add console.py to output module (was gitignored)
The output/ directory was in .gitignore, so console.py wasn't committed.
Force-adding it to fix the ModuleNotFoundError in CI.
2026-01-08 15:28:17 +00:00
Mervin Praison 08f0736db5 Fix async test infrastructure and CLI output module export
Core SDK fixes:
- Add local async test runner in conftest.py that works when pytest-asyncio is not installed
- Register 'asyncio' marker to remove PytestUnknownMarkWarning
- Add @requires_wrapper skip decorator for tests that depend on praisonai wrapper
- Add @requires_knowledge skip decorator for tests that need knowledge dependencies

Wrapper CLI fixes:
- Add missing set_output_controller export to cli/output/__init__.py
- Update test_doctor_cli.py to test actual CLI subcommands instead of non-existent options

Result: Core SDK unit tests pass (1181 passed, 21 skipped), wrapper integration tests pass (17 passed)
2026-01-08 15:07:35 +00:00
Mervin Praison 1e46093edf Release v3.4.1 2026-01-08 14:36:54 +00:00
Mervin Praison 1a71aac6b8 Release v3.4.0 2026-01-08 13:29:57 +00:00
Mervin Praison 287f42dfee Remove unused test and verification files 2026-01-08 12:50:16 +00:00
Mervin Praison 57b637948f Release v3.3.1 2026-01-08 12:28:06 +00:00
423 changed files with 14373 additions and 2702 deletions

No files matched your search

+1
View File
@@ -20,6 +20,7 @@ watch.sh
docs.sh
other
output
!src/praisonai/praisonai/cli/output/
.files
threads.db
+4 -4
View File
@@ -538,11 +538,11 @@ python app.py
Create app.py file and add the code below:
```python
from praisonaiagents import Agent, PraisonAIAgents
from praisonaiagents import Agent, Agents
research_agent = Agent(instructions="Research about AI")
summarise_agent = Agent(instructions="Summarise research agent's findings")
agents = PraisonAIAgents(agents=[research_agent, summarise_agent])
agents = Agents(agents=[research_agent, summarise_agent])
agents.start()
```
@@ -3380,11 +3380,11 @@ See [Agent Memory](#6-agent-memory-zero-dependencies) for more options.
<summary><strong>How do I run multiple agents together?</strong></summary>
```python
from praisonaiagents import Agent, PraisonAIAgents
from praisonaiagents import Agent, Agents
agent1 = Agent(instructions="Research topics")
agent2 = Agent(instructions="Summarize findings")
agents = PraisonAIAgents(agents=[agent1, agent2])
agents = Agents(agents=[agent1, agent2])
agents.start()
```
-71
View File
@@ -1,71 +0,0 @@
"""
Auto-generated API server for PraisonAI agents.
"""
from flask import Flask, request, jsonify
from flask_cors import CORS
from praisonai import PraisonAI
import os
app = Flask(__name__)
# CORS configuration
CORS(app)
# Authentication
AUTH_ENABLED = False
AUTH_TOKEN = None
def check_auth():
"""Check authentication if enabled."""
if not AUTH_ENABLED:
return True
token = request.headers.get('Authorization', '').replace('Bearer ', '')
return token == AUTH_TOKEN
@app.route('/health', methods=['GET'])
def health():
"""Health check endpoint."""
return jsonify({"status": "ok", "service": "praisonai-api"})
@app.route('/chat', methods=['POST'])
def chat():
"""Chat endpoint for agent interaction."""
if not check_auth():
return jsonify({"error": "Unauthorized"}), 401
data = request.get_json()
if not data or 'message' not in data:
return jsonify({"error": "Message required"}), 400
try:
praisonai = PraisonAI(agent_file="agents.yaml")
result = praisonai.run()
return jsonify({
"response": result,
"status": "success"
})
except Exception as e:
return jsonify({
"error": str(e),
"status": "error"
}), 500
@app.route('/agents', methods=['GET'])
def list_agents():
"""List available agents."""
if not check_auth():
return jsonify({"error": "Unauthorized"}), 401
return jsonify({
"agents": ["default"],
"agent_file": "agents.yaml"
})
if __name__ == '__main__':
app.run(
host='0.0.0.0',
port=8080,
debug=False
)
+1 -1
View File
@@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison
# Install Python packages (using latest versions)
RUN pip install --no-cache-dir \
praisonai_tools \
"praisonai>=3.3.0" \
"praisonai>=3.5.0" \
"praisonai[chat]" \
"embedchain[github,youtube]"
+1 -1
View File
@@ -20,7 +20,7 @@ RUN mkdir -p /root/.praison
# Install Python packages (using latest versions)
RUN pip install --no-cache-dir \
praisonai_tools \
"praisonai>=3.3.0" \
"praisonai>=3.5.0" \
"praisonai[ui]" \
"praisonai[chat]" \
"praisonai[realtime]" \
+1 -1
View File
@@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison
# Install Python packages (using latest versions)
RUN pip install --no-cache-dir \
praisonai_tools \
"praisonai>=3.3.0" \
"praisonai>=3.5.0" \
"praisonai[ui]" \
"praisonai[crewai]"
-203
View File
@@ -1,203 +0,0 @@
# Profiling CLI
PraisonAI provides unified profiling capabilities for performance analysis and debugging, with **full visibility from ENTER to first response**.
## Quick Start
```bash
# Basic profiling
praisonai "What is 2+2?" --profile
# Deep profiling with call graph, decision trace, and module breakdown
praisonai "What is 2+2?" --profile --profile-deep
# JSON output format
praisonai "What is 2+2?" --profile --profile-format json
```
## Time to First Response (TTFR)
**TTFR** is the key user-perceived latency metric. It measures the time from when you press ENTER until the first visible output appears.
### What contributes to TTFR?
1. **CLI Entry** - Time to reach the CLI entry point
2. **CLI Parse** - Argparse/Typer routing time
3. **Routing** - Command routing to handler
4. **Imports** - Loading required modules
5. **Agent Init** - Initializing the agent
6. **Network Request** - Sending request to LLM API
7. **First Token** - Receiving first token (streaming)
8. **First Output** - Rendering first visible output
### How to reduce TTFR
1. **Warm runs** - Imports are cached after first run
2. **Streaming mode** - See output as tokens arrive
3. **Lighter models** - Faster response times
4. **Local models** - Eliminate network latency
## CLI Flags
| Flag | Description | Default |
|------|-------------|---------|
| `--profile` | Enable profiling with timing breakdown | Disabled |
| `--profile-deep` | Enable deep profiling with call graph (higher overhead) | Disabled |
| `--profile-format` | Output format: `text` or `json` | `text` |
## Profile Command
For more detailed profiling options, use the `profile` subcommand:
```bash
# Profile a query
praisonai profile query "What is 2+2?"
# With deep call tracing
praisonai profile query "Hello" --deep
# Limit functions shown
praisonai profile query "Test" --limit 20
# Save artifacts to directory
praisonai profile query "Test" --save ./profile_results
# JSON output
praisonai profile query "Test" --format json
```
### Profile Query Options
| Option | Description | Default |
|--------|-------------|---------|
| `--model, -m` | Model to use | Default model |
| `--stream/--no-stream` | Use streaming mode | No stream |
| `--deep` | Enable deep call tracing | Disabled |
| `--limit, -n` | Top N functions to show | 30 |
| `--sort, -s` | Sort by: `cumulative` or `tottime` | `cumulative` |
| `--show-callers` | Show caller functions | Disabled |
| `--show-callees` | Show callee functions | Disabled |
| `--save` | Save artifacts to path | None |
| `--format, -f` | Output format: `text` or `json` | `text` |
## Other Profile Commands
```bash
# Profile module import times
praisonai profile imports
# Profile CLI startup time
praisonai profile startup
# Run comprehensive profiling suite
praisonai profile suite
# Create performance snapshots for comparison
praisonai profile snapshot --baseline
praisonai profile snapshot current --compare
# Configure performance optimizations
praisonai profile optimize --show
```
## Output Format
### Text Report
```
======================================================================
PraisonAI Profile Report
======================================================================
Run ID: abc12345
Timestamp: 2024-01-02T12:00:00.000000Z
Method: cli_direct
Version: 3.0.1
## Execution Timeline
---------------------------------------------
Imports : 500.00 ms
Agent Init : 0.50 ms
Execution : 2000.00 ms
───────────────────────────────────────────
⏱ Time to First Response : 2500.50 ms
TOTAL : 2500.50 ms
## Timing Breakdown
----------------------------------------
Imports: 500.00 ms
Agent Init: 0.50 ms
Execution: 2000.00 ms
─────────────────────────────────────
TOTAL: 2500.50 ms
## Decision Trace (deep profile only)
----------------------------------------
Agent Config: default
Model: gpt-4
Streaming: disabled
Profile Layer: 2
## Top Functions by Cumulative Time
----------------------------------------------------------------------
Function Calls Cumul (ms)
----------------------------------------------------------------------
request 1 1800.00
send 1 1750.00
...
```
### JSON Report
```json
{
"schema_version": "1.0",
"run_id": "abc12345",
"timestamp": "2024-01-02T12:00:00.000000Z",
"invocation": {
"method": "cli_direct",
"flags": {"layer": 1, "stream": false, "model": null},
"praisonai_version": "3.0.1",
"python_version": "3.12.0"
},
"timing": {
"total_ms": 2500.5,
"imports_ms": 500.0,
"agent_init_ms": 0.5,
"execution_ms": 2000.0
},
"functions": [...],
"response_preview": "four"
}
```
## Profiling Layers
| Layer | Overhead | Features |
|-------|----------|----------|
| 0 | < 1ms | Wall-clock phases only |
| 1 | ~5% | + cProfile function stats |
| 2 | ~15% | + Call graph (callers/callees) |
- `--profile` uses Layer 1
- `--profile --profile-deep` uses Layer 2
## Performance Tips
1. **Use Layer 0 for production monitoring** - minimal overhead
2. **Use Layer 1 for development profiling** - good balance
3. **Use Layer 2 only for deep debugging** - higher overhead
## Observational Equivalence
The following commands produce equivalent profile reports:
```bash
# CLI direct
praisonai "prompt" --profile
# Profile command
praisonai profile query "prompt"
```
Both use the same unified profiling architecture and produce identical schema output.
-257
View File
@@ -1,257 +0,0 @@
# Profiling Module
PraisonAI provides a unified profiling module for programmatic performance analysis.
## Quick Start
```python
from praisonai.cli.execution import (
ExecutionRequest,
Profiler,
ProfilerConfig,
)
# Create execution request
request = ExecutionRequest(prompt="What is 2+2?")
# Configure profiler
config = ProfilerConfig(layer=1)
# Run with profiling
profiler = Profiler(config)
result, report = profiler.profile_sync(request)
# Access results
print(f"Output: {result.output}")
print(f"Total time: {report.timing.total_ms}ms")
```
## ExecutionRequest
Immutable request descriptor for execution.
```python
from praisonai.cli.execution import ExecutionRequest
# Basic request
request = ExecutionRequest(prompt="Hello")
# With model
request = ExecutionRequest(
prompt="Hello",
model="gpt-4",
agent_name="MyAgent",
)
# With streaming
request = ExecutionRequest(
prompt="Hello",
stream=True,
)
```
### Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `prompt` | str | Required | The prompt to execute |
| `agent_name` | str | "Assistant" | Name of the agent |
| `agent_instructions` | str | None | Custom instructions |
| `model` | str | None | Model to use |
| `stream` | bool | False | Enable streaming |
| `tools` | tuple | () | Tools to provide |
## ProfilerConfig
Configuration for profiling behavior.
```python
from praisonai.cli.execution import ProfilerConfig
# Layer 0: Wall-clock only (< 1ms overhead)
config = ProfilerConfig(layer=0)
# Layer 1: + cProfile stats (~5% overhead)
config = ProfilerConfig(layer=1)
# Layer 2: + Call graph (~15% overhead)
config = ProfilerConfig(
layer=2,
show_callers=True,
show_callees=True,
)
# From CLI flags
config = ProfilerConfig.from_flags(
profile=True,
deep=True,
network=False,
)
```
### Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `layer` | int | 1 | Profiling layer (0, 1, or 2) |
| `limit` | int | 30 | Max functions to show |
| `sort_by` | str | "cumulative" | Sort by: cumulative, time, calls |
| `show_callers` | bool | False | Show caller functions |
| `show_callees` | bool | False | Show callee functions |
| `track_network` | bool | False | Track network requests |
| `output_format` | str | "text" | Output format: text, json |
| `save_path` | str | None | Path to save artifacts |
## Profiler
The main profiler class that wraps execution.
```python
from praisonai.cli.execution import Profiler, ProfilerConfig, ExecutionRequest
config = ProfilerConfig(layer=1)
profiler = Profiler(config)
request = ExecutionRequest(prompt="Hello")
result, report = profiler.profile_sync(request, invocation_method="api")
```
### Methods
#### `profile_sync(request, invocation_method="profile_command")`
Profile synchronous execution.
**Parameters:**
- `request`: ExecutionRequest - The execution request
- `invocation_method`: str - How this was invoked (for report)
**Returns:** Tuple of (ExecutionResult, ProfileReport)
## ProfileReport
The canonical profile report with timing and statistics.
```python
# Access timing breakdown
print(f"Total: {report.timing.total_ms}ms")
print(f"Imports: {report.timing.imports_ms}ms")
print(f"Agent Init: {report.timing.agent_init_ms}ms")
print(f"Execution: {report.timing.execution_ms}ms")
# Access function stats (layer 1+)
if report.functions:
for func in report.functions[:5]:
print(f"{func.name}: {func.cumulative_time_ms}ms")
# Access call graph (layer 2)
if report.call_graph:
print(f"Edges: {len(report.call_graph.edges)}")
# Export formats
json_str = report.to_json()
text_str = report.to_text()
dict_data = report.to_dict()
```
### Schema Version
The report uses schema version `1.0`. Schema is frozen after release - new fields are always optional with defaults.
### Mandatory Fields
- `schema_version`: str
- `run_id`: str
- `timestamp`: str (ISO 8601)
- `invocation`: InvocationInfo
- `timing`: TimingBreakdown
- `response_preview`: str
### Optional Fields
- `functions`: List[FunctionStat] (layer 1+)
- `call_graph`: CallGraph (layer 2)
- `network`: List[RequestTiming] (if track_network)
## ExecutionResult
Result of execution with output and metadata.
```python
# Access output
print(result.output)
print(result.success)
print(result.run_id)
# Check for errors
if result.error:
print(f"Error: {result.error}")
# Duration
print(f"Duration: {result.duration_ms}ms")
```
## Data Bounds
Profile data is strictly bounded to prevent memory issues:
| Data Type | Maximum |
|-----------|---------|
| Function stats | 1000 |
| Call graph edges | 5000 |
| Network requests | 100 |
## Example: Full Profiling Workflow
```python
from praisonai.cli.execution import (
ExecutionRequest,
Profiler,
ProfilerConfig,
)
# Configure deep profiling
config = ProfilerConfig(
layer=2,
limit=50,
show_callers=True,
show_callees=True,
)
# Create request
request = ExecutionRequest(
prompt="Explain quantum computing in simple terms",
model="gpt-4",
)
# Profile execution
profiler = Profiler(config)
result, report = profiler.profile_sync(request)
# Print text report
print(report.to_text())
# Save JSON report
with open("profile.json", "w") as f:
f.write(report.to_json())
# Analyze timing
print(f"\nTiming Analysis:")
print(f" Import overhead: {report.timing.imports_ms / report.timing.total_ms * 100:.1f}%")
print(f" Execution time: {report.timing.execution_ms / report.timing.total_ms * 100:.1f}%")
# Top 5 hotspots
if report.functions:
print(f"\nTop 5 Hotspots:")
for func in report.functions[:5]:
print(f" {func.name}: {func.cumulative_time_ms:.2f}ms ({func.calls} calls)")
```
## Invariants
The profiling module guarantees:
1. **Output Equivalence**: Profiled execution produces identical output to non-profiled execution
2. **Schema Stability**: Schema version 1.0 is frozen; new fields are always optional
3. **Bounded Data**: All profile data respects maximum bounds
4. **Zero Overhead When Disabled**: No profiling code runs unless explicitly enabled
-53
View File
@@ -1,53 +0,0 @@
# Templates CLI
```bash
praisonai templates list
```
```bash
praisonai templates search video
```
```bash
praisonai templates info ai-video-editor
```
```bash
praisonai templates run ai-video-editor --input video.mp4 --output edited.mp4
```
```bash
praisonai templates run ai-video-editor --input video.mp4 --output edited.mp4 --offline
```
```bash
praisonai templates run ai-video-editor --input video.mp4 --output edited.mp4 --strict-tools
```
```bash
praisonai templates run ai-video-editor --input video.mp4 --tools ./my_tools.py
```
```bash
praisonai templates run ai-video-editor --input video.mp4 --tools-dir ./tools
```
```bash
praisonai templates run ai-video-editor --input video.mp4 --tools-source praisonai_tools.video
```
```bash
praisonai templates run ai-video-editor --input video.mp4 --no-template-tools-py
```
```bash
praisonai templates init my-project --template ai-video-editor
```
```bash
praisonai templates cache clear
```
```bash
praisonai templates cache list
```
-104
View File
@@ -1,104 +0,0 @@
# Templates Module
## Loading Templates
```python
from praisonai.templates.loader import TemplateLoader
loader = TemplateLoader()
# Load from local path
template = loader.load("./my-template")
# Load from URI
template = loader.load("ai-video-editor")
# Load offline
template = loader.load("ai-video-editor", offline=True)
# Check requirements
missing = loader.check_requirements(template)
```
## Template Discovery
```python
from praisonai.templates.discovery import TemplateDiscovery
discovery = TemplateDiscovery(
include_package=True,
include_defaults=True,
)
# Find template
result = discovery.find_template("ai-video-editor")
# List all templates
templates = discovery.list_templates()
```
## Template Config
```python
from praisonai.templates.loader import TemplateConfig
# Access template properties
template.name
template.description
template.version
template.author
template.requires
template.workflow_file
template.agents_file
template.path
```
## Tool Override Integration
```python
from praisonai.templates.tool_override import (
create_tool_registry_with_overrides,
resolve_tools,
)
# Build registry with template sources
tools_sources = template.requires.get("tools_sources", [])
registry = create_tool_registry_with_overrides(
tools_sources=tools_sources,
template_dir=str(template.path),
include_defaults=True,
)
# Resolve tool names
tools = resolve_tools(["shell_tool"], registry=registry)
```
## TEMPLATE.yaml Schema
```yaml
name: my-template
version: "1.0.0"
description: Template description
requires:
tools: [shell_tool]
packages: [praisonai-tools]
env: [OPENAI_API_KEY]
tools_sources:
- praisonai_tools.video
- ./local_tools.py
workflow: workflow.yaml
agents: agents.yaml
config:
input:
type: string
required: true
output:
type: string
defaults:
preset: podcast
```
-65
View File
@@ -1,65 +0,0 @@
# Tools CLI
```bash
praisonai tools list
```
```bash
praisonai tools info shell_tool
```
```bash
praisonai tools info internet_search
```
```bash
praisonai tools search "web"
```
```bash
praisonai tools search "file"
```
```bash
praisonai tools doctor
```
```bash
praisonai tools doctor --json
```
```bash
praisonai tools resolve shell_tool
```
```bash
praisonai tools resolve internet_search --template ai-video-editor
```
```bash
praisonai tools resolve my_tool --tools ./my_tools.py
```
```bash
praisonai tools resolve my_tool --tools-dir ./tools
```
```bash
praisonai tools discover
```
```bash
praisonai tools discover --include praisonai_tools.video
```
```bash
praisonai tools discover --entrypoints
```
```bash
praisonai tools show-sources
```
```bash
praisonai tools show-sources --template ai-video-editor
```
-90
View File
@@ -1,90 +0,0 @@
# Tools Module
## Tool Registry
```python
from praisonai.templates.tool_override import (
create_tool_registry_with_overrides,
resolve_tools,
)
# Create registry with defaults
registry = create_tool_registry_with_overrides(include_defaults=True)
# Create registry with overrides
registry = create_tool_registry_with_overrides(
override_files=["my_tools.py"],
override_dirs=["./tools"],
include_defaults=True,
)
# Create registry with tools_sources
registry = create_tool_registry_with_overrides(
tools_sources=["praisonai_tools.video"],
template_dir="./my-template",
include_defaults=True,
)
# Resolve tool names to callables
tools = resolve_tools(
["shell_tool", "internet_search"],
registry=registry,
)
```
## Tool Override Loader
```python
from praisonai.templates.tool_override import ToolOverrideLoader
loader = ToolOverrideLoader()
# Load from file
tools = loader.load_from_file("my_tools.py")
# Load from directory
tools = loader.load_from_directory("./tools")
# Load from module
tools = loader.load_from_module("praisonai_tools.video")
# Get default tool directories
dirs = loader.get_default_tool_dirs()
```
## Resolution Order
1. CLI `--tools` files (highest priority)
2. CLI `--tools-dir` directories
3. Template `tools_sources` (from TEMPLATE.yaml)
4. Template-local `tools.py`
5. Default dirs (`~/.praison/tools`, `~/.config/praison/tools`)
6. Package discovery (`praisonai_tools`)
7. Built-in tools (lowest priority)
## Creating Custom Tools
```python
from praisonai_tools import tool
@tool
def my_custom_tool(query: str) -> str:
"""My custom tool description.
Args:
query: The search query
"""
return f"Result for: {query}"
```
## Template tools_sources
```yaml
# TEMPLATE.yaml
requires:
tools: [shell_tool]
tools_sources:
- praisonai_tools.video
- ./local_tools.py
- ./tools_dir/
```
+158
View File
@@ -0,0 +1,158 @@
"""
Agent-Centric API Example
Demonstrates the new consolidated feature parameters for PraisonAI Agents.
These params provide a cleaner, more intuitive API with progressive disclosure.
New Consolidated Params:
- memory: Union[bool, MemoryConfig, MemoryManager] - Memory and session management
- knowledge: Union[bool, List[str], KnowledgeConfig, KnowledgeBase] - RAG and retrieval
- planning: Union[bool, PlanningConfig] - Planning mode
- reflection: Union[bool, ReflectionConfig] - Self-reflection
- guardrails: Union[bool, Callable, GuardrailConfig] - Safety validation
- web: Union[bool, WebConfig] - Web search and fetch
- context: Union[bool, ManagerConfig, ContextManager] - Context management
"""
from praisonaiagents import (
Agent,
# Config classes for progressive disclosure
MemoryConfig,
KnowledgeConfig,
PlanningConfig,
ReflectionConfig,
GuardrailConfig,
WebConfig,
)
def example_simple_enable():
"""Example 1: Simple boolean enable (easiest)"""
print("\n=== Example 1: Simple Boolean Enable ===")
agent = Agent(
instructions="You are a helpful assistant",
memory=True, # Enable memory with defaults
reflection=True, # Enable self-reflection
web=True, # Enable web search + fetch
)
print(f"Agent created with memory={agent._memory_instance is not None}")
print(f" self_reflect={agent.self_reflect}")
print(f" web_search={agent.web_search}")
def example_with_config():
"""Example 2: Using config objects (more control)"""
print("\n=== Example 2: Using Config Objects ===")
agent = Agent(
instructions="You are a research assistant",
memory=MemoryConfig(
backend="file",
user_id="researcher_001",
auto_memory=True,
),
reflection=ReflectionConfig(
min_iterations=1,
max_iterations=5,
llm="gpt-4o-mini",
),
web=WebConfig(
search=True,
fetch=False, # Only search, no full page fetch
max_results=3,
),
)
print(f"Agent created with user_id={agent.user_id}")
print(f" {agent.max_reflect}")
print(f" web_search={agent.web_search}, web_fetch={agent.web_fetch}")
def example_guardrails():
"""Example 3: Guardrails with callable or config"""
print("\n=== Example 3: Guardrails ===")
# Option A: Direct callable
def my_validator(output):
"""Simple validator that checks response length."""
is_valid = len(output.raw) < 1000
return (is_valid, output if is_valid else "Response too long")
agent_a = Agent(
instructions="Be concise",
guardrails=my_validator, # Direct callable
)
print(f"Agent A: guardrail is callable = {callable(agent_a.guardrail)}")
# Option B: Using GuardrailConfig
agent_b = Agent(
instructions="Be helpful and safe",
guardrails=GuardrailConfig(
llm_validator="Ensure the response is helpful, accurate, and safe",
max_retries=3,
),
)
print(f"Agent B: guardrail = {agent_b.guardrail}")
print(f" max_retries = {agent_b.max_guardrail_retries}")
def example_planning():
"""Example 4: Planning mode"""
print("\n=== Example 4: Planning Mode ===")
agent = Agent(
instructions="You are a project planner",
planning=PlanningConfig(
reasoning=True,
read_only=True, # Plan mode - only read operations
),
)
print(f"Agent created with planning={agent.planning}")
print(f" plan_mode={agent.plan_mode}")
print(f" planning_reasoning={agent.planning_reasoning}")
def example_backward_compatible():
"""Example 5: Using new consolidated params"""
print("\n=== Example 5: Consolidated Params ===")
# New consolidated params
agent = Agent(
instructions="Test agent",
reflection=True,
web=WebConfig(search=True, fetch=False),
)
print(f"Consolidated params work: self_reflect={agent.self_reflect}")
print(f" web_search={agent.web_search}, web_fetch={agent.web_fetch}")
def example_real_chat():
"""Example 6: Real chat with new API"""
print("\n=== Example 6: Real Chat ===")
agent = Agent(
instructions="You are a helpful math tutor. Be concise.",
reflection=False,
web=False,
verbose=False,
)
response = agent.start("What is the square root of 144?")
print(f"Response: {response}")
if __name__ == "__main__":
print("=" * 60)
print("PraisonAI Agent-Centric API Examples")
print("=" * 60)
example_simple_enable()
example_with_config()
example_guardrails()
example_planning()
example_backward_compatible()
example_real_chat()
print("\n" + "=" * 60)
print("All examples completed!")
print("=" * 60)
@@ -0,0 +1,43 @@
"""
Basic Caching Configuration Example
Demonstrates using caching for response and prompt caching.
"""
import os
from praisonaiagents import Agent, CachingConfig
# Ensure API key is set from environment
assert os.getenv("OPENAI_API_KEY"), "OPENAI_API_KEY must be set"
# Default caching (enabled)
agent_cached = Agent(
instructions="You are a helpful assistant.",
caching=True,
)
# Disable caching
agent_no_cache = Agent(
instructions="You are a helpful assistant.",
caching=False,
)
# Custom caching configuration
agent_custom = Agent(
instructions="You are a helpful assistant.",
caching=CachingConfig(
enabled=True,
prompt_caching=True, # Enable prompt caching for supported providers
),
)
if __name__ == "__main__":
print("Testing CachingConfig...")
print(f"Cached agent cache: {agent_cached.cache}")
print(f"No-cache agent cache: {agent_no_cache.cache}")
print(f"Custom agent cache: {agent_custom.cache}")
result = agent_cached.chat("What is caching?")
print(f"Result: {result}")
print("\nCachingConfig tests passed!")
+72
View File
@@ -128,6 +128,78 @@ def main():
budget_dict = budgeter.to_dict()
print(f"Budget as dict: {budget_dict}")
# Example 6: Overflow handling strategies overview
print("\n6. Overflow Handling Strategies")
print("-" * 40)
strategies = [
("truncate", "Remove oldest messages first", "Fast, simple", "Loses early context"),
("sliding_window", "Keep N most recent messages", "Preserves recent", "Loses early context"),
("prune_tools", "Truncate old tool outputs", "Keeps messages", "May lose tool details"),
("summarize", "Replace old messages with summary", "Preserves meaning", "Slower, uses API"),
("smart", "Combine strategies intelligently", "Best balance", "More complex"),
]
print(f"{'Strategy':<15} | {'Description':<30} | {'Pros':<18} | {'Cons'}")
print("-" * 90)
for name, desc, pros, cons in strategies:
print(f"{name:<15} | {desc:<30} | {pros:<18} | {cons}")
# Example 7: Simulated overflow playbook
print("\n7. Overflow Playbook (Thresholds → Actions)")
print("-" * 40)
playbook = [
(0.70, "INFO", "Monitor usage, no action needed"),
(0.80, "NOTICE", "Consider optimization soon"),
(0.90, "WARNING", "Trigger auto-compact if enabled"),
(0.95, "CRITICAL", "Aggressive optimization required"),
(1.00, "OVERFLOW", "Immediate truncation to prevent API error"),
]
print(f"{'Usage':<8} | {'Level':<10} | {'Action'}")
print("-" * 60)
for threshold, level, action in playbook:
print(f"{threshold:>6.0%} | {level:<10} | {action}")
# Example 8: Strategy comparison table
print("\n8. Strategy Comparison")
print("-" * 40)
print("Strategy | Preserves | Loses | Best For")
print("-" * 70)
print("truncate | Recent msgs | Old msgs | Simple chats")
print("sliding_window | Last N msgs | Earlier msgs | Long conversations")
print("prune_tools | All messages | Tool details | Tool-heavy agents")
print("summarize | Context meaning| Exact wording | Important history")
print("smart | Balanced | Minimal | Production use")
# Example 9: Default strategy for interactive mode
print("\n9. Default Strategy: Interactive Mode")
print("-" * 40)
print("Interactive mode default: context=False (zero overhead)")
print("To enable context management in interactive mode:")
print(" praisonai chat --context # Enable with defaults")
print(" Or in code:")
print(" agent = Agent(instructions='...', context=True)")
print("")
print("When enabled, defaults are:")
print(" - auto_compact: True")
print(" - compact_threshold: 0.8 (80% usage)")
print(" - strategy: smart")
print(" - output_reserve: model-specific (8K-16K)")
# Example 10: Default strategy for auto-agents mode
print("\n10. Default Strategy: Auto-Agents Mode")
print("-" * 40)
print("Auto-agents mode default: context=False (zero overhead)")
print("To enable for multi-agent workflows:")
print(" from praisonaiagents import Agents")
print(" agents = Agents(agents=[...], context=True)")
print("")
print("Recommended config for long tasks:")
print(" context=ManagerConfig(")
print(" auto_compact=True,")
print(" compact_threshold=0.7, # Earlier trigger for safety")
print(" strategy='smart',")
print(" output_reserve=16384, # Larger reserve for complex outputs")
print(" )")
print("\n" + "=" * 60)
print("✓ Context budgeting examples complete!")
print("=" * 60)
+5 -5
View File
@@ -2,14 +2,14 @@
"""
Multi-Agent Context Isolation Example
Demonstrates how to use multi-agent context with PraisonAIAgents via context= param,
Demonstrates how to use multi-agent context with Agents via context= param,
and also shows low-level MultiAgentLedger usage for advanced scenarios.
Agent-Centric Quick Start:
from praisonaiagents import Agent, PraisonAIAgents
from praisonaiagents import Agent, Agents
from praisonaiagents.context import ManagerConfig
agents = PraisonAIAgents(
agents = Agents(
agents=[agent1, agent2],
context=ManagerConfig(policy="isolated"), # or "shared"
)
@@ -17,7 +17,7 @@ Agent-Centric Quick Start:
import os
import tempfile
from praisonaiagents import Agent, PraisonAIAgents
from praisonaiagents import Agent, Agents
from praisonaiagents.context import (
ManagerConfig,
MultiAgentLedger,
@@ -49,7 +49,7 @@ def agent_centric_example():
# Multi-agent setup with isolated context policy
# (each agent maintains its own context)
print("Created agents with context=True")
print("Use PraisonAIAgents(agents=[...], context=ManagerConfig(policy='isolated'))")
print("Use Agents(agents=[...], context=ManagerConfig(policy='isolated'))")
print("for multi-agent context isolation")
@@ -13,10 +13,10 @@ from praisonaiagents import Agent
from praisonaiagents.context import (
ContextBudgeter,
ContextLedgerManager,
ContextMonitor,
get_optimizer,
OptimizerStrategy,
estimate_messages_tokens,
format_percent,
)
@@ -37,7 +37,7 @@ def main():
# Get budget info
budget = budgeter.allocate()
print(f"\nModel: gpt-4o-mini")
print("\nModel: gpt-4o-mini")
print(f"Context budget: {budget.usable:,} tokens")
print(f"Output reserve: {budget.output_reserve:,} tokens")
@@ -76,7 +76,7 @@ def main():
current_tokens = ledger.get_total()
utilization = budgeter.get_utilization(current_tokens)
print(f"[Context: {current_tokens} tokens, {utilization:.1%} used]")
print(f"[Context: {current_tokens} tokens, {format_percent(utilization)} used]")
# Check if optimization needed
if utilization > 0.8:
@@ -101,7 +101,7 @@ def main():
final_utilization = budgeter.get_utilization(final_tokens)
print(f"Total tokens used: {final_tokens:,}")
print(f"Context utilization: {final_utilization:.1%}")
print(f"Context utilization: {format_percent(final_utilization)}")
print(f"Messages in conversation: {len(conversation)}")
print(f"Remaining capacity: {budgeter.get_remaining(final_tokens):,} tokens")
+2 -2
View File
@@ -156,7 +156,7 @@ def example_5_multi_agent():
print("Example 5: Multi-Agent Context Management")
print("=" * 60)
from praisonaiagents import PraisonAIAgents, Task
from praisonaiagents import Agents, Task
config = ManagerConfig(
auto_compact=True,
@@ -181,7 +181,7 @@ def example_5_multi_agent():
task2 = Task(description="Write a summary", agent=writer)
# Create multi-agent system with context management
agents = PraisonAIAgents(
agents = Agents(
agents=[researcher, writer],
tasks=[task1, task2],
context=config, # Shared context config
@@ -0,0 +1,48 @@
"""
Basic Execution Configuration Example
Demonstrates using execution presets for quick configuration.
"""
import os
from praisonaiagents import Agent
# Ensure API key is set from environment
assert os.getenv("OPENAI_API_KEY"), "OPENAI_API_KEY must be set"
# Default execution (max_iter=20, max_retry_limit=2)
agent_default = Agent(
instructions="You are a helpful assistant.",
)
# Fast execution - fewer iterations, quick responses
agent_fast = Agent(
instructions="You are a helpful assistant.",
execution="fast",
)
# Thorough execution - more iterations, comprehensive responses
agent_thorough = Agent(
instructions="You are a research assistant.",
execution="thorough",
)
# Unlimited execution - for complex tasks
agent_unlimited = Agent(
instructions="You are a complex problem solver.",
execution="unlimited",
)
if __name__ == "__main__":
print("Testing execution presets...")
print(f"Default agent max_iter: {agent_default.max_iter}")
print(f"Fast agent max_iter: {agent_fast.max_iter}")
print(f"Thorough agent max_iter: {agent_thorough.max_iter}")
print(f"Unlimited agent max_iter: {agent_unlimited.max_iter}")
# Test fast agent
print("\n--- Fast Execution ---")
result = agent_fast.chat("What is the capital of France?")
print(f"Result: {result}")
print("\nAll execution preset tests passed!")
@@ -0,0 +1,45 @@
"""
ExecutionConfig Example
Demonstrates using ExecutionConfig for fine-grained control over execution limits.
"""
import os
from praisonaiagents import Agent, ExecutionConfig
# Ensure API key is set from environment
assert os.getenv("OPENAI_API_KEY"), "OPENAI_API_KEY must be set"
# Custom execution configuration
agent = Agent(
instructions="You are a helpful assistant.",
execution=ExecutionConfig(
max_iter=30,
max_rpm=100,
max_execution_time=60,
max_retry_limit=3,
),
)
# Rate-limited agent for API quota management
agent_rate_limited = Agent(
instructions="You are a helpful assistant.",
execution=ExecutionConfig(
max_iter=20,
max_rpm=10, # Only 10 requests per minute
),
)
if __name__ == "__main__":
print("Testing ExecutionConfig...")
print(f"Custom agent max_iter: {agent.max_iter}")
print(f"Custom agent max_rpm: {agent.max_rpm}")
print(f"Custom agent max_execution_time: {agent.max_execution_time}")
print(f"Custom agent max_retry_limit: {agent.max_retry_limit}")
# Test custom agent
print("\n--- Custom Execution ---")
result = agent.chat("What is machine learning?")
print(f"Result: {result}")
print("\nExecutionConfig tests passed!")
+8 -8
View File
@@ -4,7 +4,7 @@ Fixed example demonstrating proper guardrail usage with PraisonAI Agents.
This addresses the issues reported in issue #875.
"""
from praisonaiagents import Agent, Task, GuardrailResult, PraisonAIAgents, TaskOutput
from praisonaiagents import Agent, Task, GuardrailResult, Agents, TaskOutput
from typing import Tuple, Any
import trafilatura
@@ -67,7 +67,7 @@ agent = Agent(
goal="Summarize web content concisely",
instructions="You are a helpful assistant that summarizes web content",
llm="gemini/gemini-2.5-flash-lite-preview-06-17",
self_reflect=False,
reflection=False,
verbose=True,
tools=[get_url_context] # FIX: tools must be a list, not a single function
)
@@ -77,7 +77,7 @@ task_with_guardrailresult = Task(
name="summarise article with GuardrailResult",
description="get the context of this url: https://blog.google/technology/ai/dolphingemma/ and produce a summary below 500 characters",
agent=agent,
guardrail=validate_length_guardrailresult, # Using GuardrailResult
guardrails=validate_length_guardrailresult, # Using GuardrailResult
expected_output="summary of the article below 500 characters",
max_retries=3 # Will retry up to 3 times if guardrail fails
)
@@ -87,7 +87,7 @@ task_with_tuple = Task(
name="summarise article with tuple",
description="get the context of this url: https://blog.google/technology/ai/dolphingemma/ and produce a summary below 500 characters",
agent=agent,
guardrail=validate_length_tuple, # Using Tuple[bool, Any]
guardrails=validate_length_tuple, # Using Tuple[bool, Any]
expected_output="summary of the article below 500 characters",
max_retries=3
)
@@ -97,13 +97,13 @@ task_with_llm_guardrail = Task(
name="summarise with LLM guardrail",
description="get the context of this url: https://blog.google/technology/ai/dolphingemma/ and produce a summary",
agent=agent,
guardrail="Ensure the summary is professional, factual, and between 100-500 characters",
guardrails="Ensure the summary is professional, factual, and between 100-500 characters",
expected_output="professional summary of the article"
)
# Run with GuardrailResult example
print("=== Running with GuardrailResult guardrail ===")
agents_gr = PraisonAIAgents(
agents_gr = Agents(
agents=[agent],
tasks=[task_with_guardrailresult]
)
@@ -113,7 +113,7 @@ agents_gr = PraisonAIAgents(
# Run with Tuple example
print("\n=== Running with Tuple[bool, Any] guardrail ===")
agents_tuple = PraisonAIAgents(
agents_tuple = Agents(
agents=[agent],
tasks=[task_with_tuple]
)
@@ -123,7 +123,7 @@ agents_tuple = PraisonAIAgents(
# Run with LLM guardrail example
print("\n=== Running with LLM-based guardrail ===")
agents_llm = PraisonAIAgents(
agents_llm = Agents(
agents=[agent],
tasks=[task_with_llm_guardrail]
)
@@ -0,0 +1,30 @@
"""
Basic Guardrails Configuration Example
Demonstrates using guardrails for output validation.
"""
import os
from praisonaiagents import Agent
# Ensure API key is set from environment
assert os.getenv("OPENAI_API_KEY"), "OPENAI_API_KEY must be set"
def validate_length(output):
"""Validate that output is not too short."""
if len(str(output.raw)) < 10:
return False, "Response too short"
return True, output
# Enable guardrails with a validator function
agent = Agent(
instructions="You are a helpful assistant.",
guardrails=validate_length,
)
if __name__ == "__main__":
print("Testing guardrails...")
result = agent.chat("Explain what Python is.")
print(f"Result: {result}")
print("\nGuardrails tests passed!")
@@ -0,0 +1,43 @@
"""
GuardrailConfig Example
Demonstrates using GuardrailConfig for fine-grained control.
"""
import os
from praisonaiagents import Agent, GuardrailConfig
# Ensure API key is set from environment
assert os.getenv("OPENAI_API_KEY"), "OPENAI_API_KEY must be set"
def validate_no_code(output):
"""Validate that output doesn't contain code blocks."""
if "```" in str(output.raw):
return False, "Response should not contain code blocks"
return True, output
# Custom guardrail configuration
agent = Agent(
instructions="You are a helpful assistant. Explain concepts without code.",
guardrails=GuardrailConfig(
validator=validate_no_code,
max_retries=3,
on_fail="retry",
),
)
# LLM-based validation
agent_llm = Agent(
instructions="You are a helpful assistant.",
guardrails=GuardrailConfig(
llm_validator="Ensure the response is helpful, accurate, and professional.",
max_retries=2,
),
)
if __name__ == "__main__":
print("Testing GuardrailConfig...")
result = agent.chat("What is a variable in programming?")
print(f"Result: {result}")
print("\nGuardrailConfig tests passed!")
@@ -14,7 +14,7 @@ Usage:
from praisonai_tools.observability import obs
from praisonai_tools.observability.base import SpanKind
from praisonaiagents import Agent, PraisonAIAgents
from praisonaiagents import Agent, Agents
# Initialize observability
obs.init()
+2 -2
View File
@@ -13,7 +13,7 @@ Features demonstrated:
import sys
sys.path.insert(0, '/Users/praison/praisonai-package/src/praisonai-agents')
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
def get_weather(city: str) -> str:
@@ -106,7 +106,7 @@ def example_multi_agent():
agent=writer
)
agents = PraisonAIAgents(
agents = Agents(
agents=[researcher, writer],
tasks=[task1, task2],
process="sequential",
+297
View File
@@ -0,0 +1,297 @@
"""
Agent-Centric Autonomy Example.
Demonstrates the new agent-centric autonomy features in PraisonAI Agents:
- Agent(autonomy=True) for enabling autonomy
- Progressive escalation stages (DIRECT, HEURISTIC, PLANNED, AUTONOMOUS)
- Doom loop detection and recovery
- Verification hooks
- Subagent delegation
"""
from praisonaiagents import Agent
def example_basic_autonomy():
"""Basic autonomy example - simple question."""
print("\n" + "="*60)
print("Example 1: Basic Autonomy - Simple Question")
print("="*60)
agent = Agent(
instructions="You are a helpful coding assistant.",
autonomy=True,
)
# Analyze a simple question
prompt = "What is Python?"
signals = agent.analyze_prompt(prompt)
stage = agent.get_recommended_stage(prompt)
print(f"Prompt: {prompt}")
print(f"Detected signals: {signals}")
print(f"Recommended stage: {stage}")
# For simple questions, stage should be "direct"
assert stage == "direct", f"Expected 'direct', got '{stage}'"
print("✓ Simple question correctly identified as DIRECT stage")
def example_file_reference():
"""File reference detection example."""
print("\n" + "="*60)
print("Example 2: File Reference Detection")
print("="*60)
agent = Agent(
instructions="You are a code reviewer.",
autonomy=True,
)
prompt = "Read the main.py file and explain what it does"
signals = agent.analyze_prompt(prompt)
stage = agent.get_recommended_stage(prompt)
print(f"Prompt: {prompt}")
print(f"Detected signals: {signals}")
print(f"Recommended stage: {stage}")
assert "file_references" in signals, "Expected file_references signal"
assert stage == "heuristic", f"Expected 'heuristic', got '{stage}'"
print("✓ File reference correctly identified as HEURISTIC stage")
def example_edit_intent():
"""Edit intent detection example."""
print("\n" + "="*60)
print("Example 3: Edit Intent Detection")
print("="*60)
agent = Agent(
instructions="You are a code editor.",
autonomy=True,
)
prompt = "Edit the config.py file to add logging support"
signals = agent.analyze_prompt(prompt)
stage = agent.get_recommended_stage(prompt)
print(f"Prompt: {prompt}")
print(f"Detected signals: {signals}")
print(f"Recommended stage: {stage}")
assert "edit_intent" in signals, "Expected edit_intent signal"
assert stage == "planned", f"Expected 'planned', got '{stage}'"
print("✓ Edit intent correctly identified as PLANNED stage")
def example_multi_step_task():
"""Multi-step task detection example."""
print("\n" + "="*60)
print("Example 4: Multi-Step Task Detection")
print("="*60)
agent = Agent(
instructions="You are a software architect.",
autonomy=True,
)
prompt = """First analyze the codebase structure,
then refactor the authentication module,
and finally add comprehensive tests."""
signals = agent.analyze_prompt(prompt)
stage = agent.get_recommended_stage(prompt)
print(f"Prompt: {prompt[:50]}...")
print(f"Detected signals: {signals}")
print(f"Recommended stage: {stage}")
assert "multi_step" in signals, "Expected multi_step signal"
assert stage == "autonomous", f"Expected 'autonomous', got '{stage}'"
print("✓ Multi-step task correctly identified as AUTONOMOUS stage")
def example_custom_config():
"""Custom autonomy configuration example."""
print("\n" + "="*60)
print("Example 5: Custom Autonomy Configuration")
print("="*60)
agent = Agent(
instructions="You are a careful code reviewer.",
autonomy={
"max_iterations": 50,
"doom_loop_threshold": 5,
"auto_escalate": True,
"checkpoint_on_write": True,
},
)
print(f"Autonomy enabled: {agent.autonomy_enabled}")
print(f"Max iterations: {agent.autonomy_config.get('max_iterations')}")
print(f"Doom loop threshold: {agent.autonomy_config.get('doom_loop_threshold')}")
print(f"Checkpoint on write: {agent.autonomy_config.get('checkpoint_on_write')}")
assert agent.autonomy_enabled == True
assert agent.autonomy_config.get("max_iterations") == 50
print("✓ Custom configuration applied correctly")
def example_doom_loop_detection():
"""Doom loop detection example."""
print("\n" + "="*60)
print("Example 6: Doom Loop Detection")
print("="*60)
agent = Agent(
instructions="You are a test agent.",
autonomy={"doom_loop_threshold": 3},
)
# Simulate repeated actions
print("Simulating repeated actions...")
for i in range(3):
agent._record_action("read_file", {"path": "test.py"}, "content", True)
print(f" Action {i+1}: read_file test.py")
is_doom_loop = agent._is_doom_loop()
print(f"Doom loop detected: {is_doom_loop}")
assert is_doom_loop == True, "Expected doom loop to be detected"
print("✓ Doom loop correctly detected after repeated actions")
# Reset and verify
agent._reset_doom_loop()
is_doom_loop_after_reset = agent._is_doom_loop()
print(f"After reset: {is_doom_loop_after_reset}")
assert is_doom_loop_after_reset == False
print("✓ Doom loop correctly reset")
def example_verification_hooks():
"""Verification hooks example."""
print("\n" + "="*60)
print("Example 7: Verification Hooks")
print("="*60)
# Create a simple mock verification hook
class MockTestRunner:
name = "pytest"
def run(self, context=None):
return {"success": True, "output": "All 10 tests passed"}
agent = Agent(
instructions="You are a test-driven developer.",
autonomy=True,
verification_hooks=[MockTestRunner()],
)
print(f"Verification hooks registered: {len(agent._verification_hooks)}")
# Run verification hooks
results = agent._run_verification_hooks()
print(f"Verification results: {results}")
assert len(results) == 1
assert results[0]["success"] == True
print("✓ Verification hooks executed correctly")
def example_subagent_delegation():
"""Subagent delegation example."""
print("\n" + "="*60)
print("Example 8: Subagent Delegation")
print("="*60)
agent = Agent(
instructions="You are a project manager.",
autonomy=True,
)
# Check delegate method exists
assert hasattr(agent, "delegate"), "Agent should have delegate method"
assert callable(agent.delegate), "delegate should be callable"
# Check _create_subagent method
subagent = agent._create_subagent("explorer")
print(f"Created subagent: {subagent.name}")
print(f"Subagent instructions: {subagent.instructions[:50]}...")
assert "subagent_explorer" in subagent.name
print("✓ Subagent delegation works correctly")
def example_explorer_profile():
"""Explorer profile example."""
print("\n" + "="*60)
print("Example 9: Explorer Profile (Read-Only)")
print("="*60)
from praisonaiagents.agents.profiles import BUILTIN_PROFILES, get_profile
explorer = get_profile("explorer")
print(f"Profile name: {explorer.name}")
print(f"Description: {explorer.description[:60]}...")
print(f"Tools: {explorer.tools}")
print(f"Read-only metadata: {explorer.metadata.get('read_only')}")
# Verify explorer is read-only
write_tools = {"write_file", "delete_file", "bash", "shell"}
has_write_tools = any(tool in write_tools for tool in explorer.tools)
assert not has_write_tools, "Explorer should not have write tools"
assert explorer.metadata.get("read_only") == True
print("✓ Explorer profile is correctly read-only")
def example_run_autonomous_method():
"""run_autonomous method example (without actual LLM call)."""
print("\n" + "="*60)
print("Example 10: run_autonomous Method")
print("="*60)
agent = Agent(
instructions="You are a helpful assistant.",
autonomy=True,
)
# Verify method exists
assert hasattr(agent, "run_autonomous"), "Agent should have run_autonomous method"
assert callable(agent.run_autonomous), "run_autonomous should be callable"
print("✓ run_autonomous method exists and is callable")
print(" (Skipping actual execution to avoid LLM API calls)")
def main():
"""Run all examples."""
print("\n" + "#"*60)
print("# Agent-Centric Autonomy Examples")
print("#"*60)
try:
example_basic_autonomy()
example_file_reference()
example_edit_intent()
example_multi_step_task()
example_custom_config()
example_doom_loop_detection()
example_verification_hooks()
example_subagent_delegation()
example_explorer_profile()
example_run_autonomous_method()
print("\n" + "="*60)
print("All examples completed successfully! ✓")
print("="*60)
except Exception as e:
print(f"\n❌ Error: {e}")
raise
if __name__ == "__main__":
main()
@@ -5,7 +5,7 @@ This example demonstrates hierarchical agent patterns using PraisonAI
for structured task delegation and coordinated workflows.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import internet_search
print("=== AutoAgents Hierarchical Generation Example ===\n")
@@ -58,7 +58,7 @@ execution_task = Task(
)
# Run hierarchical workflow
agents_system = PraisonAIAgents(
agents_system = Agents(
agents=[manager_agent, research_agent],
tasks=[planning_task, execution_task],
process="sequential",
+8 -8
View File
@@ -5,7 +5,7 @@ This example demonstrates a comprehensive code agent that can write, analyze, de
It includes self-reflection for improving code quality and multiple specialized tools.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import CodeInterpreter
# Initialize code execution tool
@@ -32,9 +32,9 @@ code_writer = Agent(
goal="Write clean, efficient, and well-documented Python code",
backstory="You are a senior Python developer with 10+ years of experience in writing production-quality code.",
instructions="Write Python code that follows PEP 8 standards, includes proper error handling, and has clear documentation.",
self_reflect=True,
min_reflect=2,
max_reflect=5
reflection=True,
)
code_reviewer = Agent(
@@ -84,7 +84,7 @@ def demonstrate_code_agent():
)
# Create workflow
workflow = PraisonAIAgents(
workflow = Agents(
agents=[code_writer, code_reviewer, code_executor],
tasks=[write_task, review_task, execute_task],
process="sequential",
@@ -108,9 +108,9 @@ general_code_agent = Agent(
4. Refactor code for better performance
5. Add tests and documentation""",
tools=[code_interpreter, analyze_code_complexity],
self_reflect=True,
min_reflect=1,
max_reflect=3
reflection=True,
)
if __name__ == "__main__":
+4 -4
View File
@@ -4,7 +4,7 @@ from praisonaiagents.tools import duckduckgo
agent = Agent(instructions="You are a Image Analysis Agent", tools=[duckduckgo])
agent.start("I want to go London next week, find me a good hotel and flight")
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Create Image Analysis Agent
image_agent = Agent(
@@ -14,7 +14,7 @@ image_agent = Agent(
backstory="""You are an expert in computer vision and image analysis.
You excel at describing images, detecting objects, and understanding visual content.""",
llm="gpt-5-nano",
self_reflect=False
reflection=False
)
# 1. Task with Image URL
@@ -35,8 +35,8 @@ task2 = Task(
images=["image.jpg"]
)
# Create PraisonAIAgents instance
agents = PraisonAIAgents(
# Create Agents instance
agents = Agents(
agents=[image_agent],
tasks=[task1, task2],
process="sequential",
@@ -4,7 +4,7 @@ from praisonaiagents.tools import duckduckgo
agent = Agent(instructions="You are a Image Analysis Agent", tools=[duckduckgo])
agent.start("I want to go London next week, find me a good hotel and flight")
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Create Image Analysis Agent
image_agent = Agent(
@@ -14,7 +14,7 @@ image_agent = Agent(
backstory="""You are an expert in computer vision and image analysis.
You excel at describing images, detecting objects, and understanding visual content.""",
llm="gpt-5-nano",
self_reflect=False
reflection=False
)
# 1. Task with Image URL
@@ -35,8 +35,8 @@ task2 = Task(
images=["image.jpg"]
)
# Create PraisonAIAgents instance
agents = PraisonAIAgents(
# Create Agents instance
agents = Agents(
agents=[image_agent],
tasks=[task1, task2],
process="sequential",
+11 -11
View File
@@ -5,7 +5,7 @@ This example demonstrates a mathematical problem-solving agent that can handle v
including calculations, equation solving, and step-by-step explanations.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from typing import Dict, Any
import math
import re
@@ -65,9 +65,9 @@ calculation_agent = Agent(
backstory="You are an expert mathematician who can handle complex calculations with precision.",
instructions="Perform the requested calculations step by step, showing your work clearly.",
tools=[basic_calculator, solve_quadratic, calculate_statistics],
self_reflect=True,
min_reflect=1,
max_reflect=2
reflection=True,
)
problem_solver_agent = Agent(
@@ -81,9 +81,9 @@ problem_solver_agent = Agent(
3. Determine what needs to be found
4. Show each step of the solution
5. Verify the answer makes sense""",
self_reflect=True,
min_reflect=2,
max_reflect=4
reflection=True,
)
math_tutor_agent = Agent(
@@ -123,7 +123,7 @@ def solve_math_problem_workflow():
context=[solve_task]
)
workflow = PraisonAIAgents(
workflow = Agents(
agents=[problem_solver_agent, calculation_agent, math_tutor_agent],
tasks=[understand_task, solve_task, verify_task],
process="sequential",
@@ -148,9 +148,9 @@ math_assistant = Agent(
Always show your work step by step.""",
tools=[basic_calculator, solve_quadratic, calculate_statistics],
self_reflect=True,
min_reflect=1,
max_reflect=3
reflection=True,
)
if __name__ == "__main__":
@@ -6,7 +6,7 @@ agent-based selection for cost optimization and performance.
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.agent import RouterAgent
from praisonaiagents.llm.model_router import ModelRouter, ModelProfile, TaskComplexity
@@ -49,7 +49,7 @@ def example_auto_routing():
)
# Run the tasks
agents = PraisonAIAgents(
agents = Agents(
agents=[research_agent],
tasks=[simple_task, moderate_task, complex_task],
process="sequential",
@@ -118,7 +118,7 @@ def example_cost_optimized_workflow():
)
# Run workflow
workflow = PraisonAIAgents(
workflow = Agents(
agents=[analyzer, writer],
tasks=[analysis_task, writing_task],
process="sequential",
@@ -249,7 +249,7 @@ def example_custom_routing():
]
# Run tasks
agents = PraisonAIAgents(
agents = Agents(
agents=[coder],
tasks=tasks,
process="sequential",
+3 -2
View File
@@ -1,10 +1,11 @@
from praisonaiagents import Agent, Tools
from praisonaiagents import Agent, Tools, ReflectionConfig
from praisonaiagents.tools import execute_code, analyze_code, format_code, lint_code, disassemble_code # Code Tools
from praisonaiagents.tools import execute_command, list_processes, kill_process, get_system_info # Shell Tools
from praisonaiagents.tools import duckduckgo # Web Search Tool
agent = Agent(
instructions="You are a Programming Agent", self_reflect=True, min_reflect=5, max_reflect=10,
instructions="You are a Programming Agent",
reflection=ReflectionConfig(min_iterations=5, max_iterations=10),
tools=[execute_code, analyze_code, format_code, lint_code, disassemble_code, execute_command, list_processes, kill_process, get_system_info, duckduckgo]
)
agent.start(
+4 -4
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Create Video Analysis Agent
video_agent = Agent(
@@ -8,7 +8,7 @@ video_agent = Agent(
backstory="""You are an expert in computer vision and image analysis.
You excel at describing images, detecting objects, and understanding visual content.""",
llm="gpt-5-nano",
self_reflect=False
reflection=False
)
# Task with Video File
@@ -24,8 +24,8 @@ task1 = Task(
images=["video.mp4"]
)
# Create PraisonAIAgents instance
agents = PraisonAIAgents(
# Create Agents instance
agents = Agents(
agents=[video_agent],
tasks=[task1],
process="sequential",
+4 -4
View File
@@ -1,12 +1,12 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import wiki_search, wiki_summary, wiki_page, wiki_random, wiki_language
agent = Agent(
instructions="You are a Wikipedia Agent",
tools=[wiki_search, wiki_summary, wiki_page, wiki_random, wiki_language],
self_reflect=True,
min_reflect=3,
max_reflect=5,
reflection=True,
)
agent.start(
"What is the history of AI?"
@@ -32,7 +32,7 @@ import os
from pathlib import Path
# Import our market research system
from praisonaiagents import Agent, Task, PraisonAIAgents, Tools
from praisonaiagents import Agent, Task, Agents, Tools
# Create FastAPI app
app = FastAPI(
@@ -266,7 +266,7 @@ async def generate_market_research_report(job_id: str, config: MarketResearchCon
job_status[job_id]["message"] = "Setting up research workflow..."
# Create workflow
workflow = PraisonAIAgents(
workflow = Agents(
agents=list(agents.values()),
tasks=tasks,
process="sequential",
@@ -0,0 +1,52 @@
"""
Basic Agent Autonomy Example.
This example demonstrates the core autonomy features with a real API call.
Run with: python 00_autonomy_basic.py
Requirements:
- OPENAI_API_KEY environment variable set
"""
from praisonaiagents import Agent
def main():
# Create an agent with autonomy enabled
agent = Agent(
instructions="You are a helpful assistant. Be concise.",
autonomy=True,
)
print("=" * 50)
print("Agent Autonomy Basic Example")
print("=" * 50)
# Test 1: Signal detection (no API call)
print("\n1. Signal Detection (fast, no API call):")
prompts = [
"What is Python?",
"Read src/main.py and explain it",
"Refactor the auth module and add tests",
]
for prompt in prompts:
stage = agent.get_recommended_stage(prompt)
print(f" '{prompt[:40]}...' → {stage}")
# Test 2: Simple chat with autonomy (real API call)
print("\n2. Simple Chat (real API call):")
response = agent.chat("What is 2 + 2? Answer with just the number.")
print(f" Response: {response}")
# Test 3: Check autonomy status
print("\n3. Autonomy Status:")
print(f" Enabled: {agent.autonomy_enabled}")
print(f" Config: {agent.autonomy_config}")
print("\n" + "=" * 50)
print("✓ Basic autonomy example completed successfully!")
print("=" * 50)
if __name__ == "__main__":
main()
@@ -0,0 +1,94 @@
"""
Advanced Agent Autonomy Example.
Demonstrates advanced autonomy features:
- Custom configuration
- Doom loop detection
- Verification hooks
- Subagent delegation
Run with: python 01_autonomy_advanced.py
Requirements:
- OPENAI_API_KEY environment variable set
"""
from praisonaiagents import Agent
from praisonaiagents.agents.profiles import get_profile, BUILTIN_PROFILES
def main():
print("=" * 60)
print("Agent Autonomy Advanced Example")
print("=" * 60)
# 1. Custom autonomy configuration
print("\n1. Custom Autonomy Configuration:")
agent = Agent(
instructions="You are a coding assistant.",
autonomy={
"max_iterations": 30,
"doom_loop_threshold": 5,
"auto_escalate": True,
},
)
print(f" Max iterations: {agent.autonomy_config.get('max_iterations')}")
print(f" Doom loop threshold: {agent.autonomy_config.get('doom_loop_threshold')}")
print(f" Auto escalate: {agent.autonomy_config.get('auto_escalate')}")
# 2. Doom loop detection
print("\n2. Doom Loop Detection:")
for i in range(5):
agent._record_action("read_file", {"path": "test.py"}, "content", True)
is_doom = agent._is_doom_loop()
print(f" After 5 repeated actions: doom_loop={is_doom}")
agent._reset_doom_loop()
is_doom_after = agent._is_doom_loop()
print(f" After reset: doom_loop={is_doom_after}")
# 3. Verification hooks
print("\n3. Verification Hooks:")
class MockTestRunner:
name = "pytest"
def run(self, context=None):
return {"success": True, "output": "5 tests passed"}
agent_with_hooks = Agent(
instructions="You are a test-driven developer.",
autonomy=True,
verification_hooks=[MockTestRunner()],
)
results = agent_with_hooks._run_verification_hooks()
print(f" Hook results: {results}")
# 4. Subagent delegation
print("\n4. Subagent Delegation:")
subagent = agent._create_subagent("explorer")
print(f" Created subagent: {subagent.name}")
print(f" Profile: explorer (read-only)")
# 5. Explorer profile details
print("\n5. Explorer Profile:")
explorer = get_profile("explorer")
print(f" Tools: {explorer.tools}")
print(f" Read-only: {explorer.metadata.get('read_only')}")
print(f" Blocked tools: {explorer.metadata.get('blocked_tools')}")
# 6. Available profiles
print("\n6. Available Agent Profiles:")
for name in BUILTIN_PROFILES:
profile = get_profile(name)
if not profile.hidden:
print(f" - {name}: {profile.description[:50]}...")
print("\n" + "=" * 60)
print("✓ Advanced autonomy example completed successfully!")
print("=" * 60)
if __name__ == "__main__":
main()
@@ -0,0 +1,51 @@
"""
run_autonomous() Example.
Demonstrates the unified autonomous loop with real API calls.
Run with: python 02_run_autonomous.py
Requirements:
- OPENAI_API_KEY environment variable set
"""
from praisonaiagents import Agent
def main():
print("=" * 60)
print("run_autonomous() Example")
print("=" * 60)
# Create agent with autonomy
agent = Agent(
instructions="You are a helpful assistant. When asked a question, provide a clear answer and say 'Task completed' at the end.",
autonomy={"max_iterations": 5},
)
# Test 1: Simple task (should complete in 1 iteration)
print("\n1. Simple Task (direct stage):")
result = agent.run_autonomous(
"What is the capital of France? Say 'Task completed' after answering.",
max_iterations=3,
)
print(f" Success: {result.success}")
print(f" Completion reason: {result.completion_reason}")
print(f" Iterations: {result.iterations}")
print(f" Stage: {result.stage}")
print(f" Duration: {result.duration_seconds:.2f}s")
print(f" Output: {result.output[:100]}...")
# Test 2: Check result attributes
print("\n2. Result Attributes:")
print(f" Has actions: {len(result.actions) > 0}")
print(f" Has error: {result.error is not None}")
print("\n" + "=" * 60)
print("✓ run_autonomous() example completed successfully!")
print("=" * 60)
if __name__ == "__main__":
main()
@@ -0,0 +1,110 @@
"""
Verification Hooks Example.
Demonstrates how to use verification hooks with Agent autonomy.
Run with: python 03_verification_hooks.py
Requirements:
- OPENAI_API_KEY environment variable set
"""
from praisonaiagents import Agent
# Agent-centric quickstart
agent = Agent(
name="VerificationHooksDemo",
instructions="You are a helpful assistant demonstrating verification hooks."
)
# --- Advanced: Low-level Verification API ---
from praisonaiagents.hooks.verification import (
VerificationHook,
VerificationResult,
BaseVerificationHook,
CommandVerificationHook,
)
class SimpleTestHook(BaseVerificationHook):
"""A simple test verification hook."""
name = "simple_test"
def _execute(self, context=None):
return VerificationResult(
success=True,
output="All tests passed!",
details={"tests_run": 5, "passed": 5, "failed": 0},
)
class LintHook(BaseVerificationHook):
"""A lint verification hook."""
name = "lint"
def _execute(self, context=None):
return VerificationResult(
success=True,
output="No lint errors found",
details={"files_checked": 10, "errors": 0, "warnings": 2},
)
def main():
print("=" * 60)
print("Verification Hooks Example")
print("=" * 60)
# 1. Create hooks
print("\n1. Creating Verification Hooks:")
test_hook = SimpleTestHook()
lint_hook = LintHook()
print(f" - {test_hook.name}: {type(test_hook).__name__}")
print(f" - {lint_hook.name}: {type(lint_hook).__name__}")
# 2. Run hooks manually
print("\n2. Running Hooks Manually:")
test_result = test_hook.run()
lint_result = lint_hook.run()
print(f" Test result: success={test_result.success}, output='{test_result.output}'")
print(f" Lint result: success={lint_result.success}, output='{lint_result.output}'")
# 3. Create agent with verification hooks
print("\n3. Agent with Verification Hooks:")
agent = Agent(
instructions="You are a test-driven developer.",
autonomy=True,
verification_hooks=[test_hook, lint_hook],
)
print(f" Hooks registered: {len(agent._verification_hooks)}")
# 4. Run verification hooks through agent
print("\n4. Running Hooks Through Agent:")
results = agent._run_verification_hooks()
for result in results:
print(f" - {result['hook']}: success={result['success']}")
# 5. CommandVerificationHook example (without running)
print("\n5. CommandVerificationHook (structure only):")
cmd_hook = CommandVerificationHook(
name="pytest",
command=["python", "-m", "pytest", "-v"],
timeout=30.0,
)
print(f" Name: {cmd_hook.name}")
print(f" Command: {cmd_hook.command}")
print(f" Timeout: {cmd_hook.timeout_seconds}s")
print("\n" + "=" * 60)
print("✓ Verification hooks example completed successfully!")
print("=" * 60)
if __name__ == "__main__":
main()
+2 -2
View File
@@ -16,7 +16,7 @@ Environment Variables:
import cv2
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
def capture_and_analyze():
@@ -58,7 +58,7 @@ def capture_and_analyze():
)
# Run analysis
agents = PraisonAIAgents(
agents = Agents(
agents=[vision_agent],
tasks=[task],
process="sequential",
+2 -2
View File
@@ -18,7 +18,7 @@ import cv2
import time
import os
from datetime import datetime
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
class ContinuousCameraMonitor:
@@ -71,7 +71,7 @@ class ContinuousCameraMonitor:
images=[image_path]
)
agents = PraisonAIAgents(
agents = Agents(
agents=[self.vision_agent],
tasks=[task],
process="sequential",
+2 -2
View File
@@ -17,7 +17,7 @@ Environment Variables:
import cv2
import os
from datetime import datetime
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
def capture_camera_frame(camera_id=0):
@@ -114,7 +114,7 @@ def analyze_with_multiple_agents():
)
# Run multi-agent analysis
agents = PraisonAIAgents(
agents = Agents(
agents=[security_agent, object_detector, scene_analyst],
tasks=[security_task, object_task, scene_task],
process="parallel", # Run all analyses in parallel
@@ -18,7 +18,7 @@ import cv2
import os
import time
from datetime import datetime
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
class CameraVideoAnalyzer:
@@ -131,7 +131,7 @@ class CameraVideoAnalyzer:
images=[video_path] # PraisonAI supports video files in images parameter
)
agents = PraisonAIAgents(
agents = Agents(
agents=[self.video_agent],
tasks=[task],
process="sequential",
+3 -3
View File
@@ -27,9 +27,9 @@ pdf_agent = Agent(
instructions="Read the provided PDF document and answer questions about its content. Be specific and cite relevant sections when possible.",
knowledge=["document.pdf"], # Replace with your PDF file path
knowledge_config=config,
self_reflect=True,
min_reflect=1,
max_reflect=3
reflection=True,
)
# Example usage
@@ -24,7 +24,7 @@ from pathlib import Path
project_root = Path(__file__).parent.parent.parent.parent / "src" / "praisonai-agents"
sys.path.insert(0, str(project_root))
from praisonaiagents import Agent, Task, PraisonAIAgents, create_context_agent
from praisonaiagents import Agent, Task, Agents, create_context_agent
class ContextEngineeringWorkflow:
"""
@@ -312,7 +312,7 @@ class ContextEngineeringWorkflow:
print("\n⚙️ Executing Context Engineering Workflow")
print("-" * 50)
agents_workflow = PraisonAIAgents(
agents_workflow = Agents(
agents=[
self.product_manager,
self.architect,
@@ -11,7 +11,7 @@ Author: Generated for GitHub Issue #23
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import read_csv, write_csv
def create_sample_urls_csv():
@@ -81,7 +81,7 @@ def method_1_simple_loop():
)
# Initialize the agents system
agents = PraisonAIAgents(
agents = Agents(
agents=[loop_agent],
tasks=[loop_task],
process="workflow",
@@ -145,7 +145,7 @@ def method_2_manual_csv():
)
# Initialize and run
agents = PraisonAIAgents(
agents = Agents(
agents=[csv_agent],
tasks=[csv_task],
process="sequential"
@@ -211,7 +211,7 @@ def method_3_url_processing():
)
# Initialize and run
agents = PraisonAIAgents(
agents = Agents(
agents=[url_agent],
tasks=[url_task],
process="sequential"
@@ -319,7 +319,7 @@ def method_4_advanced_processing():
)
# Initialize and run with sequential processing
agents = PraisonAIAgents(
agents = Agents(
agents=[validator_agent, processor_agent],
tasks=[validation_task, processing_task],
process="sequential" # Validation must complete before processing
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
import logging
import os
@@ -37,7 +37,7 @@ knowledge_task = Task(
)
# Create and start the agents
agents = PraisonAIAgents(
agents = Agents(
agents=[knowledge_agent],
tasks=[knowledge_task],
process="sequential",
+2 -2
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Define the configuration for the Knowledge instance
config = {
@@ -29,7 +29,7 @@ rag_task = Task(
)
# Build Agents
agents = PraisonAIAgents(
agents = Agents(
agents=[rag_agent],
tasks=[rag_task],
user_id="user1"
@@ -8,7 +8,7 @@ This example demonstrates how to extract and utilize reasoning patterns in Prais
- Decision rationale extraction
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from typing import Dict, List, Tuple
from pydantic import BaseModel
import json
@@ -49,9 +49,9 @@ cot_agent = Agent(
6. Assess your confidence level
Always make your thinking process explicit and transparent.""",
self_reflect=True,
min_reflect=2,
max_reflect=3
reflection=True,
)
# Example 2: Reasoning Extractor Agent
@@ -100,7 +100,7 @@ def demonstrate_reasoning_extraction():
context=[problem_task]
)
workflow = PraisonAIAgents(
workflow = Agents(
agents=[cot_agent, reasoning_extractor],
tasks=[problem_task, extract_task],
process="sequential",
@@ -184,7 +184,7 @@ def advanced_reasoning_patterns():
context=[deductive_task, inductive_task, abductive_task]
)
workflow = PraisonAIAgents(
workflow = Agents(
agents=[cot_agent, reasoning_validator],
tasks=[deductive_task, inductive_task, abductive_task, validation_task],
process="sequential",
@@ -224,7 +224,7 @@ pattern_reasoning_agent = Agent(
3. Counterfactual: Explore what-if scenarios
4. Systems thinking: Consider interconnections
5. Probabilistic: Assess likelihoods""",
self_reflect=True
reflection=True
)
# Example 8: Interactive Reasoning Extraction
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
agent = Agent(
instructions="You are a loop agent that creating a loop of tasks.",
@@ -12,7 +12,7 @@ task = Task(
input_file="tasks.csv"
)
agents = PraisonAIAgents(
agents = Agents(
agents=[agent],
tasks=[task],
process="workflow",
+6 -6
View File
@@ -8,7 +8,7 @@ This example demonstrates various routing patterns in PraisonAI including:
- Dynamic task selection
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from typing import Dict, Any
import random
@@ -77,7 +77,7 @@ def conditional_routing_example():
agent=processor_agent
)
workflow = PraisonAIAgents(
workflow = Agents(
agents=[analyzer_agent, processor_agent],
tasks=[analysis_task, premium_task, standard_task, basic_task],
process="workflow",
@@ -110,7 +110,7 @@ def loop_pattern_example():
agent=validator_agent
)
workflow = PraisonAIAgents(
workflow = Agents(
agents=[processor_agent, validator_agent],
tasks=[process_task, finalize_task],
process="workflow",
@@ -185,7 +185,7 @@ def decision_tree_example():
all_tasks = [categorize_task, technical_task, business_task] + terminal_tasks
workflow = PraisonAIAgents(
workflow = Agents(
agents=[analyzer_agent, processor_agent],
tasks=all_tasks,
process="workflow",
@@ -208,7 +208,7 @@ dynamic_router = Agent(
5. Current system load
Provide clear routing decisions with reasoning.""",
self_reflect=True
reflection=True
)
def dynamic_routing_example():
@@ -272,7 +272,7 @@ def dynamic_routing_example():
agent=processor_agent
)
workflow = PraisonAIAgents(
workflow = Agents(
agents=[dynamic_router, processor_agent],
tasks=[route_task, escalate_task, automate_task, review_task, standard_task],
process="workflow",
@@ -8,7 +8,7 @@ This example demonstrates the self-reflection capabilities in PraisonAI agents:
- Impact on output quality
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from typing import Dict, Any
import time
@@ -24,9 +24,9 @@ basic_reflection_agent = Agent(
3. Identify areas for improvement
4. Revise and enhance
5. Repeat until satisfied""",
self_reflect=True, # Enable self-reflection
min_reflect=1, # Minimum 1 reflection iteration
max_reflect=3 # Maximum 3 reflection iterations
reflection=True, # Enable self-reflection
# Minimum 1 reflection iteration
# Maximum 3 reflection iterations
)
# Example 2: Advanced Reflection with Different Strategies
@@ -41,9 +41,9 @@ quality_focused_agent = Agent(
- Clarity of presentation
- Logical flow
- Supporting evidence""",
self_reflect=True,
min_reflect=3, # Higher minimum for quality
max_reflect=5 # Allow more iterations
reflection=True,
# Higher minimum for quality
# Allow more iterations
)
efficiency_balanced_agent = Agent(
@@ -52,9 +52,9 @@ efficiency_balanced_agent = Agent(
goal="Achieve good quality with reasonable reflection time",
backstory="You balance quality with efficiency, knowing when good enough is sufficient.",
instructions="Create good content with 1-2 rounds of improvement.",
self_reflect=True,
min_reflect=1,
max_reflect=2 # Limit iterations for efficiency
reflection=True,
# Limit iterations for efficiency
)
# Example 3: No Reflection for Comparison
@@ -64,7 +64,7 @@ no_reflection_agent = Agent(
goal="Provide immediate responses without reflection",
backstory="You provide quick, first-draft responses.",
instructions="Respond immediately with your first thought.",
self_reflect=False # Disable reflection
reflection=False # Disable reflection
)
# Demonstration function to show reflection in action
@@ -113,9 +113,9 @@ def reflection_workflow_example():
role="Initial content creator",
goal="Create first draft with self-improvement",
backstory="You create initial drafts and refine them through reflection.",
self_reflect=True,
min_reflect=2,
max_reflect=3
reflection=True,
)
# Reviewer without reflection (provides feedback)
@@ -124,7 +124,7 @@ def reflection_workflow_example():
role="Content reviewer",
goal="Provide constructive feedback",
backstory="You review content and provide specific improvement suggestions.",
self_reflect=False # No reflection needed for reviewing
reflection=False # No reflection needed for reviewing
)
# Final polisher with reflection
@@ -133,9 +133,9 @@ def reflection_workflow_example():
role="Final content polisher",
goal="Perfect the content based on feedback",
backstory="You take feedback and create the final, polished version.",
self_reflect=True,
min_reflect=1,
max_reflect=2
reflection=True,
)
# Workflow tasks
@@ -162,7 +162,7 @@ def reflection_workflow_example():
context=[create_task, review_task]
)
workflow = PraisonAIAgents(
workflow = Agents(
agents=[creator_agent, reviewer_agent, polisher_agent],
tasks=[create_task, review_task, polish_task],
process="sequential",
@@ -202,9 +202,9 @@ custom_reflection_agent = Agent(
backstory="You adapt your reflection process based on content quality.",
instructions="""Create content and reflect on it.
Continue improving until quality standards are met or maximum iterations reached.""",
self_reflect=True,
min_reflect=1,
max_reflect=5
reflection=True,
)
# Example 6: Reflection Impact Analysis
@@ -5,7 +5,7 @@ This example demonstrates self-reflection capabilities using PraisonAI's
built-in reflection features for iterative improvement and quality optimization.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import internet_search
print("=== Self-Reflection Optimization Patterns Example ===\n")
@@ -17,10 +17,10 @@ reflection_agent = Agent(
goal="Demonstrate self-reflection and iterative improvement patterns",
backstory="Expert researcher with strong self-reflection and continuous improvement capabilities",
tools=[internet_search],
self_reflect=True,
min_reflect=2,
max_reflect=4,
reflect_llm="gpt-5-nano",
reflection=True,
verbose=True
)
@@ -9,7 +9,7 @@ This is the simplest possible implementation for processing URLs from a CSV file
Author: Generated for GitHub Issue #23
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import write_csv
def create_url_csv():
@@ -59,7 +59,7 @@ def main():
)
# Step 4: Run the agents
agents = PraisonAIAgents(
agents = Agents(
agents=[url_agent],
tasks=[url_task],
process="workflow",
@@ -4,7 +4,7 @@ Example: Using Latency Tracking Tool with PraisonAI
This example shows how to track latency without modifying core files.
"""
from praisonaiagents import Agent, PraisonAIAgents
from praisonaiagents import Agent, Agents
from latency_tracker_tool import (
latency_tracking_tool,
create_tracked_agent,
@@ -5,7 +5,7 @@ This shows how to add latency tracking to an MCP server
without modifying PraisonAI core files.
"""
from praisonaiagents import Agent, PraisonAIAgents
from praisonaiagents import Agent, Agents
from hosted_server import HostedMCPServer # Import from local file
from latency_tracker_tool import tracker, get_latency_metrics
import json
+2 -2
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import cot_save, cot_upload_to_huggingface
from pydantic import BaseModel
import os
@@ -131,7 +131,7 @@ upload_to_huggingface_task = Task(
)
# Initialize workflow
agents = PraisonAIAgents(
agents = Agents(
agents=[qa_generator, total_questions_evaluator, cot_generator, upload_to_huggingface],
tasks=[generate_task, evaluate_total_questions_task, generate_cot_task, upload_to_huggingface_task],
process="workflow",
+192
View File
@@ -0,0 +1,192 @@
"""
Escalation Pipeline Example.
Demonstrates the progressive escalation from direct response to autonomous mode.
"""
import asyncio
from praisonaiagents.escalation import (
EscalationPipeline,
EscalationStage,
EscalationConfig,
EscalationTrigger,
DoomLoopDetector,
ObservabilityHooks,
EventType,
)
def demo_signal_detection():
"""Demonstrate signal detection from prompts."""
print("\n" + "="*60)
print("SIGNAL DETECTION DEMO")
print("="*60)
trigger = EscalationTrigger()
# Test various prompts
test_prompts = [
("What is Python?", "Simple question"),
("Read the file src/main.py", "File reference"),
("Refactor the authentication module and add tests", "Complex task"),
("First, analyze the code. Then, fix the bug. Finally, test it.", "Multi-step"),
]
for prompt, description in test_prompts:
signals = trigger.analyze(prompt)
stage = trigger.recommend_stage(signals)
print(f"\n📝 Prompt: {prompt[:50]}...")
print(f" Description: {description}")
print(f" Signals: {[s.value for s in signals]}")
print(f" Recommended Stage: {stage.name}")
def demo_doom_loop_detection():
"""Demonstrate doom loop detection."""
print("\n" + "="*60)
print("DOOM LOOP DETECTION DEMO")
print("="*60)
detector = DoomLoopDetector()
detector.start_session()
# Simulate repeated identical actions
print("\n🔄 Simulating repeated identical actions...")
for i in range(4):
detector.record_action(
action_type="read_file",
args={"path": "config.py"},
result="same content",
success=True,
)
if detector.is_doom_loop():
loop_type = detector.get_loop_type()
recovery = detector.get_recovery_action()
print(f" ⚠️ Doom loop detected after {i+1} actions!")
print(f" Type: {loop_type.value}")
print(f" Recovery: {recovery.value}")
break
else:
print(f" Action {i+1}: No loop detected")
# Show stats
stats = detector.get_stats()
print(f"\n📊 Stats: {stats}")
def demo_observability():
"""Demonstrate observability hooks."""
print("\n" + "="*60)
print("OBSERVABILITY DEMO")
print("="*60)
hooks = ObservabilityHooks()
# Register event handlers
def on_stage_change(event):
print(f" 📍 Stage changed: {event.data}")
def on_tool_call(event):
print(f" 🔧 Tool called: {event.data}")
hooks.on(EventType.STAGE_ESCALATE, on_stage_change)
hooks.on(EventType.TOOL_CALL_END, on_tool_call)
# Simulate events
print("\n🎯 Simulating execution events...")
hooks.start_execution("session_123")
hooks.set_stage(EscalationStage.DIRECT)
hooks.emit(EventType.STEP_START, {"step": 1})
hooks.emit(EventType.TOOL_CALL_END, {"tool": "read_file", "path": "main.py"})
hooks.emit(EventType.STEP_END, {"step": 1})
hooks.emit(EventType.STAGE_ESCALATE, {"from": "DIRECT", "to": "HEURISTIC"})
hooks.set_stage(EscalationStage.HEURISTIC)
hooks.end_execution(1500.0)
# Show summary
summary = hooks.get_summary()
print(f"\n📊 Summary: {summary}")
def demo_stage_descriptions():
"""Show descriptions of each escalation stage."""
print("\n" + "="*60)
print("ESCALATION STAGES")
print("="*60)
trigger = EscalationTrigger()
stages = [
(EscalationStage.DIRECT, "Simple questions, no tools needed"),
(EscalationStage.HEURISTIC, "File references, code blocks"),
(EscalationStage.PLANNED, "Edit intent, test/build tasks"),
(EscalationStage.AUTONOMOUS, "Multi-step, refactoring tasks"),
]
for stage, example in stages:
desc = trigger.get_stage_description(stage)
print(f"\n🎯 Stage {stage.value}: {stage.name}")
print(f" Description: {desc}")
print(f" Example use: {example}")
async def demo_pipeline_analysis():
"""Demonstrate pipeline analysis."""
print("\n" + "="*60)
print("PIPELINE ANALYSIS DEMO")
print("="*60)
config = EscalationConfig(
max_steps=20,
max_time_seconds=60,
auto_escalate=True,
)
pipeline = EscalationPipeline(config=config)
prompts = [
"What is a Python decorator?",
"Read the file src/auth.py and explain it",
"Refactor the user authentication to use JWT tokens",
]
for prompt in prompts:
stage = pipeline.analyze(prompt)
print(f"\n📝 Prompt: {prompt[:50]}...")
print(f" Recommended Stage: {stage.name}")
def main():
"""Run all demos."""
print("\n" + "="*60)
print("PRAISONAI ESCALATION PIPELINE DEMO")
print("="*60)
print("\nThis demo shows the progressive escalation system that")
print("automatically adjusts execution complexity based on task signals.")
# Run demos
demo_stage_descriptions()
demo_signal_detection()
demo_doom_loop_detection()
demo_observability()
asyncio.run(demo_pipeline_analysis())
print("\n" + "="*60)
print("DEMO COMPLETE")
print("="*60)
print("\nKey takeaways:")
print("1. Simple tasks stay at DIRECT stage (no tools)")
print("2. File references trigger HEURISTIC stage")
print("3. Edit/test tasks trigger PLANNED stage")
print("4. Multi-step/refactor tasks trigger AUTONOMOUS stage")
print("5. Doom loop detection prevents infinite loops")
print("6. Observability hooks enable monitoring")
if __name__ == "__main__":
main()
@@ -5,7 +5,7 @@ This example demonstrates callback systems using PraisonAI's built-in
callback functionality for monitoring agent interactions and tool usage.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.display_callback import register_display_callback
from praisonaiagents.tools import internet_search
+7 -7
View File
@@ -1,7 +1,7 @@
import asyncio
import time
from typing import List, Dict
from praisonaiagents import Agent, Task, PraisonAIAgents, TaskOutput
from praisonaiagents import Agent, Task, Agents, TaskOutput
from praisonaiagents.main import (
display_error,
display_interaction,
@@ -98,7 +98,7 @@ sync_agent = Agent(
goal="Perform synchronous searches and return structured results",
backstory="Expert in sync operations and data organization",
tools=[sync_search_tool],
self_reflect=False,
reflection=False,
verbose=True,
markdown=True
)
@@ -109,7 +109,7 @@ async_agent = Agent(
goal="Perform asynchronous searches and return structured results",
backstory="Expert in async operations and data organization",
tools=[async_search_tool],
self_reflect=False,
reflection=False,
verbose=True,
markdown=True
)
@@ -160,7 +160,7 @@ workflow_async_task = Task(
def run_sync_example():
"""Run synchronous example"""
display_instruction("\nRunning Synchronous Example...", console)
agents = PraisonAIAgents(
agents = Agents(
agents=[sync_agent],
tasks=[sync_task],
verbose=1,
@@ -172,7 +172,7 @@ def run_sync_example():
async def run_async_example():
"""Run asynchronous example"""
display_instruction("\nRunning Asynchronous Example...", console)
agents = PraisonAIAgents(
agents = Agents(
agents=[async_agent],
tasks=[async_task],
verbose=1,
@@ -184,7 +184,7 @@ async def run_async_example():
async def run_mixed_example():
"""Run mixed sync/async example"""
display_instruction("\nRunning Mixed Sync/Async Example...", console)
agents = PraisonAIAgents(
agents = Agents(
agents=[sync_agent, async_agent],
tasks=[sync_task, async_task],
verbose=1,
@@ -196,7 +196,7 @@ async def run_mixed_example():
async def run_workflow_example():
"""Run workflow example with both sync and async tasks"""
display_instruction("\nRunning Workflow Example...", console)
agents = PraisonAIAgents(
agents = Agents(
agents=[sync_agent, async_agent],
tasks=[workflow_sync_task, workflow_async_task],
verbose=1,
@@ -1,7 +1,7 @@
import asyncio
import time
from typing import List, Dict
from praisonaiagents import Agent, Task, PraisonAIAgents, TaskOutput
from praisonaiagents import Agent, Task, Agents, TaskOutput
from duckduckgo_search import DDGS
from pydantic import BaseModel
@@ -53,7 +53,7 @@ async_agent = Agent(
goal="Perform fast parallel searches with structured results",
backstory="Expert in efficient data retrieval and parallel search operations",
tools=[async_search_tool],
self_reflect=False,
reflection=False,
verbose=True,
markdown=True
)
@@ -63,7 +63,7 @@ summary_agent = Agent(
role="Research Synthesizer",
goal="Create concise summaries from multiple search results",
backstory="Expert in analyzing and synthesizing information from multiple sources",
self_reflect=True,
reflection=True,
verbose=True,
markdown=True
)
@@ -114,8 +114,8 @@ async def run_parallel_tasks():
context=parallel_tasks
)
# Create a single PraisonAIAgents instance with both agents
agents = PraisonAIAgents(
# Create a single Agents instance with both agents
agents = Agents(
agents=[async_agent, summary_agent],
tasks=parallel_tasks + [summary_task],
verbose=1,
@@ -1,7 +1,7 @@
import asyncio
import time
from typing import List, Dict
from praisonaiagents import Agent, Task, PraisonAIAgents, TaskOutput
from praisonaiagents import Agent, Task, Agents, TaskOutput
from duckduckgo_search import DDGS
from pydantic import BaseModel
@@ -60,7 +60,7 @@ async_agent = Agent(
goal="Perform fast and efficient asynchronous searches with structured results",
backstory="Expert in parallel search operations and data retrieval",
tools=[async_search_tool],
self_reflect=False,
reflection=False,
verbose=True,
markdown=True
)
@@ -72,7 +72,7 @@ summary_agent = Agent(
backstory="""Expert in analyzing and synthesizing information from multiple sources.
Skilled at identifying patterns, trends, and connections between different topics.
Specializes in creating clear, structured summaries that highlight key insights.""",
self_reflect=True, # Enable self-reflection for better summary quality
reflection=True, # Enable self-reflection for better summary quality
verbose=True,
markdown=True
)
@@ -103,7 +103,7 @@ async_task = Task(
async def run_single_task():
"""Run single async task"""
print("\nRunning Single Async Task...")
agents = PraisonAIAgents(
agents = Agents(
agents=[async_agent],
tasks=[async_task],
verbose=1,
@@ -187,7 +187,7 @@ Present the summary in a clear, structured format with sections for findings, pa
)
# First run parallel search tasks
agents = PraisonAIAgents(
agents = Agents(
agents=[async_agent],
tasks=parallel_tasks, # Only run search tasks first
verbose=1,
@@ -212,7 +212,7 @@ Present the summary in a clear, structured format with sections for findings, pa
summary_task.context = completed_tasks
# Run summarization task with summary agent
summary_agents = PraisonAIAgents(
summary_agents = Agents(
agents=[summary_agent], # Use summary agent for synthesis
tasks=[summary_task],
verbose=1,
+2 -2
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
import time
def get_environment_state():
@@ -86,7 +86,7 @@ feedback_task = Task(
)
# Create workflow manager
workflow = PraisonAIAgents(
workflow = Agents(
agents=[llm_caller, action_agent, feedback_agent],
tasks=[monitor_task, action_task, feedback_task],
process="workflow",
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
import json
from e2b_code_interpreter import Sandbox
@@ -25,13 +25,13 @@ code_agent = Agent(
name="code_agent",
llm="gpt-5-nano",
backstory="Expert in writing Python scripts",
self_reflect=False
reflection=False
)
execution_agent = Agent(
name="execution_agent",
llm="gpt-5-nano",
backstory="Expert in executing Python scripts",
self_reflect=False,
reflection=False,
tools=[code_interpreter]
)
@@ -46,5 +46,5 @@ execution_agent_task = Task(
agent=execution_agent
)
agents = PraisonAIAgents(agents=[code_agent, execution_agent], tasks=[code_agent_task, execution_agent_task])
agents = Agents(agents=[code_agent, execution_agent], tasks=[code_agent_task, execution_agent_task])
agents.start()
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Create generator and evaluator agents
generator = Agent(
@@ -53,7 +53,7 @@ evaluate_task = Task(
)
# Create workflow manager
workflow = PraisonAIAgents(
workflow = Agents(
agents=[generator, evaluator],
tasks=[generate_task, evaluate_task],
process="workflow",
+5 -5
View File
@@ -1,7 +1,7 @@
from praisonaiagents import (
Agent,
Task,
PraisonAIAgents,
Agents,
error_logs,
register_display_callback,
sync_display_callbacks,
@@ -129,9 +129,9 @@ def main():
tools=[internet_search_tool],
llm="gpt-5-nano",
markdown=True,
reflect_llm="gpt-5-nano",
min_reflect=2,
max_reflect=4
)
writer = Agent(
@@ -190,7 +190,7 @@ def main():
)
# Create and run agents manager
agents = PraisonAIAgents(
agents = Agents(
agents=[researcher, writer],
tasks=[task1, task2, task3, task4],
verbose=True,
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from typing import List, Dict, Union
from duckduckgo_search import DDGS
from langchain_community.tools import YouTubeSearchTool
@@ -112,7 +112,7 @@ data_agent = Agent(
goal="Perform internet searches to collect relevant information.",
backstory="Expert in finding and organizing internet data from multiple sources.",
tools=[internet_search_tool, youtube_search_tool, wikipedia_search_tool],
self_reflect=False
reflection=False
)
# 3. Tasks
@@ -141,7 +141,7 @@ validate_task = Task(
)
# 4. Workflow
agents = PraisonAIAgents(
agents = Agents(
agents=[data_agent],
tasks=[collect_task, validate_task],
verbose=1,
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents, error_logs
from praisonaiagents import Agent, Task, Agents, error_logs
from duckduckgo_search import DDGS
def my_callback(output):
@@ -41,9 +41,9 @@ researcher = Agent(
tools=[internet_search_tool],
llm="gpt-5-nano",
markdown=True,
reflect_llm="gpt-5-nano",
min_reflect=2,
max_reflect=4
)
writer = Agent(
name="Writer",
@@ -99,7 +99,7 @@ task4 = Task(
)
# Create and run agents manager
agents = PraisonAIAgents(
agents = Agents(
agents=[researcher, writer],
tasks=[task1, task2, task3, task4],
verbose=False,
@@ -24,7 +24,7 @@ import sys
# Add the local development path to use the current implementation
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'src', 'praisonai-agents'))
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import python_tools, file_tools, shell_tools
from praisonaiagents.main import register_approval_callback
from praisonaiagents.approval import (
@@ -111,7 +111,7 @@ def main():
]
# Create and run process
process = PraisonAIAgents(
process = Agents(
agents=[agent],
tasks=tasks,
verbose=True
@@ -171,7 +171,7 @@ async def async_demo():
expected_output="Async execution result"
)
process = PraisonAIAgents(
process = Agents(
agents=[agent],
tasks=[task],
verbose=True
+3 -3
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from langchain_community.tools import YouTubeSearchTool
from langchain_community.utilities import WikipediaAPIWrapper
@@ -9,7 +9,7 @@ agent = Agent(
goal="Search for information from multiple sources",
backstory="I am an AI assistant that can search YouTube and Wikipedia.",
tools=[YouTubeSearchTool, WikipediaAPIWrapper],
self_reflect=False
reflection=False
)
# Create tasks to demonstrate both tools
@@ -21,7 +21,7 @@ task = Task(
)
# Create and start the workflow
agents = PraisonAIAgents(
agents = Agents(
agents=[agent],
tasks=[task],
verbose=True
+5 -5
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
import logging
import os
@@ -25,7 +25,7 @@ def main():
# else:
# logger.info("Creating new memory database")
# Create task config (without memory config since it's moved to PraisonAIAgents)
# Create task config (without memory config since it's moved to Agents)
task_config = {}
# Create agents with different roles
@@ -100,8 +100,8 @@ def main():
agent=retriever
)
# Initialize PraisonAIAgents with memory configuration
agents = PraisonAIAgents(
# Initialize Agents with memory configuration
agents = Agents(
agents=[researcher, retriever],
tasks=[store_task, verify_task, query_task, query_both_task],
verbose=True, # Use same verbose level as memory
@@ -114,7 +114,7 @@ def main():
}
)
# agents = PraisonAIAgents(
# agents = Agents(
# agents=[researcher, retriever],
# tasks=[store_task, verify_task, query_task, query_both_task],
# verbose=True, # Use same verbose level as memory
+2 -2
View File
@@ -1,4 +1,4 @@
from praisonaiagents.agents.agents import Agent, Task, PraisonAIAgents
from praisonaiagents.agents.agents import Agent, Task, Agents
from praisonaiagents.tools import duckduckgo
# Test facts
@@ -54,7 +54,7 @@ blog_task = Task(
agent=blog_agent
)
agents = PraisonAIAgents(
agents = Agents(
agents=[fact_agent, research_agent, blog_agent],
tasks=[fact_task, research_task, research_task2, research_task3, research_task4, blog_task],
memory=True
+4 -4
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Create Vision Analysis Agent
vision_agent = Agent(
@@ -8,7 +8,7 @@ vision_agent = Agent(
backstory="""You are an expert in computer vision and image analysis.
You excel at describing images, detecting objects, and understanding visual content.""",
llm="gpt-5-nano",
self_reflect=False
reflection=False
)
# 1. Task with Image URL
@@ -42,8 +42,8 @@ task3 = Task(
images=["video.mp4"]
)
# Create PraisonAIAgents instance
agents = PraisonAIAgents(
# Create Agents instance
agents = Agents(
agents=[vision_agent],
tasks=[task1, task2, task3],
process="sequential",
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
import time
def get_time_check():
@@ -93,7 +93,7 @@ synthesize_task = Task(
)
# Create workflow manager
workflow = PraisonAIAgents(
workflow = Agents(
agents=[router, worker1, worker2, worker3, synthesizer],
tasks=[router_task, worker1_task, worker2_task, worker3_task, synthesize_task],
process="workflow",
+2 -2
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from datetime import datetime
import asyncio
@@ -75,7 +75,7 @@ aggregate_task = Task(
async def main():
# Create workflow manager
workflow = PraisonAIAgents(
workflow = Agents(
agents=[agent1, agent2, agent3, aggregator],
tasks=[task1, task2, task3, aggregate_task],
process="workflow"
+2 -2
View File
@@ -1,6 +1,6 @@
from praisonaiagents.agent import Agent
from praisonaiagents.task import Task
from praisonaiagents.agents import PraisonAIAgents
from praisonaiagents.agents import Agents
from typing import List, Dict
import time
@@ -64,7 +64,7 @@ final_task = Task(
)
# Create the workflow manager
workflow = PraisonAIAgents(
workflow = Agents(
agents=[agent1, agent2, agent3],
tasks=[initial_task, analysis_task, final_task],
process="workflow", # Use workflow process type
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents, Tools
from praisonaiagents import Agent, Task, Agents, Tools
from pydantic import BaseModel
class AnalysisReport(BaseModel):
@@ -15,7 +15,7 @@ researcher = Agent(
verbose=True,
llm="gpt-5-nano",
tools=[Tools.internet_search],
self_reflect=False
reflection=False
)
# Create an analyst agent
@@ -26,7 +26,7 @@ analyst = Agent(
backstory="Senior data analyst with expertise in pattern recognition",
verbose=True,
llm="gpt-5-nano",
self_reflect=False
reflection=False
)
# Define structured tasks
@@ -46,7 +46,7 @@ analysis_task = Task(
)
# Initialize and run agents
agents = PraisonAIAgents(
agents = Agents(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
process="sequential",
@@ -33,7 +33,7 @@ def get_structured_analysis(query: str, verbose: bool = True) -> AnalysisReport:
goal="Analyze topics and provide structured reports",
backstory="Expert at gathering information and providing structured analysis",
verbose=verbose,
self_reflect=True, # Enable self-reflection for better quality
reflection=True, # Enable self-reflection for better quality
markdown=True,
llm="gpt-5-nano"
)
+3 -3
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
import os
import requests
from typing import Any, Dict, List, Optional
@@ -94,7 +94,7 @@ agent = Agent(
goal="Search for information about 'AI Agents Framework'",
backstory="I am an AI assistant that can search GitHub.",
tools=[EXASearchTool],
self_reflect=False
reflection=False
)
# Create tasks to demonstrate both tools
@@ -106,7 +106,7 @@ task = Task(
)
# Create and start the workflow
agents = PraisonAIAgents(
agents = Agents(
agents=[agent],
tasks=[task],
verbose=True
+3 -3
View File
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import get_article, get_news_sources, get_articles_from_source, get_trending_topics
# Create Wikipedia agent
@@ -8,7 +8,7 @@ news_agent = Agent(
goal="Collect and analyze news articles from various sources.",
backstory="Expert in news gathering and content analysis.",
tools=[get_article, get_news_sources, get_articles_from_source, get_trending_topics],
self_reflect=False
reflection=False
)
@@ -22,7 +22,7 @@ news_task = Task(
# Run agent
agents = PraisonAIAgents(
agents = Agents(
agents=[news_agent],
tasks=[news_task],
process="sequential"
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from typing import List, Dict
from duckduckgo_search import DDGS
@@ -35,7 +35,7 @@ data_agent = Agent(
goal="Perform internet searches to collect relevant information.",
backstory="Expert in finding and organising internet data.",
tools=[internet_search_tool],
self_reflect=False
reflection=False
)
# 3. Tasks
@@ -64,7 +64,7 @@ validate_task = Task(
)
# 4. AI Agents Workflow
agents = PraisonAIAgents(
agents = Agents(
agents=[data_agent],
tasks=[collect_task, validate_task],
verbose=1,
@@ -1,4 +1,4 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
import random
from typing import List, Dict, Union
import json
@@ -158,7 +158,7 @@ data_agent = Agent(
goal="Collect and validate data about individuals",
backstory="Expert in gathering and validating demographic data",
tools=[random_data_of_individuals],
self_reflect=False
reflection=False
)
process_agent = Agent(
@@ -167,7 +167,7 @@ process_agent = Agent(
goal="Process and categorize individual data",
backstory="Expert in data analysis and categorization",
tools=[process_data_of_individuals],
self_reflect=False
reflection=False
)
# Modify tasks to use Pydantic models
@@ -224,8 +224,8 @@ process_task = Task(
output_json=ProcessedPerson
)
# Create PraisonAIAgents instance with workflow process
workflow = PraisonAIAgents(
# Create Agents instance with workflow process
workflow = Agents(
agents=[data_agent, process_agent],
tasks=[collect_task, validate_task, process_task],
verbose=1,
@@ -12,7 +12,7 @@ Features demonstrated:
- Quality assurance workflows
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.task import TaskOutput
from typing import Tuple, Any
import re
@@ -125,7 +125,7 @@ email_task = Task(
description="Write a business proposal for a new software project, including contact information",
expected_output="Professional business proposal with contact email addresses",
agent=email_agent,
guardrail=email_format_guardrail,
guardrails=email_format_guardrail,
max_retries=3
)
@@ -135,7 +135,7 @@ content_task = Task(
description="Write an analysis of cloud computing benefits for small businesses",
expected_output="Comprehensive analysis of cloud computing benefits (minimum 50 words)",
agent=content_agent,
guardrail=word_count_guardrail,
guardrails=word_count_guardrail,
max_retries=3
)
@@ -145,7 +145,7 @@ business_task = Task(
description="Provide advice on handling difficult client relationships",
expected_output="Professional advice maintaining appropriate business tone",
agent=business_agent,
guardrail=professional_tone_guardrail,
guardrails=professional_tone_guardrail,
max_retries=3
)
@@ -155,7 +155,7 @@ research_task = Task(
description="Analyze the impact of artificial intelligence on job markets",
expected_output="Research-backed analysis with citations and evidence",
agent=research_agent,
guardrail=factual_accuracy_guardrail,
guardrails=factual_accuracy_guardrail,
max_retries=3
)
@@ -176,12 +176,12 @@ llm_guardrail_task = Task(
agent=llm_guardrail_agent,
# LLM-based guardrail using natural language validation
guardrail="Validate that this marketing content is: 1) Factually accurate with no false claims, 2) Compliant with advertising standards (no misleading statements), 3) Engaging and professional in tone, 4) Includes a clear call-to-action. If any criteria are not met, explain what needs to be improved.",
guardrails="Validate that this marketing content is: 1) Factually accurate with no false claims, 2) Compliant with advertising standards (no misleading statements), 3) Engaging and professional in tone, 4) Includes a clear call-to-action. If any criteria are not met, explain what needs to be improved.",
max_retries=2
)
# Execute tasks with guardrails
agents = PraisonAIAgents(
agents = Agents(
agents=[email_agent, content_agent, business_agent, research_agent, llm_guardrail_agent],
tasks=[email_task, content_task, business_task, research_task, llm_guardrail_task],
verbose=True
@@ -5,7 +5,7 @@ This example demonstrates production guardrail patterns using PraisonAI's
built-in validation and safety mechanisms for secure agent operations.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import internet_search
print("=== Production Guardrails Patterns Example ===\n")
@@ -38,7 +38,7 @@ production_agent = Agent(
goal="Generate safe, compliant content for production use",
backstory="Production-ready agent with built-in safety and compliance checks",
tools=[internet_search],
guardrail=content_guardrail,
guardrails=content_guardrail,
max_retries=3,
verbose=True
)
@@ -5,7 +5,7 @@ This example demonstrates an advanced system that dynamically creates agents and
based on user inputs, including conditional logic, custom configurations, and file output.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import duckduckgo
import os
from typing import Dict, List
@@ -40,7 +40,7 @@ class DynamicAgentSystem:
goal=f"Conduct {inputs['depth']} research on {inputs['topic']} in {inputs['language']}",
backstory=f"Multilingual expert specializing in {inputs['depth']} analysis",
tools=[duckduckgo],
self_reflect=inputs['depth'] == 'detailed',
reflection=inputs['depth'] == 'detailed',
llm=self.llm_config
)
agents.append(research_agent)
@@ -137,7 +137,7 @@ class DynamicAgentSystem:
# Run the system
print(f"\n🚀 Starting {process} analysis for '{inputs['topic']}'...")
praison_agents = PraisonAIAgents(
praison_agents = Agents(
agents=agents,
tasks=tasks,
process=process,
@@ -6,7 +6,7 @@ to create flexible agent configurations that can be pre-configured via environme
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Set via environment or use default
default_topic = os.getenv("RESEARCH_TOPIC", "AI trends")
@@ -46,7 +46,7 @@ print(f" - Max Retries: {max_retries}")
print("\n" + "="*50 + "\n")
# Run agents
agents = PraisonAIAgents(agents=[agent], tasks=[task])
agents = Agents(agents=[agent], tasks=[task])
result = agents.start()
# Save to environment-specified location if provided
@@ -5,7 +5,7 @@ This example shows how to use multiple user inputs to create a more sophisticate
agent system with tools, multiple agents, and context passing between tasks.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import duckduckgo
# Get multiple inputs
@@ -19,7 +19,7 @@ search_agent = Agent(
goal=f"Find {num_results} relevant results about {topic}",
backstory="Expert in internet research and data collection",
tools=[duckduckgo],
self_reflect=False
reflection=False
)
# Create analysis agent
@@ -47,7 +47,7 @@ analyze_task = Task(
)
# Run sequential process
agents = PraisonAIAgents(
agents = Agents(
agents=[search_agent, analysis_agent],
tasks=[search_task, analyze_task],
process="sequential"
+2 -2
View File
@@ -5,7 +5,7 @@ This example demonstrates how to use basic user input to create dynamic agents a
The user is prompted for a search query, and the agent searches for information about it.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Get user input
user_query = input("What would you like to search for? ")
@@ -26,5 +26,5 @@ task = Task(
)
# Run
agents = PraisonAIAgents(agents=[agent], tasks=[task])
agents = Agents(agents=[agent], tasks=[task])
agents.start()
+2 -2
View File
@@ -10,7 +10,7 @@ To run this example:
"""
import streamlit as st
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import duckduckgo
# Set page configuration
@@ -125,7 +125,7 @@ if st.button("🚀 Submit", type="primary", use_container_width=True):
)
# Run agents
agents = PraisonAIAgents(
agents = Agents(
agents=[agent],
tasks=[task],
process=process_type
@@ -5,7 +5,7 @@ This example demonstrates graph memory capabilities with PraisonAI agents
for knowledge graph construction and relationship-aware memory retrieval.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import internet_search
print("=== Advanced Graph Memory Integration Example ===\n")
@@ -59,7 +59,7 @@ query_task = Task(
)
# Run with graph memory integration
agents_system = PraisonAIAgents(
agents_system = Agents(
agents=[knowledge_agent],
tasks=[build_task, query_task],
memory=True,
@@ -5,7 +5,7 @@ This example demonstrates memory search optimization using PraisonAI's
built-in memory capabilities with semantic search and quality filtering.
"""
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import internet_search
print("=== Advanced Memory Search and Optimization Example ===\n")
@@ -60,7 +60,7 @@ search_task = Task(
)
# Run with memory optimization
agents_system = PraisonAIAgents(
agents_system = Agents(
agents=[research_agent],
tasks=[build_memory_task, search_task],
memory=True,
@@ -20,7 +20,7 @@ Prerequisites:
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
def main():
"""Demonstrate Gemini embedding usage"""
@@ -82,7 +82,7 @@ def main():
# Configure with Gemini embeddings
# Option 1: Using stable text-embedding-004
agents = PraisonAIAgents(
agents = Agents(
agents=[researcher, retriever],
tasks=[store_task, retrieve_task],
verbose=True,
@@ -98,7 +98,7 @@ def main():
)
# Alternative: Using experimental model with advanced features
# agents = PraisonAIAgents(
# agents = Agents(
# agents=[researcher, retriever],
# tasks=[store_task, retrieve_task],
# verbose=True,
+2 -2
View File
@@ -16,7 +16,7 @@ Setup:
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
def main():
# Example with Neo4j (uncomment and configure as needed)
@@ -150,7 +150,7 @@ def main():
)
# Run the multi-agent system with graph memory
agents_system = PraisonAIAgents(
agents_system = Agents(
agents=[researcher],
tasks=[build_knowledge_task, query_knowledge_task, expand_knowledge_task],
verbose=1,
@@ -34,9 +34,7 @@ agent = Agent(
llm=llm_config, # Pass the detailed configuration
verbose=True, # Enable detailed output
markdown=True, # Format responses in markdown
self_reflect=True, # Enable self-reflection
max_reflect=3, # Maximum reflection iterations
min_reflect=1 # Minimum reflection iterations
reflection=True # Enable self-reflection
)
# Test the agent
@@ -4,7 +4,7 @@ from praisonaiagents import Agent
agent = Agent(
instructions="You are a helpful assistant",
llm="gemini/gemini-1.5-flash-8b",
self_reflect=True,
reflection=True,
verbose=True
)
@@ -3,7 +3,7 @@ from praisonaiagents import Agent
agent = Agent(
instructions="You are a helpful assistant",
llm="gemini/gemini-1.5-flash-8b",
self_reflect=True,
reflection=True,
verbose=True
)
@@ -20,7 +20,7 @@ Features demonstrated:
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
from praisonaiagents.tools import mongodb_tools
# Ensure OpenAI API key is set
@@ -190,7 +190,7 @@ def main():
print("🚀 Starting Comprehensive MongoDB Business System...")
print("=" * 60)
business_system = PraisonAIAgents(
business_system = Agents(
agents=[data_manager, knowledge_curator, business_analyst, customer_service],
tasks=business_tasks,
memory=True,
@@ -19,7 +19,7 @@ Features demonstrated:
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Ensure OpenAI API key is set
if not os.environ.get("OPENAI_API_KEY"):
@@ -124,7 +124,7 @@ def main():
print("🚀 Starting MongoDB Knowledge Management System...")
print("=" * 60)
knowledge_system = PraisonAIAgents(
knowledge_system = Agents(
agents=[research_agent, knowledge_agent],
tasks=knowledge_tasks,
memory=True,
@@ -19,7 +19,7 @@ Features demonstrated:
"""
import os
from praisonaiagents import Agent, Task, PraisonAIAgents
from praisonaiagents import Agent, Task, Agents
# Ensure OpenAI API key is set
if not os.environ.get("OPENAI_API_KEY"):
@@ -91,7 +91,7 @@ def main():
print("🚀 Starting MongoDB Memory Research System...")
print("=" * 60)
research_system = PraisonAIAgents(
research_system = Agents(
agents=[research_agent],
tasks=research_tasks,
memory=True,
Loaded 100 of 423 files, more files were not shown because too many files have changed in this diff. Show more