pipecatcloud 0.7.2__tar.gz → 1.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.github/workflows/python-compatibility.yml +1 -1
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.github/workflows/tests.yml +2 -5
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/CHANGELOG.md +94 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/CLAUDE.md +5 -6
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/PKG-INFO +18 -19
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/README.md +16 -17
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/pyproject.toml +11 -6
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/__init__.py +27 -8
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/console_utils.py +62 -1
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/deploy_utils.py +18 -26
- pipecatcloud-1.0.1/src/pipecatcloud/agent.py +85 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/api.py +34 -1
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/auth.py +6 -17
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/deploy.py +11 -48
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/organizations.py +0 -22
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/secrets.py +1 -1
- pipecatcloud-1.0.1/src/pipecatcloud/cli/commands/spend_limit.py +260 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/config.py +1 -1
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/entry_point.py +2 -2
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/config.py +1 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/PKG-INFO +18 -19
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/SOURCES.txt +7 -2
- pipecatcloud-1.0.1/src/pipecatcloud.egg-info/entry_points.txt +2 -0
- pipecatcloud-1.0.1/src/pipecatcloud.egg-info/scm_file_list.json +70 -0
- pipecatcloud-1.0.1/src/pipecatcloud.egg-info/scm_version.json +8 -0
- pipecatcloud-1.0.1/tests/test_agent_args.py +64 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_agent_sessions.py +2 -2
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_agent_stop.py +2 -2
- pipecatcloud-1.0.1/tests/test_deploy_image_pull_secret.py +114 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_krisp_viva.py +19 -42
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_max_session_duration.py +1 -1
- pipecatcloud-1.0.1/tests/test_spend_limit.py +337 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/uv.lock +375 -311
- pipecatcloud-0.7.2/src/pipecatcloud/__main__.py +0 -15
- pipecatcloud-0.7.2/src/pipecatcloud/agent.py +0 -161
- pipecatcloud-0.7.2/src/pipecatcloud.egg-info/entry_points.txt +0 -6
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.claude/settings.json +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.github/workflows/format.yml +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.github/workflows/publish-pypi.yml +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.github/workflows/publish-test.yml +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.gitignore +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/.pre-commit-config.yaml +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/LICENSE +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/pipecat-cloud.png +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/pytest.ini +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/scripts/fix-ruff.sh +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/setup.cfg +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/__version__.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/__init__.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/async_utils.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/auth_utils.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/build_utils.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/regions.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/__init__.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/api.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/__init__.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/agent.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/build.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/docker.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/regions.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/constants.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/exception.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/py.typed +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/session.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud/smallwebrtc/session_manager.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/dependency_links.txt +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/requires.txt +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/top_level.txt +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/__init__.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/conftest.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_api_client.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_auth.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_build_utils.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_config_file.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_deploy_poll.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_deployment_status.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_docker_commands.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_pat_auth.py +0 -0
- {pipecatcloud-0.7.2 → pipecatcloud-1.0.1}/tests/test_regions.py +0 -0
|
@@ -33,9 +33,6 @@ jobs:
|
|
|
33
33
|
run: |
|
|
34
34
|
uv sync --group dev
|
|
35
35
|
|
|
36
|
-
- name:
|
|
36
|
+
- name: Run tests
|
|
37
37
|
run: |
|
|
38
|
-
uv run pytest
|
|
39
|
-
|
|
40
|
-
# Note: test_agent_sessions.py is excluded because it requires complex
|
|
41
|
-
# API mocking for CI. These tests can be run locally with proper auth.
|
|
38
|
+
uv run pytest -v
|
|
@@ -5,6 +5,100 @@ All notable changes to **Pipecat Cloud** will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.0.1] - 2026-07-13
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- `pipecat cloud deploy` now verifies the image pull secret passed via
|
|
13
|
+
`--credentials` by looking it up in the secrets list, matching on both name
|
|
14
|
+
and type. Previously the check misread an API error response as "secret
|
|
15
|
+
exists", and a regular secret set with the same name also passed. A deploy
|
|
16
|
+
referencing a missing image pull secret now aborts with a clear error
|
|
17
|
+
instead of proceeding.
|
|
18
|
+
|
|
19
|
+
- Documentation links in CLI output now point to `docs.pipecat.ai` instead of
|
|
20
|
+
the retired `docs.pipecat.daily.co` domain. API error panels link directly
|
|
21
|
+
to the matching entry in the error codes reference, and the deploy and
|
|
22
|
+
image pull secret prompts link to the image pull secrets guide.
|
|
23
|
+
|
|
24
|
+
## [1.0.0] - 2026-06-19
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- New `pipecat cloud spend-limit` command group for managing the organization-level
|
|
29
|
+
spend cap:
|
|
30
|
+
- `pipecat cloud spend-limit show` prints the current limit, period spend, period
|
|
31
|
+
boundaries, and blocked state. Pass `--json` for machine-readable output.
|
|
32
|
+
- `pipecat cloud spend-limit set <amount>` sets a new limit. The amount is in
|
|
33
|
+
dollars with at most two decimal places (e.g. `50` or `12.34`). The
|
|
34
|
+
command prompts before setting the limit to `$0` or below current
|
|
35
|
+
spend; pass `-y/--yes` to skip the prompt.
|
|
36
|
+
- `pipecat cloud spend-limit clear` removes the limit, with the same confirmation
|
|
37
|
+
behavior.
|
|
38
|
+
|
|
39
|
+
- Any CLI command that surfaces an HTTP 402 `SPEND_LIMIT_REACHED` error now
|
|
40
|
+
renders a wrapped remediation message that explains how to unblock new
|
|
41
|
+
sessions, instead of a generic API error panel.
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
|
|
45
|
+
- **The agent `*SessionArguments` types are now thin subclasses of pipecat-ai's
|
|
46
|
+
runner argument types** (`SessionArguments`, `PipecatSessionArguments`,
|
|
47
|
+
`DailySessionArguments`, `WebSocketSessionArguments`, `SmallWebRTCSessionArguments`).
|
|
48
|
+
Because each is a subclass of the matching `pipecat.runner.types.*RunnerArguments`,
|
|
49
|
+
it interoperates with pipecat's runner machinery — `create_transport(args)` and
|
|
50
|
+
`isinstance(args, DailyRunnerArguments)` both work — so a bot's `bot()` may type
|
|
51
|
+
the argument as either the `*SessionArguments` type or the underlying
|
|
52
|
+
`*RunnerArguments` type.
|
|
53
|
+
|
|
54
|
+
- **`pipecat-ai` is an optional dependency (`pipecatcloud[pipecat]`).** Only the
|
|
55
|
+
agent session-argument types need it; the SDK (`Session`, the API client) and the
|
|
56
|
+
CLI do not. The types are now lazily imported, so plain `import pipecatcloud`
|
|
57
|
+
works without pipecat-ai installed. *Migration:* if you use the `*SessionArguments`
|
|
58
|
+
types, install `uv add "pipecatcloud[pipecat]"` (or otherwise have pipecat-ai
|
|
59
|
+
in your environment); accessing them without pipecat-ai raises a clear `ImportError`.
|
|
60
|
+
This also removes the old standalone fallback `*RunnerArguments` definitions
|
|
61
|
+
(deprecated since 0.2.1); `pipecatcloud.agent` now imports the real types from
|
|
62
|
+
pipecat-ai.
|
|
63
|
+
|
|
64
|
+
### Fixed
|
|
65
|
+
|
|
66
|
+
- **`pipecatcloud` now exports `SmallWebRTCSessionArguments`** (the SmallWebRTC agent
|
|
67
|
+
session type), not `SmallWebRTCRunnerArguments`. The `SmallWebRTCSessionArguments`
|
|
68
|
+
dataclass existed but was unreachable from the top-level package, while a pipecat-ai
|
|
69
|
+
runner base type was exported in its place — inconsistent with the other transports'
|
|
70
|
+
`*SessionArguments` exports. `from pipecatcloud import SmallWebRTCRunnerArguments` no
|
|
71
|
+
longer works (import it from `pipecat.runner.types` if you need the base type).
|
|
72
|
+
|
|
73
|
+
### Removed
|
|
74
|
+
|
|
75
|
+
- **The standalone CLI** (`pcc` / `pipecatcloud` console scripts and `python -m
|
|
76
|
+
pipecatcloud`). Pipecat Cloud is no longer a directly-invocable CLI; its commands are
|
|
77
|
+
exposed through the **Pipecat CLI** as `pipecat cloud ...` (the same commands that have
|
|
78
|
+
been available there for some time). *Migration:* install the Pipecat CLI with
|
|
79
|
+
`uv tool install pipecat-ai-cli` and replace `pcc <command>` with
|
|
80
|
+
`pipecat cloud <command>` (e.g. `pcc auth login` → `pipecat cloud auth login`). The
|
|
81
|
+
Python SDK (`pip install pipecatcloud`) is unchanged.
|
|
82
|
+
|
|
83
|
+
- **Legacy Krisp (the `--enable-krisp` flag and the `enable_krisp` config/API field).**
|
|
84
|
+
The legacy Krisp model is no longer supported anywhere — use **Krisp VIVA**
|
|
85
|
+
(`--krisp-viva-audio-filter`, or the `[krisp_viva]` section in `pcc-deploy.toml`).
|
|
86
|
+
Removed the `--enable-krisp` CLI flag, the `enable_krisp` field on the deploy config,
|
|
87
|
+
its `pcc-deploy.toml` key, and the `enableKrisp` API payload. A `pcc-deploy.toml` that
|
|
88
|
+
still contains `enable_krisp` will now error with a message pointing to `[krisp_viva]` —
|
|
89
|
+
remove it.
|
|
90
|
+
|
|
91
|
+
- **`pipecat cloud deploy --min-instances` / `--max-instances`** (deprecated
|
|
92
|
+
since 0.4.x). Use `--min-agents` / `--max-agents`. The corresponding
|
|
93
|
+
`min_instances` / `max_instances` fields were removed from `ScalingParams`.
|
|
94
|
+
|
|
95
|
+
- **Passing a Personal Access Token as a positional argument to `pipecat cloud auth use-pat`.**
|
|
96
|
+
The command now always reads the token from a secure hidden prompt (tokens on the
|
|
97
|
+
command line leak to shell history and process listings).
|
|
98
|
+
|
|
99
|
+
- **The deprecated `pipecat cloud organization keys delete` alias.** Use
|
|
100
|
+
`pipecat cloud organization keys revoke`.
|
|
101
|
+
|
|
8
102
|
## [0.7.2] - 2026-05-29
|
|
9
103
|
|
|
10
104
|
### Fixed
|
|
@@ -4,11 +4,11 @@ Guidance for Claude Code working in this repo.
|
|
|
4
4
|
|
|
5
5
|
## What this is
|
|
6
6
|
|
|
7
|
-
**Pipecat Cloud** is the Python SDK and
|
|
7
|
+
**Pipecat Cloud** is the Python SDK and CLI for deploying and managing Pipecat voice agents on Pipecat Cloud infrastructure. It ships to PyPI as `pipecatcloud`. Users authenticate, build and push container images, deploy agents, manage secrets and scaling, and open sessions against running agents. The CLI is not a standalone command — its commands are exposed through the Pipecat CLI as `pipecat cloud ...`.
|
|
8
8
|
|
|
9
9
|
- Package root: `src/pipecatcloud/`
|
|
10
|
-
- CLI
|
|
11
|
-
- Public docs: https://docs.pipecat.
|
|
10
|
+
- CLI: registered as a Pipecat CLI extension via the `pipecat_cli.extensions:cloud` entry point (surfaced as `pipecat cloud`). There is no standalone entry point — no `[project.scripts]` and no `__main__`; the CLI runs only through the Pipecat CLI.
|
|
11
|
+
- Public docs: https://docs.pipecat.ai/pipecat-cloud
|
|
12
12
|
|
|
13
13
|
## Toolchain
|
|
14
14
|
|
|
@@ -73,7 +73,7 @@ src/pipecatcloud/
|
|
|
73
73
|
session_manager.py SmallWebRTC support for non-Pipecat agents
|
|
74
74
|
tests/ Pytest suite, parallel to src/
|
|
75
75
|
.github/workflows/ tests.yml, format.yml, publish-pypi.yml, publish-test.yml
|
|
76
|
-
pcc-deploy.toml Example deployment config consumed by `
|
|
76
|
+
pcc-deploy.toml Example deployment config consumed by `pipecat cloud deploy`
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
## Testing conventions
|
|
@@ -81,12 +81,11 @@ pcc-deploy.toml Example deployment config consumed by `pcc deploy`
|
|
|
81
81
|
- Layout mirrors `src/`. New tests go in `tests/test_<module>.py`.
|
|
82
82
|
- `tests/conftest.py` sets `PIPECAT_CONFIG_PATH` to an isolated temp file **before imports**, pre-populated with `token = "test-token"` and `org = "test-org"`. This prevents tests from reading or clobbering real credentials. Do not bypass it.
|
|
83
83
|
- Async tests use `@pytest.mark.asyncio`. Mock async calls with `unittest.mock.AsyncMock`.
|
|
84
|
-
- `tests/test_agent_sessions.py` is **skipped in CI** because it needs real auth or heavier mocking. Run it locally if you touch session code.
|
|
85
84
|
- `pytest.ini` uses `--import-mode=importlib`. Some tests manually insert `src/` onto `sys.path`, which is expected.
|
|
86
85
|
|
|
87
86
|
## CI
|
|
88
87
|
|
|
89
|
-
- `tests.yml` runs
|
|
88
|
+
- `tests.yml` runs the full suite (`uv run pytest -v`) on push to main and PRs.
|
|
90
89
|
- `format.yml` runs `ruff format --diff` and `ruff check`. Both must pass.
|
|
91
90
|
- `publish-pypi.yml` and `publish-test.yml` are manual dispatches that build and publish a specific git tag.
|
|
92
91
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pipecatcloud
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: Cloud hosting for Pipecat AI applications
|
|
5
5
|
License: BSD 2-Clause License
|
|
6
|
-
Project-URL: Website, https://docs.pipecat.
|
|
6
|
+
Project-URL: Website, https://docs.pipecat.ai/pipecat-cloud
|
|
7
7
|
Keywords: pipecat,pipecat-ai,voice,ai,llm
|
|
8
8
|
Requires-Python: >=3.11
|
|
9
9
|
Description-Content-Type: text/markdown
|
|
@@ -25,7 +25,7 @@ Dynamic: license-file
|
|
|
25
25
|
<img alt="pipecat cloud" width="500px" height="auto" src="https://raw.githubusercontent.com/daily-co/pipecat-cloud/main/pipecat-cloud.png">
|
|
26
26
|
</div></h1>
|
|
27
27
|
|
|
28
|
-
[](https://docs.pipecat.
|
|
28
|
+
[](https://docs.pipecat.ai/pipecat-cloud)
|
|
29
29
|
[](https://pypi.org/project/pipecatcloud)
|
|
30
30
|
|
|
31
31
|
# Pipecat Cloud
|
|
@@ -34,42 +34,41 @@ Python module and CLI for interacting with [Pipecat Cloud](https://pipecat.daily
|
|
|
34
34
|
|
|
35
35
|
### Requirements
|
|
36
36
|
|
|
37
|
-
- Python 3.
|
|
37
|
+
- Python 3.11+
|
|
38
38
|
- Docker and a Docker repository (e.g. Docker Hub)
|
|
39
39
|
- Active [Pipecat Cloud](https://pipecat.daily.co)
|
|
40
40
|
account
|
|
41
41
|
|
|
42
42
|
### Documentation
|
|
43
43
|
|
|
44
|
-
Documentation for Pipecat Cloud is available [here](https://docs.pipecat.
|
|
44
|
+
Documentation for Pipecat Cloud is available [here](https://docs.pipecat.ai/pipecat-cloud).
|
|
45
45
|
|
|
46
46
|
### Installation
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
pip install pipecatcloud
|
|
48
|
+
The Pipecat Cloud CLI ships as part of the [Pipecat CLI](https://github.com/pipecat-ai/pipecat-cli) — its commands are available under `pipecat cloud`. Install the Pipecat CLI:
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
```shell
|
|
51
|
+
uv tool install pipecat-ai-cli
|
|
52
|
+
```
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
```shell
|
|
55
|
+
pipecat cloud --help
|
|
56
|
+
pipecat cloud auth login
|
|
56
57
|
```
|
|
57
58
|
|
|
58
59
|
! All CLI commands have a `--help` flag that will display the command usage and options.
|
|
59
60
|
|
|
61
|
+
To use Pipecat Cloud programmatically (without the CLI), install the package directly with `uv add pipecatcloud` and see [Usage in Python scripts](#usage-in-python-scripts).
|
|
62
|
+
|
|
60
63
|
## Usage
|
|
61
64
|
|
|
62
65
|
1. Create an account at [Pipecat Cloud](https://pipecat.daily.co)
|
|
63
66
|
|
|
64
|
-
2. Login to your account `
|
|
65
|
-
|
|
66
|
-
3. (Optional): Clone the quickstart repo [here](https://github.com/pipecat-ai/pipecat-quickstart)
|
|
67
|
-
|
|
68
|
-
4. Build your agent `docker build --platform linux/arm64 -t your-agent-name .`
|
|
67
|
+
2. Login to your account `pipecat cloud auth login`
|
|
69
68
|
|
|
70
|
-
|
|
69
|
+
3. Generate secrets `pipecat cloud secrets set`
|
|
71
70
|
|
|
72
|
-
|
|
71
|
+
4. Build and deploy your agent `pipecat cloud deploy`
|
|
73
72
|
|
|
74
73
|
### Usage in Python scripts
|
|
75
74
|
|
|
@@ -101,7 +100,7 @@ if __name__ == "__main__":
|
|
|
101
100
|
|
|
102
101
|
### SSL certificate errors on macOS
|
|
103
102
|
|
|
104
|
-
If `
|
|
103
|
+
If `pipecat cloud auth login` fails with an SSL certificate verification error, your Python
|
|
105
104
|
installation may not have access to the macOS system certificate store. This is
|
|
106
105
|
common with Python installed via pyenv, conda, or the python.org installer.
|
|
107
106
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<img alt="pipecat cloud" width="500px" height="auto" src="https://raw.githubusercontent.com/daily-co/pipecat-cloud/main/pipecat-cloud.png">
|
|
3
3
|
</div></h1>
|
|
4
4
|
|
|
5
|
-
[](https://docs.pipecat.
|
|
5
|
+
[](https://docs.pipecat.ai/pipecat-cloud)
|
|
6
6
|
[](https://pypi.org/project/pipecatcloud)
|
|
7
7
|
|
|
8
8
|
# Pipecat Cloud
|
|
@@ -11,42 +11,41 @@ Python module and CLI for interacting with [Pipecat Cloud](https://pipecat.daily
|
|
|
11
11
|
|
|
12
12
|
### Requirements
|
|
13
13
|
|
|
14
|
-
- Python 3.
|
|
14
|
+
- Python 3.11+
|
|
15
15
|
- Docker and a Docker repository (e.g. Docker Hub)
|
|
16
16
|
- Active [Pipecat Cloud](https://pipecat.daily.co)
|
|
17
17
|
account
|
|
18
18
|
|
|
19
19
|
### Documentation
|
|
20
20
|
|
|
21
|
-
Documentation for Pipecat Cloud is available [here](https://docs.pipecat.
|
|
21
|
+
Documentation for Pipecat Cloud is available [here](https://docs.pipecat.ai/pipecat-cloud).
|
|
22
22
|
|
|
23
23
|
### Installation
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
pip install pipecatcloud
|
|
25
|
+
The Pipecat Cloud CLI ships as part of the [Pipecat CLI](https://github.com/pipecat-ai/pipecat-cli) — its commands are available under `pipecat cloud`. Install the Pipecat CLI:
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
```shell
|
|
28
|
+
uv tool install pipecat-ai-cli
|
|
29
|
+
```
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
```shell
|
|
32
|
+
pipecat cloud --help
|
|
33
|
+
pipecat cloud auth login
|
|
33
34
|
```
|
|
34
35
|
|
|
35
36
|
! All CLI commands have a `--help` flag that will display the command usage and options.
|
|
36
37
|
|
|
38
|
+
To use Pipecat Cloud programmatically (without the CLI), install the package directly with `uv add pipecatcloud` and see [Usage in Python scripts](#usage-in-python-scripts).
|
|
39
|
+
|
|
37
40
|
## Usage
|
|
38
41
|
|
|
39
42
|
1. Create an account at [Pipecat Cloud](https://pipecat.daily.co)
|
|
40
43
|
|
|
41
|
-
2. Login to your account `
|
|
42
|
-
|
|
43
|
-
3. (Optional): Clone the quickstart repo [here](https://github.com/pipecat-ai/pipecat-quickstart)
|
|
44
|
-
|
|
45
|
-
4. Build your agent `docker build --platform linux/arm64 -t your-agent-name .`
|
|
44
|
+
2. Login to your account `pipecat cloud auth login`
|
|
46
45
|
|
|
47
|
-
|
|
46
|
+
3. Generate secrets `pipecat cloud secrets set`
|
|
48
47
|
|
|
49
|
-
|
|
48
|
+
4. Build and deploy your agent `pipecat cloud deploy`
|
|
50
49
|
|
|
51
50
|
### Usage in Python scripts
|
|
52
51
|
|
|
@@ -78,7 +77,7 @@ if __name__ == "__main__":
|
|
|
78
77
|
|
|
79
78
|
### SSL certificate errors on macOS
|
|
80
79
|
|
|
81
|
-
If `
|
|
80
|
+
If `pipecat cloud auth login` fails with an SSL certificate verification error, your Python
|
|
82
81
|
installation may not have access to the macOS system certificate store. This is
|
|
83
82
|
common with Python installed via pyenv, conda, or the python.org installer.
|
|
84
83
|
|
|
@@ -19,12 +19,19 @@ dependencies = [
|
|
|
19
19
|
"typer>=0.20.0,<1",
|
|
20
20
|
"synchronicity>=0.11,<1.0.0",
|
|
21
21
|
"toml~=0.10.2",
|
|
22
|
-
"questionary~=2.1.0"
|
|
22
|
+
"questionary~=2.1.0",
|
|
23
23
|
]
|
|
24
24
|
|
|
25
25
|
[project.optional-dependencies]
|
|
26
|
+
# The agent session-argument types (pipecatcloud.agent) subclass pipecat-ai's
|
|
27
|
+
# runner argument types. pipecat-ai is optional so the SDK and CLI surface stay
|
|
28
|
+
# lightweight — e.g. so the pipecat-base image doesn't pull pipecat-ai into its
|
|
29
|
+
# layer (the bot provides it). Floor is 1.0.0; `session_id` on the base
|
|
30
|
+
# RunnerArguments came later (v1.2.0) but is supplied by the SessionArguments
|
|
31
|
+
# mixin for pipecat-ai in [1.0.0, 1.2.0).
|
|
26
32
|
pipecat = ["pipecat-ai>=1.0.0"]
|
|
27
33
|
|
|
34
|
+
|
|
28
35
|
[dependency-groups]
|
|
29
36
|
dev = [
|
|
30
37
|
"build~=1.4.0",
|
|
@@ -36,12 +43,10 @@ dev = [
|
|
|
36
43
|
"ruff>=0.12.11,<1",
|
|
37
44
|
"setuptools~=78.1.1",
|
|
38
45
|
"setuptools_scm~=8.3.1",
|
|
46
|
+
# Needed to import/test pipecatcloud.agent (the optional pipecat surface).
|
|
47
|
+
"pipecat-ai>=1.0.0",
|
|
39
48
|
]
|
|
40
49
|
|
|
41
|
-
[project.scripts]
|
|
42
|
-
pcc = "pipecatcloud.__main__:main"
|
|
43
|
-
pipecatcloud = "pipecatcloud.__main__:main"
|
|
44
|
-
|
|
45
50
|
[project.entry-points."pipecat_cli.extensions"]
|
|
46
51
|
cloud = "pipecatcloud.cli.entry_point:entrypoint_cli_typer"
|
|
47
52
|
|
|
@@ -72,7 +77,7 @@ select = [
|
|
|
72
77
|
"**/__init__.py" = ["D104"]
|
|
73
78
|
|
|
74
79
|
[project.urls]
|
|
75
|
-
Website = "https://docs.pipecat.
|
|
80
|
+
Website = "https://docs.pipecat.ai/pipecat-cloud"
|
|
76
81
|
|
|
77
82
|
[tool.setuptools_scm]
|
|
78
83
|
local_scheme = "no-local-version"
|
|
@@ -9,13 +9,6 @@ import sys
|
|
|
9
9
|
|
|
10
10
|
from loguru import logger
|
|
11
11
|
|
|
12
|
-
from pipecatcloud.agent import (
|
|
13
|
-
DailySessionArguments,
|
|
14
|
-
PipecatSessionArguments,
|
|
15
|
-
SessionArguments,
|
|
16
|
-
SmallWebRTCRunnerArguments,
|
|
17
|
-
WebSocketSessionArguments,
|
|
18
|
-
)
|
|
19
12
|
from pipecatcloud.exception import (
|
|
20
13
|
AgentNotHealthyError,
|
|
21
14
|
AgentStartError,
|
|
@@ -32,12 +25,38 @@ logger.remove()
|
|
|
32
25
|
logger.add(sys.stderr, level=str(os.getenv("PCC_LOG_LEVEL", "INFO")))
|
|
33
26
|
|
|
34
27
|
|
|
28
|
+
# The agent session-argument types subclass pipecat-ai's runner argument types,
|
|
29
|
+
# so importing them pulls in pipecat-ai (an optional dependency). Resolve them
|
|
30
|
+
# lazily (PEP 562) so plain `import pipecatcloud` — the SDK and CLI surface — does
|
|
31
|
+
# not require pipecat-ai. Accessing one of these names imports pipecatcloud.agent,
|
|
32
|
+
# which raises a clear ImportError if pipecat-ai is not installed.
|
|
33
|
+
_LAZY_AGENT_EXPORTS = (
|
|
34
|
+
"DailySessionArguments",
|
|
35
|
+
"PipecatSessionArguments",
|
|
36
|
+
"SessionArguments",
|
|
37
|
+
"SmallWebRTCSessionArguments",
|
|
38
|
+
"WebSocketSessionArguments",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def __getattr__(name: str):
|
|
43
|
+
if name in _LAZY_AGENT_EXPORTS:
|
|
44
|
+
from pipecatcloud import agent
|
|
45
|
+
|
|
46
|
+
return getattr(agent, name)
|
|
47
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def __dir__():
|
|
51
|
+
return sorted(list(globals()) + list(_LAZY_AGENT_EXPORTS))
|
|
52
|
+
|
|
53
|
+
|
|
35
54
|
__all__ = [
|
|
36
55
|
# Agent classes
|
|
37
56
|
"DailySessionArguments",
|
|
38
57
|
"PipecatSessionArguments",
|
|
39
58
|
"SessionArguments",
|
|
40
|
-
"
|
|
59
|
+
"SmallWebRTCSessionArguments",
|
|
41
60
|
"WebSocketSessionArguments",
|
|
42
61
|
# Session classes
|
|
43
62
|
"Session",
|
|
@@ -13,6 +13,20 @@ from rich.panel import Panel
|
|
|
13
13
|
from pipecatcloud.cli import PANEL_TITLE_ERROR, PANEL_TITLE_SUCCESS, PIPECAT_CLI_NAME
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
def format_cents(cents: int | None) -> str:
|
|
17
|
+
"""Render a cents value as a USD dollar string (e.g. 1234 -> "$12.34").
|
|
18
|
+
|
|
19
|
+
Uses integer arithmetic so the rendered value is exact for any in-range
|
|
20
|
+
integer, even values float-division would round (e.g. very large cent
|
|
21
|
+
counts where `cents / 100` loses precision).
|
|
22
|
+
"""
|
|
23
|
+
if cents is None:
|
|
24
|
+
return "no limit"
|
|
25
|
+
sign = "-" if cents < 0 else ""
|
|
26
|
+
abs_cents = abs(cents)
|
|
27
|
+
return f"{sign}${abs_cents // 100}.{abs_cents % 100:02d}"
|
|
28
|
+
|
|
29
|
+
|
|
16
30
|
class PipecatConsole(Console):
|
|
17
31
|
def success(
|
|
18
32
|
self,
|
|
@@ -90,6 +104,11 @@ class PipecatConsole(Console):
|
|
|
90
104
|
error_message = str(error_code) if error_code else DEFAULT_ERROR_MESSAGE
|
|
91
105
|
code = None
|
|
92
106
|
|
|
107
|
+
if code == "SPEND_LIMIT_REACHED":
|
|
108
|
+
# Safe to pass through: code is only set when error_code is a dict.
|
|
109
|
+
self._spend_limit_reached(error_code) # type: ignore[arg-type]
|
|
110
|
+
return
|
|
111
|
+
|
|
93
112
|
if not error_message:
|
|
94
113
|
hide_subtitle = True
|
|
95
114
|
|
|
@@ -97,7 +116,7 @@ class PipecatConsole(Console):
|
|
|
97
116
|
Panel(
|
|
98
117
|
f"[red]{title}[/red]\n\n[dim]Error message:[/dim]\n{error_message}",
|
|
99
118
|
title=f"[bold red]{PANEL_TITLE_ERROR}{f' - {code}' if code else ''}[/bold red]",
|
|
100
|
-
subtitle=f"[dim]Docs: https://docs.pipecat.
|
|
119
|
+
subtitle=f"[dim]Docs: https://docs.pipecat.ai/pipecat-cloud/fundamentals/error-codes#{str(code).lower()}[/dim]"
|
|
101
120
|
if not hide_subtitle and code
|
|
102
121
|
else None,
|
|
103
122
|
title_align="left",
|
|
@@ -106,6 +125,48 @@ class PipecatConsole(Console):
|
|
|
106
125
|
)
|
|
107
126
|
)
|
|
108
127
|
|
|
128
|
+
def _spend_limit_reached(self, error: dict):
|
|
129
|
+
"""Render the wrapped remediation message for HTTP 402 SPEND_LIMIT_REACHED.
|
|
130
|
+
|
|
131
|
+
Falls back gracefully if the error body omits the spend fields: in that
|
|
132
|
+
case we render the remediation message without the usage line.
|
|
133
|
+
"""
|
|
134
|
+
from pipecatcloud.config import config as base_config
|
|
135
|
+
|
|
136
|
+
current = error.get("currentSpendCents")
|
|
137
|
+
limit = error.get("limitCents")
|
|
138
|
+
|
|
139
|
+
if current is not None and limit is not None:
|
|
140
|
+
usage_line = (
|
|
141
|
+
f"Your organization has reached its spend limit "
|
|
142
|
+
f"({format_cents(current)} of {format_cents(limit)} used in this billing period)."
|
|
143
|
+
)
|
|
144
|
+
else:
|
|
145
|
+
usage_line = (
|
|
146
|
+
"Your organization has reached its spend limit for the current billing period."
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# Fall back to the documented default if the host is unset or empty,
|
|
150
|
+
# so the rendered link is never `[link=][/link]` or `[link=None]None[/link]`.
|
|
151
|
+
dashboard = base_config.get("dashboard_host") or "https://pipecat.daily.co"
|
|
152
|
+
body = (
|
|
153
|
+
f"{usage_line}\n"
|
|
154
|
+
"New sessions are being rejected. In-flight sessions continue to run.\n\n"
|
|
155
|
+
"To unblock new sessions:\n"
|
|
156
|
+
f" [bold cyan]{PIPECAT_CLI_NAME} spend-limit set <new amount>[/bold cyan]\n"
|
|
157
|
+
f" [bold cyan]{PIPECAT_CLI_NAME} spend-limit clear[/bold cyan]\n\n"
|
|
158
|
+
f"Or visit [link={dashboard}]{dashboard}[/link]"
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
self.print(
|
|
162
|
+
Panel(
|
|
163
|
+
body,
|
|
164
|
+
title=f"[bold red]{PANEL_TITLE_ERROR} - Spend limit reached (402)[/bold red]",
|
|
165
|
+
title_align="left",
|
|
166
|
+
border_style="red",
|
|
167
|
+
)
|
|
168
|
+
)
|
|
169
|
+
|
|
109
170
|
|
|
110
171
|
console = PipecatConsole()
|
|
111
172
|
|
|
@@ -266,21 +266,8 @@ def interpret_deployment_status(
|
|
|
266
266
|
class ScalingParams:
|
|
267
267
|
min_agents: int | None = 0
|
|
268
268
|
max_agents: int | None = None
|
|
269
|
-
# @deprecated
|
|
270
|
-
min_instances: int | None = field(default=None, metadata={"deprecated": True})
|
|
271
|
-
# @deprecated
|
|
272
|
-
max_instances: int | None = field(default=None, metadata={"deprecated": True})
|
|
273
269
|
|
|
274
270
|
def __attrs_post_init__(self):
|
|
275
|
-
# Handle deprecated fields
|
|
276
|
-
if self.min_instances is not None:
|
|
277
|
-
logger.warning("min_instances is deprecated, use min_agents instead")
|
|
278
|
-
self.min_agents = self.min_instances
|
|
279
|
-
|
|
280
|
-
if self.max_instances is not None:
|
|
281
|
-
logger.warning("max_instances is deprecated, use max_agents instead")
|
|
282
|
-
self.max_agents = self.max_instances
|
|
283
|
-
|
|
284
271
|
# Validation
|
|
285
272
|
if self.min_agents is not None:
|
|
286
273
|
if self.min_agents < 0:
|
|
@@ -339,7 +326,6 @@ class DeployConfigParams:
|
|
|
339
326
|
secret_set: str | None = None
|
|
340
327
|
region: str | None = None
|
|
341
328
|
scaling: ScalingParams = ScalingParams()
|
|
342
|
-
enable_krisp: bool = False
|
|
343
329
|
docker_config: dict = field(factory=dict)
|
|
344
330
|
build_config: BuildConfig = field(factory=BuildConfig) # Cloud build configuration
|
|
345
331
|
agent_profile: str | None = None
|
|
@@ -366,7 +352,6 @@ class DeployConfigParams:
|
|
|
366
352
|
"secret_set": self.secret_set,
|
|
367
353
|
"region": self.region,
|
|
368
354
|
"scaling": self.scaling.to_dict() if self.scaling else None,
|
|
369
|
-
"enable_krisp": self.enable_krisp,
|
|
370
355
|
"docker_config": self.docker_config,
|
|
371
356
|
"build_config": self.build_config.to_dict() if self.build_config else None,
|
|
372
357
|
"agent_profile": self.agent_profile,
|
|
@@ -409,16 +394,8 @@ def load_deploy_config_file() -> DeployConfigParams | None:
|
|
|
409
394
|
exclude_patterns=exclude_data.get("patterns", []),
|
|
410
395
|
)
|
|
411
396
|
|
|
412
|
-
#
|
|
413
|
-
|
|
414
|
-
**config_data,
|
|
415
|
-
scaling=scaling_params,
|
|
416
|
-
docker_config=docker_data,
|
|
417
|
-
build_config=build_config,
|
|
418
|
-
krisp_viva=krisp_viva_config,
|
|
419
|
-
)
|
|
420
|
-
|
|
421
|
-
# Check for unexpected keys
|
|
397
|
+
# Check for unexpected keys before constructing the config, so users get a clear
|
|
398
|
+
# message instead of a raw constructor TypeError.
|
|
422
399
|
expected_keys = {
|
|
423
400
|
"agent_name",
|
|
424
401
|
"image",
|
|
@@ -427,7 +404,6 @@ def load_deploy_config_file() -> DeployConfigParams | None:
|
|
|
427
404
|
"secret_set",
|
|
428
405
|
"region",
|
|
429
406
|
"scaling",
|
|
430
|
-
"enable_krisp",
|
|
431
407
|
"docker",
|
|
432
408
|
"build",
|
|
433
409
|
"agent_profile",
|
|
@@ -435,10 +411,26 @@ def load_deploy_config_file() -> DeployConfigParams | None:
|
|
|
435
411
|
"websocket_auth",
|
|
436
412
|
"max_session_duration",
|
|
437
413
|
}
|
|
414
|
+
|
|
415
|
+
# TODO: Remove this enable_krisp migration hint in the 2.0.0 release.
|
|
416
|
+
if "enable_krisp" in config_data:
|
|
417
|
+
raise ConfigFileError(
|
|
418
|
+
"'enable_krisp' is no longer supported. Krisp is now configured via the "
|
|
419
|
+
"[krisp_viva] section in pcc-deploy.toml. Remove 'enable_krisp' from your config."
|
|
420
|
+
)
|
|
438
421
|
unexpected_keys = set(config_data.keys()) - expected_keys
|
|
439
422
|
if unexpected_keys:
|
|
440
423
|
raise ConfigFileError(f"Unexpected keys in config file: {unexpected_keys}")
|
|
441
424
|
|
|
425
|
+
# Create DeployConfigParams with validated data
|
|
426
|
+
validated_config = DeployConfigParams(
|
|
427
|
+
**config_data,
|
|
428
|
+
scaling=scaling_params,
|
|
429
|
+
docker_config=docker_data,
|
|
430
|
+
build_config=build_config,
|
|
431
|
+
krisp_viva=krisp_viva_config,
|
|
432
|
+
)
|
|
433
|
+
|
|
442
434
|
return validated_config
|
|
443
435
|
|
|
444
436
|
except Exception as e:
|