Quickstart
Watch: Building CrewAI Agents & Flows with Coding Agent Skills
Section titled “Watch: Building CrewAI Agents & Flows with Coding Agent Skills”Install our coding agent skills (Claude Code, Codex, …) to quickly get your coding agents up and running with CrewAI.
You can install it with npx skills add crewaiinc/skills
In this guide you will create a Flow that sets a research topic, runs a crew with one agent (a researcher using web search), and ends with a markdown report on disk. Flows are the recommended way to structure production apps: they own state and execution order, while agents do the work inside a crew step.
If you have not installed CrewAI yet, follow the installation guide first.
Prerequisites
Section titled “Prerequisites”- Python environment and the CrewAI CLI (see installation)
- An LLM configured with the right API keys — see LLMs
- A Serper.dev API key (
SERPER_API_KEY) for web search in this tutorial
Build your first Flow
Section titled “Build your first Flow”- Create a Flow project
From your terminal, scaffold a Flow project (the folder name uses underscores, e.g.
latest_ai_flow):CodeTerminal window crewai create flow latest-ai-flowcd latest_ai_flowThis creates a Flow app under
src/latest_ai_flow/, including a starter crew undercrews/content_crew/that you will replace with a minimal single-agent research crew in the next steps. - Configure one agent in JSONC
Create
src/latest_ai_flow/crews/content_crew/agents/researcher.jsonc(create theagents/directory if needed). Variables like{topic}are filled fromcrew.kickoff(inputs=...).{"role": "{topic} Senior Data Researcher","goal": "Uncover cutting-edge developments in {topic}","backstory": "You're a seasoned researcher who finds relevant information and presents it clearly.","tools": ["SerperDevTool"],"settings": {"verbose": true}} - Configure the crew in `crew.jsonc`
Create
src/latest_ai_flow/crews/content_crew/crew.jsonc:{"name": "Research Crew","agents": ["researcher"],"tasks": [{"name": "research_task","description": "Conduct thorough research about {topic}. Use web search to find recent, credible information.","expected_output": "A markdown report with clear sections: key trends, notable tools or companies, and implications. Aim for 800-1200 words. No fenced code blocks around the whole document.","agent": "researcher","output_file": "output/report.md","markdown": true}],"process": "sequential","verbose": true} - Load the JSON crew (`content_crew.py`)
Replace the generated
content_crew.pywith a small loader that turnscrew.jsoncinto aCrew.src/latest_ai_flow/crews/content_crew/content_crew.py from pathlib import Pathfrom crewai.project import load_crewdef kickoff_content_crew(inputs: dict):crew, default_inputs = load_crew(Path(__file__).with_name("crew.jsonc"))return crew.kickoff(inputs={**default_inputs, **inputs}) - Define the Flow in `main.py`
Connect the crew to a Flow: a
@start()step sets the topic in state, and a@listenstep runs the crew. The task’soutput_filestill writesoutput/report.md.src/latest_ai_flow/main.py from pydantic import BaseModelfrom crewai.flow import Flow, listen, startfrom latest_ai_flow.crews.content_crew.content_crew import kickoff_content_crewclass ResearchFlowState(BaseModel):topic: str = ""report: str = ""class LatestAiFlow(Flow[ResearchFlowState]):@start()def prepare_topic(self, crewai_trigger_payload: dict | None = None):if crewai_trigger_payload:self.state.topic = crewai_trigger_payload.get("topic", "AI Agents")else:self.state.topic = "AI Agents"print(f"Topic: {self.state.topic}")@listen(prepare_topic)def run_research(self):result = kickoff_content_crew(inputs={"topic": self.state.topic})self.state.report = result.rawprint("Research crew finished.")@listen(run_research)def summarize(self):print("Report path: output/report.md")def kickoff():LatestAiFlow().kickoff()def plot():LatestAiFlow().plot()if __name__ == "__main__":kickoff() - Set environment variables
In
.envat the project root, set:SERPER_API_KEY— from Serper.dev- Your model provider keys as required — see LLM setup
- Install and runCode
Terminal window crewai installcrewai runcrewai runexecutes the Flow entrypoint defined in your project (same command as for crews; project type is"flow"inpyproject.toml). - Check the output
You should see logs from the Flow and the crew. Open
output/report.mdfor the generated report (excerpt):Code# AI Agents: Recent Landscape and Trends## Executive summary…## Key trends- **Tool use and orchestration** — …- **Enterprise adoption** — …## Implications…Your actual file will be longer and reflect live search results.
How this run fits together
Section titled “How this run fits together”- Flow —
LatestAiFlowrunsprepare_topicfirst, thenrun_research, thensummarize. State (topic,report) lives on the Flow. - Crew —
kickoff_content_crewloadscrew.jsoncand runs one task with one agent: the researcher uses Serper to search the web, then writes the structured report. - Artifact — The task’s
output_filewrites the report underoutput/report.md.
To go deeper on Flow patterns (routing, persistence, human-in-the-loop), see Build your first Flow and Flows. For crews without a Flow, see Crews. For a single Agent and kickoff() without tasks, see Agents.
Naming consistency
Section titled “Naming consistency”The names in crew.jsonc must match the files and task references you use:
agents: ["researcher"]loadsagents/researcher.jsonctasks[].agent: "researcher"assigns the task to that agent
Deploying
Section titled “Deploying”Push your Flow to CrewAI AMP once it runs locally and your project is in a GitHub repository. From the project root:
crewai logincrewai deploy createcrewai deploy statuscrewai deploy logscrewai deploy pushcrewai deploy listcrewai deploy remove <deployment_id>