Deploy CrewAI as a standalone Python application.
mkdir crewai-app
cd crewai-app
mkdir -p src/my_crew config output
python -m venv venv
source venv/bin/activate # Linux/macOS
# or
venv\Scripts\activate # Windows
Create requirements.txt:
crewai==1.10.1
crewai-tools>=0.10.0
python-dotenv>=1.0.0
langchain-openai>=0.2.0
Install:
pip install -r requirements.txt
Create config/agents.yaml:
researcher:
role: >
{topic} Senior Data Researcher
goal: >
Uncover cutting-edge developments in {topic}
backstory: >
You're a seasoned researcher with a knack for uncovering the latest
developments in {topic}. Known for finding insights others miss.
verbose: true
allow_delegation: false
writer:
role: >
{topic} Content Writer
goal: >
Create engaging content about {topic}
backstory: >
You're a skilled writer who makes complex topics accessible.
verbose: true
allow_delegation: true
Create config/tasks.yaml:
research_task:
description: >
Conduct thorough research about {topic}
expected_output: >
A list with 10 bullet points of the most relevant information
agent: researcher
writing_task:
description: >
Create a blog post based on research findings
expected_output: >
A 500-word engaging blog post
agent: writer
output_file: output/blog_post.md
Create src/my_crew/main.py:
import os
from dotenv import load_dotenv
from crewai import Crew, Process, Agent, Task
from crewai.project import CrewBase, agent, task, crew
# Load environment variables
load_dotenv()
@CrewBase
class MyCrew:
"""My CrewAI Project"""
agents_config = 'config/agents.yaml'
tasks_config = 'config/tasks.yaml'
@agent
def researcher(self) -> Agent:
return Agent(
config=self.agents_config['researcher'],
tools=[] # Add tools if needed
)
@agent
def writer(self) -> Agent:
return Agent(
config=self.agents_config['writer'],
tools=[]
)
@task
def research_task(self) -> Task:
return Task(
config=self.tasks_config['research_task'],
output_file='output/research.md'
)
@task
def writing_task(self) -> Task:
return Task(
config=self.tasks_config['writing_task'],
output_file='output/blog_post.md'
)
@crew
def crew(self) -> Crew:
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential,
verbose=True
)
def run():
"""Run the crew."""
inputs = {
'topic': 'AI developments in 2026'
}
crew_instance = MyCrew().crew()
result = crew_instance.kickoff(inputs=inputs)
print("\n\n########################")
print("## Here is the result")
print("########################\n")
print(result)
if __name__ == "__main__":
run()
Create .env file:
OPENAI_API_KEY=sk-your-openai-api-key-here
SERPER_API_KEY=your-serper-api-key # Optional, for web search
CREWAI_TELEMETRY_DISABLED=true
python src/my_crew/main.py
Create api.py:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from src.my_crew.main import MyCrew
app = FastAPI()
class CrewInput(BaseModel):
topic: str
class CrewOutput(BaseModel):
result: str
@app.post("/run", response_model=CrewOutput)
async def run_crew(input_data: CrewInput) -> CrewOutput:
try:
crew_instance = MyCrew().crew()
result = crew_instance.kickoff(inputs={'topic': input_data.topic})
return CrewOutput(result=str(result))
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health():
return {"status": "healthy"}
Install dependencies:
pip install fastapi uvicorn
Run:
uvicorn api:app --host 0.0.0.0 --port 8000
Create /etc/systemd/system/crewai.service:
[Unit]
Description=CrewAI Application
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/crewai
Environment="PATH=/opt/crewai/venv/bin"
Environment="OPENAI_API_KEY=your-api-key"
Environment="CREWAI_TELEMETRY_DISABLED=true"
ExecStart=/opt/crewai/venv/bin/python src/my_crew/main.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Enable and start:
sudo systemctl daemon-reload
sudo systemctl enable crewai
sudo systemctl start crewai
sudo systemctl status crewai
Edit crontab:
crontab -e
Add entry (run daily at 6 AM):
0 6 * * * cd /opt/crewai && /opt/crewai/venv/bin/python src/my_crew/main.py >> /var/log/crewai.log 2>&1
Create logging_config.py:
import logging
import sys
def setup_logging():
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('crewai.log'),
logging.StreamHandler(sys.stdout)
]
)
Use in main.py:
from logging_config import setup_logging
setup_logging()
logger = logging.getLogger(__name__)
def run():
logger.info("Starting CrewAI execution...")
# ... rest of code