Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
328 changes: 328 additions & 0 deletions api-reference/cli/create.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,328 @@
---
title: create
description: "Scaffold a new Pipecat project with an interactive wizard or CLI flags"
---

Create a new Pipecat project with guided setup for bot type, transport, AI services, and deployment options. Supports both an interactive wizard and a fully non-interactive mode for automation.

**Usage:**

```shell
pipecat create [OPTIONS]
```

<Tip>
To make an existing project agent-ready (so an AI coding assistant follows
Pipecat conventions and can drive `pipecat create` for you), see
[`pipecat init`](/api-reference/cli/init).
</Tip>

**Options:**

<ParamField path="--output / -o" type="string">
Output directory where files will be saved. Defaults to current directory.
</ParamField>

<ParamField path="--name / -n" type="string">
Project name. Providing this flag triggers non-interactive mode.
</ParamField>

<ParamField path="--bot-type / -b" type="string">
Bot type: `web` or `telephony`.
</ParamField>

<ParamField path="--transport / -t" type="string">
Transport provider. Repeatable for multiple transports (e.g. `-t daily -t
smallwebrtc`). Valid values: `daily`, `smallwebrtc`, `twilio`, `telnyx`,
`plivo`, `exotel`, `daily_pstn`, `twilio_daily_sip`.
</ParamField>

<ParamField path="--mode / -m" type="string">
Pipeline mode: `cascade` or `realtime`.
</ParamField>

<ParamField path="--stt" type="string">
Speech-to-Text service (cascade mode). e.g. `deepgram_stt`, `openai_stt`.
</ParamField>

<ParamField path="--llm" type="string">
Language model service (cascade mode). e.g. `openai_llm`, `anthropic_llm`.
</ParamField>

<ParamField path="--tts" type="string">
Text-to-Speech service (cascade mode). e.g. `cartesia_tts`, `elevenlabs_tts`.
</ParamField>

<ParamField path="--realtime" type="string">
Realtime service (realtime mode). e.g. `openai_realtime`,
`gemini_live_realtime`.
</ParamField>

<ParamField path="--video" type="string">
Video avatar service (web bots only). e.g. `heygen_video`, `tavus_video`,
`simli_video`.
</ParamField>

<ParamField path="--client-framework" type="string">
Client framework (web bots only): `react`, `vanilla`, or `none`.
</ParamField>

<ParamField path="--client-server" type="string">
Client dev server (when using `--client-framework react`): `vite` or `nextjs`.
</ParamField>

<ParamField path="--daily-pstn-mode" type="string">
Daily PSTN mode (required when transport is `daily_pstn`): `dial-in` or
`dial-out`.
</ParamField>

<ParamField path="--twilio-daily-sip-mode" type="string">
Twilio + Daily SIP mode (required when transport is `twilio_daily_sip`):
`dial-in` or `dial-out`.
</ParamField>

<ParamField path="--recording / --no-recording" type="boolean" default="false">
Enable audio recording.
</ParamField>

<ParamField
path="--transcription / --no-transcription"
type="boolean"
default="false"
>
Enable transcription logging.
</ParamField>

<ParamField
path="--video-input / --no-video-input"
type="boolean"
default="false"
>
Enable video input (web bots only).
</ParamField>

<ParamField
path="--video-output / --no-video-output"
type="boolean"
default="false"
>
Enable video output (web bots only).
</ParamField>

<ParamField
path="--deploy-to-cloud / --no-deploy-to-cloud"
type="boolean"
default="true"
>
Generate Pipecat Cloud deployment files (Dockerfile, pcc-deploy.toml).
</ParamField>

<ParamField
path="--enable-krisp / --no-enable-krisp"
type="boolean"
default="false"
>
Enable Krisp noise cancellation (requires cloud deployment).
</ParamField>

<ParamField
path="--observability / --no-observability"
type="boolean"
default="false"
>
Enable observability.
</ParamField>

<ParamField path="--eval / --no-eval" type="boolean" default="false">
Make the generated bot eval-ready: add an `eval` transport entry and starter
scenarios in `server/evals/`, plus the dependencies to run them. See the
evals docs for the verification workflow.
</ParamField>

<ParamField path="--config / -c" type="string">
Path to a JSON config file. Triggers non-interactive mode. CLI flags override
file values.
</ParamField>

<ParamField path="--dry-run" type="boolean" default="false">
Print the resolved configuration as JSON without generating any files.
</ParamField>

<ParamField path="--list-options" type="boolean" default="false">
Print all available service options as JSON and exit. Useful for CI scripts
and coding agents that need to discover valid values at runtime.
</ParamField>

## Quickstart Project

To scaffold the canned quickstart project (sensible defaults, no prompts):

```shell
pipecat create quickstart
```

## Interactive Setup

When run without `--name` or `--config`, the CLI guides you through selecting:

- **Bot type and client framework** - Phone, web (Next.js, Vite, Vanilla JS), or mobile
- **Transport provider** - Daily, Twilio, Telnyx, Plivo, Exotel
- **Pipeline mode** - Cascade or Realtime
- **AI services** - STT, LLM, and TTS providers
- **Optional features** - Additional capabilities for your bot
- **Deployment target** - Local development or Pipecat Cloud

## Non-Interactive Mode

When `--name` or `--config` is provided, all configuration is taken from CLI flags or a JSON config file with no interactive prompts. This is useful for automation, scripting, and coding agents.

All required fields must be specified or the command exits with a list of all missing/invalid fields.

## Examples

### Interactive Wizard

```shell
pipecat create
```

### Non-Interactive (Cascade)

```shell
pipecat create --name my-bot --bot-type web --transport daily \
--mode cascade --stt deepgram_stt --llm openai_llm --tts cartesia_tts
```

### Non-Interactive (Realtime)

```shell
pipecat create --name rt-bot --bot-type web --transport smallwebrtc \
--mode realtime --realtime openai_realtime
```

### Multiple Transports

```shell
pipecat create --name my-bot --bot-type web \
--transport daily --transport smallwebrtc \
--mode cascade --stt deepgram_stt --llm openai_llm --tts cartesia_tts
```

### With React Client

```shell
pipecat create --name my-bot --bot-type web --transport daily \
--mode cascade --stt deepgram_stt --llm openai_llm --tts cartesia_tts \
--client-framework react --client-server vite
```

### Telephony

```shell
pipecat create --name call-bot --bot-type telephony --transport twilio \
--mode cascade --stt deepgram_stt --llm openai_llm --tts cartesia_tts
```

### Eval-Ready Bot

```shell
pipecat create --name my-bot --bot-type web --transport daily \
--mode cascade --stt deepgram_stt --llm openai_llm --tts cartesia_tts \
--eval
```

### Discover Available Options

```shell
# List all valid service values as JSON
pipecat create --list-options
```

Output:

```json
{
"bot_type": ["web", "telephony"],
"transports": {
"web": ["daily", "smallwebrtc"],
"telephony": ["twilio", "twilio_daily_sip_dialin", "twilio_daily_sip_dialout", ...]
},
"stt": ["deepgram_stt", "mistral_stt", "openai_stt", "xai_stt", ...],
"llm": ["openai_llm", "anthropic_llm", ...],
"tts": ["cartesia_tts", "elevenlabs_tts", "soniox_tts", ...],
"realtime": ["openai_realtime", "gemini_live_realtime", ...],
"video": ["heygen_video", "tavus_video", "simli_video"]
}
```

This is useful for scripting — for example, to pick a random TTS provider:

```shell
options=$(pipecat create --list-options)
tts=$(echo "$options" | jq -r '.tts[0]')
```

### Dry Run

```shell
# Preview resolved config as JSON without generating files
pipecat create --name my-bot --bot-type web --transport daily \
--mode cascade --stt deepgram_stt --llm openai_llm --tts cartesia_tts \
--dry-run
```

### From Config File

```shell
pipecat create --config project-config.json
```

Sample `project-config.json`:

```json
{
"project_name": "my-bot",
"bot_type": "web",
"transports": ["daily"],
"mode": "cascade",
"stt_service": "deepgram_stt",
"llm_service": "openai_llm",
"tts_service": "cartesia_tts",
"recording": false,
"transcription": false,
"deploy_to_cloud": true,
"enable_krisp": false,
"enable_observability": false
}
```

CLI flags override any values in the file, so you can use a base config and customize per-run:

```shell
pipecat create --config base-config.json --name custom-name --no-deploy-to-cloud
```

### Specify Output Directory

```shell
pipecat create --output my-bot
```

## Generated Project Structure

```
mybot/
├── server/ # Python bot server
│ ├── bot.py # Main bot implementation
│ ├── evals/ # Starter eval scenarios (with --eval)
│ ├── pyproject.toml # Python dependencies
│ ├── .env.example # Environment variables template
│ ├── Dockerfile # Container image (if cloud enabled)
│ └── pcc-deploy.toml # Deployment config (if cloud enabled)
├── client/ # Web client (if generated)
│ ├── src/
│ ├── package.json
│ └── ...
├── .gitignore
└── README.md # Project setup instructions
```
Loading
Loading