Batteries-included framework for building automation-focused AI agents with observability
Project description
agent-workshop
Batteries-included framework for building automation-focused AI agents with full observability.
๐ฆ Install as a Package: Users should install agent-workshop via PyPI (
uv add agent-workshoporpip install agent-workshop), not clone this repository. This repo is for framework development only. See Quick Start for the correct workflow.
๐ NEW in v0.2.0: Pre-built agents with customizable prompts! Install
agent-workshop[agents]to get production-ready validators and pipelines you can use immediately or customize for your needs.
Features
๐ Dual-Provider Architecture
- Development: Claude Agent SDK ($20/month flat rate)
- Production: Anthropic API (pay-per-token)
- Automatic switching based on environment
๐ Full Observability
- Langfuse integration out of the box
- Automatic tracing of all LLM calls
- Cost tracking and token estimation
- Performance metrics
๐ธ๏ธ LangGraph Support
- Multi-step agent workflows
- State management
- Conditional routing
- Iterative refinement
โก Fast Setup with UV
- Modern dependency management
- 10-100x faster than pip/poetry
- Reproducible environments
๐ค Pre-built Agents (NEW in v0.2.0)
- Production-ready validators and pipelines
- Customizable prompts via env vars, YAML, or code
- Built-in presets for common use cases
- 5-minute setup to first validation
Quick Start
Option 1: Pre-built Agents (Fastest - 5 minutes)
Perfect for: Getting started quickly, common validation tasks, learning the framework
# Install with pre-built agents
uv add 'agent-workshop[agents]'
# Configure environment
cat > .env.development << 'EOF'
AGENT_WORKSHOP_ENV=development
CLAUDE_SDK_ENABLED=true
CLAUDE_MODEL=sonnet
# Langfuse (optional)
LANGFUSE_ENABLED=true
LANGFUSE_PUBLIC_KEY=your_public_key
LANGFUSE_SECRET_KEY=your_secret_key
LANGFUSE_HOST=https://cloud.langfuse.com
EOF
# Use immediately with built-in preset
python -c "
import asyncio
from agent_workshop.agents.validators import DeliverableValidator
from agent_workshop.agents.validators.presets import get_preset
from agent_workshop import Config
async def main():
# Use financial report preset
preset = get_preset('financial_report')
validator = DeliverableValidator(Config(), **preset)
result = await validator.run('Your financial report content...')
print(result)
asyncio.run(main())
"
Available presets:
financial_report- Financial reports and statements (GAAP, SEC compliance)research_paper- Academic research papers (methodology, citations)technical_spec- Technical documentation (API docs, architecture)marketing_content- Marketing materials (brand voice, SEO, CTAs)legal_document- Legal documents (contracts, compliance)general- General-purpose validation
Customize via YAML config:
# prompts.yaml
deliverable_validator:
system_prompt: "Custom system prompt for your use case..."
validation_criteria:
- "Custom criterion 1"
- "Custom criterion 2"
output_format: json
from agent_workshop.agents.validators import DeliverableValidator
from agent_workshop import Config
# Automatically loads prompts.yaml if present
validator = DeliverableValidator(Config())
result = await validator.run(content)
See prompts.yaml.example for full configuration options.
Option 2: Custom Agents (Full Flexibility)
Perfect for: Unique use cases, complex workflows, maximum customization
Installation:
# Install core framework (no pre-built agents)
uv add agent-workshop
# Or install with Claude SDK for development
uv add 'agent-workshop[claude-agent]'
Simple Agent (80% use case):
from agent_workshop import Agent, Config
class DeliverableValidator(Agent):
async def run(self, content: str) -> dict:
messages = [{
"role": "user",
"content": f"Validate this deliverable:\n\n{content}"
}]
result = await self.complete(messages)
return {"validation": result}
# Usage
config = Config() # Auto-detects dev/prod environment
validator = DeliverableValidator(config)
result = await validator.run(report_content)
LangGraph Workflow (15% use case)
from agent_workshop.workflows import LangGraphAgent
from langgraph.graph import StateGraph, END
class ValidationPipeline(LangGraphAgent):
def build_graph(self):
workflow = StateGraph(dict)
workflow.add_node("scan", self.quick_scan)
workflow.add_node("verify", self.verify)
workflow.add_edge("scan", "verify")
workflow.add_edge("verify", END)
workflow.set_entry_point("scan")
return workflow.compile()
async def quick_scan(self, state):
result = await self.provider.complete([{
"role": "user",
"content": f"Quick scan: {state['content']}"
}])
return {"scan_result": result, **state}
async def verify(self, state):
result = await self.provider.complete([{
"role": "user",
"content": f"Verify: {state['scan_result']}"
}])
return {"final_result": result}
# Usage (still single invocation!)
pipeline = ValidationPipeline(Config())
result = await pipeline.run({"content": report})
Pre-built Agents Reference
DeliverableValidator
Production-ready validator for documents with customizable prompts and criteria.
Usage:
from agent_workshop.agents.validators import DeliverableValidator
from agent_workshop import Config
# Option 1: Use preset
from agent_workshop.agents.validators.presets import get_preset
preset = get_preset("financial_report")
validator = DeliverableValidator(Config(), **preset)
# Option 2: Custom prompts
validator = DeliverableValidator(
config=Config(),
system_prompt="You are a compliance validator...",
validation_criteria=["Criterion 1", "Criterion 2"],
output_format="json"
)
# Option 3: YAML config (loads prompts.yaml automatically)
validator = DeliverableValidator(Config())
result = await validator.run(document_content)
ValidationPipeline
Multi-step LangGraph pipeline for thorough validation.
Usage:
from agent_workshop.agents.pipelines import ValidationPipeline
from agent_workshop import Config
# Default prompts
pipeline = ValidationPipeline(Config())
# Custom prompts
pipeline = ValidationPipeline(
config=Config(),
quick_scan_prompt="Custom scan for {content}",
detailed_verify_prompt="Custom verify for {scan_result} and {content}"
)
result = await pipeline.run({"content": document_content})
Configuration
Environment Setup
In your project directory, create .env.development or .env.production:
# .env.development
AGENT_WORKSHOP_ENV=development
# Claude Agent SDK (development)
CLAUDE_SDK_ENABLED=true
CLAUDE_MODEL=sonnet # opus, sonnet, haiku
# Anthropic API (production - optional in dev)
ANTHROPIC_API_KEY=your_api_key_here
ANTHROPIC_MODEL=claude-sonnet-4-20250514
# Langfuse Observability (optional but recommended)
LANGFUSE_ENABLED=true
LANGFUSE_PUBLIC_KEY=your_public_key
LANGFUSE_SECRET_KEY=your_secret_key
LANGFUSE_HOST=https://cloud.langfuse.com
For a complete example, see the .env.example in the repository.
Provider Switching
The framework automatically switches providers based on environment:
- Development (
AGENT_WORKSHOP_ENV=development): Uses Claude Agent SDK - Production (
AGENT_WORKSHOP_ENV=production): Uses Anthropic API
Troubleshooting
Langfuse Authentication Warnings
Problem: You see warnings like "Langfuse client initialized without public_key"
Solution: This is usually caused by missing environment variables. The framework now automatically loads .env files before initializing Langfuse, but you need to ensure:
-
Create the correct .env file:
# For development cp .env.example .env.development # Edit and add your Langfuse credentials LANGFUSE_PUBLIC_KEY=pk-lf-... LANGFUSE_SECRET_KEY=sk-lf-...
-
Set the environment:
export AGENT_WORKSHOP_ENV=development
-
Test your Langfuse connection:
from agent_workshop.utils import test_langfuse_connection if test_langfuse_connection(): print("โ Langfuse configured correctly") else: print("โ Check your credentials")
If you don't want to use Langfuse:
# In your .env file
LANGFUSE_ENABLED=false
Environment Variables Not Loading
Problem: Environment variables from .env files aren't being picked up
Cause: The .env file needs to match your environment:
AGENT_WORKSHOP_ENV=developmentโ looks for.env.developmentAGENT_WORKSHOP_ENV=productionโ looks for.env.production- Default โ looks for
.env
Solution:
# Option 1: Use environment-specific files (recommended)
export AGENT_WORKSHOP_ENV=development
# Then create .env.development
# Option 2: Use generic .env file
# Just create .env (no export needed)
Provider Configuration Errors
Problem: "No valid provider configuration found"
Solution: Ensure you have credentials for at least one provider:
For Development:
CLAUDE_SDK_ENABLED=true
CLAUDE_MODEL=sonnet
For Production:
ANTHROPIC_API_KEY=your_key_here
ANTHROPIC_MODEL=claude-sonnet-4-20250514
Import Errors
Problem: ModuleNotFoundError: No module named 'agent_workshop'
Solution: Install the package (not clone the repo):
# Correct way (users)
uv add agent-workshop
# Or with pip
pip install agent-workshop
# Incorrect way
git clone https://github.com/trentleslie/agent-workshop.git # โ Only for contributors
Claude Agent SDK Issues
Problem: "claude-agent-sdk is not installed"
Solution: Install with the optional extra:
uv add 'agent-workshop[claude-agent]'
# Or with pip
pip install 'agent-workshop[claude-agent]'
Getting Help
If you encounter other issues:
- Check the examples in the repository
- Review the documentation
- Open an issue with:
- Your Python version (
python --version) - Your environment configuration (
.envfile, with credentials redacted) - Full error message and traceback
- Your Python version (
Design Philosophy
Single-Message Pattern
agent-workshop focuses on single-message automation (input โ output), NOT streaming conversations.
Perfect for:
- โ Automated validations
- โ Batch processing
- โ Scheduled jobs
- โ CI/CD pipelines
Not designed for:
- โ ChatGPT-like interfaces
- โ Streaming conversations
- โ Real-time chat
Simple Agent vs LangGraph
| Use Case | Recommended Approach |
|---|---|
| Single validation check | Simple Agent |
| Multi-step validation pipeline | LangGraph |
| Batch processing | Simple Agent |
| Iterative refinement | LangGraph |
| One-shot classification | Simple Agent |
| Multi-agent collaboration | LangGraph |
Example Usage
Complete User Workflow
# 1. Create your project
mkdir my-research-agents
cd my-research-agents
# 2. Initialize and install
uv init
uv add agent-workshop
# 3. Create .env.development file with your keys
# 4. Create your first agent
cat > agents/validator.py << 'EOF'
from agent_workshop import Agent, Config
class DeliverableValidator(Agent):
async def run(self, content: str) -> dict:
messages = [{
"role": "user",
"content": f"Validate this deliverable:\n\n{content}"
}]
result = await self.complete(messages)
return {"validation": result}
EOF
# 5. Run your agent
python -c "
import asyncio
from agents.validator import DeliverableValidator
from agent_workshop import Config
async def main():
validator = DeliverableValidator(Config())
result = await validator.run('Sample deliverable content')
print(result)
asyncio.run(main())
"
Reference Examples
For complete examples, see the repository:
- Simple Validator - Single-message pattern, batch processing, cost tracking
- LangGraph Pipeline - Multi-step workflow, state management, conditional routing
Note: These examples are for reference only. Build your agents in your own project, not by cloning the framework repository.
Building Your Own Agents
Users: You build agents in your own project by installing agent-workshop as a dependency. See the Complete User Workflow above.
Your project structure should look like:
my-research-agents/ # Your project
โโโ pyproject.toml # dependencies = ["agent-workshop"]
โโโ .env.development
โโโ .env.production
โโโ agents/
โ โโโ __init__.py
โ โโโ deliverable_validator.py
โ โโโ analysis_checker.py
โโโ main.py
For detailed guidance, see the Building Agents Guide.
Contributing to the Framework
This section is for contributors who want to improve the agent-workshop framework itself.
Development Setup
# Clone the framework repository (contributors only)
git clone https://github.com/trentleslie/agent-workshop.git
cd agent-workshop
# Install with dev dependencies
uv sync --all-extras
# Run tests
uv run pytest
# Format code
uv run ruff format
# Type check
uv run mypy src/
Cost Comparison
| Environment | Provider | Cost Model | Best For |
|---|---|---|---|
| Development | Claude Agent SDK | $20/month flat | Unlimited experimentation |
| Production | Anthropic API | $3/1M input tokens $15/1M output tokens |
Production workloads |
Example: 1,000 validations/day with ~500 tokens each
- Development: $20/month (unlimited)
- Production: ~$30-50/month (depending on response length)
Architecture
User's Project (your own repo)
โโโ pyproject.toml
โ โโโ dependencies: ["agent-workshop"] โ Install as package
โโโ agents/
โ โโโ deliverable_validator.py
โ โโโ analysis_checker.py
โโโ .env.development
โ imports from
agent-workshop Package (from PyPI)
โโโ Agent (simple agents)
โโโ LangGraphAgent (workflows)
โโโ Providers (Claude SDK, Anthropic API)
โโโ Langfuse Integration
โ traces to
Langfuse Dashboard
โโโ Traces
โโโ Metrics
โโโ Costs
โโโ Performance
Key Point: Users install agent-workshop via uv add agent-workshop or pip install agent-workshop, they do NOT clone the repository.
Documentation
Full documentation available in the repository:
Contributing
Contributions welcome! Please see CONTRIBUTING.md for guidelines.
To contribute to the framework itself, see the Contributing to the Framework section above.
License
MIT License - see LICENSE for details.
Acknowledgments
Built with:
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agent_workshop-0.2.0.tar.gz.
File metadata
- Download URL: agent_workshop-0.2.0.tar.gz
- Upload date:
- Size: 182.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
750c60fbfe7ea4f4ceb2821b968ce97f85bb1becbd7fa79bc27f3f21a4c2d214
|
|
| MD5 |
ed04887bf014f6b93a1597be92ed887c
|
|
| BLAKE2b-256 |
e0470539bc54bb2ab17406d6a8e16f72ba8a8448478e3dd6e31fcdd0ebdf6d14
|
File details
Details for the file agent_workshop-0.2.0-py3-none-any.whl.
File metadata
- Download URL: agent_workshop-0.2.0-py3-none-any.whl
- Upload date:
- Size: 33.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1538b00831d0f467b29a2e052c7bf3c4dab58ba012b95bcfceeea1eb68ffa592
|
|
| MD5 |
15e144e16f03b6be68cdaa911c6af2e8
|
|
| BLAKE2b-256 |
0017053671b8e62d98d3969dcfe4ad45a7a74e694868fd878e39828038c02e45
|