diff --git a/examples/quickstart/Dockerfile b/examples/quickstart/Dockerfile new file mode 100644 index 000000000..d10e666ea --- /dev/null +++ b/examples/quickstart/Dockerfile @@ -0,0 +1,7 @@ +FROM dailyco/pipecat-base:latest + +COPY ./requirements.txt requirements.txt + +RUN pip install --no-cache-dir --upgrade -r requirements.txt + +COPY ./bot.py bot.py diff --git a/examples/quickstart/README.md b/examples/quickstart/README.md index eb811239c..cd2ca2f0d 100644 --- a/examples/quickstart/README.md +++ b/examples/quickstart/README.md @@ -4,15 +4,10 @@ Run your first Pipecat bot in under 5 minutes. This example creates a voice AI b ## Prerequisites -### Python 3.10+ +### Environment -Pipecat requires Python 3.10 or newer. Check your version: - -```bash -python --version -``` - -If you need to upgrade Python, we recommend using a version manager like `uv` or `pyenv`. +- Python 3.10 or later +- [uv](https://docs.astral.sh/uv/getting-started/installation/) package manager installed ### AI Service API keys @@ -26,26 +21,21 @@ Have your API keys ready. We'll add them to your `.env` shortly. ## Setup -1. Set up a virtual environment +### Set up your environment and dependencies -From the `examples/quickstart` directory, run: +From `examples/quickstart`, run: ```bash -python -m venv .venv -source .venv/bin/activate # On Windows: .venv\Scripts\activate +uv sync --extra webrtc \ + --extra daily \ + --extra silero \ + --extra deepgram \ + --extra openai \ + --extra cartesia \ + --extra runner ``` -> Using `uv`? Create your venv using: `uv venv && source .venv/bin/activate`. - -2. Install dependencies - -```bash -pip install -r requirements.txt -``` - -> Using `uv`? Install requirements using: `uv pip install -r requirements.txt`. - -3. Configure environment variables +### Configure environment variables Create a `.env` file: @@ -55,25 +45,110 @@ cp env.example .env Then, add your API keys: -``` +```ini DEEPGRAM_API_KEY=your_deepgram_api_key OPENAI_API_KEY=your_openai_api_key CARTESIA_API_KEY=your_cartesia_api_key ``` -4. Run the example - -Run your bot using: +## Run your bot locally ```bash -python bot.py +uv run bot.py ``` -> Using `uv`? Run your bot using: `uv run bot.py`. - **Open http://localhost:7860 in your browser** and click `Connect` to start talking to your bot. -> 💡 First run note: The initial startup may take ~10 seconds as Pipecat downloads required models, like the Silero VAD model. +> 💡 First run note: The initial startup may take ~20 seconds as Pipecat downloads required models and imports. + +## Deploy to Pipecat Cloud (Optional) + +Pipecat Cloud is a managed platform for hosting and scaling your Pipecat bots in production. + +[Sign up](https://pipecat.daily.co/sign-up) for a Pipecat Cloud account and deploy your bot in minutes. + +### Setup + +#### Install `pipecatcloud` + +The `pipecatcloud` CLI manages your Pipecat deployments, secrets, and organization. Install in your virtual enviroment: + +```bash +uv add pipecatcloud +``` + +> 💡 Tip: You can run the `pipecatcloud` CLI using the `pcc` alias. + +#### Docker + +Pipecat Cloud expects a built Docker image that includes the agent code and all dependencies. You need to: + +1. Install [Docker](https://www.docker.com/) on your system. +2. Create a container registry account. We'll use [Docker Hub](https://hub.docker.com/) in this example. + +### Configure pcc-deploy.toml + +The `pcc-deploy.toml` file is the spec for your Pipecat Cloud deployment. + +```ini +agent_name = "quickstart" +image = "your_username/quickstart:0.1" +secret_set = "quickstart-secrets" + +[scaling] + min_agents = 1 +``` + +Details: + +- `agent_name`: the name of your Pipecat Cloud agent +- `image`: your Docker Hub username and image tag (image_name:version) to run +- `secret_set`: environment variable secrets that you can use in your bot file +- `min_agents`: the number of reserve instances you'll run. We'll start with 1 to ensure you get an instant start + +> 💡 Tip: [Set up `image_credentials`](https://docs.pipecat.ai/deployment/pipecat-cloud/fundamentals/secrets#image-pull-secrets) in your TOML file for authenticated image pulls + +### Configure secrets + +Store your secrets in Pipecat Cloud and use the environment variable keys in your bot file. To create secrets, run: + +```bash +uv run pcc secrets set quickstart-secrets --file .env +``` + +This command creates a new secret set called `quickstart-secrets`. This value must match the `secret_set` in your TOML file. The `--file` arg points your `.env` file. This will add all environment variables from the file to the secret set. + +## Build and push your Docker image + +Pipecat Cloud expects a built Docker image that includes the agent code and all dependencies. You can build, tag, and push your Docker image using the included `build.sh` shell script: + +1. Login to Docker Hub: + + ```bash + docker login + ``` + +2. Update the `VERSION`, `DOCKER_USERNAME`, and `AGENT_NAME` to match your TOML file. +3. Run the script: + + ```bash + ./build.sh + ``` + +## Deploy your agent + +You're ready to deploy your agent. Use the following command to deploy your agent according to the spec in your `pcc-deploy.toml` file: + +```bash +uv run pcc deploy +``` + +## Connect to your agent + +The Pipecat Cloud dashboard has a Sandbox which makes it easy to talk to your agent. In your [Pipecat Cloud dashboard](https://pipecat.daily.co/), select your `quickstart` agent > Sandbox. + +- Accept the browser prompt for device access. +- Click `Connect` to start your agent. ## Troubleshooting diff --git a/examples/quickstart/bot.py b/examples/quickstart/bot.py index ef201d25a..8e35809cc 100644 --- a/examples/quickstart/bot.py +++ b/examples/quickstart/bot.py @@ -7,15 +7,13 @@ """Pipecat Quickstart Example. The example runs a simple voice AI bot that you can connect to using your -browser and speak with it. +browser and speak with it. You can also deploy this bot to Pipecat Cloud. Required AI services: - Deepgram (Speech-to-Text) - OpenAI (LLM) - Cartesia (Text-to-Speech) -The example connects between client and server using a P2P WebRTC connection. - Run the bot using:: python bot.py @@ -27,7 +25,7 @@ from dotenv import load_dotenv from loguru import logger print("🚀 Starting Pipecat bot...") -print("⏳ Loading AI models (30-40 seconds first run, <2 seconds after)\n") +print("⏳ Loading models and imports (20 seconds first run only)\n") logger.info("Loading Silero VAD model...") from pipecat.audio.vad.silero import SileroVADAnalyzer @@ -40,15 +38,12 @@ from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext from pipecat.processors.frameworks.rtvi import RTVIConfig, RTVIObserver, RTVIProcessor from pipecat.runner.types import RunnerArguments +from pipecat.runner.utils import create_transport from pipecat.services.cartesia.tts import CartesiaTTSService from pipecat.services.deepgram.stt import DeepgramSTTService from pipecat.services.openai.llm import OpenAILLMService from pipecat.transports.base_transport import BaseTransport, TransportParams - -logger.info("✅ Pipeline components loaded") - -logger.info("Loading WebRTC transport...") -from pipecat.transports.network.small_webrtc import SmallWebRTCTransport +from pipecat.transports.services.daily import DailyParams logger.info("✅ All components loaded successfully!") @@ -121,14 +116,20 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments): async def bot(runner_args: RunnerArguments): """Main bot entry point for the bot starter.""" - transport = SmallWebRTCTransport( - params=TransportParams( + transport_params = { + "daily": lambda: DailyParams( audio_in_enabled=True, audio_out_enabled=True, vad_analyzer=SileroVADAnalyzer(), ), - webrtc_connection=runner_args.webrtc_connection, - ) + "webrtc": lambda: TransportParams( + audio_in_enabled=True, + audio_out_enabled=True, + vad_analyzer=SileroVADAnalyzer(), + ), + } + + transport = await create_transport(runner_args, transport_params) await run_bot(transport, runner_args) diff --git a/examples/quickstart/build.sh b/examples/quickstart/build.sh new file mode 100755 index 000000000..689587e85 --- /dev/null +++ b/examples/quickstart/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +VERSION="0.1" +DOCKER_USERNAME="your_username" +AGENT_NAME="quickstart" + +# Build the Docker image with the correct context +echo "Building Docker image..." +docker build --platform=linux/arm64 -t "$DOCKER_USERNAME/$AGENT_NAME:$VERSION" -t "$DOCKER_USERNAME/$AGENT_NAME:latest" . + +# Push the Docker images +echo "Pushing Docker image $DOCKER_USERNAME/$AGENT_NAME:$VERSION..." +docker push "$DOCKER_USERNAME/$AGENT_NAME:$VERSION" + +echo "Pushing Docker image $DOCKER_USERNAME/$AGENT_NAME:latest..." +docker push "$DOCKER_USERNAME/$AGENT_NAME:latest" + +echo "Successfully built and pushed $DOCKER_USERNAME/$AGENT_NAME:$VERSION and $DOCKER_USERNAME/$AGENT_NAME:latest" \ No newline at end of file diff --git a/examples/quickstart/env.example b/examples/quickstart/env.example index b3e882f5d..36048f91f 100644 --- a/examples/quickstart/env.example +++ b/examples/quickstart/env.example @@ -1,3 +1,6 @@ DEEPGRAM_API_KEY=your_deepgram_api_key OPENAI_API_KEY=your_openai_api_key -CARTESIA_API_KEY=your_cartesia_api_key \ No newline at end of file +CARTESIA_API_KEY=your_cartesia_api_key + +# Optional: Connect via Daily WebRTC locally +DAILY_API_KEY=your_daily_api_key \ No newline at end of file diff --git a/examples/quickstart/pcc-deploy.toml b/examples/quickstart/pcc-deploy.toml new file mode 100644 index 000000000..28413327f --- /dev/null +++ b/examples/quickstart/pcc-deploy.toml @@ -0,0 +1,6 @@ +agent_name = "quickstart" +image = "your_username/quickstart:0.1" +secret_set = "quickstart-secrets" + +[scaling] + min_agents = 1 diff --git a/examples/quickstart/requirements.txt b/examples/quickstart/requirements.txt index fed2cfb34..b271490be 100644 --- a/examples/quickstart/requirements.txt +++ b/examples/quickstart/requirements.txt @@ -1 +1,2 @@ -pipecat-ai[webrtc,silero,deepgram,openai,cartesia,runner]>=0.0.77 \ No newline at end of file +pipecat-ai[webrtc,websocket,daily,silero,deepgram,openai,cartesia,runner]>=0.0.77 +pipecatcloud>=0.2.1 \ No newline at end of file